From 4ad5c98edb1d0140c4184288e8714a317a0df12f Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 19 Feb 2023 16:15:47 +0100 Subject: [PATCH 1/5] Renamed SDK folder to prepare for update to version 1.00.10 --- .../.vscode/settings.json | 0 .../Makefile | 0 .../app/Makefile | 0 .../app/app_config.h | 0 .../app/app_drivers/Makefile | 0 .../app/app_drivers/i2c/BMP280.c | 0 .../app/app_drivers/i2c/BMP280.h | 0 .../app/app_drivers/i2c/CST816D.c | 0 .../app/app_drivers/i2c/CST816D.h | 0 .../app/app_drivers/i2c/Makefile | 0 .../app/app_drivers/i2c/QMC5883L.c | 0 .../app/app_drivers/i2c/QMC5883L.h | 0 .../app/app_drivers/i2c/bma4.c | 0 .../app/app_drivers/i2c/bma4.h | 0 .../app/app_drivers/i2c/bma456w.c | 0 .../app/app_drivers/i2c/bma456w.h | 0 .../app/app_drivers/i2c/bma4_defs.h | 0 .../app/app_drivers/i2c/i2c.c | 0 .../app/app_drivers/i2c/i2c.h | 0 .../app/app_drivers/lcd/Makefile | 0 .../app/app_drivers/lcd/lcd.c | 0 .../app/app_drivers/lcd/lcd.h | 0 .../app/app_drivers/mmc_sdio/Makefile | 0 .../app/app_drivers/mmc_sdio/mmc_sdio.c | 0 .../app/app_drivers/mmc_sdio/mmc_sdio.h | 0 .../app/app_drivers/watch_peripherals/Makefile | 0 .../watch_peripherals/watch_peripherals.c | 0 .../watch_peripherals/watch_peripherals.h | 0 .../app/app_include/app_common.h | 0 .../app/app_include/app_log.h | 0 .../app/gfx/Makefile | 0 .../app/gfx/assets/Makefile | 0 .../app/gfx/assets/compass_assets.c | 0 .../app/gfx/assets/watch_casio_assets.c | 0 .../app/gfx/assets/watch_menu_icons.c | 0 .../app/gfx/common_screen_components.c | 0 .../app/gfx/common_screen_components.h | 0 .../app/gfx/compass_screen.c | 0 .../app/gfx/compass_screen.h | 0 .../app/gfx/gfx_task.c | 0 .../app/gfx/gfx_task.h | 0 .../app/gfx/menu_screen.c | 0 .../app/gfx/menu_screen.h | 0 .../app/gfx/settings_screen.c | 0 .../app/gfx/settings_screen.h | 0 .../app/gfx/watch_face.c | 0 .../app/gfx/watch_face.h | 0 .../app/main.c | 0 .../app/persistency/Makefile | 0 .../app/persistency/watch_settings.c | 0 .../app/persistency/watch_settings.h | 0 .../demo/Makefile | 0 .../demo/console/Makefile | 0 .../demo/console/wm_demo_console.h | 0 .../demo/console/wm_demo_console_task.c | 0 .../demo/wm_7816_demo.c | 0 .../demo/wm_adc_demo.c | 0 .../demo/wm_apsta_demo.c | 0 .../demo/wm_avoid_copy_demo.c | 0 .../demo/wm_connect_net_demo.c | 0 .../demo/wm_crypt_demo.c | 0 .../demo/wm_crypt_hard_demo.c | 0 .../demo/wm_demo.h | 0 .../demo/wm_dsp_demo.c | 0 .../demo/wm_fatfs_demo.c | 0 .../demo/wm_flash_demo.c | 0 .../demo/wm_gpio_demo.c | 0 .../demo/wm_http_demo.c | 0 .../demo/wm_https_demo.c | 0 .../demo/wm_i2c_demo.c | 0 .../demo/wm_i2s_demo.c | 0 .../demo/wm_iperf_auto_demo.c | 0 .../demo/wm_lcd_demo.c | 0 .../demo/wm_master_spi_demo.c | 0 .../demo/wm_mbedtls_demo.c | 0 .../demo/wm_mcast_demo.c | 0 .../demo/wm_mqtt_demo.c | 0 .../demo/wm_ntp_demo.c | 0 .../demo/wm_pmu_demo.c | 0 .../demo/wm_pwm_demo.c | 0 .../demo/wm_rsa_demo.c | 0 .../demo/wm_rtc_demo.c | 0 .../demo/wm_scan_demo.c | 0 .../demo/wm_sck_client_demo.c | 0 .../demo/wm_sck_server_demo.c | 0 .../demo/wm_sdio_host_demo.c | 0 .../demo/wm_slave_spi_demo.c | 0 .../demo/wm_socket_client_demo.c | 0 .../demo/wm_socket_server_demo.c | 0 .../demo/wm_softap_demo.c | 0 .../demo/wm_ssl_server_demo.c | 0 .../demo/wm_ssl_server_demo.h | 0 .../demo/wm_timer_demo.c | 0 .../demo/wm_touchsensor_demo.c | 0 .../demo/wm_uart_demo.c | 0 .../demo/wm_udp_demo.c | 0 .../demo/wm_websockets_demo.c | 0 .../demo/wm_wps_demo.c | 0 .../doc/ChangeLog.txt | 0 .../doc/w800_apis.chm | Bin .../include/app/wm_at_ri_init.h | 0 .../include/app/wm_crypto.h | 0 .../include/app/wm_dhcp_server.h | 0 .../include/app/wm_dns_server.h | 0 .../include/app/wm_http_client.h | 0 .../include/app/wm_netif.h | 0 .../include/app/wm_netif2.0.3.h | 0 .../include/app/wm_ntp.h | 0 .../include/app/wm_ssl_server.h | 0 .../include/app/wm_webserver.h | 0 .../include/app/wm_wifi_oneshot.h | 0 .../include/arch/xt804/csi_config.h | 0 .../include/arch/xt804/csi_core/core_804.h | 0 .../include/arch/xt804/csi_core/csi_core.h | 0 .../include/arch/xt804/csi_core/csi_gcc.h | 0 .../include/arch/xt804/csi_dsp/csky_common_tables.h | 0 .../include/arch/xt804/csi_dsp/csky_const_structs.h | 0 .../include/arch/xt804/csi_dsp/csky_math.h | 0 .../include/bt/wm_ble.h | 0 .../include/bt/wm_ble_gatt.h | 0 .../include/bt/wm_bt.h | 0 .../include/bt/wm_bt_api.h | 0 .../include/bt/wm_bt_av.h | 0 .../include/bt/wm_bt_def.h | 0 .../include/bt/wm_bt_hf_client.h | 0 .../include/bt/wm_bt_spp.h | 0 .../include/driver/wm_7816.h | 0 .../include/driver/wm_adc.h | 0 .../include/driver/wm_cpu.h | 0 .../include/driver/wm_dma.h | 0 .../include/driver/wm_efuse.h | 0 .../include/driver/wm_flash.h | 0 .../include/driver/wm_flash_map.h | 0 .../include/driver/wm_flash_map_backup.h | 0 .../include/driver/wm_fls_gd25qxx.h | 0 .../include/driver/wm_gpio.h | 0 .../include/driver/wm_gpio_afsel.h | 0 .../include/driver/wm_hostspi.h | 0 .../include/driver/wm_hspi.h | 0 .../include/driver/wm_i2c.h | 0 .../include/driver/wm_i2s.h | 0 .../include/driver/wm_internal_flash.h | 0 .../include/driver/wm_io.h | 0 .../include/driver/wm_irq.h | 0 .../include/driver/wm_lcd.h | 0 .../include/driver/wm_pmu.h | 0 .../include/driver/wm_psram.h | 0 .../include/driver/wm_pwm.h | 0 .../include/driver/wm_rtc.h | 0 .../include/driver/wm_sasc.h | 0 .../include/driver/wm_sdio_host.h | 0 .../include/driver/wm_timer.h | 0 .../include/driver/wm_tipc.h | 0 .../include/driver/wm_touchsensor.h | 0 .../include/driver/wm_uart.h | 0 .../include/driver/wm_watchdog.h | 0 .../include/list.h | 0 .../include/net/wm_socket.h | 0 .../include/net/wm_socket2.0.3.h | 0 .../include/net/wm_sockets.h | 0 .../include/net/wm_sockets2.0.3.h | 0 .../include/os/wm_os_config.h | 0 .../include/os/wm_osal.h | 0 .../include/platform/aes.h | 0 .../include/platform/wm_crypto_hard.h | 0 .../include/platform/wm_crypto_hard_mbed.h | 0 .../include/platform/wm_fwup.h | 0 .../include/platform/wm_mem.h | 0 .../include/platform/wm_params.h | 0 .../include/platform/wm_wl_mbox.h | 0 .../include/platform/wm_wl_task.h | 0 .../include/platform/wm_wl_timers.h | 0 .../include/random.h | 0 .../include/wifi/litepoint.h | 0 .../include/wifi/wm_ieee80211.h | 0 .../include/wifi/wm_ieee80211_gcc.h | 0 .../include/wifi/wm_wifi.h | 0 .../include/wm_bt_config.h | 0 .../include/wm_config.h | 0 .../include/wm_debug.h | 0 .../include/wm_include.h | 0 .../include/wm_ram_config.h | 0 .../include/wm_regs.h | 0 .../include/wm_type_def.h | 0 .../include/wm_wifi_config.h | 0 .../ld/w800/gcc_csky.ld | 0 .../ld/w800/gcc_csky_backup.ld | 0 .../ld/w800/gcc_csky_bt.ld | 0 .../lib/w800/libapp.a | Bin .../lib/w800/libapp_br_edr.a | Bin .../lib/w800/libblehost.a | Bin .../lib/w800/libbtcontroller.a | Bin .../lib/w800/libbtcontroller_br_edr.a | Bin .../lib/w800/libbthost_br_edr.a | Bin .../lib/w800/libdrivers.a | Bin .../lib/w800/libdsp.a | Bin .../lib/w800/libnetwork.a | Bin .../lib/w800/libos.a | Bin .../lib/w800/libwlan.a | Bin .../lib/w800/libwmarch.a | Bin .../lib/w800/libwmcommon.a | Bin .../lib/w800/libwmsys.a | Bin .../lvgl/Makefile | 0 .../lvgl/lvgl_port/Makefile | 0 .../lvgl/lvgl_port/lv_conf.h | 0 .../lvgl/lvgl_port/lv_port_disp.c | 0 .../lvgl/lvgl_port/lv_port_disp.h | 0 .../lvgl/lvgl_port/lv_port_indev.c | 0 .../lvgl/lvgl_port/lv_port_indev.c.bck | 0 .../lvgl/lvgl_port/lv_port_indev.h | 0 .../lvgl/lvgl_port/lvgl_port_tick.c | 0 .../lvgl/lvgl_port/touchpad.c.bck | 0 .../lvgl/lvgl_port/touchpad.h.bck | 0 .../lvgl/lvgl_v8.3/.codecov.yml | 0 .../lvgl/lvgl_v8.3/.editorconfig | 0 .../lvgl/lvgl_v8.3/.gitignore | 0 .../lvgl/lvgl_v8.3/.pre-commit-config.yaml | 0 .../lvgl/lvgl_v8.3/CMakeLists.txt | 0 .../lvgl/lvgl_v8.3/Kconfig | 0 .../lvgl/lvgl_v8.3/LICENCE.txt | 0 .../lvgl/lvgl_v8.3/Makefile | 0 .../lvgl/lvgl_v8.3/README.md | 0 .../lvgl/lvgl_v8.3/README_pt_BR.md | 0 .../lvgl/lvgl_v8.3/README_zh.md | 0 .../lvgl/lvgl_v8.3/SConscript | 0 .../lvgl/lvgl_v8.3/component.mk | 0 .../lvgl/lvgl_v8.3/demos/Makefile | 0 .../lvgl/lvgl_v8.3/demos/README.md | 0 .../lvgl/lvgl_v8.3/demos/benchmark/Makefile | 0 .../lvgl/lvgl_v8.3/demos/benchmark/README.md | 0 .../lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile | 0 .../assets/img_benchmark_cogwheel_alpha16.c | 0 .../benchmark/assets/img_benchmark_cogwheel_argb.c | 0 .../assets/img_benchmark_cogwheel_chroma_keyed.c | 0 .../assets/img_benchmark_cogwheel_indexed16.c | 0 .../benchmark/assets/img_benchmark_cogwheel_rgb.c | 0 .../assets/img_benchmark_cogwheel_rgb565a8.c | 0 .../demos/benchmark/assets/img_cogwheel_argb.png | Bin .../benchmark/assets/img_cogwheel_chroma_keyed.png | Bin .../benchmark/assets/img_cogwheel_indexed16.png | Bin .../demos/benchmark/assets/img_cogwheel_rgb.png | Bin .../lv_font_bechmark_montserrat_12_compr_az.c.c | 0 .../lv_font_bechmark_montserrat_16_compr_az.c.c | 0 .../lv_font_bechmark_montserrat_28_compr_az.c.c | 0 .../lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c | 0 .../lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h | 0 .../lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png | Bin .../lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png | Bin .../lvgl/lvgl_v8.3/demos/keypad_encoder/README.md | 0 .../demos/keypad_encoder/lv_demo_keypad_encoder.c | 0 .../demos/keypad_encoder/lv_demo_keypad_encoder.h | 0 .../lvgl_v8.3/demos/keypad_encoder/screenshot1.gif | Bin .../lvgl_v8.3/demos/keypad_encoder/screenshot1.png | Bin .../lvgl/lvgl_v8.3/demos/lv_demos.h | 0 .../lvgl/lvgl_v8.3/demos/lv_demos.mk | 0 .../lvgl/lvgl_v8.3/demos/music/README.md | 0 .../assets/img_lv_demo_music_btn_corner_large.c | 0 .../music/assets/img_lv_demo_music_btn_list_pause.c | 0 .../assets/img_lv_demo_music_btn_list_pause_large.c | 0 .../music/assets/img_lv_demo_music_btn_list_play.c | 0 .../assets/img_lv_demo_music_btn_list_play_large.c | 0 .../demos/music/assets/img_lv_demo_music_btn_loop.c | 0 .../music/assets/img_lv_demo_music_btn_loop_large.c | 0 .../demos/music/assets/img_lv_demo_music_btn_next.c | 0 .../music/assets/img_lv_demo_music_btn_next_large.c | 0 .../music/assets/img_lv_demo_music_btn_pause.c | 0 .../assets/img_lv_demo_music_btn_pause_large.c | 0 .../demos/music/assets/img_lv_demo_music_btn_play.c | 0 .../music/assets/img_lv_demo_music_btn_play_large.c | 0 .../demos/music/assets/img_lv_demo_music_btn_prev.c | 0 .../music/assets/img_lv_demo_music_btn_prev_large.c | 0 .../demos/music/assets/img_lv_demo_music_btn_rnd.c | 0 .../music/assets/img_lv_demo_music_btn_rnd_large.c | 0 .../music/assets/img_lv_demo_music_corner_left.c | 0 .../assets/img_lv_demo_music_corner_left_large.c | 0 .../music/assets/img_lv_demo_music_corner_right.c | 0 .../assets/img_lv_demo_music_corner_right_large.c | 0 .../demos/music/assets/img_lv_demo_music_cover_1.c | 0 .../music/assets/img_lv_demo_music_cover_1_large.c | 0 .../demos/music/assets/img_lv_demo_music_cover_2.c | 0 .../music/assets/img_lv_demo_music_cover_2_large.c | 0 .../demos/music/assets/img_lv_demo_music_cover_3.c | 0 .../music/assets/img_lv_demo_music_cover_3_large.c | 0 .../demos/music/assets/img_lv_demo_music_icon_1.c | 0 .../music/assets/img_lv_demo_music_icon_1_large.c | 0 .../demos/music/assets/img_lv_demo_music_icon_2.c | 0 .../music/assets/img_lv_demo_music_icon_2_large.c | 0 .../demos/music/assets/img_lv_demo_music_icon_3.c | 0 .../music/assets/img_lv_demo_music_icon_3_large.c | 0 .../demos/music/assets/img_lv_demo_music_icon_4.c | 0 .../music/assets/img_lv_demo_music_icon_4_large.c | 0 .../music/assets/img_lv_demo_music_list_border.c | 0 .../assets/img_lv_demo_music_list_border_large.c | 0 .../demos/music/assets/img_lv_demo_music_logo.c | 0 .../music/assets/img_lv_demo_music_slider_knob.c | 0 .../assets/img_lv_demo_music_slider_knob_large.c | 0 .../music/assets/img_lv_demo_music_wave_bottom.c | 0 .../assets/img_lv_demo_music_wave_bottom_large.c | 0 .../demos/music/assets/img_lv_demo_music_wave_top.c | 0 .../music/assets/img_lv_demo_music_wave_top_large.c | 0 .../lvgl/lvgl_v8.3/demos/music/assets/spectrum.py | 0 .../lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h | 0 .../lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h | 0 .../lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music.c | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music.h | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c | 0 .../lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h | 0 .../lvgl/lvgl_v8.3/demos/music/screenshot1.gif | Bin .../lvgl/lvgl_v8.3/demos/stress/Makefile | 0 .../lvgl/lvgl_v8.3/demos/stress/README.md | 0 .../lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c | 0 .../lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h | 0 .../lvgl/lvgl_v8.3/demos/stress/screenshot1.gif | Bin .../lvgl/lvgl_v8.3/demos/stress/screenshot1.png | Bin .../lvgl/lvgl_v8.3/demos/widgets/Makefile | 0 .../lvgl/lvgl_v8.3/demos/widgets/assets/Makefile | 0 .../lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png | Bin .../lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png | Bin .../lvgl_v8.3/demos/widgets/assets/img_clothes.c | 0 .../demos/widgets/assets/img_demo_widgets_avatar.c | 0 .../lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c | 0 .../lvgl_v8.3/demos/widgets/assets/lvgl_logo.png | Bin .../lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c | 0 .../lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h | 0 .../lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py | 0 .../lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif | Bin .../lvgl/lvgl_v8.3/demos/widgets/screenshot1.png | Bin .../lvgl/lvgl_v8.3/docs/CHANGELOG.md | 0 .../lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md | 0 .../lvgl/lvgl_v8.3/docs/CODING_STYLE.md | 0 .../lvgl/lvgl_v8.3/docs/CONTRIBUTING.md | 0 .../lvgl/lvgl_v8.3/docs/ROADMAP.md | 0 .../lvgl/lvgl_v8.3/docs/_ext/lv_example.py | 0 .../lvgl/lvgl_v8.3/docs/_static/css/custom.css | 0 .../lvgl_v8.3/docs/_static/css/fontawesome.min.css | 0 .../lvgl/lvgl_v8.3/docs/_static/img/home_1.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_2.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_3.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_4.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_5.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_6.png | Bin .../lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg | Bin .../lvgl/lvgl_v8.3/docs/_static/js/custom.js | 0 .../lvgl/lvgl_v8.3/docs/_templates/layout.html | 0 .../lvgl/lvgl_v8.3/docs/_templates/page.html | 0 .../lvgl/lvgl_v8.3/docs/build.py | 0 .../lvgl/lvgl_v8.3/docs/conf.py | 0 .../lvgl/lvgl_v8.3/docs/example_list.py | 0 .../lvgl/lvgl_v8.3/docs/favicon.png | Bin .../lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md | 0 .../lvgl_v8.3/docs/get-started/bindings/index.md | 0 .../docs/get-started/bindings/micropython.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/index.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/os/freertos.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/os/index.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md | 0 .../lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md | 0 .../lvgl_v8.3/docs/get-started/platforms/arduino.md | 0 .../lvgl_v8.3/docs/get-started/platforms/cmake.md | 0 .../docs/get-started/platforms/espressif.md | 0 .../lvgl_v8.3/docs/get-started/platforms/index.md | 0 .../lvgl_v8.3/docs/get-started/platforms/nxp.md | 0 .../docs/get-started/platforms/pc-simulator.md | 0 .../lvgl_v8.3/docs/get-started/platforms/stm32.md | 0 .../docs/get-started/platforms/tasmota-berry.md | 0 .../lvgl_v8.3/docs/get-started/quick-overview.md | 0 .../lvgl/lvgl_v8.3/docs/index.md | 0 .../lvgl/lvgl_v8.3/docs/intro/index.md | 0 .../lvgl/lvgl_v8.3/docs/layouts/flex.md | 0 .../lvgl/lvgl_v8.3/docs/layouts/grid.md | 0 .../lvgl/lvgl_v8.3/docs/layouts/index.md | 0 .../lvgl/lvgl_v8.3/docs/libs/bmp.md | 0 .../lvgl/lvgl_v8.3/docs/libs/ffmpeg.md | 0 .../lvgl/lvgl_v8.3/docs/libs/freetype.md | 0 .../lvgl/lvgl_v8.3/docs/libs/fsdrv.md | 0 .../lvgl/lvgl_v8.3/docs/libs/gif.md | 0 .../lvgl/lvgl_v8.3/docs/libs/index.md | 0 .../lvgl/lvgl_v8.3/docs/libs/png.md | 0 .../lvgl/lvgl_v8.3/docs/libs/qrcode.md | 0 .../lvgl/lvgl_v8.3/docs/libs/rlottie.md | 0 .../lvgl/lvgl_v8.3/docs/libs/sjpg.md | 0 .../lvgl/lvgl_v8.3/docs/logo_lvgl.png | Bin .../lvgl/lvgl_v8.3/docs/misc/align.png | Bin .../lvgl/lvgl_v8.3/docs/misc/anim-timeline.png | Bin .../lvgl/lvgl_v8.3/docs/misc/bidi.png | Bin .../lvgl/lvgl_v8.3/docs/misc/boxmodel.png | Bin .../lvgl/lvgl_v8.3/docs/misc/btn_example.png | Bin .../lvgl_v8.3/docs/misc/button_style_example.gif | Bin .../lvgl_v8.3/docs/misc/button_style_example.png | Bin .../lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg | Bin .../lvgl/lvgl_v8.3/docs/misc/eclipse.jpg | Bin .../lvgl/lvgl_v8.3/docs/misc/layers.png | Bin .../lvgl/lvgl_v8.3/docs/misc/par_child1.png | Bin .../lvgl/lvgl_v8.3/docs/misc/par_child2.png | Bin .../lvgl/lvgl_v8.3/docs/misc/par_child3.png | Bin .../lvgl/lvgl_v8.3/docs/misc/platformio.jpg | Bin .../lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg | Bin .../lvgl_v8.3/docs/misc/simple_button_example.gif | Bin .../lvgl_v8.3/docs/misc/simple_button_example.png | Bin .../lvgl/lvgl_v8.3/docs/misc/symbols.png | Bin .../lvgl/lvgl_v8.3/docs/misc/sys.png | Bin .../lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg | Bin .../lvgl/lvgl_v8.3/docs/others/fragment.md | 0 .../lvgl/lvgl_v8.3/docs/others/gridnav.md | 0 .../lvgl/lvgl_v8.3/docs/others/ime_pinyin.md | 0 .../lvgl/lvgl_v8.3/docs/others/imgfont.md | 0 .../lvgl/lvgl_v8.3/docs/others/index.md | 0 .../lvgl/lvgl_v8.3/docs/others/monkey.md | 0 .../lvgl/lvgl_v8.3/docs/others/msg.md | 0 .../lvgl/lvgl_v8.3/docs/others/snapshot.md | 0 .../lvgl/lvgl_v8.3/docs/overview/animation.md | 0 .../lvgl/lvgl_v8.3/docs/overview/color.md | 0 .../lvgl/lvgl_v8.3/docs/overview/coords.md | 0 .../lvgl/lvgl_v8.3/docs/overview/display.md | 0 .../lvgl/lvgl_v8.3/docs/overview/drawing.md | 0 .../lvgl/lvgl_v8.3/docs/overview/event.md | 0 .../lvgl/lvgl_v8.3/docs/overview/file-system.md | 0 .../lvgl/lvgl_v8.3/docs/overview/font.md | 0 .../lvgl/lvgl_v8.3/docs/overview/image.md | 0 .../lvgl/lvgl_v8.3/docs/overview/indev.md | 0 .../lvgl/lvgl_v8.3/docs/overview/index.md | 0 .../lvgl/lvgl_v8.3/docs/overview/layer.md | 0 .../lvgl/lvgl_v8.3/docs/overview/new_widget.md | 0 .../lvgl/lvgl_v8.3/docs/overview/object.md | 0 .../lvgl_v8.3/docs/overview/renderers/arm-2d.md | 0 .../lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md | 0 .../lvgl/lvgl_v8.3/docs/overview/renderers/index.md | 0 .../lvgl_v8.3/docs/overview/renderers/pxp-vglite.md | 0 .../lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md | 0 .../lvgl/lvgl_v8.3/docs/overview/renderers/sw.md | 0 .../lvgl/lvgl_v8.3/docs/overview/scroll.md | 0 .../lvgl/lvgl_v8.3/docs/overview/style-props.md | 0 .../lvgl/lvgl_v8.3/docs/overview/style.md | 0 .../lvgl/lvgl_v8.3/docs/overview/timer.md | 0 .../lvgl/lvgl_v8.3/docs/porting/display.md | 0 .../lvgl/lvgl_v8.3/docs/porting/gpu.md | 0 .../lvgl/lvgl_v8.3/docs/porting/indev.md | 0 .../lvgl/lvgl_v8.3/docs/porting/index.md | 0 .../lvgl/lvgl_v8.3/docs/porting/log.md | 0 .../lvgl/lvgl_v8.3/docs/porting/os.md | 0 .../lvgl/lvgl_v8.3/docs/porting/project.md | 0 .../lvgl/lvgl_v8.3/docs/porting/sleep.md | 0 .../lvgl/lvgl_v8.3/docs/porting/tick.md | 0 .../lvgl/lvgl_v8.3/docs/porting/timer-handler.md | 0 .../lvgl/lvgl_v8.3/docs/requirements.txt | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/arc.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/bar.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/btn.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/canvas.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/img.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/index.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/label.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/line.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/roller.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/slider.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/switch.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/table.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/core/textarea.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/chart.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/index.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/led.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/list.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/menu.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/meter.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/span.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/extra/win.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/index.md | 0 .../lvgl/lvgl_v8.3/docs/widgets/obj.md | 0 .../lvgl/lvgl_v8.3/env_support/cmake/custom.cmake | 0 .../lvgl/lvgl_v8.3/env_support/cmake/esp.cmake | 0 .../lvgl_v8.3/env_support/cmake/micropython.cmake | 0 .../lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake | 0 .../env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack | Bin .../lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc | 0 .../lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx | 0 .../lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md | 0 .../lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh | 0 .../env_support/cmsis-pack/lv_cmsis_pack.txt | 0 .../env_support/cmsis-pack/lv_conf_cmsis.h | 0 .../lvgl/lvgl_v8.3/env_support/rt-thread/SConscript | 0 .../env_support/rt-thread/lv_rt_thread_conf.h | 0 .../env_support/rt-thread/lv_rt_thread_port.c | 0 .../env_support/rt-thread/squareline/README.md | 0 .../env_support/rt-thread/squareline/SConscript | 0 .../rt-thread/squareline/ui/lv_ui_entry.c | 0 .../lvgl/lvgl_v8.3/env_support/zephyr/module.yml | 0 .../lvgl/lvgl_v8.3/examples/anim/index.rst | 0 .../lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_1.c | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_1.py | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_2.c | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_2.py | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_3.c | 0 .../lvgl_v8.3/examples/anim/lv_example_anim_3.py | 0 .../examples/anim/lv_example_anim_timeline_1.c | 0 .../examples/anim/lv_example_anim_timeline_1.py | 0 .../examples/arduino/LVGL_Arduino/LVGL_Arduino.ino | 0 .../lvgl/lvgl_v8.3/examples/assets/animimg001.c | 0 .../lvgl/lvgl_v8.3/examples/assets/animimg001.png | Bin .../lvgl/lvgl_v8.3/examples/assets/animimg002.c | 0 .../lvgl/lvgl_v8.3/examples/assets/animimg002.png | Bin .../lvgl/lvgl_v8.3/examples/assets/animimg003.c | 0 .../lvgl/lvgl_v8.3/examples/assets/animimg003.png | Bin .../lvgl/lvgl_v8.3/examples/assets/caret_down.png | Bin .../lvgl/lvgl_v8.3/examples/assets/emoji/F600.png | Bin .../examples/assets/emoji/img_emoji_F617.c | 0 .../examples/assets/font/lv_font_simsun_16_cjk.fnt | Bin .../examples/assets/font/montserrat-16.fnt | Bin .../examples/assets/font/montserrat-22.fnt | Bin .../lvgl/lvgl_v8.3/examples/assets/img_caret_down.c | 0 .../lvgl_v8.3/examples/assets/img_caret_down.png | Bin .../examples/assets/img_cogwheel_alpha16.c | 0 .../lvgl_v8.3/examples/assets/img_cogwheel_argb.c | 0 .../lvgl_v8.3/examples/assets/img_cogwheel_argb.png | Bin .../examples/assets/img_cogwheel_chroma_keyed.c | 0 .../examples/assets/img_cogwheel_chroma_keyed.png | Bin .../examples/assets/img_cogwheel_indexed16.c | 0 .../examples/assets/img_cogwheel_indexed16.png | Bin .../lvgl_v8.3/examples/assets/img_cogwheel_rgb.c | 0 .../lvgl_v8.3/examples/assets/img_cogwheel_rgb.png | Bin .../lvgl/lvgl_v8.3/examples/assets/img_hand.c | 0 .../lvgl_v8.3/examples/assets/img_hand_hour.png | Bin .../lvgl/lvgl_v8.3/examples/assets/img_hand_min.png | Bin .../lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c | 0 .../lvgl_v8.3/examples/assets/img_skew_strip.png | Bin .../assets/img_skew_strip_80x20_argb8888.fnt | Bin .../lvgl/lvgl_v8.3/examples/assets/img_star.c | 0 .../lvgl/lvgl_v8.3/examples/assets/img_star.png | Bin .../lvgl/lvgl_v8.3/examples/assets/img_strip.png | Bin .../lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c | 0 .../lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png | Bin .../lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c | 0 .../lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png | Bin .../lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c | 0 .../lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png | Bin .../lvgl/lvgl_v8.3/examples/event/index.rst | 0 .../lvgl_v8.3/examples/event/lv_example_event.h | 0 .../lvgl_v8.3/examples/event/lv_example_event_1.c | 0 .../lvgl_v8.3/examples/event/lv_example_event_1.py | 0 .../lvgl_v8.3/examples/event/lv_example_event_2.c | 0 .../lvgl_v8.3/examples/event/lv_example_event_2.py | 0 .../lvgl_v8.3/examples/event/lv_example_event_3.c | 0 .../lvgl_v8.3/examples/event/lv_example_event_3.py | 0 .../lvgl_v8.3/examples/event/lv_example_event_4.c | 0 .../lvgl/lvgl_v8.3/examples/get_started/index.rst | 0 .../examples/get_started/lv_example_get_started.h | 0 .../examples/get_started/lv_example_get_started_1.c | 0 .../get_started/lv_example_get_started_1.py | 0 .../examples/get_started/lv_example_get_started_2.c | 0 .../get_started/lv_example_get_started_2.py | 0 .../examples/get_started/lv_example_get_started_3.c | 0 .../get_started/lv_example_get_started_3.py | 0 .../lvgl/lvgl_v8.3/examples/header.py | 0 .../lvgl/lvgl_v8.3/examples/layouts/flex/index.rst | 0 .../examples/layouts/flex/lv_example_flex.h | 0 .../examples/layouts/flex/lv_example_flex_1.c | 0 .../examples/layouts/flex/lv_example_flex_1.py | 0 .../examples/layouts/flex/lv_example_flex_2.c | 0 .../examples/layouts/flex/lv_example_flex_2.py | 0 .../examples/layouts/flex/lv_example_flex_3.c | 0 .../examples/layouts/flex/lv_example_flex_3.py | 0 .../examples/layouts/flex/lv_example_flex_4.c | 0 .../examples/layouts/flex/lv_example_flex_4.py | 0 .../examples/layouts/flex/lv_example_flex_5.c | 0 .../examples/layouts/flex/lv_example_flex_5.py | 0 .../examples/layouts/flex/lv_example_flex_6.c | 0 .../examples/layouts/flex/lv_example_flex_6.py | 0 .../lvgl/lvgl_v8.3/examples/layouts/grid/index.rst | 0 .../examples/layouts/grid/lv_example_grid.h | 0 .../examples/layouts/grid/lv_example_grid_1.c | 0 .../examples/layouts/grid/lv_example_grid_1.py | 0 .../examples/layouts/grid/lv_example_grid_2.c | 0 .../examples/layouts/grid/lv_example_grid_2.py | 0 .../examples/layouts/grid/lv_example_grid_3.c | 0 .../examples/layouts/grid/lv_example_grid_3.py | 0 .../examples/layouts/grid/lv_example_grid_4.c | 0 .../examples/layouts/grid/lv_example_grid_4.py | 0 .../examples/layouts/grid/lv_example_grid_5.c | 0 .../examples/layouts/grid/lv_example_grid_5.py | 0 .../examples/layouts/grid/lv_example_grid_6.c | 0 .../examples/layouts/grid/lv_example_grid_6.py | 0 .../lvgl_v8.3/examples/layouts/lv_example_layout.h | 0 .../lvgl_v8.3/examples/libs/bmp/example_16bit.bmp | Bin .../lvgl_v8.3/examples/libs/bmp/example_24bit.bmp | Bin .../lvgl_v8.3/examples/libs/bmp/example_32bit.bmp | Bin .../lvgl/lvgl_v8.3/examples/libs/bmp/index.rst | 0 .../lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h | 0 .../lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c | 0 .../lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py | 0 .../lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 | Bin .../lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png | Bin .../lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst | 0 .../examples/libs/ffmpeg/lv_example_ffmpeg.h | 0 .../examples/libs/ffmpeg/lv_example_ffmpeg_1.c | 0 .../examples/libs/ffmpeg/lv_example_ffmpeg_2.c | 0 .../examples/libs/freetype/Lato-Regular.ttf | Bin .../lvgl/lvgl_v8.3/examples/libs/freetype/index.rst | 0 .../examples/libs/freetype/lv_example_freetype.h | 0 .../examples/libs/freetype/lv_example_freetype_1.c | 0 .../examples/libs/freetype/lv_example_freetype_1.py | 0 .../lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif | Bin .../lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c | 0 .../lvgl_v8.3/examples/libs/gif/img_bulb_gif.py | 0 .../lvgl/lvgl_v8.3/examples/libs/gif/index.rst | 0 .../lvgl_v8.3/examples/libs/gif/lv_example_gif.h | 0 .../lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c | 0 .../lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py | 0 .../lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h | 0 .../lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c | 0 .../lvgl_v8.3/examples/libs/png/img_wink_png.py | 0 .../lvgl/lvgl_v8.3/examples/libs/png/index.rst | 0 .../lvgl_v8.3/examples/libs/png/lv_example_png.h | 0 .../lvgl_v8.3/examples/libs/png/lv_example_png_1.c | 0 .../lvgl_v8.3/examples/libs/png/lv_example_png_1.py | 0 .../lvgl/lvgl_v8.3/examples/libs/png/wink.png | Bin .../lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst | 0 .../examples/libs/qrcode/lv_example_qrcode.h | 0 .../examples/libs/qrcode/lv_example_qrcode_1.c | 0 .../examples/libs/qrcode/lv_example_qrcode_1.py | 0 .../lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst | 0 .../examples/libs/rlottie/lv_example_rlottie.h | 0 .../examples/libs/rlottie/lv_example_rlottie_1.c | 0 .../examples/libs/rlottie/lv_example_rlottie_1.py | 0 .../examples/libs/rlottie/lv_example_rlottie_2.c | 0 .../examples/libs/rlottie/lv_example_rlottie_2.py | 0 .../libs/rlottie/lv_example_rlottie_approve.c | 0 .../libs/rlottie/lv_example_rlottie_approve.json | 0 .../libs/rlottie/lv_example_rlottie_approve.py | 0 .../lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst | 0 .../lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h | 0 .../examples/libs/sjpg/lv_example_sjpg_1.c | 0 .../examples/libs/sjpg/lv_example_sjpg_1.py | 0 .../lvgl_v8.3/examples/libs/sjpg/small_image.sjpg | Bin .../lvgl/lvgl_v8.3/examples/lv_examples.h | 0 .../lvgl/lvgl_v8.3/examples/lv_examples.mk | 0 .../lvgl_v8.3/examples/others/fragment/index.rst | 0 .../examples/others/fragment/lv_example_fragment.h | 0 .../others/fragment/lv_example_fragment_1.c | 0 .../others/fragment/lv_example_fragment_2.c | 0 .../lvgl_v8.3/examples/others/gridnav/index.rst | 0 .../examples/others/gridnav/lv_example_gridnav.h | 0 .../examples/others/gridnav/lv_example_gridnav_1.c | 0 .../examples/others/gridnav/lv_example_gridnav_2.c | 0 .../examples/others/gridnav/lv_example_gridnav_3.c | 0 .../examples/others/gridnav/lv_example_gridnav_4.c | 0 .../lvgl/lvgl_v8.3/examples/others/ime/index.rst | 0 .../examples/others/ime/lv_example_ime_pinyin.h | 0 .../examples/others/ime/lv_example_ime_pinyin_1.c | 0 .../examples/others/ime/lv_example_ime_pinyin_2.c | 0 .../lvgl_v8.3/examples/others/imgfont/index.rst | 0 .../examples/others/imgfont/lv_example_imgfont.h | 0 .../examples/others/imgfont/lv_example_imgfont_1.c | 0 .../lvgl_v8.3/examples/others/lv_example_others.h | 0 .../lvgl/lvgl_v8.3/examples/others/monkey/index.rst | 0 .../examples/others/monkey/lv_example_monkey.h | 0 .../examples/others/monkey/lv_example_monkey_1.c | 0 .../examples/others/monkey/lv_example_monkey_2.c | 0 .../examples/others/monkey/lv_example_monkey_3.c | 0 .../lvgl/lvgl_v8.3/examples/others/msg/index.rst | 0 .../lvgl_v8.3/examples/others/msg/lv_example_msg.h | 0 .../examples/others/msg/lv_example_msg_1.c | 0 .../examples/others/msg/lv_example_msg_2.c | 0 .../examples/others/msg/lv_example_msg_3.c | 0 .../lvgl_v8.3/examples/others/snapshot/index.rst | 0 .../examples/others/snapshot/lv_example_snapshot.h | 0 .../others/snapshot/lv_example_snapshot_1.c | 0 .../others/snapshot/lv_example_snapshot_1.py | 0 .../examples/porting/lv_port_disp_template.c | 0 .../examples/porting/lv_port_disp_template.h | 0 .../examples/porting/lv_port_fs_template.c | 0 .../examples/porting/lv_port_fs_template.h | 0 .../examples/porting/lv_port_indev_template.c | 0 .../examples/porting/lv_port_indev_template.h | 0 .../lvgl/lvgl_v8.3/examples/scroll/index.rst | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll.h | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_1.c | 0 .../examples/scroll/lv_example_scroll_1.py | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_2.c | 0 .../examples/scroll/lv_example_scroll_2.py | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_3.c | 0 .../examples/scroll/lv_example_scroll_3.py | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_4.c | 0 .../examples/scroll/lv_example_scroll_4.py | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_5.c | 0 .../examples/scroll/lv_example_scroll_5.py | 0 .../lvgl_v8.3/examples/scroll/lv_example_scroll_6.c | 0 .../examples/scroll/lv_example_scroll_6.py | 0 .../lvgl/lvgl_v8.3/examples/styles/index.rst | 0 .../lvgl_v8.3/examples/styles/lv_example_style.h | 0 .../lvgl_v8.3/examples/styles/lv_example_style_1.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_1.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_10.c | 0 .../examples/styles/lv_example_style_10.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_11.c | 0 .../examples/styles/lv_example_style_11.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_12.c | 0 .../examples/styles/lv_example_style_12.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_13.c | 0 .../examples/styles/lv_example_style_13.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_14.c | 0 .../examples/styles/lv_example_style_14.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_15.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_2.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_2.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_3.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_3.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_4.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_4.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_5.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_5.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_6.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_6.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_7.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_7.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_8.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_8.py | 0 .../lvgl_v8.3/examples/styles/lv_example_style_9.c | 0 .../lvgl_v8.3/examples/styles/lv_example_style_9.py | 0 .../lvgl/lvgl_v8.3/examples/test_ex.sh | 0 .../lvgl_v8.3/examples/widgets/animimg/index.rst | 0 .../examples/widgets/animimg/lv_example_animimg_1.c | 0 .../widgets/animimg/lv_example_animimg_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/arc/index.rst | 0 .../examples/widgets/arc/lv_example_arc_1.c | 0 .../examples/widgets/arc/lv_example_arc_1.py | 0 .../examples/widgets/arc/lv_example_arc_2.c | 0 .../examples/widgets/arc/lv_example_arc_2.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/bar/index.rst | 0 .../examples/widgets/bar/lv_example_bar_1.c | 0 .../examples/widgets/bar/lv_example_bar_1.py | 0 .../examples/widgets/bar/lv_example_bar_2.c | 0 .../examples/widgets/bar/lv_example_bar_2.py | 0 .../examples/widgets/bar/lv_example_bar_3.c | 0 .../examples/widgets/bar/lv_example_bar_3.py | 0 .../examples/widgets/bar/lv_example_bar_4.c | 0 .../examples/widgets/bar/lv_example_bar_4.py | 0 .../examples/widgets/bar/lv_example_bar_5.c | 0 .../examples/widgets/bar/lv_example_bar_5.py | 0 .../examples/widgets/bar/lv_example_bar_6.c | 0 .../examples/widgets/bar/lv_example_bar_6.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/bar/test.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/btn/index.rst | 0 .../examples/widgets/btn/lv_example_btn_1.c | 0 .../examples/widgets/btn/lv_example_btn_1.py | 0 .../examples/widgets/btn/lv_example_btn_2.c | 0 .../examples/widgets/btn/lv_example_btn_2.py | 0 .../examples/widgets/btn/lv_example_btn_3.c | 0 .../examples/widgets/btn/lv_example_btn_3.py | 0 .../lvgl_v8.3/examples/widgets/btnmatrix/index.rst | 0 .../widgets/btnmatrix/lv_example_btnmatrix_1.c | 0 .../widgets/btnmatrix/lv_example_btnmatrix_1.py | 0 .../widgets/btnmatrix/lv_example_btnmatrix_2.c | 0 .../widgets/btnmatrix/lv_example_btnmatrix_2.py | 0 .../widgets/btnmatrix/lv_example_btnmatrix_3.c | 0 .../widgets/btnmatrix/lv_example_btnmatrix_3.py | 0 .../lvgl_v8.3/examples/widgets/calendar/index.rst | 0 .../widgets/calendar/lv_example_calendar_1.c | 0 .../widgets/calendar/lv_example_calendar_1.py | 0 .../lvgl_v8.3/examples/widgets/canvas/index.rst | 0 .../examples/widgets/canvas/lv_example_canvas_1.c | 0 .../examples/widgets/canvas/lv_example_canvas_1.py | 0 .../examples/widgets/canvas/lv_example_canvas_2.c | 0 .../examples/widgets/canvas/lv_example_canvas_2.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/chart/index.rst | 0 .../examples/widgets/chart/lv_example_chart_1.c | 0 .../examples/widgets/chart/lv_example_chart_1.py | 0 .../examples/widgets/chart/lv_example_chart_2.c | 0 .../examples/widgets/chart/lv_example_chart_2.py | 0 .../examples/widgets/chart/lv_example_chart_3.c | 0 .../examples/widgets/chart/lv_example_chart_3.py | 0 .../examples/widgets/chart/lv_example_chart_4.c | 0 .../examples/widgets/chart/lv_example_chart_4.py | 0 .../examples/widgets/chart/lv_example_chart_5.c | 0 .../examples/widgets/chart/lv_example_chart_5.py | 0 .../examples/widgets/chart/lv_example_chart_6.c | 0 .../examples/widgets/chart/lv_example_chart_6.py | 0 .../examples/widgets/chart/lv_example_chart_7.c | 0 .../examples/widgets/chart/lv_example_chart_7.py | 0 .../examples/widgets/chart/lv_example_chart_8.c | 0 .../examples/widgets/chart/lv_example_chart_8.py | 0 .../examples/widgets/chart/lv_example_chart_9.c | 0 .../examples/widgets/chart/lv_example_chart_9.py | 0 .../lvgl_v8.3/examples/widgets/checkbox/index.rst | 0 .../widgets/checkbox/lv_example_checkbox_1.c | 0 .../widgets/checkbox/lv_example_checkbox_1.py | 0 .../widgets/checkbox/lv_example_checkbox_2.c | 0 .../lvgl_v8.3/examples/widgets/colorwheel/index.rst | 0 .../widgets/colorwheel/lv_example_colorwheel_1.c | 0 .../widgets/colorwheel/lv_example_colorwheel_1.py | 0 .../lvgl_v8.3/examples/widgets/dropdown/index.rst | 0 .../widgets/dropdown/lv_example_dropdown_1.c | 0 .../widgets/dropdown/lv_example_dropdown_1.py | 0 .../widgets/dropdown/lv_example_dropdown_2.c | 0 .../widgets/dropdown/lv_example_dropdown_2.py | 0 .../widgets/dropdown/lv_example_dropdown_3.c | 0 .../widgets/dropdown/lv_example_dropdown_3.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/img/index.rst | 0 .../examples/widgets/img/lv_example_img_1.c | 0 .../examples/widgets/img/lv_example_img_1.py | 0 .../examples/widgets/img/lv_example_img_2.c | 0 .../examples/widgets/img/lv_example_img_2.py | 0 .../examples/widgets/img/lv_example_img_3.c | 0 .../examples/widgets/img/lv_example_img_3.py | 0 .../examples/widgets/img/lv_example_img_4.c | 0 .../examples/widgets/img/lv_example_img_4.py | 0 .../lvgl_v8.3/examples/widgets/imgbtn/index.rst | 0 .../examples/widgets/imgbtn/lv_example_imgbtn_1.c | 0 .../examples/widgets/imgbtn/lv_example_imgbtn_1.py | 0 .../lvgl_v8.3/examples/widgets/keyboard/index.rst | 0 .../widgets/keyboard/lv_example_keyboard_1.c | 0 .../widgets/keyboard/lv_example_keyboard_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/label/index.rst | 0 .../examples/widgets/label/lv_example_label_1.c | 0 .../examples/widgets/label/lv_example_label_1.py | 0 .../examples/widgets/label/lv_example_label_2.c | 0 .../examples/widgets/label/lv_example_label_2.py | 0 .../examples/widgets/label/lv_example_label_3.c | 0 .../examples/widgets/label/lv_example_label_3.py | 0 .../examples/widgets/label/lv_example_label_4.c | 0 .../examples/widgets/label/lv_example_label_5.c | 0 .../examples/widgets/label/lv_example_label_5.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/led/index.rst | 0 .../examples/widgets/led/lv_example_led_1.c | 0 .../examples/widgets/led/lv_example_led_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/line/index.rst | 0 .../examples/widgets/line/lv_example_line_1.c | 0 .../examples/widgets/line/lv_example_line_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/list/index.rst | 0 .../examples/widgets/list/lv_example_list_1.c | 0 .../examples/widgets/list/lv_example_list_1.py | 0 .../examples/widgets/list/lv_example_list_2.c | 0 .../examples/widgets/list/lv_example_list_2.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/list/test.py | 0 .../lvgl_v8.3/examples/widgets/lv_example_widgets.h | 0 .../lvgl/lvgl_v8.3/examples/widgets/menu/index.rst | 0 .../examples/widgets/menu/lv_example_menu_1.c | 0 .../examples/widgets/menu/lv_example_menu_1.py | 0 .../examples/widgets/menu/lv_example_menu_2.c | 0 .../examples/widgets/menu/lv_example_menu_2.py | 0 .../examples/widgets/menu/lv_example_menu_3.c | 0 .../examples/widgets/menu/lv_example_menu_3.py | 0 .../examples/widgets/menu/lv_example_menu_4.c | 0 .../examples/widgets/menu/lv_example_menu_4.py | 0 .../examples/widgets/menu/lv_example_menu_5.c | 0 .../lvgl/lvgl_v8.3/examples/widgets/meter/index.rst | 0 .../examples/widgets/meter/lv_example_meter_1.c | 0 .../examples/widgets/meter/lv_example_meter_1.py | 0 .../examples/widgets/meter/lv_example_meter_2.c | 0 .../examples/widgets/meter/lv_example_meter_2.py | 0 .../examples/widgets/meter/lv_example_meter_3.c | 0 .../examples/widgets/meter/lv_example_meter_3.py | 0 .../examples/widgets/meter/lv_example_meter_4.c | 0 .../examples/widgets/meter/lv_example_meter_4.py | 0 .../lvgl_v8.3/examples/widgets/msgbox/index.rst | 0 .../examples/widgets/msgbox/lv_example_msgbox_1.c | 0 .../examples/widgets/msgbox/lv_example_msgbox_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/obj/index.rst | 0 .../examples/widgets/obj/lv_example_obj_1.c | 0 .../examples/widgets/obj/lv_example_obj_1.py | 0 .../examples/widgets/obj/lv_example_obj_2.c | 0 .../examples/widgets/obj/lv_example_obj_2.py | 0 .../lvgl_v8.3/examples/widgets/roller/index.rst | 0 .../examples/widgets/roller/lv_example_roller_1.c | 0 .../examples/widgets/roller/lv_example_roller_1.py | 0 .../examples/widgets/roller/lv_example_roller_2.c | 0 .../examples/widgets/roller/lv_example_roller_2.py | 0 .../examples/widgets/roller/lv_example_roller_3.c | 0 .../examples/widgets/roller/lv_example_roller_3.py | 0 .../lvgl_v8.3/examples/widgets/slider/index.rst | 0 .../examples/widgets/slider/lv_example_slider_1.c | 0 .../examples/widgets/slider/lv_example_slider_1.py | 0 .../examples/widgets/slider/lv_example_slider_2.c | 0 .../examples/widgets/slider/lv_example_slider_2.py | 0 .../examples/widgets/slider/lv_example_slider_3.c | 0 .../examples/widgets/slider/lv_example_slider_3.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/span/index.rst | 0 .../examples/widgets/span/lv_example_span_1.c | 0 .../examples/widgets/span/lv_example_span_1.py | 0 .../lvgl_v8.3/examples/widgets/spinbox/index.rst | 0 .../examples/widgets/spinbox/lv_example_spinbox_1.c | 0 .../widgets/spinbox/lv_example_spinbox_1.py | 0 .../lvgl_v8.3/examples/widgets/spinner/index.rst | 0 .../examples/widgets/spinner/lv_example_spinner_1.c | 0 .../widgets/spinner/lv_example_spinner_1.py | 0 .../lvgl_v8.3/examples/widgets/switch/index.rst | 0 .../examples/widgets/switch/lv_example_switch_1.c | 0 .../examples/widgets/switch/lv_example_switch_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/table/index.rst | 0 .../examples/widgets/table/lv_example_table_1.c | 0 .../examples/widgets/table/lv_example_table_1.py | 0 .../examples/widgets/table/lv_example_table_2.c | 0 .../examples/widgets/table/lv_example_table_2.py | 0 .../lvgl_v8.3/examples/widgets/tabview/index.rst | 0 .../examples/widgets/tabview/lv_example_tabview_1.c | 0 .../widgets/tabview/lv_example_tabview_1.py | 0 .../examples/widgets/tabview/lv_example_tabview_2.c | 0 .../widgets/tabview/lv_example_tabview_2.py | 0 .../lvgl_v8.3/examples/widgets/textarea/index.rst | 0 .../widgets/textarea/lv_example_textarea_1.c | 0 .../widgets/textarea/lv_example_textarea_1.py | 0 .../widgets/textarea/lv_example_textarea_2.c | 0 .../widgets/textarea/lv_example_textarea_2.py | 0 .../widgets/textarea/lv_example_textarea_3.c | 0 .../widgets/textarea/lv_example_textarea_3.py | 0 .../lvgl_v8.3/examples/widgets/tileview/index.rst | 0 .../widgets/tileview/lv_example_tileview_1.c | 0 .../widgets/tileview/lv_example_tileview_1.py | 0 .../lvgl/lvgl_v8.3/examples/widgets/win/index.rst | 0 .../examples/widgets/win/lv_example_win_1.c | 0 .../examples/widgets/win/lv_example_win_1.py | 0 .../lvgl/lvgl_v8.3/idf_component.yml | 0 .../lvgl/lvgl_v8.3/library.json | 0 .../lvgl/lvgl_v8.3/library.properties | 0 .../lvgl/lvgl_v8.3/lv_conf_template.h | 0 .../lvgl/lvgl_v8.3/lvgl.h | 0 .../lvgl/lvgl_v8.3/lvgl.mk | 0 .../lvgl/lvgl_v8.3/scripts/.gitignore | 0 .../lvgl/lvgl_v8.3/scripts/Doxyfile | 0 .../lvgl/lvgl_v8.3/scripts/build_html_examples.sh | 0 .../lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf | Bin .../FontAwesome5-Solid+Brands+Regular.woff | Bin .../scripts/built_in_font/Montserrat-Medium.ttf | Bin .../lvgl_v8.3/scripts/built_in_font/SimSun.woff | Bin .../scripts/built_in_font/built_in_font_gen.py | 0 .../lvgl_v8.3/scripts/built_in_font/generate_all.py | 0 .../lvgl_v8.3/scripts/built_in_font/unscii-8.ttf | Bin .../lvgl/lvgl_v8.3/scripts/changelog-template.hbs | 0 .../lvgl/lvgl_v8.3/scripts/changelog_gen.sh | 0 .../lvgl/lvgl_v8.3/scripts/code-format.cfg | 0 .../lvgl/lvgl_v8.3/scripts/code-format.py | 0 .../lvgl/lvgl_v8.3/scripts/cppcheck_run.sh | 0 .../lvgl/lvgl_v8.3/scripts/filetohex.py | 0 .../lvgl/lvgl_v8.3/scripts/find_version.sh | 0 .../lvgl/lvgl_v8.3/scripts/genexamplelist.sh | 0 .../lvgl/lvgl_v8.3/scripts/infer_run.sh | 0 .../lvgl/lvgl_v8.3/scripts/install-prerequisites.sh | 0 .../lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py | 0 .../lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py | 0 .../lvgl/lvgl_v8.3/scripts/release/com.py | 0 .../lvgl/lvgl_v8.3/scripts/release/commits.txt | 0 .../lvgl/lvgl_v8.3/scripts/release/patch.py | 0 .../lvgl/lvgl_v8.3/scripts/release/release.py | 0 .../lvgl/lvgl_v8.3/scripts/style_api_gen.py | 0 .../lvgl/lvgl_v8.3/src/Makefile | 0 .../lvgl/lvgl_v8.3/src/core/Makefile | 0 .../lvgl/lvgl_v8.3/src/core/lv_core.mk | 0 .../lvgl/lvgl_v8.3/src/core/lv_disp.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_disp.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_event.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_event.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_group.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_group.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_indev.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_indev.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_class.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_class.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_draw.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_draw.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_pos.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_pos.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_style.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_style.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_tree.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_obj_tree.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_refr.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_refr.h | 0 .../lvgl/lvgl_v8.3/src/core/lv_theme.c | 0 .../lvgl/lvgl_v8.3/src/core/lv_theme.h | 0 .../lvgl/lvgl_v8.3/src/draw/Makefile | 0 .../lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk | 0 .../lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c | 0 .../lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw.mk | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_img.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_img.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_label.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_label.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_line.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_line.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_buf.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_buf.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_cache.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_cache.h | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c | 0 .../lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h | 0 .../lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk | 0 .../lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c | 0 .../lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c | 0 .../lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h | 0 .../src/draw/nxp/vglite/lv_draw_nxp_vglite.mk | 0 .../src/draw/nxp/vglite/lv_draw_vglite_arc.c | 0 .../src/draw/nxp/vglite/lv_draw_vglite_arc.h | 0 .../src/draw/nxp/vglite/lv_draw_vglite_blend.c | 0 .../src/draw/nxp/vglite/lv_draw_vglite_blend.h | 0 .../src/draw/nxp/vglite/lv_draw_vglite_rect.c | 0 .../src/draw/nxp/vglite/lv_draw_vglite_rect.h | 0 .../src/draw/nxp/vglite/lv_gpu_nxp_vglite.c | 0 .../src/draw/nxp/vglite/lv_gpu_nxp_vglite.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/README.md | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c | 0 .../lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c | 0 .../lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h | 0 .../lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h | 0 .../lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c | 0 .../lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h | 0 .../src/draw/sdl/lv_draw_sdl_texture_cache.c | 0 .../src/draw/sdl/lv_draw_sdl_texture_cache.h | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c | 0 .../lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h | 0 .../src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk | 0 .../src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c | 0 .../src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h | 0 .../lvgl/lvgl_v8.3/src/draw/sw/Makefile | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h | 0 .../lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c | 0 .../lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c | 0 .../lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c | 0 .../lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c | 0 .../src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk | 0 .../src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c | 0 .../src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h | 0 .../lvgl/lvgl_v8.3/src/extra/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/README.md | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h | 0 .../lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile | 0 .../lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c | 0 .../lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile | 0 .../lvgl_v8.3/src/extra/libs/freetype/arial.ttf | Bin .../lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c | 0 .../lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile | 0 .../lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c | 0 .../lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c | 0 .../lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c | 0 .../lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/png/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile | 0 .../lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c | 0 .../lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h | 0 .../lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c | 0 .../lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile | 0 .../lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c | 0 .../lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h | 0 .../lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h | 0 .../lvgl/lvgl_v8.3/src/extra/lv_extra.c | 0 .../lvgl/lvgl_v8.3/src/extra/lv_extra.h | 0 .../lvgl/lvgl_v8.3/src/extra/lv_extra.mk | 0 .../lvgl/lvgl_v8.3/src/extra/others/Makefile | 0 .../lvgl_v8.3/src/extra/others/fragment/Makefile | 0 .../lvgl_v8.3/src/extra/others/fragment/README.md | 0 .../src/extra/others/fragment/lv_fragment.c | 0 .../src/extra/others/fragment/lv_fragment.h | 0 .../src/extra/others/fragment/lv_fragment_manager.c | 0 .../lvgl_v8.3/src/extra/others/gridnav/Makefile | 0 .../lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c | 0 .../lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h | 0 .../lvgl/lvgl_v8.3/src/extra/others/ime/Makefile | 0 .../lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c | 0 .../lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h | 0 .../lvgl_v8.3/src/extra/others/imgfont/Makefile | 0 .../lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c | 0 .../lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h | 0 .../lvgl/lvgl_v8.3/src/extra/others/lv_others.h | 0 .../lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile | 0 .../lvgl_v8.3/src/extra/others/monkey/lv_monkey.c | 0 .../lvgl_v8.3/src/extra/others/monkey/lv_monkey.h | 0 .../lvgl/lvgl_v8.3/src/extra/others/msg/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c | 0 .../lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h | 0 .../lvgl_v8.3/src/extra/others/snapshot/Makefile | 0 .../src/extra/others/snapshot/lv_snapshot.c | 0 .../src/extra/others/snapshot/lv_snapshot.h | 0 .../lvgl/lvgl_v8.3/src/extra/themes/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile | 0 .../src/extra/themes/basic/lv_theme_basic.c | 0 .../src/extra/themes/basic/lv_theme_basic.h | 0 .../lvgl_v8.3/src/extra/themes/default/Makefile | 0 .../src/extra/themes/default/lv_theme_default.c | 0 .../src/extra/themes/default/lv_theme_default.h | 0 .../lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h | 0 .../lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile | 0 .../lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c | 0 .../lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/Makefile | 0 .../lvgl_v8.3/src/extra/widgets/animimg/Makefile | 0 .../src/extra/widgets/animimg/lv_animimg.c | 0 .../src/extra/widgets/animimg/lv_animimg.h | 0 .../lvgl_v8.3/src/extra/widgets/calendar/Makefile | 0 .../src/extra/widgets/calendar/lv_calendar.c | 0 .../src/extra/widgets/calendar/lv_calendar.h | 0 .../widgets/calendar/lv_calendar_header_arrow.c | 0 .../widgets/calendar/lv_calendar_header_arrow.h | 0 .../widgets/calendar/lv_calendar_header_dropdown.c | 0 .../widgets/calendar/lv_calendar_header_dropdown.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile | 0 .../lvgl_v8.3/src/extra/widgets/chart/lv_chart.c | 0 .../lvgl_v8.3/src/extra/widgets/chart/lv_chart.h | 0 .../lvgl_v8.3/src/extra/widgets/colorwheel/Makefile | 0 .../src/extra/widgets/colorwheel/lv_colorwheel.c | 0 .../src/extra/widgets/colorwheel/lv_colorwheel.h | 0 .../lvgl_v8.3/src/extra/widgets/imgbtn/Makefile | 0 .../lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c | 0 .../lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h | 0 .../lvgl_v8.3/src/extra/widgets/keyboard/Makefile | 0 .../src/extra/widgets/keyboard/lv_keyboard.c | 0 .../src/extra/widgets/keyboard/lv_keyboard.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile | 0 .../lvgl_v8.3/src/extra/widgets/meter/lv_meter.c | 0 .../lvgl_v8.3/src/extra/widgets/meter/lv_meter.h | 0 .../lvgl_v8.3/src/extra/widgets/msgbox/Makefile | 0 .../lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c | 0 .../lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h | 0 .../lvgl_v8.3/src/extra/widgets/spinbox/Makefile | 0 .../src/extra/widgets/spinbox/lv_spinbox.c | 0 .../src/extra/widgets/spinbox/lv_spinbox.h | 0 .../lvgl_v8.3/src/extra/widgets/spinner/Makefile | 0 .../src/extra/widgets/spinner/lv_spinner.c | 0 .../src/extra/widgets/spinner/lv_spinner.h | 0 .../lvgl_v8.3/src/extra/widgets/tabview/Makefile | 0 .../src/extra/widgets/tabview/lv_tabview.c | 0 .../src/extra/widgets/tabview/lv_tabview.h | 0 .../lvgl_v8.3/src/extra/widgets/tileview/Makefile | 0 .../src/extra/widgets/tileview/lv_tileview.c | 0 .../src/extra/widgets/tileview/lv_tileview.h | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c | 0 .../lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h | 0 .../lvgl/lvgl_v8.3/src/font/Makefile | 0 .../lvgl/lvgl_v8.3/src/font/korean.ttf | Bin .../lvgl/lvgl_v8.3/src/font/lv_font.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font.h | 0 .../lvgl/lvgl_v8.3/src/font/lv_font.mk | 0 .../src/font/lv_font_dejavu_16_persian_hebrew.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_loader.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_loader.h | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c | 0 .../src/font/lv_font_montserrat_12_subpx.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c | 0 .../src/font/lv_font_montserrat_28_compressed.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c | 0 .../lvgl/lvgl_v8.3/src/font/lv_symbol_def.h | 0 .../lvgl/lvgl_v8.3/src/hal/Makefile | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal.h | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal.mk | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c | 0 .../lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h | 0 .../lvgl/lvgl_v8.3/src/lv_api_map.h | 0 .../lvgl/lvgl_v8.3/src/lv_conf_internal.h | 0 .../lvgl/lvgl_v8.3/src/lv_conf_kconfig.h | 0 .../lvgl/lvgl_v8.3/src/lvgl.h | 0 .../lvgl/lvgl_v8.3/src/misc/Makefile | 0 .../lvgl/lvgl_v8.3/src/misc/lv_anim.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_anim.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_area.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_area.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_assert.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_async.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_async.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_bidi.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_bidi.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_color.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_color.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_fs.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_fs.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_gc.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_gc.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_ll.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_ll.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_log.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_log.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_lru.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_lru.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_math.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_math.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_mem.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_mem.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_misc.mk | 0 .../lvgl/lvgl_v8.3/src/misc/lv_printf.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_printf.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_style.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_style.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_style_gen.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_style_gen.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_templ.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_templ.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_timer.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_timer.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_tlsf.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_tlsf.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_txt.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_txt.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_types.h | 0 .../lvgl/lvgl_v8.3/src/misc/lv_utils.c | 0 .../lvgl/lvgl_v8.3/src/misc/lv_utils.h | 0 .../lvgl/lvgl_v8.3/src/widgets/Makefile | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_arc.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_arc.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_bar.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_bar.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_btn.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_btn.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_canvas.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_canvas.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_img.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_img.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_label.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_label.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_line.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_line.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_roller.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_roller.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_slider.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_slider.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_switch.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_switch.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_table.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_table.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_textarea.c | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_textarea.h | 0 .../lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk | 0 .../lvgl/lvgl_v8.3/tests/.gitignore | 0 .../lvgl/lvgl_v8.3/tests/CMakeLists.txt | 0 .../lvgl/lvgl_v8.3/tests/README.md | 0 .../lvgl/lvgl_v8.3/tests/__makefile__/Makefile | 0 .../lvgl/lvgl_v8.3/tests/__makefile__/test.c | 0 .../lvgl/lvgl_v8.3/tests/config.yml | 0 .../lvgl/lvgl_v8.3/tests/main.py | 0 .../lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png | Bin .../lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png | Bin .../lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png | Bin .../lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png | Bin .../lvgl/lvgl_v8.3/tests/src/lv_test_conf.h | 0 .../lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h | 0 .../lvgl/lvgl_v8.3/tests/src/lv_test_indev.c | 0 .../lvgl/lvgl_v8.3/tests/src/lv_test_indev.h | 0 .../lvgl/lvgl_v8.3/tests/src/lv_test_init.c | 0 .../lvgl/lvgl_v8.3/tests/src/lv_test_init.h | 0 .../lvgl_v8.3/tests/src/test_cases/_test_template.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_checkbox.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_config.c | 0 .../tests/src/test_cases/test_demo_stress.c | 0 .../tests/src/test_cases/test_demo_widgets.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_dropdown.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_event.c | 0 .../tests/src/test_cases/test_font_loader.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_obj_tree.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_slider.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_snapshot.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_style.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_switch.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_table.c | 0 .../lvgl_v8.3/tests/src/test_cases/test_textarea.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c | 0 .../lvgl_v8.3/tests/src/test_files/readtest.txt | Bin .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt | Bin .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt | Bin .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c | 0 .../lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt | Bin .../lvgl_v8.3/tests/unity/generate_test_runner.rb | 0 .../lvgl/lvgl_v8.3/tests/unity/run_test.erb | 0 .../lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb | 0 .../lvgl/lvgl_v8.3/tests/unity/unity.c | 0 .../lvgl/lvgl_v8.3/tests/unity/unity.h | 0 .../lvgl/lvgl_v8.3/tests/unity/unity_internals.h | 0 .../lvgl/lvgl_v8.3/tests/unity/unity_support.c | 0 .../lvgl/lvgl_v8.3/tests/unity/unity_support.h | 0 .../platform/arch/Makefile | 0 .../platform/arch/xt804/Makefile | 0 .../platform/arch/xt804/bsp/Makefile | 0 .../platform/arch/xt804/bsp/board_init.c | 0 .../platform/arch/xt804/bsp/isr.c | 0 .../platform/arch/xt804/bsp/startup.S | 0 .../platform/arch/xt804/bsp/system.c | 0 .../platform/arch/xt804/bsp/trap_c.c | 0 .../platform/arch/xt804/bsp/vectors.S | 0 .../platform/arch/xt804/libc/Makefile | 0 .../platform/arch/xt804/libc/libc_port.c | 0 .../platform/common/Makefile | 0 .../platform/common/crypto/Makefile | 0 .../platform/common/crypto/wm_crypto_hard.c | 0 .../platform/common/crypto/wm_crypto_hard_mbed.c | 0 .../platform/common/fwup/Makefile | 0 .../platform/common/fwup/wm_fwup.c | 0 .../platform/common/mem/Makefile | 0 .../platform/common/mem/wm_mem.c | 0 .../platform/common/params/Makefile | 0 .../platform/common/params/wm_param.c | 0 .../platform/common/params/wm_param.h | 0 .../platform/common/task/Makefile | 0 .../platform/common/task/wm_wl_mbox.c | 0 .../platform/common/task/wm_wl_task.c | 0 .../platform/common/task/wm_wl_timers.c | 0 .../platform/common/utils/Makefile | 0 .../platform/common/utils/utils.c | 0 .../platform/drivers/7816/Makefile | 0 .../platform/drivers/7816/wm_7816.c | 0 .../platform/drivers/Makefile | 0 .../platform/drivers/adc/Makefile | 0 .../platform/drivers/adc/wm_adc.c | 0 .../platform/drivers/adc/wm_polyfit.c | 0 .../platform/drivers/cpu/Makefile | 0 .../platform/drivers/cpu/wm_cpu.c | 0 .../platform/drivers/dma/Makefile | 0 .../platform/drivers/dma/wm_dma.c | 0 .../platform/drivers/efuse/Makefile | 0 .../platform/drivers/efuse/wm_efuse.c | 0 .../platform/drivers/flash/Makefile | 0 .../platform/drivers/flash/wm_fls.c | 0 .../platform/drivers/flash/wm_fls_gd25qxx.c | 0 .../platform/drivers/gpio/Makefile | 0 .../platform/drivers/gpio/wm_gpio.c | 0 .../platform/drivers/gpio/wm_gpio_afsel.c | 0 .../platform/drivers/hspi/Makefile | 0 .../platform/drivers/hspi/wm_hspi.c | 0 .../platform/drivers/i2c/Makefile | 0 .../platform/drivers/i2c/wm_i2c.c | 0 .../platform/drivers/i2s/Makefile | 0 .../platform/drivers/i2s/wm_i2s.c | 0 .../platform/drivers/internalflash/Makefile | 0 .../drivers/internalflash/wm_internal_fls.c | 0 .../platform/drivers/io/Makefile | 0 .../platform/drivers/io/wm_io.c | 0 .../platform/drivers/irq/Makefile | 0 .../platform/drivers/irq/wm_irq.c | 0 .../platform/drivers/lcd/Makefile | 0 .../platform/drivers/lcd/wm_lcd.c | 0 .../platform/drivers/pmu/Makefile | 0 .../platform/drivers/pmu/wm_pmu.c | 0 .../platform/drivers/psram/Makefile | 0 .../platform/drivers/psram/wm_psram.c | 0 .../platform/drivers/pwm/Makefile | 0 .../platform/drivers/pwm/wm_pwm.c | 0 .../platform/drivers/rtc/Makefile | 0 .../platform/drivers/rtc/wm_rtc.c | 0 .../platform/drivers/sasc/Makefile | 0 .../platform/drivers/sasc/wm_sasc.c | 0 .../platform/drivers/sdio_host/Makefile | 0 .../platform/drivers/sdio_host/wm_sdio_host.c | 0 .../platform/drivers/spi/Makefile | 0 .../platform/drivers/spi/wm_hostspi.c | 0 .../platform/drivers/spi/wm_spi_hal.h | 0 .../platform/drivers/timer/Makefile | 0 .../platform/drivers/timer/wm_timer.c | 0 .../platform/drivers/touchsensor/Makefile | 0 .../platform/drivers/touchsensor/wm_touchsensor.c | 0 .../platform/drivers/uart/Makefile | 0 .../platform/drivers/uart/wm_uart.c | 0 .../platform/drivers/watchdog/Makefile | 0 .../platform/drivers/watchdog/wm_watchdog.c | 0 .../platform/inc/bitops.h | 0 .../platform/inc/common.h | 0 .../platform/inc/libtommath.h | 0 .../platform/inc/md5.h | 0 .../platform/inc/os.h | 0 .../platform/inc/rc4.h | 0 .../platform/inc/sha1.h | 0 .../platform/inc/sha256.h | 0 .../platform/inc/tls_common.h | 0 .../platform/inc/tls_ieee80211.h | 0 .../platform/inc/tls_wireless.h | 0 .../platform/inc/utils.h | 0 .../platform/inc/wm_dbg.h | 0 .../platform/sys/Makefile | 0 .../platform/sys/tls_sys.c | 0 .../platform/sys/tls_sys.h | 0 .../platform/sys/wm_main.c | 0 .../src/app/Makefile | 0 .../src/app/bleapp/Makefile | 0 .../src/app/bleapp/wm_ble_client_api_demo.c | 0 .../src/app/bleapp/wm_ble_client_api_demo.h | 0 .../app/bleapp/wm_ble_client_api_multi_conn_demo.c | 0 .../app/bleapp/wm_ble_client_api_multi_conn_demo.h | 0 .../src/app/bleapp/wm_ble_client_peer_manager.c | 0 .../src/app/bleapp/wm_ble_client_util.c | 0 .../src/app/bleapp/wm_ble_client_util.h | 0 .../src/app/bleapp/wm_ble_gap.c | 0 .../src/app/bleapp/wm_ble_gap.h | 0 .../src/app/bleapp/wm_ble_mesh.c | 0 .../src/app/bleapp/wm_ble_mesh.h | 0 .../src/app/bleapp/wm_ble_mesh_gen_level_server.c | 0 .../src/app/bleapp/wm_ble_mesh_gen_level_server.h | 0 .../src/app/bleapp/wm_ble_mesh_gen_onoff_client.c | 0 .../src/app/bleapp/wm_ble_mesh_gen_onoff_client.h | 0 .../src/app/bleapp/wm_ble_mesh_gen_onoff_server.c | 0 .../src/app/bleapp/wm_ble_mesh_gen_onoff_server.h | 0 .../src/app/bleapp/wm_ble_mesh_health_server.c | 0 .../src/app/bleapp/wm_ble_mesh_health_server.h | 0 .../src/app/bleapp/wm_ble_mesh_light_model.c | 0 .../src/app/bleapp/wm_ble_mesh_light_model.h | 0 .../src/app/bleapp/wm_ble_mesh_node_demo.c | 0 .../src/app/bleapp/wm_ble_mesh_node_demo.h | 0 .../src/app/bleapp/wm_ble_mesh_vnd_model.c | 0 .../src/app/bleapp/wm_ble_mesh_vnd_model.h | 0 .../src/app/bleapp/wm_ble_server_api_demo.c | 0 .../src/app/bleapp/wm_ble_server_api_demo.h | 0 .../src/app/bleapp/wm_ble_server_wifi_app.c | 0 .../src/app/bleapp/wm_ble_server_wifi_app.h | 0 .../src/app/bleapp/wm_ble_server_wifi_prof.c | 0 .../src/app/bleapp/wm_ble_server_wifi_prof.h | 0 .../src/app/bleapp/wm_ble_uart_if.c | 0 .../src/app/bleapp/wm_ble_uart_if.h | 0 .../src/app/bleapp/wm_bt_app.c | 0 .../src/app/bleapp/wm_bt_app.h | 0 .../src/app/bleapp/wm_bt_util.c | 0 .../src/app/bleapp/wm_bt_util.h | 0 .../src/app/btapp/Makefile | 0 .../src/app/btapp/wm_audio_sink.c | 0 .../src/app/btapp/wm_audio_sink.h | 0 .../src/app/btapp/wm_ble_client.c | 0 .../src/app/btapp/wm_ble_client.h | 0 .../src/app/btapp/wm_ble_client_api_demo.c | 0 .../src/app/btapp/wm_ble_client_api_demo.h | 0 .../app/btapp/wm_ble_client_api_multi_conn_demo.c | 0 .../app/btapp/wm_ble_client_api_multi_conn_demo.h | 0 .../src/app/btapp/wm_ble_client_demo.c | 0 .../src/app/btapp/wm_ble_client_demo.h | 0 .../src/app/btapp/wm_ble_dm_api.h | 0 .../src/app/btapp/wm_ble_gap.c | 0 .../src/app/btapp/wm_ble_gap.h | 0 .../src/app/btapp/wm_ble_server.c | 0 .../src/app/btapp/wm_ble_server.h | 0 .../src/app/btapp/wm_ble_server_api_demo.c | 0 .../src/app/btapp/wm_ble_server_api_demo.h | 0 .../src/app/btapp/wm_ble_server_demo_prof.c | 0 .../src/app/btapp/wm_ble_server_demo_prof.h | 0 .../src/app/btapp/wm_ble_server_wifi_app.c | 0 .../src/app/btapp/wm_ble_server_wifi_app.h | 0 .../src/app/btapp/wm_ble_server_wifi_prof.c | 0 .../src/app/btapp/wm_ble_server_wifi_prof.h | 0 .../src/app/btapp/wm_ble_uart_if.c | 0 .../src/app/btapp/wm_ble_uart_if.h | 0 .../src/app/btapp/wm_bt_app.c | 0 .../src/app/btapp/wm_bt_app.h | 0 .../src/app/btapp/wm_bt_spp_client.c | 0 .../src/app/btapp/wm_bt_spp_client.h | 0 .../src/app/btapp/wm_bt_spp_server.c | 0 .../src/app/btapp/wm_bt_spp_server.h | 0 .../src/app/btapp/wm_bt_util.c | 0 .../src/app/btapp/wm_bt_util.h | 0 .../src/app/btapp/wm_hfp_hsp_client.c | 0 .../src/app/btapp/wm_hfp_hsp_client.h | 0 .../src/app/cJSON/Makefile | 0 .../src/app/cJSON/cJSON.c | 0 .../src/app/cJSON/cJSON.h | 0 .../src/app/dhcpserver/Makefile | 0 .../src/app/dhcpserver/dhcp_server.c | 0 .../src/app/dhcpserver/dhcp_server.h | 0 .../src/app/dnsserver/Makefile | 0 .../src/app/dnsserver/dns_server.c | 0 .../src/app/dnsserver/dns_server.h | 0 .../src/app/factorycmd/Makefile | 0 .../src/app/factorycmd/factory_atcmd.c | 0 .../src/app/factorycmd/factory_atcmd.h | 0 .../src/app/fatfs/LICENSE.txt | 0 .../src/app/fatfs/Makefile | 0 .../src/app/fatfs/diskio.c | 0 .../src/app/fatfs/diskio.h | 0 .../src/app/fatfs/ff.c | 0 .../src/app/fatfs/ff.h | 0 .../src/app/fatfs/ffconf.h | 0 .../src/app/fatfs/ffsystem.c | 0 .../src/app/fatfs/ffunicode.c | 0 .../src/app/httpclient/HTTPClient.c | 0 .../src/app/httpclient/HTTPClient.h | 0 .../src/app/httpclient/HTTPClientAuth.c | 0 .../src/app/httpclient/HTTPClientAuth.h | 0 .../src/app/httpclient/HTTPClientCommon.h | 0 .../src/app/httpclient/HTTPClientString.c | 0 .../src/app/httpclient/HTTPClientString.h | 0 .../src/app/httpclient/HTTPClientWrapper.c | 0 .../src/app/httpclient/HTTPClientWrapper.h | 0 .../src/app/httpclient/Makefile | 0 .../src/app/httpclient/wm_httpclient_if.c | 0 .../src/app/httpclient/wm_httpclient_task.c | 0 .../src/app/iperf/Makefile | 0 .../src/app/iperf/config.h | 0 .../src/app/iperf/iperf.h | 0 .../src/app/iperf/iperf_api.c | 0 .../src/app/iperf/iperf_api.h | 0 .../src/app/iperf/iperf_client_api.c | 0 .../src/app/iperf/iperf_client_api.h | 0 .../src/app/iperf/iperf_error.c | 0 .../src/app/iperf/iperf_error.h | 0 .../src/app/iperf/iperf_locale.c | 0 .../src/app/iperf/iperf_locale.h | 0 .../src/app/iperf/iperf_main.c | 0 .../src/app/iperf/iperf_net.c | 0 .../src/app/iperf/iperf_net.h | 0 .../src/app/iperf/iperf_queue.h | 0 .../src/app/iperf/iperf_server_api.c | 0 .../src/app/iperf/iperf_server_api.h | 0 .../src/app/iperf/iperf_tcp.c | 0 .../src/app/iperf/iperf_tcp.h | 0 .../src/app/iperf/iperf_timer.c | 0 .../src/app/iperf/iperf_timer.h | 0 .../src/app/iperf/iperf_udp.c | 0 .../src/app/iperf/iperf_udp.h | 0 .../src/app/iperf/iperf_units.c | 0 .../src/app/iperf/iperf_units.h | 0 .../src/app/iperf/iperf_util.c | 0 .../src/app/iperf/iperf_util.h | 0 .../src/app/iperf/tcp_info.c | 0 .../src/app/iperf/tcp_window_size.c | 0 .../src/app/iperf/tcp_window_size.h | 0 .../src/app/iperf/version.h | 0 .../src/app/iperf/wm_perf.c | 0 .../src/app/libcoap/Makefile | 0 .../src/app/libcoap/address.c | 0 .../src/app/libcoap/async.c | 0 .../src/app/libcoap/block.c | 0 .../src/app/libcoap/coap_io.c | 0 .../src/app/libcoap/coap_io_lwip.c | 0 .../src/app/libcoap/coap_time.c | 0 .../src/app/libcoap/debug.c | 0 .../src/app/libcoap/encode.c | 0 .../src/app/libcoap/hashkey.c | 0 .../src/app/libcoap/include/address.h | 0 .../src/app/libcoap/include/async.h | 0 .../src/app/libcoap/include/bits.h | 0 .../src/app/libcoap/include/block.h | 0 .../src/app/libcoap/include/coap.h | 0 .../src/app/libcoap/include/coap_config.h | 0 .../src/app/libcoap/include/coap_io.h | 0 .../src/app/libcoap/include/coap_time.h | 0 .../src/app/libcoap/include/debug_libcoap.h | 0 .../src/app/libcoap/include/encode.h | 0 .../src/app/libcoap/include/hashkey.h | 0 .../src/app/libcoap/include/libcoap.h | 0 .../src/app/libcoap/include/lwippools.h | 0 .../src/app/libcoap/include/mem.h | 0 .../src/app/libcoap/include/mem_libcoap.h | 0 .../src/app/libcoap/include/net.h | 0 .../src/app/libcoap/include/option.h | 0 .../src/app/libcoap/include/pdu.h | 0 .../src/app/libcoap/include/prng.h | 0 .../src/app/libcoap/include/resource.h | 0 .../src/app/libcoap/include/str.h | 0 .../src/app/libcoap/include/subscribe.h | 0 .../src/app/libcoap/include/uri.h | 0 .../src/app/libcoap/include/uthash.h | 0 .../src/app/libcoap/include/utlist.h | 0 .../src/app/libcoap/mem_libcoap.c | 0 .../src/app/libcoap/net.c | 0 .../src/app/libcoap/option.c | 0 .../src/app/libcoap/pdu.c | 0 .../src/app/libcoap/resource.c | 0 .../src/app/libcoap/str.c | 0 .../src/app/libcoap/subscribe.c | 0 .../src/app/libcoap/uri_libcoap.c | 0 .../src/app/libwebsockets-2.1-stable/Makefile | 0 .../src/app/libwebsockets-2.1-stable/alloc.c | 0 .../app/libwebsockets-2.1-stable/base64-decode.c | 0 .../app/libwebsockets-2.1-stable/client-handshake.c | 0 .../app/libwebsockets-2.1-stable/client-parser.c | 0 .../src/app/libwebsockets-2.1-stable/client.c | 0 .../src/app/libwebsockets-2.1-stable/context.c | 0 .../src/app/libwebsockets-2.1-stable/daemonize.c | 0 .../extension-permessage-deflate.c | 0 .../extension-permessage-deflate.h | 0 .../src/app/libwebsockets-2.1-stable/extension.c | 0 .../src/app/libwebsockets-2.1-stable/getifaddrs.c | 0 .../src/app/libwebsockets-2.1-stable/getifaddrs.h | 0 .../src/app/libwebsockets-2.1-stable/handshake.c | 0 .../src/app/libwebsockets-2.1-stable/header.c | 0 .../src/app/libwebsockets-2.1-stable/hpack.c | 0 .../src/app/libwebsockets-2.1-stable/http2.c | 0 .../src/app/libwebsockets-2.1-stable/huftable.h | 0 .../src/app/libwebsockets-2.1-stable/lejp-conf.c | 0 .../src/app/libwebsockets-2.1-stable/lejp.c | 0 .../src/app/libwebsockets-2.1-stable/lejp.h | 0 .../app/libwebsockets-2.1-stable/lextable-strings.h | 0 .../src/app/libwebsockets-2.1-stable/lextable.h | 0 .../src/app/libwebsockets-2.1-stable/libev.c | 0 .../src/app/libwebsockets-2.1-stable/libuv.c | 0 .../app/libwebsockets-2.1-stable/libwebsockets.c | 0 .../app/libwebsockets-2.1-stable/libwebsockets.h | 0 .../src/app/libwebsockets-2.1-stable/lws-plat-wm.c | 0 .../src/app/libwebsockets-2.1-stable/lws_config.h | 0 .../libwebsockets-2.1-stable/lws_config_private.h | 0 .../src/app/libwebsockets-2.1-stable/minihuf.c | 0 .../src/app/libwebsockets-2.1-stable/minilex.c | 0 .../src/app/libwebsockets-2.1-stable/output.c | 0 .../src/app/libwebsockets-2.1-stable/parsers.c | 0 .../src/app/libwebsockets-2.1-stable/pollfd.c | 0 .../private-libwebsockets.h | 0 .../src/app/libwebsockets-2.1-stable/rewrite.c | 0 .../app/libwebsockets-2.1-stable/server-handshake.c | 0 .../src/app/libwebsockets-2.1-stable/server.c | 0 .../src/app/libwebsockets-2.1-stable/service.c | 0 .../src/app/libwebsockets-2.1-stable/sha-1.c | 0 .../src/app/libwebsockets-2.1-stable/smtp.c | 0 .../src/app/libwebsockets-2.1-stable/ssl-client.c | 0 .../src/app/libwebsockets-2.1-stable/ssl-http2.c | 0 .../src/app/libwebsockets-2.1-stable/ssl-server.c | 0 .../src/app/libwebsockets-2.1-stable/ssl.c | 0 .../src/app/mDNS/Makefile | 0 .../src/app/mDNS/mDNSCore/APSCommonServices.h | 0 .../src/app/mDNS/mDNSCore/Makefile | 0 .../src/app/mDNS/mDNSCore/mDNS.c | 0 .../src/app/mDNS/mDNSCore/mDNS.h | 0 .../src/app/mDNS/mDNSCore/mDNSClientAPI.h | 0 .../src/app/mDNS/mDNSCore/mDNSDebug.h | 0 .../src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h | 0 .../src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h | 0 .../src/app/mDNS/mDNSPosix/Makefile | 0 .../src/app/mDNS/mDNSPosix/mDNSPosix.c | 0 .../src/app/mDNS/mDNSPosix/mDNSPosix.h | 0 .../src/app/mbedtls/Makefile | 0 .../src/app/mbedtls/include/mbedtls/aes.h | 0 .../src/app/mbedtls/include/mbedtls/aesni.h | 0 .../src/app/mbedtls/include/mbedtls/arc4.h | 0 .../src/app/mbedtls/include/mbedtls/asn1.h | 0 .../src/app/mbedtls/include/mbedtls/asn1write.h | 0 .../src/app/mbedtls/include/mbedtls/base64.h | 0 .../src/app/mbedtls/include/mbedtls/bignum.h | 0 .../src/app/mbedtls/include/mbedtls/blowfish.h | 0 .../src/app/mbedtls/include/mbedtls/bn_mul.h | 0 .../src/app/mbedtls/include/mbedtls/camellia.h | 0 .../src/app/mbedtls/include/mbedtls/ccm.h | 0 .../src/app/mbedtls/include/mbedtls/certs.h | 0 .../src/app/mbedtls/include/mbedtls/check_config.h | 0 .../src/app/mbedtls/include/mbedtls/cipher.h | 0 .../app/mbedtls/include/mbedtls/cipher_internal.h | 0 .../src/app/mbedtls/include/mbedtls/cmac.h | 0 .../src/app/mbedtls/include/mbedtls/compat-1.3.h | 0 .../src/app/mbedtls/include/mbedtls/config.h | 0 .../src/app/mbedtls/include/mbedtls/ctr_drbg.h | 0 .../src/app/mbedtls/include/mbedtls/debug.h | 0 .../src/app/mbedtls/include/mbedtls/des.h | 0 .../src/app/mbedtls/include/mbedtls/dhm.h | 0 .../src/app/mbedtls/include/mbedtls/ecdh.h | 0 .../src/app/mbedtls/include/mbedtls/ecdsa.h | 0 .../src/app/mbedtls/include/mbedtls/ecjpake.h | 0 .../src/app/mbedtls/include/mbedtls/ecp.h | 0 .../src/app/mbedtls/include/mbedtls/ecp_internal.h | 0 .../src/app/mbedtls/include/mbedtls/entropy.h | 0 .../src/app/mbedtls/include/mbedtls/entropy_poll.h | 0 .../src/app/mbedtls/include/mbedtls/error.h | 0 .../src/app/mbedtls/include/mbedtls/gcm.h | 0 .../src/app/mbedtls/include/mbedtls/havege.h | 0 .../src/app/mbedtls/include/mbedtls/hmac_drbg.h | 0 .../src/app/mbedtls/include/mbedtls/md.h | 0 .../src/app/mbedtls/include/mbedtls/md2.h | 0 .../src/app/mbedtls/include/mbedtls/md4.h | 0 .../src/app/mbedtls/include/mbedtls/md5.h | 0 .../src/app/mbedtls/include/mbedtls/md_internal.h | 0 .../mbedtls/include/mbedtls/memory_buffer_alloc.h | 0 .../src/app/mbedtls/include/mbedtls/net.h | 0 .../src/app/mbedtls/include/mbedtls/net_sockets.h | 0 .../src/app/mbedtls/include/mbedtls/oid.h | 0 .../src/app/mbedtls/include/mbedtls/padlock.h | 0 .../src/app/mbedtls/include/mbedtls/pem.h | 0 .../src/app/mbedtls/include/mbedtls/pk.h | 0 .../src/app/mbedtls/include/mbedtls/pk_internal.h | 0 .../src/app/mbedtls/include/mbedtls/pkcs11.h | 0 .../src/app/mbedtls/include/mbedtls/pkcs12.h | 0 .../src/app/mbedtls/include/mbedtls/pkcs5.h | 0 .../src/app/mbedtls/include/mbedtls/platform.h | 0 .../src/app/mbedtls/include/mbedtls/platform_time.h | 0 .../src/app/mbedtls/include/mbedtls/ripemd160.h | 0 .../src/app/mbedtls/include/mbedtls/rsa.h | 0 .../src/app/mbedtls/include/mbedtls/rsa_internal.h | 0 .../src/app/mbedtls/include/mbedtls/sha1.h | 0 .../src/app/mbedtls/include/mbedtls/sha256.h | 0 .../src/app/mbedtls/include/mbedtls/sha512.h | 0 .../src/app/mbedtls/include/mbedtls/ssl.h | 0 .../src/app/mbedtls/include/mbedtls/ssl_cache.h | 0 .../app/mbedtls/include/mbedtls/ssl_ciphersuites.h | 0 .../src/app/mbedtls/include/mbedtls/ssl_cookie.h | 0 .../src/app/mbedtls/include/mbedtls/ssl_internal.h | 0 .../src/app/mbedtls/include/mbedtls/ssl_ticket.h | 0 .../src/app/mbedtls/include/mbedtls/threading.h | 0 .../src/app/mbedtls/include/mbedtls/timing.h | 0 .../src/app/mbedtls/include/mbedtls/version.h | 0 .../src/app/mbedtls/include/mbedtls/x509.h | 0 .../src/app/mbedtls/include/mbedtls/x509_crl.h | 0 .../src/app/mbedtls/include/mbedtls/x509_crt.h | 0 .../src/app/mbedtls/include/mbedtls/x509_csr.h | 0 .../src/app/mbedtls/include/mbedtls/xtea.h | 0 .../src/app/mbedtls/library/Makefile | 0 .../src/app/mbedtls/library/aes.c | 0 .../src/app/mbedtls/library/aesni.c | 0 .../src/app/mbedtls/library/arc4.c | 0 .../src/app/mbedtls/library/asn1parse.c | 0 .../src/app/mbedtls/library/asn1write.c | 0 .../src/app/mbedtls/library/base64.c | 0 .../src/app/mbedtls/library/bignum.c | 0 .../src/app/mbedtls/library/blowfish.c | 0 .../src/app/mbedtls/library/camellia.c | 0 .../src/app/mbedtls/library/ccm.c | 0 .../src/app/mbedtls/library/certs.c | 0 .../src/app/mbedtls/library/cipher.c | 0 .../src/app/mbedtls/library/cipher_wrap.c | 0 .../src/app/mbedtls/library/cmac.c | 0 .../src/app/mbedtls/library/ctr_drbg.c | 0 .../src/app/mbedtls/library/debug.c | 0 .../src/app/mbedtls/library/des.c | 0 .../src/app/mbedtls/library/dhm.c | 0 .../src/app/mbedtls/library/ecdh.c | 0 .../src/app/mbedtls/library/ecdsa.c | 0 .../src/app/mbedtls/library/ecjpake.c | 0 .../src/app/mbedtls/library/ecp.c | 0 .../src/app/mbedtls/library/ecp_curves.c | 0 .../src/app/mbedtls/library/entropy.c | 0 .../src/app/mbedtls/library/entropy_poll.c | 0 .../src/app/mbedtls/library/error.c | 0 .../src/app/mbedtls/library/gcm.c | 0 .../src/app/mbedtls/library/havege.c | 0 .../src/app/mbedtls/library/hmac_drbg.c | 0 .../src/app/mbedtls/library/md.c | 0 .../src/app/mbedtls/library/md2.c | 0 .../src/app/mbedtls/library/md4.c | 0 .../src/app/mbedtls/library/md5.c | 0 .../src/app/mbedtls/library/md_wrap.c | 0 .../src/app/mbedtls/library/memory_buffer_alloc.c | 0 .../src/app/mbedtls/library/net_sockets.c | 0 .../src/app/mbedtls/library/oid.c | 0 .../src/app/mbedtls/library/padlock.c | 0 .../src/app/mbedtls/library/pem.c | 0 .../src/app/mbedtls/library/pk.c | 0 .../src/app/mbedtls/library/pk_wrap.c | 0 .../src/app/mbedtls/library/pkcs11.c | 0 .../src/app/mbedtls/library/pkcs12.c | 0 .../src/app/mbedtls/library/pkcs5.c | 0 .../src/app/mbedtls/library/pkparse.c | 0 .../src/app/mbedtls/library/pkwrite.c | 0 .../src/app/mbedtls/library/platform.c | 0 .../src/app/mbedtls/library/ripemd160.c | 0 .../src/app/mbedtls/library/rsa.c | 0 .../src/app/mbedtls/library/rsa_internal.c | 0 .../src/app/mbedtls/library/sha1.c | 0 .../src/app/mbedtls/library/sha256.c | 0 .../src/app/mbedtls/library/sha512.c | 0 .../src/app/mbedtls/library/ssl_cache.c | 0 .../src/app/mbedtls/library/ssl_ciphersuites.c | 0 .../src/app/mbedtls/library/ssl_cli.c | 0 .../src/app/mbedtls/library/ssl_cookie.c | 0 .../src/app/mbedtls/library/ssl_srv.c | 0 .../src/app/mbedtls/library/ssl_ticket.c | 0 .../src/app/mbedtls/library/ssl_tls.c | 0 .../src/app/mbedtls/library/threading.c | 0 .../src/app/mbedtls/library/timing.c | 0 .../src/app/mbedtls/library/version.c | 0 .../src/app/mbedtls/library/version_features.c | 0 .../src/app/mbedtls/library/x509.c | 0 .../src/app/mbedtls/library/x509_create.c | 0 .../src/app/mbedtls/library/x509_crl.c | 0 .../src/app/mbedtls/library/x509_crt.c | 0 .../src/app/mbedtls/library/x509_csr.c | 0 .../src/app/mbedtls/library/x509write_crt.c | 0 .../src/app/mbedtls/library/x509write_csr.c | 0 .../src/app/mbedtls/library/xtea.c | 0 .../src/app/mbedtls/ports/Makefile | 0 .../src/app/mbedtls/ports/aes_alt.c | 0 .../src/app/mbedtls/ports/aes_alt.h | 0 .../src/app/mbedtls/ports/arc4_alt.c | 0 .../src/app/mbedtls/ports/arc4_alt.h | 0 .../src/app/mbedtls/ports/des_alt.c | 0 .../src/app/mbedtls/ports/des_alt.h | 0 .../src/app/mbedtls/ports/hardware_alt.c | 0 .../src/app/mbedtls/ports/md5_alt.c | 0 .../src/app/mbedtls/ports/md5_alt.h | 0 .../src/app/mbedtls/ports/net_alt.c | 0 .../src/app/mbedtls/ports/net_alt.h | 0 .../src/app/mbedtls/ports/sha1_alt.c | 0 .../src/app/mbedtls/ports/sha1_alt.h | 0 .../src/app/mbedtls/ports/timing_alt.c | 0 .../src/app/mbedtls/ports/timing_alt.h | 0 .../src/app/mqtt/Makefile | 0 .../src/app/mqtt/libemqtt.c | 0 .../src/app/mqtt/libemqtt.h | 0 .../src/app/ntp/Makefile | 0 .../src/app/ntp/ntp_client.c | 0 .../src/app/oneshotconfig/Makefile | 0 .../src/app/oneshotconfig/airkiss.h | 0 .../src/app/oneshotconfig/wm_oneshot_airkiss.c | 0 .../src/app/oneshotconfig/wm_oneshot_lsd.c | 0 .../src/app/oneshotconfig/wm_oneshot_lsd.h | 0 .../src/app/oneshotconfig/wm_wifi_oneshot.c | 0 .../src/app/ota/Makefile | 0 .../src/app/ota/wm_http_fwup.c | 0 .../src/app/ota/wm_http_fwup.h | 0 .../src/app/ota/wm_socket_fwup.c | 0 .../src/app/ota/wm_socket_fwup.h | 0 .../src/app/ping/Makefile | 0 .../src/app/ping/ping.c | 0 .../src/app/ping/ping.h | 0 .../src/app/polarssl/Makefile | 0 .../src/app/polarssl/include/polarssl/aes.h | 0 .../src/app/polarssl/include/polarssl/arc4.h | 0 .../src/app/polarssl/include/polarssl/asn1.h | 0 .../src/app/polarssl/include/polarssl/base64.h | 0 .../src/app/polarssl/include/polarssl/bignum.h | 0 .../src/app/polarssl/include/polarssl/bn_mul.h | 0 .../src/app/polarssl/include/polarssl/camellia.h | 0 .../src/app/polarssl/include/polarssl/certs.h | 0 .../src/app/polarssl/include/polarssl/cipher.h | 0 .../src/app/polarssl/include/polarssl/cipher_wrap.h | 0 .../src/app/polarssl/include/polarssl/config.h | 0 .../src/app/polarssl/include/polarssl/debug.h | 0 .../src/app/polarssl/include/polarssl/des.h | 0 .../src/app/polarssl/include/polarssl/dhm.h | 0 .../src/app/polarssl/include/polarssl/error.h | 0 .../src/app/polarssl/include/polarssl/md.h | 0 .../src/app/polarssl/include/polarssl/md2.h | 0 .../src/app/polarssl/include/polarssl/md4.h | 0 .../src/app/polarssl/include/polarssl/md5.h | 0 .../src/app/polarssl/include/polarssl/md_wrap.h | 0 .../src/app/polarssl/include/polarssl/net.h | 0 .../src/app/polarssl/include/polarssl/openssl.h | 0 .../src/app/polarssl/include/polarssl/pem.h | 0 .../src/app/polarssl/include/polarssl/rsa.h | 0 .../src/app/polarssl/include/polarssl/sha1.h | 0 .../src/app/polarssl/include/polarssl/sha2.h | 0 .../src/app/polarssl/include/polarssl/sha4.h | 0 .../src/app/polarssl/include/polarssl/ssl.h | 0 .../src/app/polarssl/include/polarssl/x509.h | 0 .../src/app/polarssl/library/Makefile | 0 .../src/app/polarssl/library/arc4.c | 0 .../src/app/polarssl/library/asn1parse.c | 0 .../src/app/polarssl/library/base64.c | 0 .../src/app/polarssl/library/cipher.c | 0 .../src/app/polarssl/library/cipher_wrap.c | 0 .../src/app/polarssl/library/error.c | 0 .../src/app/polarssl/library/md.c | 0 .../src/app/polarssl/library/md_wrap.c | 0 .../src/app/polarssl/library/pem.c | 0 .../src/app/polarssl/library/polarssl_bignum.c | 0 .../src/app/polarssl/library/polarssl_debug.c | 0 .../src/app/polarssl/library/polarssl_md5.c | 0 .../src/app/polarssl/library/polarssl_sha1.c | 0 .../src/app/polarssl/library/rsa.c | 0 .../src/app/polarssl/library/ssl_cli.c | 0 .../src/app/polarssl/library/ssl_tls.c | 0 .../src/app/polarssl/library/x509parse.c | 0 .../src/app/sslserver/Makefile | 0 .../src/app/sslserver/wm_ssl_server.c | 0 .../src/app/web/Makefile | 0 .../src/app/web/fs.c | 0 .../src/app/web/fs.h | 0 .../src/app/web/fs/404.html | 0 .../src/app/web/fs/advance.html | 0 .../src/app/web/fs/basic.html | 0 .../src/app/web/fs/firmware.html | 0 .../src/app/web/fs/index.html | 0 .../src/app/web/fs/jump.html | 0 .../src/app/web/fs/style.css | 0 .../src/app/web/fs_ap_config/404.html | 0 .../src/app/web/fs_ap_config/basic.html | 0 .../src/app/web/fs_ap_config/firmware.html | 0 .../src/app/web/fs_ap_config/index.html | 0 .../src/app/web/fs_ap_config/jump.html | 0 .../src/app/web/fs_ap_config/style.css | 0 .../src/app/web/fsdata.c | 0 .../src/app/web/fsdata.h | 0 .../src/app/web/fsdata_ap_config.c | 0 .../src/app/web/goall | 0 .../src/app/web/http.h | 0 .../src/app/web/httpd.c | 0 .../src/app/web/httpd.h | 0 .../src/app/web/makefs | 0 .../src/app/web/web.c | 0 .../src/app/wm_atcmd/Makefile | 0 .../src/app/wm_atcmd/wm_cmdp.c | 0 .../src/app/wm_atcmd/wm_cmdp.h | 0 .../src/app/wm_atcmd/wm_cmdp_hostif.c | 0 .../src/app/wm_atcmd/wm_cmdp_hostif.h | 0 .../src/app/wm_atcmd/wm_cmdp_hostif_gcc.h | 0 .../src/app/wm_atcmd/wm_cmdp_ri.c | 0 .../src/app/wm_atcmd/wm_cmdp_ri.h | 0 .../src/app/wm_atcmd/wm_hspi_task.c | 0 .../src/app/wm_atcmd/wm_hspi_task.h | 0 .../src/app/wm_atcmd/wm_rmms.c | 0 .../src/app/wm_atcmd/wm_rmms.h | 0 .../src/app/wm_atcmd/wm_uart_task.c | 0 .../src/app/wm_atcmd/wm_uart_task.h | 0 .../src/bt/AStyle.exe | Bin .../src/bt/astyle.bat | 0 .../src/bt/blehost/Makefile | 0 .../src/bt/blehost/docs/Makefile | 0 .../src/bt/blehost/docs/README.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_att.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_gap.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_gattc.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_gatts.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_hs.rst | 0 .../src/bt/blehost/docs/ble_hs/ble_hs_id.rst | 0 .../bt/blehost/docs/ble_hs/ble_hs_return_codes.rst | 0 .../src/bt/blehost/docs/ble_sec.rst | 0 .../src/bt/blehost/docs/ble_setup/ble_addr.rst | 0 .../src/bt/blehost/docs/ble_setup/ble_lp_clock.rst | 0 .../bt/blehost/docs/ble_setup/ble_setup_intro.rst | 0 .../src/bt/blehost/docs/ble_setup/ble_sync_cb.rst | 0 .../src/bt/blehost/docs/btshell/btshell_GAP.rst | 0 .../src/bt/blehost/docs/btshell/btshell_GATT.rst | 0 .../src/bt/blehost/docs/btshell/btshell_advdata.rst | 0 .../src/bt/blehost/docs/btshell/btshell_api.rst | 0 .../src/bt/blehost/docs/conf.py | 0 .../src/bt/blehost/docs/doxygen.xml | 0 .../src/bt/blehost/docs/index.rst | 0 .../src/bt/blehost/docs/mesh/index.rst | 0 .../bt/blehost/docs/mesh/mesh_lightning_model.jpg | Bin .../src/bt/blehost/docs/mesh/mesh_topology.jpg | Bin .../src/bt/blehost/docs/mesh/sample.rst | 0 .../src/bt/blehost/ext/Makefile | 0 .../src/bt/blehost/ext/tinycrypt/Makefile | 0 .../blehost/ext/tinycrypt/include/tinycrypt/aes.h | 0 .../ext/tinycrypt/include/tinycrypt/cbc_mode.h | 0 .../ext/tinycrypt/include/tinycrypt/ccm_mode.h | 0 .../ext/tinycrypt/include/tinycrypt/cmac_mode.h | 0 .../ext/tinycrypt/include/tinycrypt/constants.h | 0 .../ext/tinycrypt/include/tinycrypt/ctr_mode.h | 0 .../ext/tinycrypt/include/tinycrypt/ctr_prng.h | 0 .../blehost/ext/tinycrypt/include/tinycrypt/ecc.h | 0 .../ext/tinycrypt/include/tinycrypt/ecc_dh.h | 0 .../ext/tinycrypt/include/tinycrypt/ecc_dsa.h | 0 .../include/tinycrypt/ecc_platform_specific.h | 0 .../blehost/ext/tinycrypt/include/tinycrypt/hmac.h | 0 .../ext/tinycrypt/include/tinycrypt/hmac_prng.h | 0 .../ext/tinycrypt/include/tinycrypt/sha256.h | 0 .../blehost/ext/tinycrypt/include/tinycrypt/utils.h | 0 .../src/bt/blehost/ext/tinycrypt/src/Makefile | 0 .../src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c | 0 .../src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c | 0 .../src/bt/blehost/ext/tinycrypt/src/bleutils.c | 0 .../src/bt/blehost/ext/tinycrypt/src/cbc_mode.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ccm_mode.c | 0 .../src/bt/blehost/ext/tinycrypt/src/cmac_mode.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ctr_mode.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ctr_prng.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ecc.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ecc_dh.c | 0 .../src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c | 0 .../ext/tinycrypt/src/ecc_platform_specific.c | 0 .../src/bt/blehost/ext/tinycrypt/src/hmac.c | 0 .../src/bt/blehost/ext/tinycrypt/src/hmac_prng.c | 0 .../src/bt/blehost/ext/tinycrypt/src/sha256.c | 0 .../src/bt/blehost/nimble/Makefile | 0 .../src/bt/blehost/nimble/host/Makefile | 0 .../bt/blehost/nimble/host/include/host/ble_att.h | 0 .../nimble/host/include/host/ble_eddystone.h | 0 .../bt/blehost/nimble/host/include/host/ble_gap.h | 0 .../bt/blehost/nimble/host/include/host/ble_gatt.h | 0 .../bt/blehost/nimble/host/include/host/ble_hs.h | 0 .../blehost/nimble/host/include/host/ble_hs_adv.h | 0 .../blehost/nimble/host/include/host/ble_hs_hci.h | 0 .../bt/blehost/nimble/host/include/host/ble_hs_id.h | 0 .../blehost/nimble/host/include/host/ble_hs_log.h | 0 .../blehost/nimble/host/include/host/ble_hs_mbuf.h | 0 .../blehost/nimble/host/include/host/ble_hs_stop.h | 0 .../blehost/nimble/host/include/host/ble_ibeacon.h | 0 .../bt/blehost/nimble/host/include/host/ble_l2cap.h | 0 .../blehost/nimble/host/include/host/ble_monitor.h | 0 .../bt/blehost/nimble/host/include/host/ble_sm.h | 0 .../bt/blehost/nimble/host/include/host/ble_store.h | 0 .../bt/blehost/nimble/host/include/host/ble_uuid.h | 0 .../src/bt/blehost/nimble/host/mesh/Makefile | 0 .../blehost/nimble/host/mesh/include/mesh/access.h | 0 .../blehost/nimble/host/mesh/include/mesh/cfg_cli.h | 0 .../blehost/nimble/host/mesh/include/mesh/cfg_srv.h | 0 .../bt/blehost/nimble/host/mesh/include/mesh/glue.h | 0 .../nimble/host/mesh/include/mesh/health_cli.h | 0 .../nimble/host/mesh/include/mesh/health_srv.h | 0 .../bt/blehost/nimble/host/mesh/include/mesh/main.h | 0 .../bt/blehost/nimble/host/mesh/include/mesh/mesh.h | 0 .../nimble/host/mesh/include/mesh/model_cli.h | 0 .../nimble/host/mesh/include/mesh/model_srv.h | 0 .../blehost/nimble/host/mesh/include/mesh/porting.h | 0 .../blehost/nimble/host/mesh/include/mesh/proxy.h | 0 .../blehost/nimble/host/mesh/include/mesh/slist.h | 0 .../blehost/nimble/host/mesh/include/mesh/testing.h | 0 .../src/bt/blehost/nimble/host/mesh/src/Makefile | 0 .../src/bt/blehost/nimble/host/mesh/src/access.c | 0 .../src/bt/blehost/nimble/host/mesh/src/access.h | 0 .../src/bt/blehost/nimble/host/mesh/src/adv.c | 0 .../src/bt/blehost/nimble/host/mesh/src/adv.h | 0 .../src/bt/blehost/nimble/host/mesh/src/atomic.h | 0 .../src/bt/blehost/nimble/host/mesh/src/beacon.c | 0 .../src/bt/blehost/nimble/host/mesh/src/beacon.h | 0 .../src/bt/blehost/nimble/host/mesh/src/cfg_cli.c | 0 .../src/bt/blehost/nimble/host/mesh/src/cfg_srv.c | 0 .../src/bt/blehost/nimble/host/mesh/src/crypto.c | 0 .../src/bt/blehost/nimble/host/mesh/src/crypto.h | 0 .../bt/blehost/nimble/host/mesh/src/foundation.h | 0 .../src/bt/blehost/nimble/host/mesh/src/friend.c | 0 .../src/bt/blehost/nimble/host/mesh/src/friend.h | 0 .../src/bt/blehost/nimble/host/mesh/src/glue.c | 0 .../bt/blehost/nimble/host/mesh/src/health_cli.c | 0 .../bt/blehost/nimble/host/mesh/src/health_srv.c | 0 .../bt/blehost/nimble/host/mesh/src/light_model.c | 0 .../bt/blehost/nimble/host/mesh/src/light_model.h | 0 .../src/bt/blehost/nimble/host/mesh/src/lpn.c | 0 .../src/bt/blehost/nimble/host/mesh/src/lpn.h | 0 .../src/bt/blehost/nimble/host/mesh/src/mesh.c | 0 .../src/bt/blehost/nimble/host/mesh/src/mesh_priv.h | 0 .../src/bt/blehost/nimble/host/mesh/src/model_cli.c | 0 .../src/bt/blehost/nimble/host/mesh/src/model_srv.c | 0 .../src/bt/blehost/nimble/host/mesh/src/net.c | 0 .../src/bt/blehost/nimble/host/mesh/src/net.h | 0 .../src/bt/blehost/nimble/host/mesh/src/nodes.c | 0 .../src/bt/blehost/nimble/host/mesh/src/nodes.h | 0 .../src/bt/blehost/nimble/host/mesh/src/prov.c | 0 .../src/bt/blehost/nimble/host/mesh/src/prov.h | 0 .../src/bt/blehost/nimble/host/mesh/src/proxy.c | 0 .../src/bt/blehost/nimble/host/mesh/src/proxy.h | 0 .../src/bt/blehost/nimble/host/mesh/src/settings.c | 0 .../src/bt/blehost/nimble/host/mesh/src/settings.h | 0 .../src/bt/blehost/nimble/host/mesh/src/shell.c | 0 .../src/bt/blehost/nimble/host/mesh/src/shell.h | 0 .../src/bt/blehost/nimble/host/mesh/src/testing.c | 0 .../src/bt/blehost/nimble/host/mesh/src/testing.h | 0 .../src/bt/blehost/nimble/host/mesh/src/transport.c | 0 .../src/bt/blehost/nimble/host/mesh/src/transport.h | 0 .../nimble/host/mesh/src/wm_ble_mesh_store.c | 0 .../nimble/host/mesh/src/wm_ble_mesh_store.h | 0 .../src/bt/blehost/nimble/host/services/Makefile | 0 .../services/bas/include/services/bas/ble_svc_bas.h | 0 .../src/bt/blehost/nimble/host/services/bas/pkg.yml | 0 .../nimble/host/services/bas/src/ble_svc_bas.c | 0 .../bt/blehost/nimble/host/services/bas/syscfg.yml | 0 .../services/dis/include/services/dis/ble_svc_dis.h | 0 .../src/bt/blehost/nimble/host/services/dis/pkg.yml | 0 .../nimble/host/services/dis/src/ble_svc_dis.c | 0 .../bt/blehost/nimble/host/services/dis/syscfg.yml | 0 .../bt/blehost/nimble/host/services/gap/Makefile | 0 .../services/gap/include/services/gap/ble_svc_gap.h | 0 .../blehost/nimble/host/services/gap/src/Makefile | 0 .../nimble/host/services/gap/src/ble_svc_gap.c | 0 .../bt/blehost/nimble/host/services/gatt/Makefile | 0 .../gatt/include/services/gatt/ble_svc_gatt.h | 0 .../blehost/nimble/host/services/gatt/src/Makefile | 0 .../nimble/host/services/gatt/src/ble_svc_gatt.c | 0 .../src/bt/blehost/nimble/host/src/Makefile | 0 .../src/bt/blehost/nimble/host/src/ble_att.c | 0 .../src/bt/blehost/nimble/host/src/ble_att_clt.c | 0 .../src/bt/blehost/nimble/host/src/ble_att_cmd.c | 0 .../bt/blehost/nimble/host/src/ble_att_cmd_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_att_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_att_svr.c | 0 .../src/bt/blehost/nimble/host/src/ble_eddystone.c | 0 .../src/bt/blehost/nimble/host/src/ble_gap.c | 0 .../src/bt/blehost/nimble/host/src/ble_gap_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_gatt_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_gattc.c | 0 .../src/bt/blehost/nimble/host/src/ble_gatts.c | 0 .../src/bt/blehost/nimble/host/src/ble_gatts_lcl.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_adv.c | 0 .../bt/blehost/nimble/host/src/ble_hs_adv_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_atomic.c | 0 .../bt/blehost/nimble/host/src/ble_hs_atomic_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_cfg.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_conn.c | 0 .../bt/blehost/nimble/host/src/ble_hs_conn_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_flow.c | 0 .../bt/blehost/nimble/host/src/ble_hs_flow_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_hci.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c | 0 .../bt/blehost/nimble/host/src/ble_hs_hci_priv.h | 0 .../bt/blehost/nimble/host/src/ble_hs_hci_util.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_id.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_id_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_log.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_mbuf.c | 0 .../bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_misc.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_mqueue.c | 0 .../blehost/nimble/host/src/ble_hs_periodic_sync.c | 0 .../nimble/host/src/ble_hs_periodic_sync_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_pvcy.c | 0 .../bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h | 0 .../bt/blehost/nimble/host/src/ble_hs_shutdown.c | 0 .../src/bt/blehost/nimble/host/src/ble_hs_startup.c | 0 .../blehost/nimble/host/src/ble_hs_startup_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_hs_stop.c | 0 .../src/bt/blehost/nimble/host/src/ble_ibeacon.c | 0 .../src/bt/blehost/nimble/host/src/ble_l2cap.c | 0 .../src/bt/blehost/nimble/host/src/ble_l2cap_coc.c | 0 .../bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_l2cap_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_l2cap_sig.c | 0 .../bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c | 0 .../bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_monitor.c | 0 .../bt/blehost/nimble/host/src/ble_monitor_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_sm.c | 0 .../src/bt/blehost/nimble/host/src/ble_sm_alg.c | 0 .../src/bt/blehost/nimble/host/src/ble_sm_cmd.c | 0 .../src/bt/blehost/nimble/host/src/ble_sm_lgcy.c | 0 .../src/bt/blehost/nimble/host/src/ble_sm_priv.h | 0 .../src/bt/blehost/nimble/host/src/ble_sm_sc.c | 0 .../src/bt/blehost/nimble/host/src/ble_store.c | 0 .../src/bt/blehost/nimble/host/src/ble_store_util.c | 0 .../src/bt/blehost/nimble/host/src/ble_uuid.c | 0 .../src/bt/blehost/nimble/host/src/ble_uuid_priv.h | 0 .../src/bt/blehost/nimble/host/store/Makefile | 0 .../bt/blehost/nimble/host/store/config/Makefile | 0 .../config/include/store/config/ble_store_config.h | 0 .../config/include/store/config/wm_bt_storage.h | 0 .../blehost/nimble/host/store/config/src/Makefile | 0 .../nimble/host/store/config/src/ble_store_config.c | 0 .../host/store/config/src/ble_store_config_priv.h | 0 .../nimble/host/store/config/src/ble_store_nvram.c | 0 .../nimble/host/store/config/src/wm_bt_storage.c | 0 .../src/bt/blehost/nimble/host/store/ram/Makefile | 0 .../store/ram/include/store/ram/ble_store_ram.h | 0 .../bt/blehost/nimble/host/store/ram/src/Makefile | 0 .../nimble/host/store/ram/src/ble_store_ram.c | 0 .../src/bt/blehost/nimble/host/util/Makefile | 0 .../nimble/host/util/include/host/util/util.h | 0 .../src/bt/blehost/nimble/host/util/src/Makefile | 0 .../src/bt/blehost/nimble/host/util/src/addr.c | 0 .../src/bt/blehost/nimble/include/nimble/ble.h | 0 .../blehost/nimble/include/nimble/ble_hci_trans.h | 0 .../bt/blehost/nimble/include/nimble/hci_common.h | 0 .../bt/blehost/nimble/include/nimble/nimble_npl.h | 0 .../bt/blehost/nimble/include/nimble/nimble_opt.h | 0 .../blehost/nimble/include/nimble/nimble_opt_auto.h | 0 .../src/bt/blehost/nimble/transport/Makefile | 0 .../src/bt/blehost/nimble/transport/uart/Makefile | 0 .../uart/include/transport/uart/ble_hci_uart.h | 0 .../bt/blehost/nimble/transport/uart/src/Makefile | 0 .../nimble/transport/uart/src/ble_hci_uart.c | 0 .../src/bt/blehost/porting/Makefile | 0 .../src/bt/blehost/porting/w800/Makefile | 0 .../bt/blehost/porting/w800/include/hal/hal_timer.h | 0 .../bt/blehost/porting/w800/include/hal/hal_uart.h | 0 .../src/bt/blehost/porting/w800/include/log/log.h | 0 .../porting/w800/include/log_common/ignore.h | 0 .../porting/w800/include/log_common/log_common.h | 0 .../bt/blehost/porting/w800/include/logcfg/logcfg.h | 0 .../src/bt/blehost/porting/w800/include/mem/mem.h | 0 .../bt/blehost/porting/w800/include/modlog/modlog.h | 0 .../porting/w800/include/nimble/nimble_npl_os.h | 0 .../porting/w800/include/nimble/nimble_port.h | 0 .../porting/w800/include/nimble/tls_nimble.h | 0 .../src/bt/blehost/porting/w800/include/os/endian.h | 0 .../blehost/porting/w800/include/os/npl_freertos.h | 0 .../src/bt/blehost/porting/w800/include/os/os.h | 0 .../bt/blehost/porting/w800/include/os/os_cputime.h | 0 .../bt/blehost/porting/w800/include/os/os_error.h | 0 .../bt/blehost/porting/w800/include/os/os_mbuf.h | 0 .../bt/blehost/porting/w800/include/os/os_mempool.h | 0 .../blehost/porting/w800/include/os/os_trace_api.h | 0 .../src/bt/blehost/porting/w800/include/os/queue.h | 0 .../src/bt/blehost/porting/w800/include/os/util.h | 0 .../bt/blehost/porting/w800/include/stats/stats.h | 0 .../bt/blehost/porting/w800/include/syscfg/syscfg.h | 0 .../porting/w800/include/sysflash/sysflash.h | 0 .../blehost/porting/w800/include/sysinit/sysinit.h | 0 .../src/bt/blehost/porting/w800/src/Makefile | 0 .../src/bt/blehost/porting/w800/src/endian.c | 0 .../src/bt/blehost/porting/w800/src/mem.c | 0 .../src/bt/blehost/porting/w800/src/nimble_port.c | 0 .../bt/blehost/porting/w800/src/npl_os_freertos.c | 0 .../src/bt/blehost/porting/w800/src/os_mbuf.c | 0 .../src/bt/blehost/porting/w800/src/os_mempool.c | 0 .../src/bt/blehost/porting/w800/src/os_msys_init.c | 0 .../src/bt/blehost/porting/w800/src/tls_nimble.c | 0 .../src/bt/host/Makefile | 0 .../src/bt/host/bta/Makefile | 0 .../src/bt/host/bta/ag/Makefile | 0 .../src/bt/host/bta/ag/bta_ag_act.c | 0 .../src/bt/host/bta/ag/bta_ag_api.c | 0 .../src/bt/host/bta/ag/bta_ag_at.c | 0 .../src/bt/host/bta/ag/bta_ag_cfg.c | 0 .../src/bt/host/bta/ag/bta_ag_ci.c | 0 .../src/bt/host/bta/ag/bta_ag_cmd.c | 0 .../src/bt/host/bta/ag/bta_ag_main.c | 0 .../src/bt/host/bta/ag/bta_ag_rfc.c | 0 .../src/bt/host/bta/ag/bta_ag_sco.c | 0 .../src/bt/host/bta/ag/bta_ag_sdp.c | 0 .../src/bt/host/bta/ar/Makefile | 0 .../src/bt/host/bta/ar/bta_ar.c | 0 .../src/bt/host/bta/av/Makefile | 0 .../src/bt/host/bta/av/bta_av_aact.c | 0 .../src/bt/host/bta/av/bta_av_act.c | 0 .../src/bt/host/bta/av/bta_av_api.c | 0 .../src/bt/host/bta/av/bta_av_cfg.c | 0 .../src/bt/host/bta/av/bta_av_ci.c | 0 .../src/bt/host/bta/av/bta_av_main.c | 0 .../src/bt/host/bta/av/bta_av_sbc.c | 0 .../src/bt/host/bta/av/bta_av_ssm.c | 0 .../src/bt/host/bta/dm/Makefile | 0 .../src/bt/host/bta/dm/bta_dm_act.c | 0 .../src/bt/host/bta/dm/bta_dm_api.c | 0 .../src/bt/host/bta/dm/bta_dm_cfg.c | 0 .../src/bt/host/bta/dm/bta_dm_ci.c | 0 .../src/bt/host/bta/dm/bta_dm_main.c | 0 .../src/bt/host/bta/dm/bta_dm_pm.c | 0 .../src/bt/host/bta/dm/bta_dm_sco.c | 0 .../src/bt/host/bta/gatt/Makefile | 0 .../src/bt/host/bta/gatt/bta_gattc_act.c | 0 .../src/bt/host/bta/gatt/bta_gattc_api.c | 0 .../src/bt/host/bta/gatt/bta_gattc_cache.c | 0 .../src/bt/host/bta/gatt/bta_gattc_main.c | 0 .../src/bt/host/bta/gatt/bta_gattc_utils.c | 0 .../src/bt/host/bta/gatt/bta_gatts_act.c | 0 .../src/bt/host/bta/gatt/bta_gatts_api.c | 0 .../src/bt/host/bta/gatt/bta_gatts_main.c | 0 .../src/bt/host/bta/gatt/bta_gatts_utils.c | 0 .../src/bt/host/bta/hf_client/Makefile | 0 .../src/bt/host/bta/hf_client/bta_hf_client_act.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_api.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_at.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_cmd.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_co.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_main.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_rfc.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_sco.c | 0 .../src/bt/host/bta/hf_client/bta_hf_client_sdp.c | 0 .../src/bt/host/bta/hh/Makefile | 0 .../src/bt/host/bta/hh/bta_hh_act.c | 0 .../src/bt/host/bta/hh/bta_hh_api.c | 0 .../src/bt/host/bta/hh/bta_hh_cfg.c | 0 .../src/bt/host/bta/hh/bta_hh_le.c | 0 .../src/bt/host/bta/hh/bta_hh_main.c | 0 .../src/bt/host/bta/hh/bta_hh_utils.c | 0 .../src/bt/host/bta/hl/Makefile | 0 .../src/bt/host/bta/hl/bta_hl_act.c | 0 .../src/bt/host/bta/hl/bta_hl_api.c | 0 .../src/bt/host/bta/hl/bta_hl_ci.c | 0 .../src/bt/host/bta/hl/bta_hl_main.c | 0 .../src/bt/host/bta/hl/bta_hl_sdp.c | 0 .../src/bt/host/bta/hl/bta_hl_utils.c | 0 .../src/bt/host/bta/include/bta_ag_api.h | 0 .../src/bt/host/bta/include/bta_ag_at.h | 0 .../src/bt/host/bta/include/bta_ag_ci.h | 0 .../src/bt/host/bta/include/bta_ag_co.h | 0 .../src/bt/host/bta/include/bta_ag_int.h | 0 .../src/bt/host/bta/include/bta_api.h | 0 .../src/bt/host/bta/include/bta_ar_api.h | 0 .../src/bt/host/bta/include/bta_ar_int.h | 0 .../src/bt/host/bta/include/bta_av_api.h | 0 .../src/bt/host/bta/include/bta_av_ci.h | 0 .../src/bt/host/bta/include/bta_av_co.h | 0 .../src/bt/host/bta/include/bta_av_int.h | 0 .../src/bt/host/bta/include/bta_av_sbc.h | 0 .../src/bt/host/bta/include/bta_dm_ci.h | 0 .../src/bt/host/bta/include/bta_dm_co.h | 0 .../src/bt/host/bta/include/bta_dm_int.h | 0 .../src/bt/host/bta/include/bta_gatt_api.h | 0 .../src/bt/host/bta/include/bta_gattc_int.h | 0 .../src/bt/host/bta/include/bta_gatts_co.h | 0 .../src/bt/host/bta/include/bta_gatts_int.h | 0 .../src/bt/host/bta/include/bta_hf_client_api.h | 0 .../src/bt/host/bta/include/bta_hf_client_at.h | 0 .../src/bt/host/bta/include/bta_hf_client_co.h | 0 .../src/bt/host/bta/include/bta_hf_client_int.h | 0 .../src/bt/host/bta/include/bta_hh_api.h | 0 .../src/bt/host/bta/include/bta_hh_co.h | 0 .../src/bt/host/bta/include/bta_hh_int.h | 0 .../src/bt/host/bta/include/bta_hl_api.h | 0 .../src/bt/host/bta/include/bta_hl_ci.h | 0 .../src/bt/host/bta/include/bta_hl_co.h | 0 .../src/bt/host/bta/include/bta_hl_int.h | 0 .../src/bt/host/bta/include/bta_jv_api.h | 0 .../src/bt/host/bta/include/bta_jv_co.h | 0 .../src/bt/host/bta/include/bta_jv_int.h | 0 .../src/bt/host/bta/include/bta_mce_api.h | 0 .../src/bt/host/bta/include/bta_mce_int.h | 0 .../src/bt/host/bta/include/bta_op_api.h | 0 .../src/bt/host/bta/include/bta_pan_api.h | 0 .../src/bt/host/bta/include/bta_pan_ci.h | 0 .../src/bt/host/bta/include/bta_pan_co.h | 0 .../src/bt/host/bta/include/bta_pan_int.h | 0 .../src/bt/host/bta/include/bta_pbs_int.h | 0 .../src/bt/host/bta/include/bta_sdp_api.h | 0 .../src/bt/host/bta/include/bta_sdp_int.h | 0 .../src/bt/host/bta/include/bta_sys.h | 0 .../src/bt/host/bta/include/bta_sys_int.h | 0 .../src/bt/host/bta/include/ptim.h | 0 .../src/bt/host/bta/include/utl.h | 0 .../src/bt/host/bta/jv/Makefile | 0 .../src/bt/host/bta/jv/bta_jv_act.c | 0 .../src/bt/host/bta/jv/bta_jv_api.c | 0 .../src/bt/host/bta/jv/bta_jv_cfg.c | 0 .../src/bt/host/bta/jv/bta_jv_main.c | 0 .../src/bt/host/bta/mce/Makefile | 0 .../src/bt/host/bta/mce/bta_mce_act.c | 0 .../src/bt/host/bta/mce/bta_mce_api.c | 0 .../src/bt/host/bta/mce/bta_mce_cfg.c | 0 .../src/bt/host/bta/mce/bta_mce_main.c | 0 .../src/bt/host/bta/pan/Makefile | 0 .../src/bt/host/bta/pan/bta_pan_act.c | 0 .../src/bt/host/bta/pan/bta_pan_api.c | 0 .../src/bt/host/bta/pan/bta_pan_ci.c | 0 .../src/bt/host/bta/pan/bta_pan_main.c | 0 .../src/bt/host/bta/sdp/Makefile | 0 .../src/bt/host/bta/sdp/bta_sdp.c | 0 .../src/bt/host/bta/sdp/bta_sdp_act.c | 0 .../src/bt/host/bta/sdp/bta_sdp_api.c | 0 .../src/bt/host/bta/sdp/bta_sdp_cfg.c | 0 .../src/bt/host/bta/sys/Makefile | 0 .../src/bt/host/bta/sys/bta_sys_cfg.c | 0 .../src/bt/host/bta/sys/bta_sys_conn.c | 0 .../src/bt/host/bta/sys/bta_sys_main.c | 0 .../src/bt/host/bta/sys/ptim.c | 0 .../src/bt/host/bta/sys/utl.c | 0 .../src/bt/host/btcore/Makefile | 0 .../src/bt/host/btcore/include/bdaddr.h | 0 .../src/bt/host/btcore/include/device_class.h | 0 .../src/bt/host/btcore/include/device_features.h | 0 .../src/bt/host/btcore/include/event_mask.h | 0 .../src/bt/host/btcore/include/hal_util.h | 0 .../src/bt/host/btcore/include/iac.h | 0 .../src/bt/host/btcore/include/module.h | 0 .../src/bt/host/btcore/include/osi_module.h | 0 .../src/bt/host/btcore/include/property.h | 0 .../src/bt/host/btcore/include/uuid.h | 0 .../src/bt/host/btcore/include/version.h | 0 .../src/bt/host/btcore/src/Makefile | 0 .../src/bt/host/btcore/src/bdaddr.c | 0 .../src/bt/host/btcore/src/device_class.c | 0 .../src/bt/host/btcore/src/property.c | 0 .../src/bt/host/btcore/src/uuid.c | 0 .../src/bt/host/btif/Makefile | 0 .../src/bt/host/btif/co/Makefile | 0 .../src/bt/host/btif/co/bta_ag_co.c | 0 .../src/bt/host/btif/co/bta_av_co.c | 0 .../src/bt/host/btif/co/bta_dm_co.c | 0 .../src/bt/host/btif/co/bta_gatts_co.c | 0 .../src/bt/host/btif/co/bta_hh_co.c | 0 .../src/bt/host/btif/co/bta_hl_co.c | 0 .../src/bt/host/btif/co/bta_pan_co.c | 0 .../src/bt/host/btif/include/btif_api.h | 0 .../src/bt/host/btif/include/btif_av.h | 0 .../src/bt/host/btif/include/btif_av_api.h | 0 .../src/bt/host/btif/include/btif_av_co.h | 0 .../bt/host/btif/include/btif_avrcp_audio_track.h | 0 .../src/bt/host/btif/include/btif_common.h | 0 .../src/bt/host/btif/include/btif_config.h | 0 .../bt/host/btif/include/btif_config_transcode.h | 0 .../src/bt/host/btif/include/btif_debug.h | 0 .../src/bt/host/btif/include/btif_debug_btsnoop.h | 0 .../src/bt/host/btif/include/btif_debug_conn.h | 0 .../src/bt/host/btif/include/btif_dm.h | 0 .../src/bt/host/btif/include/btif_gatt.h | 0 .../bt/host/btif/include/btif_gatt_multi_adv_util.h | 0 .../src/bt/host/btif/include/btif_gatt_util.h | 0 .../src/bt/host/btif/include/btif_hh.h | 0 .../src/bt/host/btif/include/btif_hl.h | 0 .../src/bt/host/btif/include/btif_mce.h | 0 .../src/bt/host/btif/include/btif_media.h | 0 .../src/bt/host/btif/include/btif_pan.h | 0 .../src/bt/host/btif/include/btif_pan_internal.h | 0 .../src/bt/host/btif/include/btif_profile_queue.h | 0 .../src/bt/host/btif/include/btif_sdp.h | 0 .../src/bt/host/btif/include/btif_sm.h | 0 .../src/bt/host/btif/include/btif_sock.h | 0 .../src/bt/host/btif/include/btif_sock_l2cap.h | 0 .../src/bt/host/btif/include/btif_sock_rfc.h | 0 .../src/bt/host/btif/include/btif_sock_sco.h | 0 .../src/bt/host/btif/include/btif_sock_sdp.h | 0 .../src/bt/host/btif/include/btif_sock_thread.h | 0 .../src/bt/host/btif/include/btif_sock_util.h | 0 .../src/bt/host/btif/include/btif_storage.h | 0 .../src/bt/host/btif/include/btif_uid.h | 0 .../src/bt/host/btif/include/btif_util.h | 0 .../src/bt/host/btif/include/stack_manager.h | 0 .../src/bt/host/btif/include/uinput.h | 0 .../src/bt/host/btif/src/Makefile | 0 .../src/bt/host/btif/src/bluetooth.c | 0 .../src/bt/host/btif/src/btif_av.c | 0 .../src/bt/host/btif/src/btif_core.c | 0 .../src/bt/host/btif/src/btif_dm.c | 0 .../src/bt/host/btif/src/btif_gatt.c | 0 .../src/bt/host/btif/src/btif_gatt_client.c | 0 .../src/bt/host/btif/src/btif_gatt_dm.c | 0 .../src/bt/host/btif/src/btif_gatt_multi_adv_util.c | 0 .../src/bt/host/btif/src/btif_gatt_server.c | 0 .../src/bt/host/btif/src/btif_gatt_util.c | 0 .../src/bt/host/btif/src/btif_hf.c | 0 .../src/bt/host/btif/src/btif_hf_client.c | 0 .../src/bt/host/btif/src/btif_hh.c | 0 .../src/bt/host/btif/src/btif_hl.c | 0 .../src/bt/host/btif/src/btif_mce.c | 0 .../src/bt/host/btif/src/btif_media_task.c | 0 .../src/bt/host/btif/src/btif_pan.c | 0 .../src/bt/host/btif/src/btif_profile_queue.c | 0 .../src/bt/host/btif/src/btif_rc.c | 0 .../src/bt/host/btif/src/btif_sdp.c | 0 .../src/bt/host/btif/src/btif_sdp_server.c | 0 .../src/bt/host/btif/src/btif_sm.c | 0 .../src/bt/host/btif/src/btif_spp.c | 0 .../src/bt/host/btif/src/btif_storage.c | 0 .../src/bt/host/btif/src/btif_util.c | 0 .../src/bt/host/conf/Android.mk | 0 .../src/bt/host/conf/bt_did.conf | 0 .../src/bt/host/conf/bt_stack.conf | 0 .../src/bt/host/embdrv/Makefile | 0 .../src/bt/host/embdrv/sbc/Makefile | 0 .../src/bt/host/embdrv/sbc/decoder/Makefile | 0 .../bt/host/embdrv/sbc/decoder/include/oi_assert.h | 0 .../host/embdrv/sbc/decoder/include/oi_bitstream.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h | 0 .../host/embdrv/sbc/decoder/include/oi_codec_sbc.h | 0 .../sbc/decoder/include/oi_codec_sbc_private.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_common.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_modules.h | 0 .../embdrv/sbc/decoder/include/oi_osinterface.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_status.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_stddefs.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_string.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_time.h | 0 .../bt/host/embdrv/sbc/decoder/include/oi_utils.h | 0 .../src/bt/host/embdrv/sbc/decoder/srce/Makefile | 0 .../src/bt/host/embdrv/sbc/decoder/srce/alloc.c | 0 .../bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c | 0 .../src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c | 0 .../host/embdrv/sbc/decoder/srce/bitstream-decode.c | 0 .../bt/host/embdrv/sbc/decoder/srce/decoder-oina.c | 0 .../host/embdrv/sbc/decoder/srce/decoder-private.c | 0 .../bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c | 0 .../src/bt/host/embdrv/sbc/decoder/srce/dequant.c | 0 .../bt/host/embdrv/sbc/decoder/srce/framing-sbc.c | 0 .../src/bt/host/embdrv/sbc/decoder/srce/framing.c | 0 .../host/embdrv/sbc/decoder/srce/oi_codec_version.c | 0 .../embdrv/sbc/decoder/srce/readsamplesjoint.inc | 0 .../embdrv/sbc/decoder/srce/synthesis-8-generated.c | 0 .../host/embdrv/sbc/decoder/srce/synthesis-dct8.c | 0 .../bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c | 0 .../src/bt/host/embdrv/sbc/encoder/Makefile | 0 .../bt/host/embdrv/sbc/encoder/include/sbc_dct.h | 0 .../sbc/encoder/include/sbc_enc_func_declare.h | 0 .../host/embdrv/sbc/encoder/include/sbc_encoder.h | 0 .../src/bt/host/embdrv/sbc/encoder/include/sbc_if.h | 0 .../bt/host/embdrv/sbc/encoder/include/sbc_types.h | 0 .../src/bt/host/embdrv/sbc/encoder/srce/Makefile | 0 .../bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c | 0 .../src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c | 0 .../host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c | 0 .../sbc/encoder/srce/sbc_enc_bit_alloc_mono.c | 0 .../embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c | 0 .../host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c | 0 .../bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c | 0 .../bt/host/embdrv/sbc/encoder/srce/sbc_packing.c | 0 .../src/bt/host/gki/Android.mk | 0 .../src/bt/host/gki/Makefile | 0 .../src/bt/host/gki/common/Makefile | 0 .../src/bt/host/gki/common/gki.h | 0 .../src/bt/host/gki/common/gki_buffer.c | 0 .../src/bt/host/gki/common/gki_common.h | 0 .../src/bt/host/gki/common/gki_debug.c | 0 .../src/bt/host/gki/common/gki_time.c | 0 .../src/bt/host/gki/wm/Makefile | 0 .../src/bt/host/gki/wm/data_types.h | 0 .../src/bt/host/gki/wm/gki_int.h | 0 .../src/bt/host/gki/wm/gki_wm.c | 0 .../src/bt/host/hci/Makefile | 0 .../src/bt/host/hci/include/bt_hci_bdroid.h | 0 .../src/bt/host/hci/include/bt_hci_lib.h | 0 .../src/bt/host/hci/include/bt_vendor_lib.h | 0 .../src/bt/host/hci/include/btsnoop.h | 0 .../src/bt/host/hci/include/btsnoop_mem.h | 0 .../src/bt/host/hci/include/buffer_allocator.h | 0 .../src/bt/host/hci/include/hci_audio.h | 0 .../src/bt/host/hci/include/hci_hal.h | 0 .../src/bt/host/hci/include/hci_inject.h | 0 .../src/bt/host/hci/include/hci_internals.h | 0 .../src/bt/host/hci/include/hci_layer.h | 0 .../src/bt/host/hci/include/hci_packet_factory.h | 0 .../src/bt/host/hci/include/hci_packet_parser.h | 0 .../src/bt/host/hci/include/hcih.h | 0 .../src/bt/host/hci/include/low_power_manager.h | 0 .../src/bt/host/hci/include/packet_fragmenter.h | 0 .../src/bt/host/hci/include/userial.h | 0 .../src/bt/host/hci/include/vendor.h | 0 .../src/bt/host/hci/src/Makefile | 0 .../src/bt/host/hci/src/bt_hci_bdroid.c | 0 .../src/bt/host/hci/src/hci_h4.c | 0 .../src/bt/host/hci/src/utils.c | 0 .../src/bt/host/include/audio_a2dp_hw.h | 0 .../src/bt/host/include/bdroid_buildcfg.h | 0 .../src/bt/host/include/bluetooth.h | 0 .../src/bt/host/include/bt_av.h | 0 .../src/bt/host/include/bt_common.h | 0 .../src/bt/host/include/bt_common_types.h | 0 .../src/bt/host/include/bt_gatt.h | 0 .../src/bt/host/include/bt_gatt_client.h | 0 .../src/bt/host/include/bt_gatt_dm.h | 0 .../src/bt/host/include/bt_gatt_server.h | 0 .../src/bt/host/include/bt_gatt_types.h | 0 .../src/bt/host/include/bt_hf.h | 0 .../src/bt/host/include/bt_hf_client.h | 0 .../src/bt/host/include/bt_hh.h | 0 .../src/bt/host/include/bt_hl.h | 0 .../src/bt/host/include/bt_mce.h | 0 .../src/bt/host/include/bt_pan.h | 0 .../src/bt/host/include/bt_rc.h | 0 .../src/bt/host/include/bt_sdp.h | 0 .../src/bt/host/include/bt_sock.h | 0 .../src/bt/host/include/bt_target.h | 0 .../src/bt/host/include/bt_trace.h | 0 .../src/bt/host/include/bt_utils.h | 0 .../src/bt/host/include/bte.h | 0 .../src/bt/host/include/bte_appl.h | 0 .../src/bt/host/include/generic.h | 0 .../src/bt/host/include/gki_target.h | 0 .../src/bt/host/include/gki_target_ble.h | 0 .../src/bt/host/include/stack_config.h | 0 .../src/bt/host/main/Makefile | 0 .../src/bt/host/main/bte_init.c | 0 .../src/bt/host/main/bte_logmsg.c | 0 .../src/bt/host/main/bte_main.c | 0 .../src/bt/host/main/wm_bt_storage.c | 0 .../src/bt/host/main/wm_bt_storage.h | 0 .../src/bt/host/osi/Makefile | 0 .../src/bt/host/osi/include/alarm.h | 0 .../src/bt/host/osi/include/allocation_tracker.h | 0 .../src/bt/host/osi/include/allocator.h | 0 .../src/bt/host/osi/include/array.h | 0 .../src/bt/host/osi/include/buffer.h | 0 .../src/bt/host/osi/include/compat.h | 0 .../src/bt/host/osi/include/config.h | 0 .../src/bt/host/osi/include/data_dispatcher.h | 0 .../src/bt/host/osi/include/eager_reader.h | 0 .../src/bt/host/osi/include/fixed_queue.h | 0 .../src/bt/host/osi/include/future.h | 0 .../src/bt/host/osi/include/hash_functions.h | 0 .../src/bt/host/osi/include/hash_map.h | 0 .../src/bt/host/osi/include/hash_map_utils.h | 0 .../src/bt/host/osi/include/list.h | 0 .../src/bt/host/osi/include/log.h | 0 .../src/bt/host/osi/include/metrics.h | 0 .../src/bt/host/osi/include/mutex.h | 0 .../src/bt/host/osi/include/osi.h | 0 .../src/bt/host/osi/include/properties.h | 0 .../src/bt/host/osi/include/reactor.h | 0 .../src/bt/host/osi/include/ringbuffer.h | 0 .../src/bt/host/osi/include/semaphore.h | 0 .../src/bt/host/osi/include/socket.h | 0 .../bt/host/osi/include/socket_utils/socket_local.h | 0 .../src/bt/host/osi/include/socket_utils/sockets.h | 0 .../src/bt/host/osi/include/thread.h | 0 .../src/bt/host/osi/include/wakelock.h | 0 .../src/bt/host/osi/src/Makefile | 0 .../src/bt/host/osi/src/buffer.c | 0 .../src/bt/host/osi/src/compat.c | 0 .../src/bt/host/osi/src/fixed_queue.c | 0 .../src/bt/host/osi/src/hash_map.c | 0 .../src/bt/host/osi/src/list.c | 0 .../src/bt/host/osi/src/mutex.c | 0 .../src/bt/host/osi/src/ringbuffer.c | 0 .../src/bt/host/stack/Makefile | 0 .../src/bt/host/stack/a2dp/Makefile | 0 .../src/bt/host/stack/a2dp/a2d_api.c | 0 .../src/bt/host/stack/a2dp/a2d_sbc.c | 0 .../src/bt/host/stack/avct/Makefile | 0 .../src/bt/host/stack/avct/avct_api.c | 0 .../src/bt/host/stack/avct/avct_ccb.c | 0 .../src/bt/host/stack/avct/avct_l2c.c | 0 .../src/bt/host/stack/avct/avct_lcb.c | 0 .../src/bt/host/stack/avct/avct_lcb_act.c | 0 .../src/bt/host/stack/avdt/Makefile | 0 .../src/bt/host/stack/avdt/avdt_ad.c | 0 .../src/bt/host/stack/avdt/avdt_api.c | 0 .../src/bt/host/stack/avdt/avdt_ccb.c | 0 .../src/bt/host/stack/avdt/avdt_ccb_act.c | 0 .../src/bt/host/stack/avdt/avdt_l2c.c | 0 .../src/bt/host/stack/avdt/avdt_msg.c | 0 .../src/bt/host/stack/avdt/avdt_scb.c | 0 .../src/bt/host/stack/avdt/avdt_scb_act.c | 0 .../src/bt/host/stack/avrc/Makefile | 0 .../src/bt/host/stack/avrc/avrc_api.c | 0 .../src/bt/host/stack/avrc/avrc_bld_ct.c | 0 .../src/bt/host/stack/avrc/avrc_bld_tg.c | 0 .../src/bt/host/stack/avrc/avrc_opt.c | 0 .../src/bt/host/stack/avrc/avrc_pars_ct.c | 0 .../src/bt/host/stack/avrc/avrc_pars_tg.c | 0 .../src/bt/host/stack/avrc/avrc_sdp.c | 0 .../src/bt/host/stack/avrc/avrc_utils.c | 0 .../src/bt/host/stack/bnep/Makefile | 0 .../src/bt/host/stack/bnep/bnep_api.c | 0 .../src/bt/host/stack/bnep/bnep_int.h | 0 .../src/bt/host/stack/bnep/bnep_main.c | 0 .../src/bt/host/stack/bnep/bnep_utils.c | 0 .../src/bt/host/stack/btm/Makefile | 0 .../src/bt/host/stack/btm/btm_acl.c | 0 .../src/bt/host/stack/btm/btm_ble.c | 0 .../src/bt/host/stack/btm/btm_ble_addr.c | 0 .../src/bt/host/stack/btm/btm_ble_adv_filter.c | 0 .../src/bt/host/stack/btm/btm_ble_batchscan.c | 0 .../src/bt/host/stack/btm/btm_ble_bgconn.c | 0 .../src/bt/host/stack/btm/btm_ble_cont_energy.c | 0 .../src/bt/host/stack/btm/btm_ble_gap.c | 0 .../src/bt/host/stack/btm/btm_ble_multi_adv.c | 0 .../src/bt/host/stack/btm/btm_ble_privacy.c | 0 .../src/bt/host/stack/btm/btm_dev.c | 0 .../src/bt/host/stack/btm/btm_devctl.c | 0 .../src/bt/host/stack/btm/btm_inq.c | 0 .../src/bt/host/stack/btm/btm_main.c | 0 .../src/bt/host/stack/btm/btm_pm.c | 0 .../src/bt/host/stack/btm/btm_sco.c | 0 .../src/bt/host/stack/btm/btm_sec.c | 0 .../src/bt/host/stack/btu/Makefile | 0 .../src/bt/host/stack/btu/btu_hcif.c | 0 .../src/bt/host/stack/btu/btu_init.c | 0 .../src/bt/host/stack/btu/btu_task.c | 0 .../src/bt/host/stack/gap/Makefile | 0 .../src/bt/host/stack/gap/gap_api.c | 0 .../src/bt/host/stack/gap/gap_ble.c | 0 .../src/bt/host/stack/gap/gap_conn.c | 0 .../src/bt/host/stack/gap/gap_utils.c | 0 .../src/bt/host/stack/gatt/Makefile | 0 .../src/bt/host/stack/gatt/att_protocol.c | 0 .../src/bt/host/stack/gatt/gatt_api.c | 0 .../src/bt/host/stack/gatt/gatt_attr.c | 0 .../src/bt/host/stack/gatt/gatt_auth.c | 0 .../src/bt/host/stack/gatt/gatt_cl.c | 0 .../src/bt/host/stack/gatt/gatt_db.c | 0 .../src/bt/host/stack/gatt/gatt_main.c | 0 .../src/bt/host/stack/gatt/gatt_sr.c | 0 .../src/bt/host/stack/gatt/gatt_utils.c | 0 .../src/bt/host/stack/hcic/Makefile | 0 .../src/bt/host/stack/hcic/hciblecmds.c | 0 .../src/bt/host/stack/hcic/hcicmds.c | 0 .../src/bt/host/stack/hid/Makefile | 0 .../src/bt/host/stack/hid/hidh_api.c | 0 .../src/bt/host/stack/hid/hidh_conn.c | 0 .../src/bt/host/stack/include/a2d_api.h | 0 .../src/bt/host/stack/include/a2d_int.h | 0 .../src/bt/host/stack/include/a2d_sbc.h | 0 .../src/bt/host/stack/include/avct_api.h | 0 .../src/bt/host/stack/include/avct_defs.h | 0 .../src/bt/host/stack/include/avct_int.h | 0 .../src/bt/host/stack/include/avdt_api.h | 0 .../src/bt/host/stack/include/avdt_defs.h | 0 .../src/bt/host/stack/include/avdt_int.h | 0 .../src/bt/host/stack/include/avdtc_api.h | 0 .../src/bt/host/stack/include/avrc_api.h | 0 .../src/bt/host/stack/include/avrc_defs.h | 0 .../src/bt/host/stack/include/avrc_int.h | 0 .../src/bt/host/stack/include/bnep_api.h | 0 .../src/bt/host/stack/include/bt_buffer_q.h | 0 .../src/bt/host/stack/include/bt_types.h | 0 .../src/bt/host/stack/include/btm_api.h | 0 .../src/bt/host/stack/include/btm_ble_api.h | 0 .../src/bt/host/stack/include/btm_ble_int.h | 0 .../src/bt/host/stack/include/btm_int.h | 0 .../src/bt/host/stack/include/btu.h | 0 .../src/bt/host/stack/include/dyn_mem.h | 0 .../src/bt/host/stack/include/gap_api.h | 0 .../src/bt/host/stack/include/gap_int.h | 0 .../src/bt/host/stack/include/gatt_api.h | 0 .../src/bt/host/stack/include/gatt_int.h | 0 .../src/bt/host/stack/include/gattdefs.h | 0 .../src/bt/host/stack/include/hcidefs.h | 0 .../src/bt/host/stack/include/hcimsgs.h | 0 .../src/bt/host/stack/include/hid_conn.h | 0 .../src/bt/host/stack/include/hiddefs.h | 0 .../src/bt/host/stack/include/hidh_api.h | 0 .../src/bt/host/stack/include/hidh_int.h | 0 .../src/bt/host/stack/include/l2c_api.h | 0 .../src/bt/host/stack/include/l2c_int.h | 0 .../src/bt/host/stack/include/l2cap_client.h | 0 .../src/bt/host/stack/include/l2cdefs.h | 0 .../src/bt/host/stack/include/mca_api.h | 0 .../src/bt/host/stack/include/mca_defs.h | 0 .../src/bt/host/stack/include/mca_int.h | 0 .../src/bt/host/stack/include/p_256_ecc_pp.h | 0 .../src/bt/host/stack/include/p_256_multprecision.h | 0 .../src/bt/host/stack/include/pan_api.h | 0 .../src/bt/host/stack/include/pan_int.h | 0 .../src/bt/host/stack/include/port_api.h | 0 .../src/bt/host/stack/include/port_ext.h | 0 .../src/bt/host/stack/include/port_int.h | 0 .../src/bt/host/stack/include/profiles_api.h | 0 .../src/bt/host/stack/include/rfc_int.h | 0 .../src/bt/host/stack/include/rfcdefs.h | 0 .../src/bt/host/stack/include/sdp_api.h | 0 .../src/bt/host/stack/include/sdpdefs.h | 0 .../src/bt/host/stack/include/sdpint.h | 0 .../src/bt/host/stack/include/smp_api.h | 0 .../src/bt/host/stack/include/smp_int.h | 0 .../src/bt/host/stack/include/srvc_api.h | 0 .../src/bt/host/stack/include/srvc_battery_int.h | 0 .../src/bt/host/stack/include/srvc_dis_int.h | 0 .../src/bt/host/stack/include/srvc_eng_int.h | 0 .../src/bt/host/stack/l2cap/Makefile | 0 .../src/bt/host/stack/l2cap/l2c_api.c | 0 .../src/bt/host/stack/l2cap/l2c_ble.c | 0 .../src/bt/host/stack/l2cap/l2c_csm.c | 0 .../src/bt/host/stack/l2cap/l2c_fcr.c | 0 .../src/bt/host/stack/l2cap/l2c_link.c | 0 .../src/bt/host/stack/l2cap/l2c_main.c | 0 .../src/bt/host/stack/l2cap/l2c_ucd.c | 0 .../src/bt/host/stack/l2cap/l2c_utils.c | 0 .../src/bt/host/stack/l2cap/l2cap_client.c | 0 .../src/bt/host/stack/mcap/Makefile | 0 .../src/bt/host/stack/mcap/mca_api.c | 0 .../src/bt/host/stack/mcap/mca_cact.c | 0 .../src/bt/host/stack/mcap/mca_csm.c | 0 .../src/bt/host/stack/mcap/mca_dact.c | 0 .../src/bt/host/stack/mcap/mca_dsm.c | 0 .../src/bt/host/stack/mcap/mca_l2c.c | 0 .../src/bt/host/stack/mcap/mca_main.c | 0 .../src/bt/host/stack/pan/Makefile | 0 .../src/bt/host/stack/pan/pan_api.c | 0 .../src/bt/host/stack/pan/pan_main.c | 0 .../src/bt/host/stack/pan/pan_utils.c | 0 .../src/bt/host/stack/rfcomm/Makefile | 0 .../src/bt/host/stack/rfcomm/port_api.c | 0 .../src/bt/host/stack/rfcomm/port_rfc.c | 0 .../src/bt/host/stack/rfcomm/port_utils.c | 0 .../src/bt/host/stack/rfcomm/rfc_l2cap_if.c | 0 .../src/bt/host/stack/rfcomm/rfc_mx_fsm.c | 0 .../src/bt/host/stack/rfcomm/rfc_port_fsm.c | 0 .../src/bt/host/stack/rfcomm/rfc_port_if.c | 0 .../src/bt/host/stack/rfcomm/rfc_ts_frames.c | 0 .../src/bt/host/stack/rfcomm/rfc_utils.c | 0 .../src/bt/host/stack/sdp/Makefile | 0 .../src/bt/host/stack/sdp/sdp_api.c | 0 .../src/bt/host/stack/sdp/sdp_db.c | 0 .../src/bt/host/stack/sdp/sdp_discovery.c | 0 .../src/bt/host/stack/sdp/sdp_main.c | 0 .../src/bt/host/stack/sdp/sdp_server.c | 0 .../src/bt/host/stack/sdp/sdp_utils.c | 0 .../src/bt/host/stack/smp/Makefile | 0 .../src/bt/host/stack/smp/aes.c | 0 .../src/bt/host/stack/smp/aes.h | 0 .../src/bt/host/stack/smp/p_256_curvepara.c | 0 .../src/bt/host/stack/smp/p_256_ecc_pp.c | 0 .../src/bt/host/stack/smp/p_256_multprecision.c | 0 .../src/bt/host/stack/smp/smp_act.c | 0 .../src/bt/host/stack/smp/smp_api.c | 0 .../src/bt/host/stack/smp/smp_br_main.c | 0 .../src/bt/host/stack/smp/smp_cmac.c | 0 .../src/bt/host/stack/smp/smp_keys.c | 0 .../src/bt/host/stack/smp/smp_l2c.c | 0 .../src/bt/host/stack/smp/smp_main.c | 0 .../src/bt/host/stack/smp/smp_utils.c | 0 .../src/bt/host/stack/srvc/Makefile | 0 .../src/bt/host/stack/srvc/srvc_battery.c | 0 .../src/bt/host/stack/srvc/srvc_dis.c | 0 .../src/bt/host/stack/srvc/srvc_eng.c | 0 .../src/bt/host/udrv/include/uipc.h | 0 .../src/bt/host/udrv/ulinux/uipc_linux.h | 0 .../src/bt/host/vnd/ble/vendor_hcidefs.h | 0 .../src/bt/host/vnd/include/vendor_api.h | 0 .../src/network/Makefile | 0 .../src/network/api2.0.3/Makefile | 0 .../src/network/api2.0.3/tls_netconn.c | 0 .../src/network/api2.0.3/tls_netconn.h | 0 .../src/network/api2.0.3/tls_sockets.c | 0 .../src/network/lwip2.0.3/FILES | 0 .../src/network/lwip2.0.3/Filelists.mk | 0 .../src/network/lwip2.0.3/Makefile | 0 .../src/network/lwip2.0.3/api/Makefile | 0 .../src/network/lwip2.0.3/api/api_lib.c | 0 .../src/network/lwip2.0.3/api/api_msg.c | 0 .../src/network/lwip2.0.3/api/err.c | 0 .../src/network/lwip2.0.3/api/netbuf.c | 0 .../src/network/lwip2.0.3/api/netdb.c | 0 .../src/network/lwip2.0.3/api/netifapi.c | 0 .../src/network/lwip2.0.3/api/pppapi.c | 0 .../src/network/lwip2.0.3/api/sockets.c | 0 .../src/network/lwip2.0.3/api/tcpip.c | 0 .../src/network/lwip2.0.3/apps/httpd/fs.c | 0 .../src/network/lwip2.0.3/apps/httpd/fs/404.html | 0 .../network/lwip2.0.3/apps/httpd/fs/img/sics.gif | Bin .../src/network/lwip2.0.3/apps/httpd/fs/index.html | 0 .../src/network/lwip2.0.3/apps/httpd/fsdata.c | 0 .../src/network/lwip2.0.3/apps/httpd/fsdata.h | 0 .../src/network/lwip2.0.3/apps/httpd/httpd.c | 0 .../network/lwip2.0.3/apps/httpd/httpd_structs.h | 0 .../lwip2.0.3/apps/httpd/makefsdata/makefsdata | 0 .../lwip2.0.3/apps/httpd/makefsdata/makefsdata.c | 0 .../lwip2.0.3/apps/httpd/makefsdata/readme.txt | 0 .../src/network/lwip2.0.3/apps/lwiperf/lwiperf.c | 0 .../src/network/lwip2.0.3/apps/mdns/mdns.c | 0 .../src/network/lwip2.0.3/apps/mqtt/mqtt.c | 0 .../network/lwip2.0.3/apps/netbiosns/netbiosns.c | 0 .../CCodeGeneration/CCodeGeneration.csproj | 0 .../snmp/LwipMibCompiler/CCodeGeneration/CFile.cs | 0 .../LwipMibCompiler/CCodeGeneration/CGenerator.cs | 0 .../snmp/LwipMibCompiler/CCodeGeneration/Code.cs | 0 .../CCodeGeneration/CodeContainerBase.cs | 0 .../LwipMibCompiler/CCodeGeneration/CodeElement.cs | 0 .../snmp/LwipMibCompiler/CCodeGeneration/Comment.cs | 0 .../LwipMibCompiler/CCodeGeneration/EmptyLine.cs | 0 .../LwipMibCompiler/CCodeGeneration/Function.cs | 0 .../CCodeGeneration/FunctionDeclaration.cs | 0 .../LwipMibCompiler/CCodeGeneration/IfThenElse.cs | 0 .../snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs | 0 .../LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs | 0 .../LwipMibCompiler/CCodeGeneration/PP_Include.cs | 0 .../LwipMibCompiler/CCodeGeneration/PP_Macro.cs | 0 .../LwipMibCompiler/CCodeGeneration/PlainText.cs | 0 .../CCodeGeneration/Properties/AssemblyInfo.cs | 0 .../snmp/LwipMibCompiler/CCodeGeneration/Switch.cs | 0 .../CCodeGeneration/VariableDeclaration.cs | 0 .../CCodeGeneration/VariablePrototype.cs | 0 .../LwipMibCompiler/CCodeGeneration/VariableType.cs | 0 .../apps/snmp/LwipMibCompiler/LwipMibCompiler.sln | 0 .../LwipMibCompiler/LwipMibCompiler.csproj | 0 .../snmp/LwipMibCompiler/LwipMibCompiler/Program.cs | 0 .../LwipMibCompiler/Properties/AssemblyInfo.cs | 0 .../snmp/LwipMibCompiler/LwipMibCompiler/app.config | 0 .../LwipMibViewer/FormMain.Designer.cs | 0 .../snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs | 0 .../LwipMibCompiler/LwipMibViewer/FormMain.resx | 0 .../LwipMibViewer/LwipMibViewer.csproj | 0 .../snmp/LwipMibCompiler/LwipMibViewer/Program.cs | 0 .../LwipMibViewer/Properties/AssemblyInfo.cs | 0 .../LwipMibViewer/Properties/Resources.Designer.cs | 0 .../LwipMibViewer/Properties/Resources.resx | 0 .../LwipMibViewer/Properties/Settings.Designer.cs | 0 .../LwipMibViewer/Properties/Settings.settings | 0 .../snmp/LwipMibCompiler/LwipMibViewer/app.config | 0 .../LwipSnmpCodeGeneration/IRestriction.cs | 0 .../LwipSnmpCodeGeneration/LwipSnmp.cs | 0 .../LwipSnmpCodeGeneration.csproj | 0 .../LwipSnmpCodeGeneration/MibCFile.cs | 0 .../LwipSnmpCodeGeneration/MibHeaderFile.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../LwipSnmpCodeGeneration/SnmpMib.cs | 0 .../LwipSnmpCodeGeneration/SnmpNode.cs | 0 .../SnmpScalarAggregationNode.cs | 0 .../LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs | 0 .../LwipSnmpCodeGeneration/SnmpScalarNode.cs | 0 .../LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs | 0 .../SnmpScalarNodeCounter64.cs | 0 .../LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs | 0 .../SnmpScalarNodeObjectIdentifier.cs | 0 .../SnmpScalarNodeOctetString.cs | 0 .../SnmpScalarNodeTruthValue.cs | 0 .../LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs | 0 .../LwipSnmpCodeGeneration/SnmpTableNode.cs | 0 .../LwipSnmpCodeGeneration/SnmpTreeNode.cs | 0 .../Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB | 0 .../LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB | 0 .../LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB | 0 .../snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB | 0 .../snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB | 0 .../snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB | 0 .../snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB | 0 .../LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB | 0 .../snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB | 0 .../lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB | 0 .../lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC-1212 | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC-1215 | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF | 0 .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI | 0 .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC | 0 .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM | 0 .../apps/snmp/LwipMibCompiler/Mibs/TCP-MIB | 0 .../apps/snmp/LwipMibCompiler/Mibs/UDP-MIB | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs | 0 .../Mib/Elements/Entities/AgentCapabilities.cs | 0 .../Mib/Elements/Entities/EntityBase.cs | 0 .../SharpSnmpLib/Mib/Elements/Entities/IEntity.cs | 0 .../Mib/Elements/Entities/ModuleCompliance.cs | 0 .../Mib/Elements/Entities/ModuleIdentity.cs | 0 .../Mib/Elements/Entities/NotificationGroup.cs | 0 .../Mib/Elements/Entities/NotificationType.cs | 0 .../Mib/Elements/Entities/ObjectGroup.cs | 0 .../Mib/Elements/Entities/ObjectIdentity.cs | 0 .../Mib/Elements/Entities/ObjectType.cs | 0 .../Mib/Elements/Entities/OidValueAssignment.cs | 0 .../SharpSnmpLib/Mib/Elements/Exports.cs | 0 .../SharpSnmpLib/Mib/Elements/IDeclaration.cs | 0 .../SharpSnmpLib/Mib/Elements/IElement.cs | 0 .../SharpSnmpLib/Mib/Elements/ITypeReferrer.cs | 0 .../SharpSnmpLib/Mib/Elements/Imports.cs | 0 .../SharpSnmpLib/Mib/Elements/ImportsFrom.cs | 0 .../SharpSnmpLib/Mib/Elements/TrapType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/BaseType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/BitsType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/Choice.cs | 0 .../Mib/Elements/Types/ITypeAssignment.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/IntegerType.cs | 0 .../Mib/Elements/Types/IpAddressType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/Macro.cs | 0 .../Mib/Elements/Types/ObjectIdentifierType.cs | 0 .../Mib/Elements/Types/OctetStringType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/Sequence.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs | 0 .../Mib/Elements/Types/TextualConvention.cs | 0 .../Mib/Elements/Types/TypeAssignment.cs | 0 .../SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs | 0 .../SharpSnmpLib/Mib/ISymbolEnumerator.cs | 0 .../snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs | 0 .../SharpSnmpLib/Mib/MibException.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs | 0 .../SharpSnmpLib/Mib/MibTypesResolver.cs | 0 .../SharpSnmpLib/Mib/ObjectIdentifier.cs | 0 .../snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs | 0 .../snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs | 0 .../LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs | 0 .../SharpSnmpLib/Properties/AssemblyInfo.cs | 0 .../SharpSnmpLib/Properties/Resources.Designer.cs | 0 .../SharpSnmpLib/Properties/Resources.resx | 0 .../SharpSnmpLib/SharpSnmpLib.Mib.csproj | 0 .../snmp/LwipMibCompiler/SharpSnmpLib/license.txt | 0 .../LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk | Bin .../snmp/LwipMibCompiler/example/compile_udp_mib.sh | 0 .../src/network/lwip2.0.3/apps/snmp/README | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_asn1.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_asn1.h | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_core.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_core_priv.h | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_mib2.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c | 0 .../lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_mib2_system.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_msg.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_msg.h | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_netconn.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_raw.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_scalar.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_table.c | 0 .../network/lwip2.0.3/apps/snmp/snmp_threadsync.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmp_traps.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmpv3.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c | 0 .../network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c | 0 .../src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h | 0 .../src/network/lwip2.0.3/apps/sntp/sntp.c | 0 .../src/network/lwip2.0.3/apps/tftp/tftp_server.c | 0 .../src/network/lwip2.0.3/core/Makefile | 0 .../src/network/lwip2.0.3/core/alg.c | 0 .../src/network/lwip2.0.3/core/def.c | 0 .../src/network/lwip2.0.3/core/dns.c | 0 .../src/network/lwip2.0.3/core/inet_chksum.c | 0 .../src/network/lwip2.0.3/core/init.c | 0 .../src/network/lwip2.0.3/core/ip.c | 0 .../src/network/lwip2.0.3/core/ipv4/Makefile | 0 .../src/network/lwip2.0.3/core/ipv4/autoip.c | 0 .../src/network/lwip2.0.3/core/ipv4/dhcp.c | 0 .../src/network/lwip2.0.3/core/ipv4/etharp.c | 0 .../src/network/lwip2.0.3/core/ipv4/icmp.c | 0 .../src/network/lwip2.0.3/core/ipv4/igmp.c | 0 .../src/network/lwip2.0.3/core/ipv4/ip4.c | 0 .../src/network/lwip2.0.3/core/ipv4/ip4_addr.c | 0 .../src/network/lwip2.0.3/core/ipv4/ip4_frag.c | 0 .../src/network/lwip2.0.3/core/ipv4/ip_frag.c | 0 .../src/network/lwip2.0.3/core/ipv6/Makefile | 0 .../src/network/lwip2.0.3/core/ipv6/dhcp6.c | 0 .../src/network/lwip2.0.3/core/ipv6/ethip6.c | 0 .../src/network/lwip2.0.3/core/ipv6/icmp6.c | 0 .../src/network/lwip2.0.3/core/ipv6/inet6.c | 0 .../src/network/lwip2.0.3/core/ipv6/ip6.c | 0 .../src/network/lwip2.0.3/core/ipv6/ip6_addr.c | 0 .../src/network/lwip2.0.3/core/ipv6/ip6_frag.c | 0 .../src/network/lwip2.0.3/core/ipv6/mld6.c | 0 .../src/network/lwip2.0.3/core/ipv6/nd6.c | 0 .../src/network/lwip2.0.3/core/mem.c | 0 .../src/network/lwip2.0.3/core/memp.c | 0 .../src/network/lwip2.0.3/core/netif.c | 0 .../src/network/lwip2.0.3/core/pbuf.c | 0 .../src/network/lwip2.0.3/core/raw.c | 0 .../src/network/lwip2.0.3/core/stats.c | 0 .../src/network/lwip2.0.3/core/sys.c | 0 .../src/network/lwip2.0.3/core/tcp.c | 0 .../src/network/lwip2.0.3/core/tcp_in.c | 0 .../src/network/lwip2.0.3/core/tcp_out.c | 0 .../src/network/lwip2.0.3/core/timeouts.c | 0 .../src/network/lwip2.0.3/core/timers.c | 0 .../src/network/lwip2.0.3/core/udp.c | 0 .../src/network/lwip2.0.3/include/arch/cc.h | 0 .../src/network/lwip2.0.3/include/arch/perf.h | 0 .../src/network/lwip2.0.3/include/arch/sys_arch.h | 0 .../src/network/lwip2.0.3/include/lwip/alg.h | 0 .../src/network/lwip2.0.3/include/lwip/api.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/FILES | 0 .../src/network/lwip2.0.3/include/lwip/apps/fs.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/httpd.h | 0 .../lwip2.0.3/include/lwip/apps/httpd_opts.h | 0 .../network/lwip2.0.3/include/lwip/apps/lwiperf.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/mdns.h | 0 .../network/lwip2.0.3/include/lwip/apps/mdns_opts.h | 0 .../network/lwip2.0.3/include/lwip/apps/mdns_priv.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/mqtt.h | 0 .../network/lwip2.0.3/include/lwip/apps/mqtt_opts.h | 0 .../network/lwip2.0.3/include/lwip/apps/netbiosns.h | 0 .../lwip2.0.3/include/lwip/apps/netbiosns_opts.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/snmp.h | 0 .../network/lwip2.0.3/include/lwip/apps/snmp_core.h | 0 .../network/lwip2.0.3/include/lwip/apps/snmp_mib2.h | 0 .../network/lwip2.0.3/include/lwip/apps/snmp_opts.h | 0 .../lwip2.0.3/include/lwip/apps/snmp_scalar.h | 0 .../lwip2.0.3/include/lwip/apps/snmp_table.h | 0 .../lwip2.0.3/include/lwip/apps/snmp_threadsync.h | 0 .../network/lwip2.0.3/include/lwip/apps/snmpv3.h | 0 .../src/network/lwip2.0.3/include/lwip/apps/sntp.h | 0 .../network/lwip2.0.3/include/lwip/apps/sntp_opts.h | 0 .../network/lwip2.0.3/include/lwip/apps/tftp_opts.h | 0 .../lwip2.0.3/include/lwip/apps/tftp_server.h | 0 .../src/network/lwip2.0.3/include/lwip/arch.h | 0 .../src/network/lwip2.0.3/include/lwip/autoip.h | 0 .../src/network/lwip2.0.3/include/lwip/debug.h | 0 .../src/network/lwip2.0.3/include/lwip/def.h | 0 .../src/network/lwip2.0.3/include/lwip/dhcp.h | 0 .../src/network/lwip2.0.3/include/lwip/dhcp6.h | 0 .../src/network/lwip2.0.3/include/lwip/dns.h | 0 .../src/network/lwip2.0.3/include/lwip/err.h | 0 .../src/network/lwip2.0.3/include/lwip/errno.h | 0 .../src/network/lwip2.0.3/include/lwip/etharp.h | 0 .../src/network/lwip2.0.3/include/lwip/ethip6.h | 0 .../src/network/lwip2.0.3/include/lwip/icmp.h | 0 .../src/network/lwip2.0.3/include/lwip/icmp6.h | 0 .../src/network/lwip2.0.3/include/lwip/igmp.h | 0 .../src/network/lwip2.0.3/include/lwip/inet.h | 0 .../network/lwip2.0.3/include/lwip/inet_chksum.h | 0 .../src/network/lwip2.0.3/include/lwip/init.h | 0 .../src/network/lwip2.0.3/include/lwip/ip.h | 0 .../src/network/lwip2.0.3/include/lwip/ip4.h | 0 .../src/network/lwip2.0.3/include/lwip/ip4_addr.h | 0 .../src/network/lwip2.0.3/include/lwip/ip4_frag.h | 0 .../src/network/lwip2.0.3/include/lwip/ip6.h | 0 .../src/network/lwip2.0.3/include/lwip/ip6_addr.h | 0 .../src/network/lwip2.0.3/include/lwip/ip6_frag.h | 0 .../src/network/lwip2.0.3/include/lwip/ip_addr.h | 0 .../src/network/lwip2.0.3/include/lwip/ip_frag.h | 0 .../src/network/lwip2.0.3/include/lwip/lwipopts.h | 0 .../src/network/lwip2.0.3/include/lwip/mem.h | 0 .../src/network/lwip2.0.3/include/lwip/memp.h | 0 .../src/network/lwip2.0.3/include/lwip/mld6.h | 0 .../src/network/lwip2.0.3/include/lwip/nd6.h | 0 .../src/network/lwip2.0.3/include/lwip/netbuf.h | 0 .../src/network/lwip2.0.3/include/lwip/netdb.h | 0 .../src/network/lwip2.0.3/include/lwip/netif.h | 0 .../src/network/lwip2.0.3/include/lwip/netifapi.h | 0 .../src/network/lwip2.0.3/include/lwip/opt.h | 0 .../src/network/lwip2.0.3/include/lwip/pbuf.h | 0 .../src/network/lwip2.0.3/include/lwip/pppapi.h | 0 .../network/lwip2.0.3/include/lwip/priv/api_msg.h | 0 .../network/lwip2.0.3/include/lwip/priv/memp_priv.h | 0 .../network/lwip2.0.3/include/lwip/priv/memp_std.h | 0 .../network/lwip2.0.3/include/lwip/priv/nd6_priv.h | 0 .../network/lwip2.0.3/include/lwip/priv/tcp_priv.h | 0 .../lwip2.0.3/include/lwip/priv/tcpip_priv.h | 0 .../network/lwip2.0.3/include/lwip/prot/autoip.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/dhcp.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/dns.h | 0 .../network/lwip2.0.3/include/lwip/prot/etharp.h | 0 .../network/lwip2.0.3/include/lwip/prot/ethernet.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/icmp.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/icmp6.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/igmp.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/ip.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/ip4.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/ip6.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/mld6.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/nd6.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/tcp.h | 0 .../src/network/lwip2.0.3/include/lwip/prot/udp.h | 0 .../src/network/lwip2.0.3/include/lwip/raw.h | 0 .../src/network/lwip2.0.3/include/lwip/sio.h | 0 .../src/network/lwip2.0.3/include/lwip/snmp.h | 0 .../src/network/lwip2.0.3/include/lwip/sockets.h | 0 .../src/network/lwip2.0.3/include/lwip/stats.h | 0 .../src/network/lwip2.0.3/include/lwip/sys.h | 0 .../src/network/lwip2.0.3/include/lwip/tcp.h | 0 .../src/network/lwip2.0.3/include/lwip/tcpip.h | 0 .../src/network/lwip2.0.3/include/lwip/timeouts.h | 0 .../src/network/lwip2.0.3/include/lwip/timers.h | 0 .../src/network/lwip2.0.3/include/lwip/udp.h | 0 .../src/network/lwip2.0.3/include/netif/etharp.h | 0 .../src/network/lwip2.0.3/include/netif/ethernet.h | 0 .../network/lwip2.0.3/include/netif/ethernetif.h | 0 .../src/network/lwip2.0.3/include/netif/lowpan6.h | 0 .../network/lwip2.0.3/include/netif/lowpan6_opts.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/ccp.h | 0 .../network/lwip2.0.3/include/netif/ppp/chap-md5.h | 0 .../network/lwip2.0.3/include/netif/ppp/chap-new.h | 0 .../network/lwip2.0.3/include/netif/ppp/chap_ms.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/eap.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/ecp.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/eui64.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/fsm.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/ipcp.h | 0 .../network/lwip2.0.3/include/netif/ppp/ipv6cp.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/lcp.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/magic.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/mppe.h | 0 .../lwip2.0.3/include/netif/ppp/polarssl/arc4.h | 0 .../lwip2.0.3/include/netif/ppp/polarssl/des.h | 0 .../lwip2.0.3/include/netif/ppp/polarssl/md4.h | 0 .../lwip2.0.3/include/netif/ppp/polarssl/md5.h | 0 .../lwip2.0.3/include/netif/ppp/polarssl/sha1.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/ppp.h | 0 .../network/lwip2.0.3/include/netif/ppp/ppp_impl.h | 0 .../network/lwip2.0.3/include/netif/ppp/ppp_opts.h | 0 .../network/lwip2.0.3/include/netif/ppp/pppapi.h | 0 .../network/lwip2.0.3/include/netif/ppp/pppcrypt.h | 0 .../network/lwip2.0.3/include/netif/ppp/pppdebug.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/pppoe.h | 0 .../network/lwip2.0.3/include/netif/ppp/pppol2tp.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/pppos.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/upap.h | 0 .../src/network/lwip2.0.3/include/netif/ppp/vj.h | 0 .../src/network/lwip2.0.3/include/netif/slipif.h | 0 .../src/network/lwip2.0.3/include/posix/errno.h | 0 .../src/network/lwip2.0.3/include/posix/netdb.h | 0 .../network/lwip2.0.3/include/posix/sys/socket.h | 0 .../src/network/lwip2.0.3/netif/FILES | 0 .../src/network/lwip2.0.3/netif/Makefile | 0 .../src/network/lwip2.0.3/netif/ethernet.c | 0 .../src/network/lwip2.0.3/netif/ethernetif.c | 0 .../src/network/lwip2.0.3/netif/lowpan6.c | 0 .../src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP | 0 .../src/network/lwip2.0.3/netif/ppp/auth.c | 0 .../src/network/lwip2.0.3/netif/ppp/ccp.c | 0 .../src/network/lwip2.0.3/netif/ppp/chap-md5.c | 0 .../src/network/lwip2.0.3/netif/ppp/chap-new.c | 0 .../src/network/lwip2.0.3/netif/ppp/chap_ms.c | 0 .../src/network/lwip2.0.3/netif/ppp/demand.c | 0 .../src/network/lwip2.0.3/netif/ppp/eap.c | 0 .../src/network/lwip2.0.3/netif/ppp/ecp.c | 0 .../src/network/lwip2.0.3/netif/ppp/eui64.c | 0 .../src/network/lwip2.0.3/netif/ppp/fsm.c | 0 .../src/network/lwip2.0.3/netif/ppp/ipcp.c | 0 .../src/network/lwip2.0.3/netif/ppp/ipv6cp.c | 0 .../src/network/lwip2.0.3/netif/ppp/lcp.c | 0 .../src/network/lwip2.0.3/netif/ppp/magic.c | 0 .../src/network/lwip2.0.3/netif/ppp/mppe.c | 0 .../src/network/lwip2.0.3/netif/ppp/multilink.c | 0 .../network/lwip2.0.3/netif/ppp/polarssl/Makefile | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/README | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/des.c | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/md4.c | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/md5.c | 0 .../src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c | 0 .../src/network/lwip2.0.3/netif/ppp/ppp.c | 0 .../src/network/lwip2.0.3/netif/ppp/pppapi.c | 0 .../src/network/lwip2.0.3/netif/ppp/pppcrypt.c | 0 .../src/network/lwip2.0.3/netif/ppp/pppoe.c | 0 .../src/network/lwip2.0.3/netif/ppp/pppol2tp.c | 0 .../src/network/lwip2.0.3/netif/ppp/pppos.c | 0 .../src/network/lwip2.0.3/netif/ppp/upap.c | 0 .../src/network/lwip2.0.3/netif/ppp/utils.c | 0 .../src/network/lwip2.0.3/netif/ppp/vj.c | 0 .../src/network/lwip2.0.3/netif/slipif.c | 0 .../src/network/lwip2.0.3/netif/wm_ethernet.c | 0 .../src/network/lwip2.0.3/sys_arch.c | 0 .../src/os/Makefile | 0 .../src/os/rtos/Makefile | 0 .../src/os/rtos/include/FreeRTOS.h | 0 .../src/os/rtos/include/FreeRTOSConfig.h | 0 .../src/os/rtos/include/StackMacros.h | 0 .../src/os/rtos/include/atomic.h | 0 .../src/os/rtos/include/croutine.h | 0 .../src/os/rtos/include/deprecated_definitions.h | 0 .../src/os/rtos/include/event_groups.h | 0 .../src/os/rtos/include/lexicon.txt | 0 .../src/os/rtos/include/list.h | 0 .../src/os/rtos/include/message_buffer.h | 0 .../src/os/rtos/include/mpu_prototypes.h | 0 .../src/os/rtos/include/mpu_wrappers.h | 0 .../src/os/rtos/include/portable.h | 0 .../src/os/rtos/include/portmacro.h | 0 .../src/os/rtos/include/projdefs.h | 0 .../src/os/rtos/include/queue.h | 0 .../src/os/rtos/include/rtoslist.h | 0 .../src/os/rtos/include/rtosqueue.h | 0 .../src/os/rtos/include/rtostimers.h | 0 .../src/os/rtos/include/semphr.h | 0 .../src/os/rtos/include/stack_macros.h | 0 .../src/os/rtos/include/stdint.readme | 0 .../src/os/rtos/include/stream_buffer.h | 0 .../src/os/rtos/include/task.h | 0 .../src/os/rtos/include/timers.h | 0 .../src/os/rtos/ports/Makefile | 0 .../src/os/rtos/ports/xt804/Makefile | 0 .../src/os/rtos/ports/xt804/cpu_task_sw.S | 0 .../src/os/rtos/ports/xt804/port.c | 0 .../src/os/rtos/source/Makefile | 0 .../src/os/rtos/source/croutine.c | 0 .../src/os/rtos/source/event_groups.c | 0 .../src/os/rtos/source/heap_2.c | 0 .../src/os/rtos/source/heap_3.c | 0 .../src/os/rtos/source/list.c | 0 .../src/os/rtos/source/queue.c | 0 .../src/os/rtos/source/stream_buffer.c | 0 .../src/os/rtos/source/tasks.c | 0 .../src/os/rtos/source/timers.c | 0 .../src/os/rtos/wm_osal_rtos.c | 0 .../tools/w800/.config | 0 .../tools/w800/.config_backup | 0 .../tools/w800/README.md | 0 .../tools/w800/ca/cakey.pem | 0 .../tools/w800/ca/capub.pem | 0 .../tools/w800/ca/capub_1.pem | 0 .../tools/w800/ca/capub_1_N.dat | Bin .../tools/w800/ca/key.txt | 0 .../tools/w800/conf.mk | 0 .../tools/w800/config/Makefile | 0 .../tools/w800/config/confdata.c | 0 .../tools/w800/config/expr.c | 0 .../tools/w800/config/expr.h | 0 .../tools/w800/config/images.c | 0 .../tools/w800/config/list.h | 0 .../tools/w800/config/lkc.h | 0 .../tools/w800/config/lkc_proto.h | 0 .../tools/w800/config/lxdialog/checklist.c | 0 .../tools/w800/config/lxdialog/dialog.h | 0 .../tools/w800/config/lxdialog/inputbox.c | 0 .../tools/w800/config/lxdialog/menubox.c | 0 .../tools/w800/config/lxdialog/textbox.c | 0 .../tools/w800/config/lxdialog/util.c | 0 .../tools/w800/config/lxdialog/yesno.c | 0 .../tools/w800/config/mconf.c | 0 .../tools/w800/config/menu.c | 0 .../tools/w800/config/symbol.c | 0 .../tools/w800/config/util.c | 0 .../tools/w800/config/zconf.gperf | 0 .../tools/w800/config/zconf.hash.c | 0 .../tools/w800/config/zconf.lex.c | 0 .../tools/w800/config/zconf.tab.c | 0 .../tools/w800/inc.mk | 0 .../tools/w800/mconfig.sh | 0 .../SDK_Project/project/CDK_WS/CDK_WS.cdkws | 0 .../project/CDK_WS/W800_SDK/W800_SDK.cdkproj | 0 .../project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj | 0 .../tools/w800/rules.mk | 0 .../tools/w800/utilities/W800_Flash_Tool.elf | Bin .../tools/w800/utilities/aft_build_project.sh | 0 .../tools/w800/utilities/cdk_aft_build.sh | 0 .../tools/w800/utilities/download.mk | 0 .../tools/w800/utilities/flashinit | 0 .../tools/w800/utilities/gdb.init | 0 .../tools/w800/w800_secboot.bin | Bin .../tools/w800/w800_secboot.img | Bin .../tools/w800/wconfig | 0 .../tools/w800/wm_getver.c | 0 .../tools/w800/wm_getver.exe | Bin .../tools/w800/wm_tool.c | 0 .../tools/w800/wm_tool.exe | Bin .../tools/w800/zlib-1.2.11/Makefile | 0 .../tools/w800/zlib-1.2.11/adler32.c | 0 .../tools/w800/zlib-1.2.11/configure | 0 .../tools/w800/zlib-1.2.11/crc32.c | 0 .../tools/w800/zlib-1.2.11/crc32.h | 0 .../tools/w800/zlib-1.2.11/deflate.c | 0 .../tools/w800/zlib-1.2.11/deflate.h | 0 .../tools/w800/zlib-1.2.11/gzclose.c | 0 .../tools/w800/zlib-1.2.11/gzguts.h | 0 .../tools/w800/zlib-1.2.11/gzlib.c | 0 .../tools/w800/zlib-1.2.11/gzwrite.c | 0 .../tools/w800/zlib-1.2.11/minigzip.c | 0 .../tools/w800/zlib-1.2.11/trees.c | 0 .../tools/w800/zlib-1.2.11/trees.h | 0 .../tools/w800/zlib-1.2.11/zconf.h | 0 .../tools/w800/zlib-1.2.11/zlib.3.pdf | Bin .../tools/w800/zlib-1.2.11/zlib.h | 0 .../tools/w800/zlib-1.2.11/zlib.pc | 0 .../tools/w800/zlib-1.2.11/zutil.c | 0 .../tools/w800/zlib-1.2.11/zutil.h | 0 3437 files changed, 0 insertions(+), 0 deletions(-) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/.vscode/settings.json (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/BMP280.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/BMP280.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/CST816D.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/CST816D.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/QMC5883L.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/QMC5883L.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/bma4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/bma4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/bma456w.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/bma456w.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/bma4_defs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/i2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/i2c/i2c.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/lcd/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/lcd/lcd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/lcd/lcd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/mmc_sdio/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/mmc_sdio/mmc_sdio.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/mmc_sdio/mmc_sdio.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/watch_peripherals/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/watch_peripherals/watch_peripherals.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_drivers/watch_peripherals/watch_peripherals.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_include/app_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/app_include/app_log.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/assets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/assets/compass_assets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/assets/watch_casio_assets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/assets/watch_menu_icons.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/common_screen_components.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/common_screen_components.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/compass_screen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/compass_screen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/gfx_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/gfx_task.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/menu_screen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/menu_screen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/settings_screen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/settings_screen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/watch_face.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/gfx/watch_face.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/persistency/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/persistency/watch_settings.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/app/persistency/watch_settings.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/console/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/console/wm_demo_console.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/console/wm_demo_console_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_7816_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_adc_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_apsta_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_avoid_copy_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_connect_net_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_crypt_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_crypt_hard_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_dsp_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_fatfs_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_flash_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_gpio_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_http_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_https_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_i2c_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_i2s_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_iperf_auto_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_lcd_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_master_spi_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_mbedtls_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_mcast_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_mqtt_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_ntp_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_pmu_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_pwm_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_rsa_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_rtc_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_scan_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_sck_client_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_sck_server_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_sdio_host_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_slave_spi_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_socket_client_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_socket_server_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_softap_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_ssl_server_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_ssl_server_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_timer_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_touchsensor_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_uart_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_udp_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_websockets_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/demo/wm_wps_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/doc/ChangeLog.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/doc/w800_apis.chm (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_at_ri_init.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_crypto.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_dhcp_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_dns_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_http_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_netif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_netif2.0.3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_ntp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_ssl_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_webserver.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/app/wm_wifi_oneshot.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_core/core_804.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_core/csi_core.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_core/csi_gcc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_dsp/csky_common_tables.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_dsp/csky_const_structs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/arch/xt804/csi_dsp/csky_math.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_ble.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_ble_gatt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt_av.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt_def.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt_hf_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/bt/wm_bt_spp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_7816.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_adc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_cpu.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_dma.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_efuse.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_flash.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_flash_map.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_flash_map_backup.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_fls_gd25qxx.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_gpio.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_gpio_afsel.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_hostspi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_hspi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_i2c.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_i2s.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_internal_flash.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_io.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_irq.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_lcd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_pmu.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_psram.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_pwm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_rtc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_sasc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_sdio_host.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_timer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_tipc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_touchsensor.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_uart.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/driver/wm_watchdog.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/net/wm_socket.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/net/wm_socket2.0.3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/net/wm_sockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/net/wm_sockets2.0.3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/os/wm_os_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/os/wm_osal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/aes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_crypto_hard.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_crypto_hard_mbed.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_fwup.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_params.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_wl_mbox.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_wl_task.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/platform/wm_wl_timers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/random.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wifi/litepoint.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wifi/wm_ieee80211.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wifi/wm_ieee80211_gcc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wifi/wm_wifi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_bt_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_debug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_include.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_ram_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_regs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_type_def.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/include/wm_wifi_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/ld/w800/gcc_csky.ld (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/ld/w800/gcc_csky_backup.ld (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/ld/w800/gcc_csky_bt.ld (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libapp.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libapp_br_edr.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libblehost.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libbtcontroller.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libbtcontroller_br_edr.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libbthost_br_edr.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libdrivers.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libdsp.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libnetwork.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libos.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libwlan.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libwmarch.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libwmcommon.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lib/w800/libwmsys.a (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_conf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_port_disp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_port_disp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_port_indev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_port_indev.c.bck (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lv_port_indev.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/lvgl_port_tick.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/touchpad.c.bck (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_port/touchpad.h.bck (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/.codecov.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/.editorconfig (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/.gitignore (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/.pre-commit-config.yaml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/CMakeLists.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/Kconfig (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/LICENCE.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/README_pt_BR.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/README_zh.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/SConscript (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/component.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/lv_demos.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/lv_demos.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/music/screenshot1.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/stress/screenshot1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/CHANGELOG.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/CODING_STYLE.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/ROADMAP.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_ext/lv_example.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/css/custom.css (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_2.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_3.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_4.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_5.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_6.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_static/js/custom.js (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_templates/layout.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/_templates/page.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/build.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/conf.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/example_list.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/favicon.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/os/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/intro/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/layouts/flex.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/layouts/grid.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/layouts/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/bmp.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/freetype.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/fsdrv.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/gif.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/png.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/qrcode.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/rlottie.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/libs/sjpg.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/logo_lvgl.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/align.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/bidi.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/boxmodel.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/btn_example.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/button_style_example.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/layers.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/par_child1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/par_child2.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/par_child3.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/platformio.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/symbols.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/sys.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/fragment.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/gridnav.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/imgfont.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/monkey.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/msg.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/others/snapshot.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/animation.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/color.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/coords.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/display.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/drawing.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/event.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/file-system.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/font.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/image.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/indev.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/layer.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/new_widget.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/object.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/scroll.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/style-props.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/style.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/overview/timer.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/display.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/gpu.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/indev.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/log.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/os.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/project.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/sleep.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/tick.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/porting/timer-handler.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/requirements.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/arc.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/bar.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/btn.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/img.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/label.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/line.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/roller.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/slider.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/switch.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/table.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/led.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/list.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/span.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/extra/win.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/index.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/docs/widgets/obj.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/env_support/zephyr/module.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg001.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg001.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg002.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg002.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg003.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/animimg003.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/caret_down.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_hand.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_star.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_star.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/img_strip.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/header.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/png/wink.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/lv_examples.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/lv_examples.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/fragment/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/ime/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/lv_example_others.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/monkey/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/msg/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/test_ex.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/bar/test.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/led/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/line/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/list/test.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/span/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/table/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/win/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/idf_component.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/library.json (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/library.properties (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/lv_conf_template.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/lvgl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/lvgl.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/.gitignore (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/Doxyfile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/build_html_examples.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/changelog-template.hbs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/changelog_gen.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/code-format.cfg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/code-format.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/filetohex.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/find_version.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/genexamplelist.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/infer_run.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/release/com.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/release/commits.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/release/patch.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/release/release.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/scripts/style_api_gen.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_core.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_disp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_disp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_event.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_event.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_group.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_group.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_indev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_indev.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_class.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_class.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_style.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_style.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_refr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_refr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_theme.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/core/lv_theme.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/lv_extra.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/lv_extra.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/lv_extra.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/lv_others.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/korean.ttf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_loader.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_loader.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/lv_api_map.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/lv_conf_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/lvgl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_anim.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_anim.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_area.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_area.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_assert.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_async.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_async.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_bidi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_bidi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_color.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_color.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_fs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_fs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_gc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_gc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_ll.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_ll.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_log.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_log.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_lru.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_lru.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_math.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_math.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_mem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_misc.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_printf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_printf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_style.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_style.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_templ.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_templ.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_timer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_timer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_txt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_txt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/misc/lv_utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_arc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_bar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_bar.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_btn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_btn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_img.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_img.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_label.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_label.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_line.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_line.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_roller.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_roller.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_slider.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_slider.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_switch.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_switch.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_table.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_table.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/.gitignore (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/CMakeLists.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/__makefile__/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/__makefile__/test.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/config.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/main.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/lv_test_init.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/run_test.erb (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/unity.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/unity.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/unity_internals.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/unity_support.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/lvgl/lvgl_v8.3/tests/unity/unity_support.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/board_init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/isr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/startup.S (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/system.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/trap_c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/bsp/vectors.S (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/libc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/arch/xt804/libc/libc_port.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/crypto/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/crypto/wm_crypto_hard.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/crypto/wm_crypto_hard_mbed.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/fwup/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/fwup/wm_fwup.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/mem/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/mem/wm_mem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/params/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/params/wm_param.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/params/wm_param.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/task/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/task/wm_wl_mbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/task/wm_wl_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/task/wm_wl_timers.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/utils/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/common/utils/utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/7816/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/7816/wm_7816.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/adc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/adc/wm_adc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/adc/wm_polyfit.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/cpu/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/cpu/wm_cpu.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/dma/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/dma/wm_dma.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/efuse/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/efuse/wm_efuse.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/flash/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/flash/wm_fls.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/flash/wm_fls_gd25qxx.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/gpio/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/gpio/wm_gpio.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/gpio/wm_gpio_afsel.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/hspi/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/hspi/wm_hspi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/i2c/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/i2c/wm_i2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/i2s/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/i2s/wm_i2s.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/internalflash/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/internalflash/wm_internal_fls.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/io/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/io/wm_io.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/irq/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/irq/wm_irq.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/lcd/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/lcd/wm_lcd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/pmu/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/pmu/wm_pmu.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/psram/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/psram/wm_psram.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/pwm/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/pwm/wm_pwm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/rtc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/rtc/wm_rtc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/sasc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/sasc/wm_sasc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/sdio_host/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/sdio_host/wm_sdio_host.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/spi/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/spi/wm_hostspi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/spi/wm_spi_hal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/timer/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/timer/wm_timer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/touchsensor/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/touchsensor/wm_touchsensor.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/uart/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/uart/wm_uart.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/watchdog/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/drivers/watchdog/wm_watchdog.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/bitops.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/libtommath.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/md5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/os.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/rc4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/sha1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/sha256.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/tls_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/tls_ieee80211.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/tls_wireless.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/inc/wm_dbg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/sys/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/sys/tls_sys.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/sys/tls_sys.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/platform/sys/wm_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_api_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_api_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_api_multi_conn_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_api_multi_conn_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_peer_manager.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_client_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_gap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_gap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_level_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_level_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_onoff_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_onoff_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_onoff_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_gen_onoff_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_health_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_health_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_light_model.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_light_model.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_node_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_node_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_vnd_model.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_mesh_vnd_model.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_api_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_api_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_wifi_app.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_wifi_app.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_wifi_prof.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_server_wifi_prof.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_uart_if.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_ble_uart_if.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_bt_app.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_bt_app.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_bt_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/bleapp/wm_bt_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_audio_sink.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_audio_sink.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_api_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_api_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_api_multi_conn_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_api_multi_conn_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_client_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_dm_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_gap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_gap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_api_demo.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_api_demo.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_demo_prof.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_demo_prof.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_wifi_app.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_wifi_app.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_wifi_prof.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_server_wifi_prof.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_uart_if.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_ble_uart_if.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_app.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_app.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_spp_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_spp_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_spp_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_spp_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_bt_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_hfp_hsp_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/btapp/wm_hfp_hsp_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/cJSON/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/cJSON/cJSON.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/cJSON/cJSON.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dhcpserver/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dhcpserver/dhcp_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dhcpserver/dhcp_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dnsserver/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dnsserver/dns_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/dnsserver/dns_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/factorycmd/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/factorycmd/factory_atcmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/factorycmd/factory_atcmd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/LICENSE.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/diskio.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/diskio.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/ff.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/ff.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/ffconf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/ffsystem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/fatfs/ffunicode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClient.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClient.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientAuth.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientAuth.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientCommon.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientString.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientString.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientWrapper.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/HTTPClientWrapper.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/wm_httpclient_if.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/httpclient/wm_httpclient_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_client_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_client_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_error.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_error.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_locale.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_locale.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_net.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_net.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_queue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_server_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_server_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_tcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_tcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_timer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_timer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_udp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_udp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_units.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_units.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/iperf_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/tcp_info.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/tcp_window_size.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/tcp_window_size.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/version.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/iperf/wm_perf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/address.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/async.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/block.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/coap_io.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/coap_io_lwip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/coap_time.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/debug.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/encode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/hashkey.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/address.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/async.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/bits.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/block.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/coap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/coap_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/coap_io.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/coap_time.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/debug_libcoap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/encode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/hashkey.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/libcoap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/lwippools.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/mem_libcoap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/net.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/option.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/pdu.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/prng.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/resource.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/str.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/subscribe.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/uri.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/uthash.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/include/utlist.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/mem_libcoap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/net.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/option.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/pdu.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/resource.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/str.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/subscribe.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libcoap/uri_libcoap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/alloc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/base64-decode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/client-handshake.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/client-parser.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/context.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/daemonize.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/extension.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/getifaddrs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/getifaddrs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/handshake.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/header.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/hpack.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/http2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/huftable.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lejp-conf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lejp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lejp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lextable-strings.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lextable.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/libev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/libuv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/libwebsockets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/libwebsockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lws-plat-wm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lws_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/lws_config_private.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/minihuf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/minilex.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/output.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/parsers.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/pollfd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/private-libwebsockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/rewrite.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/server-handshake.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/service.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/sha-1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/smtp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/ssl-client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/ssl-http2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/ssl-server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/libwebsockets-2.1-stable/ssl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/APSCommonServices.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNS.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNS.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNSClientAPI.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNSDebug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSPosix/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSPosix/mDNSPosix.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mDNS/mDNSPosix/mDNSPosix.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/aes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/aesni.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/arc4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/asn1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/asn1write.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/base64.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/bignum.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/blowfish.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/bn_mul.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/camellia.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ccm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/certs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/check_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/cipher.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/cipher_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/cmac.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/compat-1.3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ctr_drbg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/debug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/des.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/dhm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ecdh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ecdsa.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ecjpake.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ecp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ecp_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/entropy.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/entropy_poll.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/error.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/gcm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/havege.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/hmac_drbg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/md.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/md2.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/md4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/md5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/md_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/memory_buffer_alloc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/net.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/net_sockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/oid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/padlock.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pk.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pk_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pkcs11.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pkcs12.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/pkcs5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/platform.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/platform_time.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ripemd160.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/rsa.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/rsa_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/sha1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/sha256.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/sha512.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl_cache.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl_ciphersuites.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl_cookie.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/ssl_ticket.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/threading.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/timing.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/version.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/x509.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/x509_crl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/x509_crt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/x509_csr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/include/mbedtls/xtea.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/aes.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/aesni.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/arc4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/asn1parse.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/asn1write.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/base64.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/bignum.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/blowfish.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/camellia.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ccm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/certs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/cipher.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/cipher_wrap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/cmac.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ctr_drbg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/debug.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/des.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/dhm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ecdh.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ecdsa.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ecjpake.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ecp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ecp_curves.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/entropy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/entropy_poll.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/error.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/gcm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/havege.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/hmac_drbg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/md.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/md2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/md4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/md5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/md_wrap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/memory_buffer_alloc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/net_sockets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/oid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/padlock.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pk.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pk_wrap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pkcs11.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pkcs12.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pkcs5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pkparse.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/pkwrite.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/platform.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ripemd160.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/rsa.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/rsa_internal.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/sha1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/sha256.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/sha512.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_cache.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_ciphersuites.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_cli.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_cookie.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_srv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_ticket.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/ssl_tls.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/threading.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/timing.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/version.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/version_features.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509_create.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509_crl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509_crt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509_csr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509write_crt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/x509write_csr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/library/xtea.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/aes_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/aes_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/arc4_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/arc4_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/des_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/des_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/hardware_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/md5_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/md5_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/net_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/net_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/sha1_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/sha1_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/timing_alt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mbedtls/ports/timing_alt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mqtt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mqtt/libemqtt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/mqtt/libemqtt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ntp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ntp/ntp_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/airkiss.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/wm_oneshot_airkiss.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/wm_oneshot_lsd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/wm_oneshot_lsd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/oneshotconfig/wm_wifi_oneshot.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ota/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ota/wm_http_fwup.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ota/wm_http_fwup.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ota/wm_socket_fwup.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ota/wm_socket_fwup.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ping/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ping/ping.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/ping/ping.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/aes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/arc4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/asn1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/base64.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/bignum.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/bn_mul.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/camellia.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/certs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/cipher.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/cipher_wrap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/debug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/des.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/dhm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/error.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/md.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/md2.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/md4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/md5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/md_wrap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/net.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/openssl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/pem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/rsa.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/sha1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/sha2.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/sha4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/ssl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/include/polarssl/x509.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/arc4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/asn1parse.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/base64.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/cipher.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/cipher_wrap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/error.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/md.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/md_wrap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/pem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/polarssl_bignum.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/polarssl_debug.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/polarssl_md5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/polarssl_sha1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/rsa.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/ssl_cli.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/ssl_tls.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/polarssl/library/x509parse.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/sslserver/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/sslserver/wm_ssl_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/404.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/advance.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/basic.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/firmware.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/index.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/jump.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs/style.css (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/404.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/basic.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/firmware.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/index.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/jump.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fs_ap_config/style.css (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fsdata.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fsdata.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/fsdata_ap_config.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/goall (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/http.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/httpd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/httpd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/makefs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/web/web.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp_hostif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp_hostif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp_ri.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_cmdp_ri.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_hspi_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_hspi_task.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_rmms.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_rmms.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_uart_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/app/wm_atcmd/wm_uart_task.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/AStyle.exe (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/astyle.bat (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/README.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_att.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_gap.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_gattc.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_gatts.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_hs.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_hs_id.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_hs/ble_hs_return_codes.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_sec.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_setup/ble_addr.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_setup/ble_lp_clock.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_setup/ble_setup_intro.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/ble_setup/ble_sync_cb.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/btshell/btshell_GAP.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/btshell/btshell_GATT.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/btshell/btshell_advdata.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/btshell/btshell_api.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/conf.py (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/doxygen.xml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/mesh/index.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/mesh/mesh_lightning_model.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/mesh/mesh_topology.jpg (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/docs/mesh/sample.rst (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/aes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cbc_mode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ccm_mode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cmac_mode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/constants.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_mode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_prng.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dsa.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac_prng.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/sha256.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/include/tinycrypt/utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/bleutils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/cbc_mode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ccm_mode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/cmac_mode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ctr_mode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ctr_prng.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ecc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ecc_dh.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/ecc_platform_specific.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/hmac.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/hmac_prng.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/ext/tinycrypt/src/sha256.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_att.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_eddystone.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_gap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_gatt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_adv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_hci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_id.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_log.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_mbuf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_hs_stop.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_ibeacon.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_l2cap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_monitor.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_sm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_store.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/include/host/ble_uuid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/access.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_cli.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_srv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/glue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/health_cli.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/health_srv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/main.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/mesh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/model_cli.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/model_srv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/porting.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/proxy.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/slist.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/include/mesh/testing.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/access.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/access.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/adv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/adv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/atomic.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/beacon.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/beacon.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/cfg_cli.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/cfg_srv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/crypto.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/crypto.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/foundation.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/friend.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/friend.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/glue.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/health_cli.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/health_srv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/light_model.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/light_model.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/lpn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/lpn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/mesh.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/mesh_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/model_cli.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/model_srv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/net.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/net.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/nodes.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/nodes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/prov.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/prov.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/proxy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/proxy.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/settings.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/settings.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/shell.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/shell.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/testing.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/testing.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/transport.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/transport.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/bas/include/services/bas/ble_svc_bas.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/bas/pkg.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/bas/src/ble_svc_bas.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/bas/syscfg.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/dis/include/services/dis/ble_svc_dis.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/dis/pkg.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/dis/src/ble_svc_dis.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/dis/syscfg.yml (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gap/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gap/include/services/gap/ble_svc_gap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gap/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gap/src/ble_svc_gap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gatt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gatt/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/services/gatt/src/ble_svc_gatt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att_clt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att_cmd_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_att_svr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_eddystone.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gap_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gatt_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gattc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gatts.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_gatts_lcl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_adv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_adv_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_atomic.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_atomic_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_conn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_conn_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_flow.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_flow_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_hci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_hci_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_hci_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_id.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_id_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_log.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_mbuf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_misc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_mqueue.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_pvcy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_shutdown.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_startup.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_startup_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_hs_stop.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_ibeacon.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_coc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_sig.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_monitor.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_monitor_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm_alg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm_lgcy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_sm_sc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_store.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_store_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_uuid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/src/ble_uuid_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/include/store/config/ble_store_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/include/store/config/wm_bt_storage.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/src/ble_store_config.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/src/ble_store_config_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/src/ble_store_nvram.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/config/src/wm_bt_storage.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/ram/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/ram/include/store/ram/ble_store_ram.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/ram/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/store/ram/src/ble_store_ram.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/util/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/util/include/host/util/util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/util/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/host/util/src/addr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/ble.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/ble_hci_trans.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/hci_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/nimble_npl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/nimble_opt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/include/nimble/nimble_opt_auto.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/transport/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/transport/uart/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/transport/uart/include/transport/uart/ble_hci_uart.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/transport/uart/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/nimble/transport/uart/src/ble_hci_uart.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/hal/hal_timer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/hal/hal_uart.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/log/log.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/log_common/ignore.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/log_common/log_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/logcfg/logcfg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/mem/mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/modlog/modlog.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/nimble/nimble_npl_os.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/nimble/nimble_port.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/nimble/tls_nimble.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/endian.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/npl_freertos.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os_cputime.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os_error.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os_mbuf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os_mempool.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/os_trace_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/queue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/os/util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/stats/stats.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/syscfg/syscfg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/sysflash/sysflash.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/include/sysinit/sysinit.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/endian.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/mem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/nimble_port.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/npl_os_freertos.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/os_mbuf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/os_mempool.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/os_msys_init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/blehost/porting/w800/src/tls_nimble.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_at.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_ci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_rfc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_sco.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ag/bta_ag_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ar/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/ar/bta_ar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_aact.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_ci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/av/bta_av_ssm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_ci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_pm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/dm/bta_dm_sco.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gattc_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gattc_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gattc_cache.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gattc_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gattc_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gatts_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gatts_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gatts_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/gatt/bta_gatts_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_at.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_cmd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_rfc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_sco.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hf_client/bta_hf_client_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_le.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hh/bta_hh_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_ci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/hl/bta_hl_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ag_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ag_at.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ag_ci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ag_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ag_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ar_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_ar_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_av_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_av_ci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_av_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_av_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_av_sbc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_dm_ci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_dm_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_dm_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_gatt_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_gattc_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_gatts_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_gatts_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hf_client_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hf_client_at.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hf_client_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hf_client_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hh_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hh_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hh_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hl_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hl_ci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hl_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_hl_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_jv_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_jv_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_jv_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_mce_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_mce_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_op_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_pan_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_pan_ci.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_pan_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_pan_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_pbs_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_sdp_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_sdp_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_sys.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/bta_sys_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/ptim.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/include/utl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/jv/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/jv/bta_jv_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/jv/bta_jv_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/jv/bta_jv_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/jv/bta_jv_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/mce/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/mce/bta_mce_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/mce/bta_mce_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/mce/bta_mce_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/mce/bta_mce_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/pan/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/pan/bta_pan_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/pan/bta_pan_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/pan/bta_pan_ci.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/pan/bta_pan_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sdp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sdp/bta_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sdp/bta_sdp_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sdp/bta_sdp_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sdp/bta_sdp_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/bta_sys_cfg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/bta_sys_conn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/bta_sys_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/ptim.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/bta/sys/utl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/bdaddr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/device_class.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/device_features.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/event_mask.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/hal_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/iac.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/module.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/osi_module.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/property.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/uuid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/include/version.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/src/bdaddr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/src/device_class.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/src/property.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btcore/src/uuid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_ag_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_av_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_dm_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_gatts_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_hh_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_hl_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/co/bta_pan_co.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_av.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_av_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_av_co.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_avrcp_audio_track.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_config_transcode.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_debug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_debug_btsnoop.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_debug_conn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_dm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_gatt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_gatt_multi_adv_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_gatt_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_hh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_hl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_mce.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_media.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_pan.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_pan_internal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_profile_queue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sdp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_l2cap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_rfc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_sco.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_sdp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_thread.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_sock_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_storage.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_uid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/btif_util.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/stack_manager.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/include/uinput.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/bluetooth.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_av.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_core.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_dm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt_dm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt_multi_adv_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_gatt_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_hf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_hf_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_hh.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_hl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_mce.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_media_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_pan.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_profile_queue.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_rc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_sdp_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_sm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_spp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_storage.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/btif/src/btif_util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/conf/Android.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/conf/bt_did.conf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/conf/bt_stack.conf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_assert.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_bitstream.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc_private.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_modules.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_osinterface.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_status.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_stddefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_string.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_time.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/include/oi_utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/alloc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/bitstream-decode.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/decoder-oina.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/decoder-private.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/dequant.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/framing-sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/framing.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/oi_codec_version.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/readsamplesjoint.inc (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/synthesis-8-generated.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/synthesis-dct8.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/include/sbc_dct.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/include/sbc_enc_func_declare.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/include/sbc_encoder.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/include/sbc_if.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/include/sbc_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/embdrv/sbc/encoder/srce/sbc_packing.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/Android.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/gki.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/gki_buffer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/gki_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/gki_debug.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/common/gki_time.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/wm/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/wm/data_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/wm/gki_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/gki/wm/gki_wm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/bt_hci_bdroid.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/bt_hci_lib.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/bt_vendor_lib.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/btsnoop.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/btsnoop_mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/buffer_allocator.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_audio.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_hal.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_inject.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_internals.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_layer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_packet_factory.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hci_packet_parser.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/hcih.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/low_power_manager.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/packet_fragmenter.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/userial.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/include/vendor.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/src/bt_hci_bdroid.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/src/hci_h4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/hci/src/utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/audio_a2dp_hw.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bdroid_buildcfg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bluetooth.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_av.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_common.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_common_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_gatt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_gatt_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_gatt_dm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_gatt_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_gatt_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_hf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_hf_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_hh.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_hl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_mce.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_pan.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_rc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_sdp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_sock.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_target.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_trace.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bt_utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bte.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/bte_appl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/generic.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/gki_target.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/gki_target_ble.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/include/stack_config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/bte_init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/bte_logmsg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/bte_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/wm_bt_storage.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/main/wm_bt_storage.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/alarm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/allocation_tracker.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/allocator.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/array.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/buffer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/compat.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/config.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/data_dispatcher.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/eager_reader.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/fixed_queue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/future.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/hash_functions.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/hash_map.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/hash_map_utils.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/log.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/metrics.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/mutex.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/osi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/properties.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/reactor.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/ringbuffer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/semaphore.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/socket.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/socket_utils/socket_local.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/socket_utils/sockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/thread.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/include/wakelock.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/buffer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/compat.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/fixed_queue.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/hash_map.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/list.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/mutex.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/osi/src/ringbuffer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/a2dp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/a2dp/a2d_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/a2dp/a2d_sbc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/avct_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/avct_ccb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/avct_l2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/avct_lcb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avct/avct_lcb_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_ad.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_ccb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_ccb_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_l2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_msg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_scb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avdt/avdt_scb_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_bld_ct.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_bld_tg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_opt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_pars_ct.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_pars_tg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_sdp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/avrc/avrc_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/bnep/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/bnep/bnep_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/bnep/bnep_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/bnep/bnep_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/bnep/bnep_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_acl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_addr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_adv_filter.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_batchscan.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_bgconn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_cont_energy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_gap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_multi_adv.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_ble_privacy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_dev.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_devctl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_inq.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_pm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_sco.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btm/btm_sec.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btu/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btu/btu_hcif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btu/btu_init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/btu/btu_task.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gap/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gap/gap_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gap/gap_ble.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gap/gap_conn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gap/gap_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/att_protocol.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_attr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_auth.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_cl.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_db.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_sr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/gatt/gatt_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hcic/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hcic/hciblecmds.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hcic/hcicmds.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hid/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hid/hidh_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/hid/hidh_conn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/a2d_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/a2d_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/a2d_sbc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avct_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avct_defs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avct_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avdt_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avdt_defs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avdt_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avdtc_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avrc_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avrc_defs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/avrc_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/bnep_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/bt_buffer_q.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/bt_types.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/btm_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/btm_ble_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/btm_ble_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/btm_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/btu.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/dyn_mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/gap_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/gap_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/gatt_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/gatt_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/gattdefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hcidefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hcimsgs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hid_conn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hiddefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hidh_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/hidh_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/l2c_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/l2c_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/l2cap_client.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/l2cdefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/mca_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/mca_defs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/mca_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/p_256_ecc_pp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/p_256_multprecision.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/pan_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/pan_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/port_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/port_ext.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/port_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/profiles_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/rfc_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/rfcdefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/sdp_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/sdpdefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/sdpint.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/smp_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/smp_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/srvc_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/srvc_battery_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/srvc_dis_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/include/srvc_eng_int.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_ble.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_csm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_fcr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_link.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_ucd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2c_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/l2cap/l2cap_client.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_cact.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_csm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_dact.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_dsm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_l2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/mcap/mca_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/pan/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/pan/pan_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/pan/pan_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/pan/pan_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/port_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/port_rfc.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/port_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_l2cap_if.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_mx_fsm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_port_fsm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_port_if.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_ts_frames.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/rfcomm/rfc_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_db.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_discovery.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/sdp/sdp_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/aes.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/aes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/p_256_curvepara.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/p_256_ecc_pp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/p_256_multprecision.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_act.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_api.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_br_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_cmac.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_keys.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_l2c.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_main.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/smp/smp_utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/srvc/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/srvc/srvc_battery.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/srvc/srvc_dis.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/stack/srvc/srvc_eng.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/udrv/include/uipc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/udrv/ulinux/uipc_linux.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/vnd/ble/vendor_hcidefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/bt/host/vnd/include/vendor_api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/api2.0.3/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/api2.0.3/tls_netconn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/api2.0.3/tls_netconn.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/api2.0.3/tls_sockets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/FILES (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/Filelists.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/api_lib.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/api_msg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/err.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/netbuf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/netdb.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/netifapi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/pppapi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/sockets.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/api/tcpip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fs.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fs/404.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fs/index.html (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fsdata.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/fsdata.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/httpd.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/httpd_structs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/mdns/mdns.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/mqtt/mqtt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/README (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_core.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_msg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_msg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_raw.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_table.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmp_traps.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmpv3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/sntp/sntp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/apps/tftp/tftp_server.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/alg.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/def.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/dns.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/inet_chksum.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/init.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/autoip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/dhcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/etharp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/icmp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/igmp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/ip4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/ip4_addr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/ip4_frag.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv4/ip_frag.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/dhcp6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/ethip6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/icmp6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/inet6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/ip6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/ip6_addr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/ip6_frag.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/mld6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/ipv6/nd6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/mem.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/memp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/netif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/pbuf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/raw.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/stats.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/sys.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/tcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/tcp_in.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/tcp_out.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/timeouts.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/timers.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/core/udp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/arch/cc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/arch/perf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/arch/sys_arch.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/alg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/api.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/FILES (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/fs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/httpd.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/mdns.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/mqtt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/sntp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/arch.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/autoip.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/debug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/def.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/dhcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/dhcp6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/dns.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/err.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/errno.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/etharp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ethip6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/icmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/icmp6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/igmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/inet.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/inet_chksum.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/init.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip4_addr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip4_frag.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip6_addr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip6_frag.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip_addr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/ip_frag.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/lwipopts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/mem.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/memp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/mld6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/nd6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/netbuf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/netdb.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/netif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/netifapi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/opt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/pbuf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/pppapi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/api_msg.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/memp_std.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/autoip.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/dhcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/dns.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/etharp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/ethernet.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/icmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/icmp6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/igmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/ip.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/ip4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/ip6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/mld6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/nd6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/tcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/prot/udp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/raw.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/sio.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/snmp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/sockets.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/stats.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/sys.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/tcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/tcpip.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/timeouts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/timers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/lwip/udp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/etharp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ethernet.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ethernetif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/lowpan6.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/lowpan6_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ccp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/chap-new.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/eap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ecp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/eui64.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/fsm.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ipcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/lcp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/magic.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/mppe.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ppp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppapi.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppoe.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/pppos.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/upap.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/ppp/vj.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/netif/slipif.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/posix/errno.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/posix/netdb.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/include/posix/sys/socket.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/FILES (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ethernet.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ethernetif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/lowpan6.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/auth.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/ccp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/chap-md5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/chap-new.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/chap_ms.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/demand.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/eap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/ecp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/eui64.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/fsm.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/ipcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/ipv6cp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/lcp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/magic.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/mppe.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/multilink.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/README (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/des.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/ppp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/pppapi.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/pppcrypt.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/pppoe.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/pppol2tp.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/pppos.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/upap.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/utils.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/ppp/vj.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/slipif.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/netif/wm_ethernet.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/network/lwip2.0.3/sys_arch.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/FreeRTOS.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/FreeRTOSConfig.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/StackMacros.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/atomic.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/croutine.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/deprecated_definitions.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/event_groups.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/lexicon.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/message_buffer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/mpu_prototypes.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/mpu_wrappers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/portable.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/portmacro.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/projdefs.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/queue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/rtoslist.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/rtosqueue.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/rtostimers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/semphr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/stack_macros.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/stdint.readme (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/stream_buffer.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/task.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/include/timers.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/ports/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/ports/xt804/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/ports/xt804/cpu_task_sw.S (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/ports/xt804/port.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/croutine.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/event_groups.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/heap_2.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/heap_3.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/list.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/queue.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/stream_buffer.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/tasks.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/source/timers.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/src/os/rtos/wm_osal_rtos.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/.config (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/.config_backup (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/README.md (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/ca/cakey.pem (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/ca/capub.pem (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/ca/capub_1.pem (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/ca/capub_1_N.dat (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/ca/key.txt (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/conf.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/confdata.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/expr.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/expr.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/images.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/list.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lkc.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lkc_proto.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/checklist.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/dialog.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/inputbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/menubox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/textbox.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/lxdialog/yesno.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/mconf.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/menu.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/symbol.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/util.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/zconf.gperf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/zconf.hash.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/zconf.lex.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/config/zconf.tab.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/inc.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/mconfig.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/projects/SDK_Project/project/CDK_WS/CDK_WS.cdkws (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/rules.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/W800_Flash_Tool.elf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/aft_build_project.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/cdk_aft_build.sh (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/download.mk (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/flashinit (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/utilities/gdb.init (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/w800_secboot.bin (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/w800_secboot.img (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/wconfig (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/wm_getver.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/wm_getver.exe (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/wm_tool.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/wm_tool.exe (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/Makefile (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/adler32.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/configure (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/crc32.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/crc32.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/deflate.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/deflate.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/gzclose.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/gzguts.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/gzlib.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/gzwrite.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/minigzip.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/trees.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/trees.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zconf.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zlib.3.pdf (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zlib.h (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zlib.pc (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zutil.c (100%) rename src/{W800 SDK v1.00.08 => W800_SDK_v1.00.10}/tools/w800/zlib-1.2.11/zutil.h (100%) diff --git a/src/W800 SDK v1.00.08/.vscode/settings.json b/src/W800_SDK_v1.00.10/.vscode/settings.json similarity index 100% rename from src/W800 SDK v1.00.08/.vscode/settings.json rename to src/W800_SDK_v1.00.10/.vscode/settings.json diff --git a/src/W800 SDK v1.00.08/Makefile b/src/W800_SDK_v1.00.10/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/Makefile rename to src/W800_SDK_v1.00.10/Makefile diff --git a/src/W800 SDK v1.00.08/app/Makefile b/src/W800_SDK_v1.00.10/app/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/Makefile rename to src/W800_SDK_v1.00.10/app/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_config.h b/src/W800_SDK_v1.00.10/app/app_config.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_config.h rename to src/W800_SDK_v1.00.10/app/app_config.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/Makefile b/src/W800_SDK_v1.00.10/app/app_drivers/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/Makefile rename to src/W800_SDK_v1.00.10/app/app_drivers/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/BMP280.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/BMP280.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/BMP280.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/BMP280.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/BMP280.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/BMP280.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/BMP280.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/BMP280.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/CST816D.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/CST816D.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/CST816D.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/CST816D.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/CST816D.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/CST816D.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/CST816D.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/CST816D.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/Makefile b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/Makefile rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/QMC5883L.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/QMC5883L.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/QMC5883L.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/QMC5883L.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/QMC5883L.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/QMC5883L.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/QMC5883L.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/QMC5883L.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/bma456w.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma456w.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/bma456w.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma456w.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/bma456w.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma456w.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/bma456w.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma456w.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4_defs.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4_defs.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/bma4_defs.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/bma4_defs.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/i2c.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/i2c.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/i2c.c rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/i2c.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/i2c/i2c.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/i2c.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/i2c/i2c.h rename to src/W800_SDK_v1.00.10/app/app_drivers/i2c/i2c.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/lcd/Makefile b/src/W800_SDK_v1.00.10/app/app_drivers/lcd/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/lcd/Makefile rename to src/W800_SDK_v1.00.10/app/app_drivers/lcd/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_drivers/lcd/lcd.c b/src/W800_SDK_v1.00.10/app/app_drivers/lcd/lcd.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/lcd/lcd.c rename to src/W800_SDK_v1.00.10/app/app_drivers/lcd/lcd.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/lcd/lcd.h b/src/W800_SDK_v1.00.10/app/app_drivers/lcd/lcd.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/lcd/lcd.h rename to src/W800_SDK_v1.00.10/app/app_drivers/lcd/lcd.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/Makefile b/src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/Makefile rename to src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/mmc_sdio.c b/src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/mmc_sdio.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/mmc_sdio.c rename to src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/mmc_sdio.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/mmc_sdio.h b/src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/mmc_sdio.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/mmc_sdio/mmc_sdio.h rename to src/W800_SDK_v1.00.10/app/app_drivers/mmc_sdio/mmc_sdio.h diff --git a/src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/Makefile b/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/Makefile rename to src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/Makefile diff --git a/src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/watch_peripherals.c b/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/watch_peripherals.c rename to src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c diff --git a/src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/watch_peripherals.h b/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_drivers/watch_peripherals/watch_peripherals.h rename to src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.h diff --git a/src/W800 SDK v1.00.08/app/app_include/app_common.h b/src/W800_SDK_v1.00.10/app/app_include/app_common.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_include/app_common.h rename to src/W800_SDK_v1.00.10/app/app_include/app_common.h diff --git a/src/W800 SDK v1.00.08/app/app_include/app_log.h b/src/W800_SDK_v1.00.10/app/app_include/app_log.h similarity index 100% rename from src/W800 SDK v1.00.08/app/app_include/app_log.h rename to src/W800_SDK_v1.00.10/app/app_include/app_log.h diff --git a/src/W800 SDK v1.00.08/app/gfx/Makefile b/src/W800_SDK_v1.00.10/app/gfx/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/Makefile rename to src/W800_SDK_v1.00.10/app/gfx/Makefile diff --git a/src/W800 SDK v1.00.08/app/gfx/assets/Makefile b/src/W800_SDK_v1.00.10/app/gfx/assets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/assets/Makefile rename to src/W800_SDK_v1.00.10/app/gfx/assets/Makefile diff --git a/src/W800 SDK v1.00.08/app/gfx/assets/compass_assets.c b/src/W800_SDK_v1.00.10/app/gfx/assets/compass_assets.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/assets/compass_assets.c rename to src/W800_SDK_v1.00.10/app/gfx/assets/compass_assets.c diff --git a/src/W800 SDK v1.00.08/app/gfx/assets/watch_casio_assets.c b/src/W800_SDK_v1.00.10/app/gfx/assets/watch_casio_assets.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/assets/watch_casio_assets.c rename to src/W800_SDK_v1.00.10/app/gfx/assets/watch_casio_assets.c diff --git a/src/W800 SDK v1.00.08/app/gfx/assets/watch_menu_icons.c b/src/W800_SDK_v1.00.10/app/gfx/assets/watch_menu_icons.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/assets/watch_menu_icons.c rename to src/W800_SDK_v1.00.10/app/gfx/assets/watch_menu_icons.c diff --git a/src/W800 SDK v1.00.08/app/gfx/common_screen_components.c b/src/W800_SDK_v1.00.10/app/gfx/common_screen_components.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/common_screen_components.c rename to src/W800_SDK_v1.00.10/app/gfx/common_screen_components.c diff --git a/src/W800 SDK v1.00.08/app/gfx/common_screen_components.h b/src/W800_SDK_v1.00.10/app/gfx/common_screen_components.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/common_screen_components.h rename to src/W800_SDK_v1.00.10/app/gfx/common_screen_components.h diff --git a/src/W800 SDK v1.00.08/app/gfx/compass_screen.c b/src/W800_SDK_v1.00.10/app/gfx/compass_screen.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/compass_screen.c rename to src/W800_SDK_v1.00.10/app/gfx/compass_screen.c diff --git a/src/W800 SDK v1.00.08/app/gfx/compass_screen.h b/src/W800_SDK_v1.00.10/app/gfx/compass_screen.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/compass_screen.h rename to src/W800_SDK_v1.00.10/app/gfx/compass_screen.h diff --git a/src/W800 SDK v1.00.08/app/gfx/gfx_task.c b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/gfx_task.c rename to src/W800_SDK_v1.00.10/app/gfx/gfx_task.c diff --git a/src/W800 SDK v1.00.08/app/gfx/gfx_task.h b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/gfx_task.h rename to src/W800_SDK_v1.00.10/app/gfx/gfx_task.h diff --git a/src/W800 SDK v1.00.08/app/gfx/menu_screen.c b/src/W800_SDK_v1.00.10/app/gfx/menu_screen.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/menu_screen.c rename to src/W800_SDK_v1.00.10/app/gfx/menu_screen.c diff --git a/src/W800 SDK v1.00.08/app/gfx/menu_screen.h b/src/W800_SDK_v1.00.10/app/gfx/menu_screen.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/menu_screen.h rename to src/W800_SDK_v1.00.10/app/gfx/menu_screen.h diff --git a/src/W800 SDK v1.00.08/app/gfx/settings_screen.c b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/settings_screen.c rename to src/W800_SDK_v1.00.10/app/gfx/settings_screen.c diff --git a/src/W800 SDK v1.00.08/app/gfx/settings_screen.h b/src/W800_SDK_v1.00.10/app/gfx/settings_screen.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/settings_screen.h rename to src/W800_SDK_v1.00.10/app/gfx/settings_screen.h diff --git a/src/W800 SDK v1.00.08/app/gfx/watch_face.c b/src/W800_SDK_v1.00.10/app/gfx/watch_face.c similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/watch_face.c rename to src/W800_SDK_v1.00.10/app/gfx/watch_face.c diff --git a/src/W800 SDK v1.00.08/app/gfx/watch_face.h b/src/W800_SDK_v1.00.10/app/gfx/watch_face.h similarity index 100% rename from src/W800 SDK v1.00.08/app/gfx/watch_face.h rename to src/W800_SDK_v1.00.10/app/gfx/watch_face.h diff --git a/src/W800 SDK v1.00.08/app/main.c b/src/W800_SDK_v1.00.10/app/main.c similarity index 100% rename from src/W800 SDK v1.00.08/app/main.c rename to src/W800_SDK_v1.00.10/app/main.c diff --git a/src/W800 SDK v1.00.08/app/persistency/Makefile b/src/W800_SDK_v1.00.10/app/persistency/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/app/persistency/Makefile rename to src/W800_SDK_v1.00.10/app/persistency/Makefile diff --git a/src/W800 SDK v1.00.08/app/persistency/watch_settings.c b/src/W800_SDK_v1.00.10/app/persistency/watch_settings.c similarity index 100% rename from src/W800 SDK v1.00.08/app/persistency/watch_settings.c rename to src/W800_SDK_v1.00.10/app/persistency/watch_settings.c diff --git a/src/W800 SDK v1.00.08/app/persistency/watch_settings.h b/src/W800_SDK_v1.00.10/app/persistency/watch_settings.h similarity index 100% rename from src/W800 SDK v1.00.08/app/persistency/watch_settings.h rename to src/W800_SDK_v1.00.10/app/persistency/watch_settings.h diff --git a/src/W800 SDK v1.00.08/demo/Makefile b/src/W800_SDK_v1.00.10/demo/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/demo/Makefile rename to src/W800_SDK_v1.00.10/demo/Makefile diff --git a/src/W800 SDK v1.00.08/demo/console/Makefile b/src/W800_SDK_v1.00.10/demo/console/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/demo/console/Makefile rename to src/W800_SDK_v1.00.10/demo/console/Makefile diff --git a/src/W800 SDK v1.00.08/demo/console/wm_demo_console.h b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h similarity index 100% rename from src/W800 SDK v1.00.08/demo/console/wm_demo_console.h rename to src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h diff --git a/src/W800 SDK v1.00.08/demo/console/wm_demo_console_task.c b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/console/wm_demo_console_task.c rename to src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c diff --git a/src/W800 SDK v1.00.08/demo/wm_7816_demo.c b/src/W800_SDK_v1.00.10/demo/wm_7816_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_7816_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_7816_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_adc_demo.c b/src/W800_SDK_v1.00.10/demo/wm_adc_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_adc_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_adc_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_apsta_demo.c b/src/W800_SDK_v1.00.10/demo/wm_apsta_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_apsta_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_apsta_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_avoid_copy_demo.c b/src/W800_SDK_v1.00.10/demo/wm_avoid_copy_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_avoid_copy_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_avoid_copy_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_connect_net_demo.c b/src/W800_SDK_v1.00.10/demo/wm_connect_net_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_connect_net_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_connect_net_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_crypt_demo.c b/src/W800_SDK_v1.00.10/demo/wm_crypt_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_crypt_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_crypt_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_crypt_hard_demo.c b/src/W800_SDK_v1.00.10/demo/wm_crypt_hard_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_crypt_hard_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_crypt_hard_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_demo.h b/src/W800_SDK_v1.00.10/demo/wm_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_demo.h rename to src/W800_SDK_v1.00.10/demo/wm_demo.h diff --git a/src/W800 SDK v1.00.08/demo/wm_dsp_demo.c b/src/W800_SDK_v1.00.10/demo/wm_dsp_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_dsp_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_dsp_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_fatfs_demo.c b/src/W800_SDK_v1.00.10/demo/wm_fatfs_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_fatfs_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_fatfs_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_flash_demo.c b/src/W800_SDK_v1.00.10/demo/wm_flash_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_flash_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_flash_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_gpio_demo.c b/src/W800_SDK_v1.00.10/demo/wm_gpio_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_gpio_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_gpio_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_http_demo.c b/src/W800_SDK_v1.00.10/demo/wm_http_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_http_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_http_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_https_demo.c b/src/W800_SDK_v1.00.10/demo/wm_https_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_https_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_https_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_i2c_demo.c b/src/W800_SDK_v1.00.10/demo/wm_i2c_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_i2c_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_i2c_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_i2s_demo.c b/src/W800_SDK_v1.00.10/demo/wm_i2s_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_i2s_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_i2s_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_iperf_auto_demo.c b/src/W800_SDK_v1.00.10/demo/wm_iperf_auto_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_iperf_auto_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_iperf_auto_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_lcd_demo.c b/src/W800_SDK_v1.00.10/demo/wm_lcd_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_lcd_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_lcd_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_master_spi_demo.c b/src/W800_SDK_v1.00.10/demo/wm_master_spi_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_master_spi_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_master_spi_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_mbedtls_demo.c b/src/W800_SDK_v1.00.10/demo/wm_mbedtls_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_mbedtls_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_mbedtls_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_mcast_demo.c b/src/W800_SDK_v1.00.10/demo/wm_mcast_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_mcast_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_mcast_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_mqtt_demo.c b/src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_mqtt_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_ntp_demo.c b/src/W800_SDK_v1.00.10/demo/wm_ntp_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_ntp_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_ntp_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_pmu_demo.c b/src/W800_SDK_v1.00.10/demo/wm_pmu_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_pmu_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_pmu_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_pwm_demo.c b/src/W800_SDK_v1.00.10/demo/wm_pwm_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_pwm_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_pwm_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_rsa_demo.c b/src/W800_SDK_v1.00.10/demo/wm_rsa_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_rsa_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_rsa_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_rtc_demo.c b/src/W800_SDK_v1.00.10/demo/wm_rtc_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_rtc_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_rtc_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_scan_demo.c b/src/W800_SDK_v1.00.10/demo/wm_scan_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_scan_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_scan_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_sck_client_demo.c b/src/W800_SDK_v1.00.10/demo/wm_sck_client_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_sck_client_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_sck_client_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_sck_server_demo.c b/src/W800_SDK_v1.00.10/demo/wm_sck_server_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_sck_server_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_sck_server_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_sdio_host_demo.c b/src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_sdio_host_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_slave_spi_demo.c b/src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_slave_spi_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_socket_client_demo.c b/src/W800_SDK_v1.00.10/demo/wm_socket_client_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_socket_client_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_socket_client_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_socket_server_demo.c b/src/W800_SDK_v1.00.10/demo/wm_socket_server_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_socket_server_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_socket_server_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_softap_demo.c b/src/W800_SDK_v1.00.10/demo/wm_softap_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_softap_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_softap_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_ssl_server_demo.c b/src/W800_SDK_v1.00.10/demo/wm_ssl_server_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_ssl_server_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_ssl_server_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_ssl_server_demo.h b/src/W800_SDK_v1.00.10/demo/wm_ssl_server_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_ssl_server_demo.h rename to src/W800_SDK_v1.00.10/demo/wm_ssl_server_demo.h diff --git a/src/W800 SDK v1.00.08/demo/wm_timer_demo.c b/src/W800_SDK_v1.00.10/demo/wm_timer_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_timer_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_timer_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_touchsensor_demo.c b/src/W800_SDK_v1.00.10/demo/wm_touchsensor_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_touchsensor_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_touchsensor_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_uart_demo.c b/src/W800_SDK_v1.00.10/demo/wm_uart_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_uart_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_uart_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_udp_demo.c b/src/W800_SDK_v1.00.10/demo/wm_udp_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_udp_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_udp_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_websockets_demo.c b/src/W800_SDK_v1.00.10/demo/wm_websockets_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_websockets_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_websockets_demo.c diff --git a/src/W800 SDK v1.00.08/demo/wm_wps_demo.c b/src/W800_SDK_v1.00.10/demo/wm_wps_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/demo/wm_wps_demo.c rename to src/W800_SDK_v1.00.10/demo/wm_wps_demo.c diff --git a/src/W800 SDK v1.00.08/doc/ChangeLog.txt b/src/W800_SDK_v1.00.10/doc/ChangeLog.txt similarity index 100% rename from src/W800 SDK v1.00.08/doc/ChangeLog.txt rename to src/W800_SDK_v1.00.10/doc/ChangeLog.txt diff --git a/src/W800 SDK v1.00.08/doc/w800_apis.chm b/src/W800_SDK_v1.00.10/doc/w800_apis.chm similarity index 100% rename from src/W800 SDK v1.00.08/doc/w800_apis.chm rename to src/W800_SDK_v1.00.10/doc/w800_apis.chm diff --git a/src/W800 SDK v1.00.08/include/app/wm_at_ri_init.h b/src/W800_SDK_v1.00.10/include/app/wm_at_ri_init.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_at_ri_init.h rename to src/W800_SDK_v1.00.10/include/app/wm_at_ri_init.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_crypto.h b/src/W800_SDK_v1.00.10/include/app/wm_crypto.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_crypto.h rename to src/W800_SDK_v1.00.10/include/app/wm_crypto.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_dhcp_server.h b/src/W800_SDK_v1.00.10/include/app/wm_dhcp_server.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_dhcp_server.h rename to src/W800_SDK_v1.00.10/include/app/wm_dhcp_server.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_dns_server.h b/src/W800_SDK_v1.00.10/include/app/wm_dns_server.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_dns_server.h rename to src/W800_SDK_v1.00.10/include/app/wm_dns_server.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_http_client.h b/src/W800_SDK_v1.00.10/include/app/wm_http_client.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_http_client.h rename to src/W800_SDK_v1.00.10/include/app/wm_http_client.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_netif.h b/src/W800_SDK_v1.00.10/include/app/wm_netif.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_netif.h rename to src/W800_SDK_v1.00.10/include/app/wm_netif.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_netif2.0.3.h b/src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_netif2.0.3.h rename to src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_ntp.h b/src/W800_SDK_v1.00.10/include/app/wm_ntp.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_ntp.h rename to src/W800_SDK_v1.00.10/include/app/wm_ntp.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_ssl_server.h b/src/W800_SDK_v1.00.10/include/app/wm_ssl_server.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_ssl_server.h rename to src/W800_SDK_v1.00.10/include/app/wm_ssl_server.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_webserver.h b/src/W800_SDK_v1.00.10/include/app/wm_webserver.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_webserver.h rename to src/W800_SDK_v1.00.10/include/app/wm_webserver.h diff --git a/src/W800 SDK v1.00.08/include/app/wm_wifi_oneshot.h b/src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h similarity index 100% rename from src/W800 SDK v1.00.08/include/app/wm_wifi_oneshot.h rename to src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_config.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_config.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_config.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_core/core_804.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/core_804.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_core/core_804.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/core_804.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_core/csi_core.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/csi_core.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_core/csi_core.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/csi_core.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_core/csi_gcc.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/csi_gcc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_core/csi_gcc.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_core/csi_gcc.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_common_tables.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_common_tables.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_common_tables.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_common_tables.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_const_structs.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_const_structs.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_const_structs.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_const_structs.h diff --git a/src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_math.h b/src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_math.h similarity index 100% rename from src/W800 SDK v1.00.08/include/arch/xt804/csi_dsp/csky_math.h rename to src/W800_SDK_v1.00.10/include/arch/xt804/csi_dsp/csky_math.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_ble.h b/src/W800_SDK_v1.00.10/include/bt/wm_ble.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_ble.h rename to src/W800_SDK_v1.00.10/include/bt/wm_ble.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_ble_gatt.h b/src/W800_SDK_v1.00.10/include/bt/wm_ble_gatt.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_ble_gatt.h rename to src/W800_SDK_v1.00.10/include/bt/wm_ble_gatt.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt_api.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt_api.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt_api.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt_api.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt_av.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt_av.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt_av.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt_av.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt_def.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt_def.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt_def.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt_def.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt_hf_client.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt_hf_client.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt_hf_client.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt_hf_client.h diff --git a/src/W800 SDK v1.00.08/include/bt/wm_bt_spp.h b/src/W800_SDK_v1.00.10/include/bt/wm_bt_spp.h similarity index 100% rename from src/W800 SDK v1.00.08/include/bt/wm_bt_spp.h rename to src/W800_SDK_v1.00.10/include/bt/wm_bt_spp.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_7816.h b/src/W800_SDK_v1.00.10/include/driver/wm_7816.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_7816.h rename to src/W800_SDK_v1.00.10/include/driver/wm_7816.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_adc.h b/src/W800_SDK_v1.00.10/include/driver/wm_adc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_adc.h rename to src/W800_SDK_v1.00.10/include/driver/wm_adc.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_cpu.h b/src/W800_SDK_v1.00.10/include/driver/wm_cpu.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_cpu.h rename to src/W800_SDK_v1.00.10/include/driver/wm_cpu.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_dma.h b/src/W800_SDK_v1.00.10/include/driver/wm_dma.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_dma.h rename to src/W800_SDK_v1.00.10/include/driver/wm_dma.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_efuse.h b/src/W800_SDK_v1.00.10/include/driver/wm_efuse.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_efuse.h rename to src/W800_SDK_v1.00.10/include/driver/wm_efuse.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_flash.h b/src/W800_SDK_v1.00.10/include/driver/wm_flash.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_flash.h rename to src/W800_SDK_v1.00.10/include/driver/wm_flash.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_flash_map.h b/src/W800_SDK_v1.00.10/include/driver/wm_flash_map.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_flash_map.h rename to src/W800_SDK_v1.00.10/include/driver/wm_flash_map.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_flash_map_backup.h b/src/W800_SDK_v1.00.10/include/driver/wm_flash_map_backup.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_flash_map_backup.h rename to src/W800_SDK_v1.00.10/include/driver/wm_flash_map_backup.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_fls_gd25qxx.h b/src/W800_SDK_v1.00.10/include/driver/wm_fls_gd25qxx.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_fls_gd25qxx.h rename to src/W800_SDK_v1.00.10/include/driver/wm_fls_gd25qxx.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_gpio.h b/src/W800_SDK_v1.00.10/include/driver/wm_gpio.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_gpio.h rename to src/W800_SDK_v1.00.10/include/driver/wm_gpio.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_gpio_afsel.h b/src/W800_SDK_v1.00.10/include/driver/wm_gpio_afsel.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_gpio_afsel.h rename to src/W800_SDK_v1.00.10/include/driver/wm_gpio_afsel.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_hostspi.h b/src/W800_SDK_v1.00.10/include/driver/wm_hostspi.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_hostspi.h rename to src/W800_SDK_v1.00.10/include/driver/wm_hostspi.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_hspi.h b/src/W800_SDK_v1.00.10/include/driver/wm_hspi.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_hspi.h rename to src/W800_SDK_v1.00.10/include/driver/wm_hspi.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_i2c.h b/src/W800_SDK_v1.00.10/include/driver/wm_i2c.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_i2c.h rename to src/W800_SDK_v1.00.10/include/driver/wm_i2c.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_i2s.h b/src/W800_SDK_v1.00.10/include/driver/wm_i2s.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_i2s.h rename to src/W800_SDK_v1.00.10/include/driver/wm_i2s.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_internal_flash.h b/src/W800_SDK_v1.00.10/include/driver/wm_internal_flash.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_internal_flash.h rename to src/W800_SDK_v1.00.10/include/driver/wm_internal_flash.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_io.h b/src/W800_SDK_v1.00.10/include/driver/wm_io.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_io.h rename to src/W800_SDK_v1.00.10/include/driver/wm_io.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_irq.h b/src/W800_SDK_v1.00.10/include/driver/wm_irq.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_irq.h rename to src/W800_SDK_v1.00.10/include/driver/wm_irq.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_lcd.h b/src/W800_SDK_v1.00.10/include/driver/wm_lcd.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_lcd.h rename to src/W800_SDK_v1.00.10/include/driver/wm_lcd.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_pmu.h b/src/W800_SDK_v1.00.10/include/driver/wm_pmu.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_pmu.h rename to src/W800_SDK_v1.00.10/include/driver/wm_pmu.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_psram.h b/src/W800_SDK_v1.00.10/include/driver/wm_psram.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_psram.h rename to src/W800_SDK_v1.00.10/include/driver/wm_psram.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_pwm.h b/src/W800_SDK_v1.00.10/include/driver/wm_pwm.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_pwm.h rename to src/W800_SDK_v1.00.10/include/driver/wm_pwm.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_rtc.h b/src/W800_SDK_v1.00.10/include/driver/wm_rtc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_rtc.h rename to src/W800_SDK_v1.00.10/include/driver/wm_rtc.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_sasc.h b/src/W800_SDK_v1.00.10/include/driver/wm_sasc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_sasc.h rename to src/W800_SDK_v1.00.10/include/driver/wm_sasc.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_sdio_host.h b/src/W800_SDK_v1.00.10/include/driver/wm_sdio_host.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_sdio_host.h rename to src/W800_SDK_v1.00.10/include/driver/wm_sdio_host.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_timer.h b/src/W800_SDK_v1.00.10/include/driver/wm_timer.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_timer.h rename to src/W800_SDK_v1.00.10/include/driver/wm_timer.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_tipc.h b/src/W800_SDK_v1.00.10/include/driver/wm_tipc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_tipc.h rename to src/W800_SDK_v1.00.10/include/driver/wm_tipc.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_touchsensor.h b/src/W800_SDK_v1.00.10/include/driver/wm_touchsensor.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_touchsensor.h rename to src/W800_SDK_v1.00.10/include/driver/wm_touchsensor.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_uart.h b/src/W800_SDK_v1.00.10/include/driver/wm_uart.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_uart.h rename to src/W800_SDK_v1.00.10/include/driver/wm_uart.h diff --git a/src/W800 SDK v1.00.08/include/driver/wm_watchdog.h b/src/W800_SDK_v1.00.10/include/driver/wm_watchdog.h similarity index 100% rename from src/W800 SDK v1.00.08/include/driver/wm_watchdog.h rename to src/W800_SDK_v1.00.10/include/driver/wm_watchdog.h diff --git a/src/W800 SDK v1.00.08/include/list.h b/src/W800_SDK_v1.00.10/include/list.h similarity index 100% rename from src/W800 SDK v1.00.08/include/list.h rename to src/W800_SDK_v1.00.10/include/list.h diff --git a/src/W800 SDK v1.00.08/include/net/wm_socket.h b/src/W800_SDK_v1.00.10/include/net/wm_socket.h similarity index 100% rename from src/W800 SDK v1.00.08/include/net/wm_socket.h rename to src/W800_SDK_v1.00.10/include/net/wm_socket.h diff --git a/src/W800 SDK v1.00.08/include/net/wm_socket2.0.3.h b/src/W800_SDK_v1.00.10/include/net/wm_socket2.0.3.h similarity index 100% rename from src/W800 SDK v1.00.08/include/net/wm_socket2.0.3.h rename to src/W800_SDK_v1.00.10/include/net/wm_socket2.0.3.h diff --git a/src/W800 SDK v1.00.08/include/net/wm_sockets.h b/src/W800_SDK_v1.00.10/include/net/wm_sockets.h similarity index 100% rename from src/W800 SDK v1.00.08/include/net/wm_sockets.h rename to src/W800_SDK_v1.00.10/include/net/wm_sockets.h diff --git a/src/W800 SDK v1.00.08/include/net/wm_sockets2.0.3.h b/src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h similarity index 100% rename from src/W800 SDK v1.00.08/include/net/wm_sockets2.0.3.h rename to src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h diff --git a/src/W800 SDK v1.00.08/include/os/wm_os_config.h b/src/W800_SDK_v1.00.10/include/os/wm_os_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/os/wm_os_config.h rename to src/W800_SDK_v1.00.10/include/os/wm_os_config.h diff --git a/src/W800 SDK v1.00.08/include/os/wm_osal.h b/src/W800_SDK_v1.00.10/include/os/wm_osal.h similarity index 100% rename from src/W800 SDK v1.00.08/include/os/wm_osal.h rename to src/W800_SDK_v1.00.10/include/os/wm_osal.h diff --git a/src/W800 SDK v1.00.08/include/platform/aes.h b/src/W800_SDK_v1.00.10/include/platform/aes.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/aes.h rename to src/W800_SDK_v1.00.10/include/platform/aes.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_crypto_hard.h b/src/W800_SDK_v1.00.10/include/platform/wm_crypto_hard.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_crypto_hard.h rename to src/W800_SDK_v1.00.10/include/platform/wm_crypto_hard.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_crypto_hard_mbed.h b/src/W800_SDK_v1.00.10/include/platform/wm_crypto_hard_mbed.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_crypto_hard_mbed.h rename to src/W800_SDK_v1.00.10/include/platform/wm_crypto_hard_mbed.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_fwup.h b/src/W800_SDK_v1.00.10/include/platform/wm_fwup.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_fwup.h rename to src/W800_SDK_v1.00.10/include/platform/wm_fwup.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_mem.h b/src/W800_SDK_v1.00.10/include/platform/wm_mem.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_mem.h rename to src/W800_SDK_v1.00.10/include/platform/wm_mem.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_params.h b/src/W800_SDK_v1.00.10/include/platform/wm_params.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_params.h rename to src/W800_SDK_v1.00.10/include/platform/wm_params.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_wl_mbox.h b/src/W800_SDK_v1.00.10/include/platform/wm_wl_mbox.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_wl_mbox.h rename to src/W800_SDK_v1.00.10/include/platform/wm_wl_mbox.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_wl_task.h b/src/W800_SDK_v1.00.10/include/platform/wm_wl_task.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_wl_task.h rename to src/W800_SDK_v1.00.10/include/platform/wm_wl_task.h diff --git a/src/W800 SDK v1.00.08/include/platform/wm_wl_timers.h b/src/W800_SDK_v1.00.10/include/platform/wm_wl_timers.h similarity index 100% rename from src/W800 SDK v1.00.08/include/platform/wm_wl_timers.h rename to src/W800_SDK_v1.00.10/include/platform/wm_wl_timers.h diff --git a/src/W800 SDK v1.00.08/include/random.h b/src/W800_SDK_v1.00.10/include/random.h similarity index 100% rename from src/W800 SDK v1.00.08/include/random.h rename to src/W800_SDK_v1.00.10/include/random.h diff --git a/src/W800 SDK v1.00.08/include/wifi/litepoint.h b/src/W800_SDK_v1.00.10/include/wifi/litepoint.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wifi/litepoint.h rename to src/W800_SDK_v1.00.10/include/wifi/litepoint.h diff --git a/src/W800 SDK v1.00.08/include/wifi/wm_ieee80211.h b/src/W800_SDK_v1.00.10/include/wifi/wm_ieee80211.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wifi/wm_ieee80211.h rename to src/W800_SDK_v1.00.10/include/wifi/wm_ieee80211.h diff --git a/src/W800 SDK v1.00.08/include/wifi/wm_ieee80211_gcc.h b/src/W800_SDK_v1.00.10/include/wifi/wm_ieee80211_gcc.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wifi/wm_ieee80211_gcc.h rename to src/W800_SDK_v1.00.10/include/wifi/wm_ieee80211_gcc.h diff --git a/src/W800 SDK v1.00.08/include/wifi/wm_wifi.h b/src/W800_SDK_v1.00.10/include/wifi/wm_wifi.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wifi/wm_wifi.h rename to src/W800_SDK_v1.00.10/include/wifi/wm_wifi.h diff --git a/src/W800 SDK v1.00.08/include/wm_bt_config.h b/src/W800_SDK_v1.00.10/include/wm_bt_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_bt_config.h rename to src/W800_SDK_v1.00.10/include/wm_bt_config.h diff --git a/src/W800 SDK v1.00.08/include/wm_config.h b/src/W800_SDK_v1.00.10/include/wm_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_config.h rename to src/W800_SDK_v1.00.10/include/wm_config.h diff --git a/src/W800 SDK v1.00.08/include/wm_debug.h b/src/W800_SDK_v1.00.10/include/wm_debug.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_debug.h rename to src/W800_SDK_v1.00.10/include/wm_debug.h diff --git a/src/W800 SDK v1.00.08/include/wm_include.h b/src/W800_SDK_v1.00.10/include/wm_include.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_include.h rename to src/W800_SDK_v1.00.10/include/wm_include.h diff --git a/src/W800 SDK v1.00.08/include/wm_ram_config.h b/src/W800_SDK_v1.00.10/include/wm_ram_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_ram_config.h rename to src/W800_SDK_v1.00.10/include/wm_ram_config.h diff --git a/src/W800 SDK v1.00.08/include/wm_regs.h b/src/W800_SDK_v1.00.10/include/wm_regs.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_regs.h rename to src/W800_SDK_v1.00.10/include/wm_regs.h diff --git a/src/W800 SDK v1.00.08/include/wm_type_def.h b/src/W800_SDK_v1.00.10/include/wm_type_def.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_type_def.h rename to src/W800_SDK_v1.00.10/include/wm_type_def.h diff --git a/src/W800 SDK v1.00.08/include/wm_wifi_config.h b/src/W800_SDK_v1.00.10/include/wm_wifi_config.h similarity index 100% rename from src/W800 SDK v1.00.08/include/wm_wifi_config.h rename to src/W800_SDK_v1.00.10/include/wm_wifi_config.h diff --git a/src/W800 SDK v1.00.08/ld/w800/gcc_csky.ld b/src/W800_SDK_v1.00.10/ld/w800/gcc_csky.ld similarity index 100% rename from src/W800 SDK v1.00.08/ld/w800/gcc_csky.ld rename to src/W800_SDK_v1.00.10/ld/w800/gcc_csky.ld diff --git a/src/W800 SDK v1.00.08/ld/w800/gcc_csky_backup.ld b/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_backup.ld similarity index 100% rename from src/W800 SDK v1.00.08/ld/w800/gcc_csky_backup.ld rename to src/W800_SDK_v1.00.10/ld/w800/gcc_csky_backup.ld diff --git a/src/W800 SDK v1.00.08/ld/w800/gcc_csky_bt.ld b/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld similarity index 100% rename from src/W800 SDK v1.00.08/ld/w800/gcc_csky_bt.ld rename to src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld diff --git a/src/W800 SDK v1.00.08/lib/w800/libapp.a b/src/W800_SDK_v1.00.10/lib/w800/libapp.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libapp.a rename to src/W800_SDK_v1.00.10/lib/w800/libapp.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libapp_br_edr.a b/src/W800_SDK_v1.00.10/lib/w800/libapp_br_edr.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libapp_br_edr.a rename to src/W800_SDK_v1.00.10/lib/w800/libapp_br_edr.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libblehost.a b/src/W800_SDK_v1.00.10/lib/w800/libblehost.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libblehost.a rename to src/W800_SDK_v1.00.10/lib/w800/libblehost.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libbtcontroller.a b/src/W800_SDK_v1.00.10/lib/w800/libbtcontroller.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libbtcontroller.a rename to src/W800_SDK_v1.00.10/lib/w800/libbtcontroller.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libbtcontroller_br_edr.a b/src/W800_SDK_v1.00.10/lib/w800/libbtcontroller_br_edr.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libbtcontroller_br_edr.a rename to src/W800_SDK_v1.00.10/lib/w800/libbtcontroller_br_edr.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libbthost_br_edr.a b/src/W800_SDK_v1.00.10/lib/w800/libbthost_br_edr.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libbthost_br_edr.a rename to src/W800_SDK_v1.00.10/lib/w800/libbthost_br_edr.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libdrivers.a b/src/W800_SDK_v1.00.10/lib/w800/libdrivers.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libdrivers.a rename to src/W800_SDK_v1.00.10/lib/w800/libdrivers.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libdsp.a b/src/W800_SDK_v1.00.10/lib/w800/libdsp.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libdsp.a rename to src/W800_SDK_v1.00.10/lib/w800/libdsp.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libnetwork.a b/src/W800_SDK_v1.00.10/lib/w800/libnetwork.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libnetwork.a rename to src/W800_SDK_v1.00.10/lib/w800/libnetwork.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libos.a b/src/W800_SDK_v1.00.10/lib/w800/libos.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libos.a rename to src/W800_SDK_v1.00.10/lib/w800/libos.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libwlan.a b/src/W800_SDK_v1.00.10/lib/w800/libwlan.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libwlan.a rename to src/W800_SDK_v1.00.10/lib/w800/libwlan.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libwmarch.a b/src/W800_SDK_v1.00.10/lib/w800/libwmarch.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libwmarch.a rename to src/W800_SDK_v1.00.10/lib/w800/libwmarch.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libwmcommon.a b/src/W800_SDK_v1.00.10/lib/w800/libwmcommon.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libwmcommon.a rename to src/W800_SDK_v1.00.10/lib/w800/libwmcommon.a diff --git a/src/W800 SDK v1.00.08/lib/w800/libwmsys.a b/src/W800_SDK_v1.00.10/lib/w800/libwmsys.a similarity index 100% rename from src/W800 SDK v1.00.08/lib/w800/libwmsys.a rename to src/W800_SDK_v1.00.10/lib/w800/libwmsys.a diff --git a/src/W800 SDK v1.00.08/lvgl/Makefile b/src/W800_SDK_v1.00.10/lvgl/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/Makefile rename to src/W800_SDK_v1.00.10/lvgl/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_conf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_conf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_disp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_disp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_disp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_disp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_disp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_disp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_disp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_disp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.c.bck b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.c.bck similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.c.bck rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.c.bck diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lv_port_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lv_port_indev.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/lvgl_port_tick.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/lvgl_port_tick.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/lvgl_port_tick.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/lvgl_port_tick.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/touchpad.c.bck b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/touchpad.c.bck similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/touchpad.c.bck rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/touchpad.c.bck diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_port/touchpad.h.bck b/src/W800_SDK_v1.00.10/lvgl/lvgl_port/touchpad.h.bck similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_port/touchpad.h.bck rename to src/W800_SDK_v1.00.10/lvgl/lvgl_port/touchpad.h.bck diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.codecov.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.codecov.yml similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.codecov.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.codecov.yml diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.editorconfig b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.editorconfig similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.editorconfig rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.editorconfig diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.gitignore similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.gitignore diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.pre-commit-config.yaml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.pre-commit-config.yaml similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/.pre-commit-config.yaml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/.pre-commit-config.yaml diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/CMakeLists.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/CMakeLists.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/CMakeLists.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/CMakeLists.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/Kconfig b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Kconfig similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/Kconfig rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Kconfig diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/LICENCE.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/LICENCE.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/LICENCE.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/LICENCE.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README_pt_BR.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_pt_BR.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README_pt_BR.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_pt_BR.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README_zh.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_zh.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/README_zh.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/README_zh.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/SConscript similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/SConscript rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/SConscript diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/component.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/component.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/component.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/component.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_alpha16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_argb.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_chroma_keyed.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_indexed16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_benchmark_cogwheel_rgb565a8.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_argb.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_chroma_keyed.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_indexed16.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/img_cogwheel_rgb.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_12_compr_az.c.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_16_compr_az.c.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/assets/lv_font_bechmark_montserrat_28_compr_az.c.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/lv_demo_benchmark.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/benchmark/screenshot2.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/lv_demo_keypad_encoder.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/keypad_encoder/screenshot1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/lv_demos.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/lv_demos.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/lv_demos.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/lv_demos.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/lv_demos.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_corner_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_pause_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_list_play_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_loop_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_next_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_pause_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_play_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_prev_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_btn_rnd_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_left_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_corner_right_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_1_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_2_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_cover_3_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_1_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_2_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_3_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_icon_4_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_list_border_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_logo.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_slider_knob_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_bottom_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/img_lv_demo_music_wave_top_large.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_1.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_2.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/assets/spectrum_3.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_list.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/lv_demo_music_main.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/screenshot1.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/music/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/music/screenshot1.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/lv_demo_stress.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/stress/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/stress/screenshot1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/avatar.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/clothes.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_clothes.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_demo_widgets_avatar.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/img_lvgl_logo.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/assets/lvgl_logo.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/lv_demo_widgets.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/demos/widgets/screenshot1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CHANGELOG.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CHANGELOG.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CHANGELOG.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CHANGELOG.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODE_OF_CONDUCT.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CODING_STYLE.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODING_STYLE.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CODING_STYLE.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CODING_STYLE.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/CONTRIBUTING.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/ROADMAP.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/ROADMAP.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/ROADMAP.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/ROADMAP.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_ext/lv_example.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_ext/lv_example.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_ext/lv_example.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_ext/lv_example.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/css/custom.css b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/custom.css similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/css/custom.css rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/custom.css diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/css/fontawesome.min.css diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_2.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_2.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_3.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_3.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_3.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_4.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_4.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_4.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_4.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_5.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_5.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_5.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_5.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_6.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_6.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_6.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_6.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/img/home_banner.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/js/custom.js b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/js/custom.js similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_static/js/custom.js rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_static/js/custom.js diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_templates/layout.html b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/layout.html similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_templates/layout.html rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/layout.html diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_templates/page.html b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/page.html similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/_templates/page.html rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/_templates/page.html diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/build.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/build.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/build.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/build.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/conf.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/conf.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/conf.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/conf.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/example_list.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/example_list.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/example_list.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/example_list.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/favicon.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/favicon.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/favicon.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/favicon.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/cpp.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/bindings/micropython.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/freertos.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/nuttx.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/rt-thread.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/os/zephyr.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/arduino.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/cmake.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/espressif.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/nxp.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/pc-simulator.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/stm32.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/platforms/tasmota-berry.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/get-started/quick-overview.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/intro/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/intro/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/intro/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/intro/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/flex.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/flex.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/flex.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/flex.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/grid.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/grid.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/grid.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/grid.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/layouts/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/layouts/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/bmp.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/bmp.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/bmp.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/bmp.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/ffmpeg.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/freetype.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/freetype.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/freetype.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/freetype.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/fsdrv.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/fsdrv.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/fsdrv.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/fsdrv.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/gif.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/gif.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/gif.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/gif.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/png.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/png.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/png.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/png.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/qrcode.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/qrcode.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/qrcode.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/qrcode.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/rlottie.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/rlottie.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/rlottie.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/rlottie.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/sjpg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/sjpg.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/libs/sjpg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/libs/sjpg.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/logo_lvgl.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/logo_lvgl.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/logo_lvgl.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/logo_lvgl.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/align.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/align.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/align.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/align.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/anim-timeline.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/bidi.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/bidi.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/bidi.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/bidi.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/boxmodel.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/boxmodel.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/boxmodel.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/boxmodel.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/btn_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/btn_example.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/btn_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/btn_example.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/button_style_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/button_style_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/button_style_example.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/codeblocks.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/eclipse.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/layers.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/layers.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/layers.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/layers.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child2.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child2.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child3.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child3.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/par_child3.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/par_child3.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/platformio.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/platformio.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/platformio.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/platformio.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/qtcreator.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/simple_button_example.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/symbols.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/symbols.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/symbols.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/symbols.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/sys.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/sys.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/sys.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/sys.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/misc/visualstudio.jpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/fragment.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/fragment.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/fragment.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/fragment.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/gridnav.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/gridnav.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/gridnav.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/gridnav.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/ime_pinyin.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/imgfont.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/imgfont.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/imgfont.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/imgfont.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/monkey.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/monkey.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/monkey.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/monkey.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/msg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/msg.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/msg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/msg.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/snapshot.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/snapshot.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/others/snapshot.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/others/snapshot.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/animation.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/animation.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/animation.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/animation.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/color.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/color.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/color.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/color.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/coords.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/coords.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/coords.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/coords.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/display.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/display.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/display.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/display.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/drawing.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/drawing.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/drawing.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/drawing.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/event.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/event.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/event.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/event.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/file-system.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/file-system.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/file-system.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/file-system.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/font.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/font.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/font.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/font.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/image.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/image.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/image.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/image.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/indev.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/indev.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/indev.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/indev.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/layer.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/layer.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/layer.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/layer.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/new_widget.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/new_widget.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/new_widget.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/new_widget.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/object.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/object.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/object.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/object.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/arm-2d.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/dma2d.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/pxp-vglite.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sdl.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/renderers/sw.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/scroll.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/scroll.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/scroll.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/scroll.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/style-props.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style-props.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/style-props.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style-props.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/style.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/style.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/style.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/timer.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/timer.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/overview/timer.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/overview/timer.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/display.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/display.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/display.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/display.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/gpu.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/gpu.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/gpu.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/gpu.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/indev.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/indev.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/indev.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/indev.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/log.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/log.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/log.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/log.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/os.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/os.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/os.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/os.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/project.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/project.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/project.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/project.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/sleep.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/sleep.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/sleep.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/sleep.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/tick.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/tick.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/tick.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/tick.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/timer-handler.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/timer-handler.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/porting/timer-handler.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/porting/timer-handler.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/requirements.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/requirements.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/requirements.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/requirements.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/arc.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/arc.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/arc.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/arc.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/bar.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/bar.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/bar.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/bar.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/btn.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btn.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/btn.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btn.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/btnmatrix.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/canvas.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/checkbox.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/dropdown.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/img.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/img.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/img.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/img.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/label.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/label.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/label.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/label.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/line.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/line.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/line.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/line.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/roller.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/roller.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/roller.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/roller.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/slider.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/slider.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/slider.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/slider.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/switch.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/switch.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/switch.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/switch.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/table.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/table.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/table.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/table.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/core/textarea.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/animimg.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/calendar.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/chart.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/colorwheel.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/imgbtn.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/keyboard.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/led.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/led.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/led.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/led.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/list.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/list.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/list.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/list.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/menu.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/meter.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/msgbox.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/span.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/span.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/span.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/span.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinbox.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/spinner.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tabview.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/tileview.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/win.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/win.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/extra/win.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/extra/win.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/index.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/index.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/index.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/index.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/obj.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/obj.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/docs/widgets/obj.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/docs/widgets/obj.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/custom.cmake diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/esp.cmake diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/micropython.cmake diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmake/zephyr.cmake diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.1.0.6.pack diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.lvgl.pdsc diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/LVGL.pidx diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/gen_pack.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_cmsis_pack.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/cmsis-pack/lv_conf_cmsis.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/SConscript diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_conf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/lv_rt_thread_port.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/SConscript diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/rt-thread/squareline/ui/lv_ui_entry.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/zephyr/module.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/zephyr/module.yml similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/env_support/zephyr/module.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/env_support/zephyr/module.yml diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/anim/lv_example_anim_timeline_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/arduino/LVGL_Arduino/LVGL_Arduino.ino diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg001.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg001.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg001.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg001.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg001.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg002.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg002.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg002.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg002.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg002.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg003.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg003.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg003.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/animimg003.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/animimg003.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/caret_down.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/caret_down.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/caret_down.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/caret_down.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/F600.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/emoji/img_emoji_F617.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/lv_font_simsun_16_cjk.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-16.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/font/montserrat-22.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_caret_down.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_alpha16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_argb.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_chroma_keyed.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_indexed16.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_cogwheel_rgb.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_hour.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_hand_min.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_skew_strip_80x20_argb8888.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_star.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_star.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_star.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_star.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_star.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_strip.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_strip.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/img_strip.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/img_strip.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_left.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_mid.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/assets/imgbtn_right.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/event/lv_example_event_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/get_started/lv_example_get_started_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/header.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/header.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/header.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/header.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/flex/lv_example_flex_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/grid/lv_example_grid_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/layouts/lv_example_layout.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_16bit.bmp diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_24bit.bmp diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/example_32bit.bmp diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/bmp/lv_example_bmp_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/birds.mp4 diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/ffmpeg.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/ffmpeg/lv_example_ffmpeg_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/Lato-Regular.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/freetype/lv_example_freetype_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/bulb.gif diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/img_bulb_gif.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/gif/lv_example_gif_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/lv_example_libs.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/img_wink_png.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/lv_example_png_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/wink.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/wink.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/png/wink.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/png/wink.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/qrcode/lv_example_qrcode_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.json diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/rlottie/lv_example_rlottie_approve.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/lv_example_sjpg_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/libs/sjpg/small_image.sjpg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/lv_examples.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/lv_examples.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/lv_examples.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/lv_examples.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/lv_examples.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/fragment/lv_example_fragment_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/gridnav/lv_example_gridnav_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/ime/lv_example_ime_pinyin_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/imgfont/lv_example_imgfont_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/lv_example_others.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/lv_example_others.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/lv_example_others.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/lv_example_others.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/monkey/lv_example_monkey_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/msg/lv_example_msg_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/others/snapshot/lv_example_snapshot_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_disp_template.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_fs_template.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/porting/lv_port_indev_template.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/scroll/lv_example_scroll_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_10.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_11.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_12.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_13.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_14.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_15.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_7.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_8.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/styles/lv_example_style_9.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/test_ex.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/test_ex.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/test_ex.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/test_ex.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/animimg/lv_example_animimg_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/arc/lv_example_arc_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/lv_example_bar_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/test.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/test.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/bar/test.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/bar/test.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btn/lv_example_btn_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/btnmatrix/lv_example_btnmatrix_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/calendar/lv_example_calendar_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/canvas/lv_example_canvas_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_6.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_7.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_8.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/chart/lv_example_chart_9.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/checkbox/lv_example_checkbox_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/colorwheel/lv_example_colorwheel_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/dropdown/lv_example_dropdown_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/img/lv_example_img_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/imgbtn/lv_example_imgbtn_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/keyboard/lv_example_keyboard_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/label/lv_example_label_5.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/led/lv_example_led_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/line/lv_example_line_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/lv_example_list_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/test.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/test.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/list/test.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/list/test.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/lv_example_widgets.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/menu/lv_example_menu_5.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/meter/lv_example_meter_4.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/msgbox/lv_example_msgbox_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/obj/lv_example_obj_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/roller/lv_example_roller_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/slider/lv_example_slider_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/span/lv_example_span_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinbox/lv_example_spinbox_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/spinner/lv_example_spinner_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/switch/lv_example_switch_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/table/lv_example_table_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tabview/lv_example_tabview_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_2.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/textarea/lv_example_textarea_3.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/tileview/lv_example_tileview_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/index.rst b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/index.rst rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/index.rst diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/examples/widgets/win/lv_example_win_1.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/idf_component.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/idf_component.yml similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/idf_component.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/idf_component.yml diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/library.json b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.json similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/library.json rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.json diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/library.properties b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.properties similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/library.properties rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/library.properties diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lv_conf_template.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lv_conf_template.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lv_conf_template.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lv_conf_template.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lvgl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lvgl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lvgl.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/lvgl.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/lvgl.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/.gitignore similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/.gitignore diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/Doxyfile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/Doxyfile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/Doxyfile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/Doxyfile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/build_html_examples.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/build_html_examples.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/build_html_examples.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/build_html_examples.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/DejaVuSans.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/Montserrat-Medium.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/SimSun.woff diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/built_in_font_gen.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/generate_all.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/built_in_font/unscii-8.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/changelog-template.hbs b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog-template.hbs similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/changelog-template.hbs rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog-template.hbs diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/changelog_gen.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog_gen.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/changelog_gen.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/changelog_gen.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/code-format.cfg b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.cfg similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/code-format.cfg rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.cfg diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/code-format.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/code-format.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/code-format.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/cppcheck_run.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/filetohex.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/filetohex.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/filetohex.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/filetohex.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/find_version.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/find_version.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/find_version.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/find_version.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/genexamplelist.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/genexamplelist.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/genexamplelist.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/genexamplelist.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/infer_run.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/infer_run.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/infer_run.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/infer_run.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/install-prerequisites.sh diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/jpg_to_sjpg.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/lv_conf_internal_gen.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/com.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/com.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/com.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/com.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/commits.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/commits.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/commits.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/commits.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/patch.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/patch.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/patch.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/patch.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/release.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/release.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/release/release.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/release/release.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/style_api_gen.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/style_api_gen.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/scripts/style_api_gen.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/scripts/style_api_gen.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_core.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_core.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_core.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_core.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_disp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_disp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_disp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_disp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_disp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_event.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_event.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_event.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_event.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_event.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_group.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_group.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_group.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_group.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_group.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_indev_scroll.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_class.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_class.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_class.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_class.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_class.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_draw.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_pos.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_scroll.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_style_gen.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_obj_tree.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_refr.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_refr.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_refr.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_refr.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_refr.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_theme.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_theme.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_theme.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/core/lv_theme.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/core/lv_theme.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_draw_arm2d.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/arm2d/lv_gpu_arm2d.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_arc.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_img.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_label.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_layer.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_line.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_mask.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_rect.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_transform.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_draw_triangle.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_buf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_cache.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/lv_img_decoder.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_draw_nxp.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/lv_gpu_nxp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_nxp_pxp.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_draw_pxp_blend.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/pxp/lv_gpu_nxp_pxp_osa.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_nxp_vglite.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_arc.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_blend.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_draw_vglite_rect.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/nxp/vglite/lv_gpu_nxp_vglite.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_bg.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_composite.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_img.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_label.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_layer.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_line.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_mask.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_polygon.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_priv.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_rect.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_stack_blur.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_texture_cache.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sdl/lv_draw_sdl_utils.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_draw_stm32_dma2d.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_blend.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_dither.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_gradient.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_img.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_layer.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_letter.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_line.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_polygon.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_rect.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/sw/lv_draw_sw_transform.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_draw_swm341_dma2d.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/draw/swm341_dma2d/lv_gpu_swm341_dma2d.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/flex/lv_flex.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/grid/lv_grid.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/layouts/lv_layouts.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/bmp/lv_bmp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/ffmpeg/lv_ffmpeg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/arial.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/freetype/lv_freetype.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_fatfs.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_posix.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_stdio.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fs_win32.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/fsdrv/lv_fsdrv.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/gifdec.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/gif/lv_gif.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/lv_libs.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lodepng.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/png/lv_png.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/lv_qrcode.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/qrcode/qrcodegen.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/rlottie/lv_rlottie.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/lv_sjpg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgd.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/libs/sjpg/tjpgdcnf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/lv_extra.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/lv_extra.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/fragment/lv_fragment_manager.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/gridnav/lv_gridnav.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/ime/lv_ime_pinyin.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/imgfont/lv_imgfont.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/lv_others.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/lv_others.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/lv_others.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/lv_others.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/monkey/lv_monkey.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/msg/lv_msg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/others/snapshot/lv_snapshot.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/basic/lv_theme_basic.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/default/lv_theme_default.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/lv_themes.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/themes/mono/lv_theme_mono.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/animimg/lv_animimg.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_arrow.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/calendar/lv_calendar_header_dropdown.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/chart/lv_chart.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/colorwheel/lv_colorwheel.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/imgbtn/lv_imgbtn.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/keyboard/lv_keyboard.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/led/lv_led.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/list/lv_list.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/lv_widgets.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/menu/lv_menu.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/meter/lv_meter.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/msgbox/lv_msgbox.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/span/lv_span.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinbox/lv_spinbox.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/spinner/lv_spinner.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tabview/lv_tabview.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/tileview/lv_tileview.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/extra/widgets/win/lv_win.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/korean.ttf b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/korean.ttf similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/korean.ttf rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/korean.ttf diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_dejavu_16_persian_hebrew.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_fmt_txt.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_loader.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_loader.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_loader.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_loader.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_loader.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_10.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_12_subpx.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_14.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_18.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_20.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_22.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_24.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_26.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_28_compressed.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_30.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_32.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_34.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_36.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_38.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_40.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_42.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_44.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_46.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_48.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_montserrat_8.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_simsun_16_cjk.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_16.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_font_unscii_8.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/font/lv_symbol_def.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_disp.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_indev.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/hal/lv_hal_tick.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_api_map.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_api_map.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_api_map.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_api_map.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_conf_internal.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_conf_internal.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_internal.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lv_conf_kconfig.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lvgl.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lvgl.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/lvgl.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/lvgl.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_anim_timeline.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_area.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_area.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_area.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_area.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_area.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_assert.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_assert.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_assert.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_assert.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_async.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_async.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_async.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_async.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_async.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_bidi.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_bidi.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_bidi.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_bidi.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_bidi.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_color.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_color.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_color.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_color.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_color.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_fs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_fs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_fs.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_fs.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_fs.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_gc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_gc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_gc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_gc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_gc.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_ll.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_ll.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_ll.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_ll.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_ll.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_log.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_log.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_log.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_log.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_log.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_lru.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_lru.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_lru.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_lru.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_lru.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_math.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_math.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_math.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_math.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_math.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_mem.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_mem.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_mem.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_mem.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_mem.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_misc.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_misc.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_misc.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_misc.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_printf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_printf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_printf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_printf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_printf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_style_gen.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_templ.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_templ.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_templ.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_templ.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_templ.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_timer.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_timer.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_timer.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_timer.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_timer.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_tlsf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_txt_ap.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_types.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_types.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_types.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_types.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_utils.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_utils.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_utils.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/misc/lv_utils.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/misc/lv_utils.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_arc.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_arc.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_arc.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_bar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_bar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_bar.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_bar.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_bar.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btn.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btn.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btn.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btn.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btn.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_btnmatrix.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_canvas.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_checkbox.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_dropdown.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_img.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_img.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_img.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_img.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_img.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_label.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_label.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_label.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_label.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_label.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_line.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_line.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_line.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_objx_templ.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_roller.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_roller.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_roller.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_roller.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_roller.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_slider.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_slider.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_slider.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_slider.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_slider.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_switch.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_switch.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_switch.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_switch.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_switch.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_table.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_table.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_table.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_table.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_table.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_textarea.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/src/widgets/lv_widgets.mk diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/.gitignore b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/.gitignore similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/.gitignore rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/.gitignore diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/CMakeLists.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/CMakeLists.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/CMakeLists.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/CMakeLists.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/README.md b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/README.md similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/README.md rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/README.md diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/__makefile__/Makefile b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/__makefile__/Makefile rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/Makefile diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/__makefile__/test.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/test.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/__makefile__/test.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/__makefile__/test.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/config.yml b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/config.yml similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/config.yml rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/config.yml diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/main.py b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/main.py similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/main.py rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/main.py diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/dropdown_2.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/scr1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/ref_imgs/table_1.png diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_conf.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_helpers.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_indev.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_init.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_init.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_init.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/lv_test_init.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/lv_test_init.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/_test_template.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_arc.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_bar.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_checkbox.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_config.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_stress.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_demo_widgets.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_dropdown.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_event.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_font_loader.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_fs.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_line.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_mem.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_obj_tree.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_slider.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_snapshot.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_style.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_switch.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_table.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_textarea.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_cases/test_txt.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_files/readtest.txt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_1.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_2.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/src/test_fonts/font_3.fnt diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/generate_test_runner.rb diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/run_test.erb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/run_test.erb similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/run_test.erb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/run_test.erb diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/type_sanitizer.rb diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_internals.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_internals.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_internals.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_internals.h diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_support.c b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.c similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_support.c rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.c diff --git a/src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_support.h b/src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.h similarity index 100% rename from src/W800 SDK v1.00.08/lvgl/lvgl_v8.3/tests/unity/unity_support.h rename to src/W800_SDK_v1.00.10/lvgl/lvgl_v8.3/tests/unity/unity_support.h diff --git a/src/W800 SDK v1.00.08/platform/arch/Makefile b/src/W800_SDK_v1.00.10/platform/arch/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/Makefile rename to src/W800_SDK_v1.00.10/platform/arch/Makefile diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/Makefile b/src/W800_SDK_v1.00.10/platform/arch/xt804/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/Makefile rename to src/W800_SDK_v1.00.10/platform/arch/xt804/Makefile diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/Makefile b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/Makefile rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/Makefile diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/board_init.c b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/board_init.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/board_init.c rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/board_init.c diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/isr.c b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/isr.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/isr.c rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/isr.c diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/startup.S b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/startup.S similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/startup.S rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/startup.S diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/system.c b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/system.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/system.c rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/system.c diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/trap_c.c b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/trap_c.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/trap_c.c rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/trap_c.c diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/bsp/vectors.S b/src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/vectors.S similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/bsp/vectors.S rename to src/W800_SDK_v1.00.10/platform/arch/xt804/bsp/vectors.S diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/libc/Makefile b/src/W800_SDK_v1.00.10/platform/arch/xt804/libc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/libc/Makefile rename to src/W800_SDK_v1.00.10/platform/arch/xt804/libc/Makefile diff --git a/src/W800 SDK v1.00.08/platform/arch/xt804/libc/libc_port.c b/src/W800_SDK_v1.00.10/platform/arch/xt804/libc/libc_port.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/arch/xt804/libc/libc_port.c rename to src/W800_SDK_v1.00.10/platform/arch/xt804/libc/libc_port.c diff --git a/src/W800 SDK v1.00.08/platform/common/Makefile b/src/W800_SDK_v1.00.10/platform/common/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/Makefile rename to src/W800_SDK_v1.00.10/platform/common/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/crypto/Makefile b/src/W800_SDK_v1.00.10/platform/common/crypto/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/crypto/Makefile rename to src/W800_SDK_v1.00.10/platform/common/crypto/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/crypto/wm_crypto_hard.c b/src/W800_SDK_v1.00.10/platform/common/crypto/wm_crypto_hard.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/crypto/wm_crypto_hard.c rename to src/W800_SDK_v1.00.10/platform/common/crypto/wm_crypto_hard.c diff --git a/src/W800 SDK v1.00.08/platform/common/crypto/wm_crypto_hard_mbed.c b/src/W800_SDK_v1.00.10/platform/common/crypto/wm_crypto_hard_mbed.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/crypto/wm_crypto_hard_mbed.c rename to src/W800_SDK_v1.00.10/platform/common/crypto/wm_crypto_hard_mbed.c diff --git a/src/W800 SDK v1.00.08/platform/common/fwup/Makefile b/src/W800_SDK_v1.00.10/platform/common/fwup/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/fwup/Makefile rename to src/W800_SDK_v1.00.10/platform/common/fwup/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/fwup/wm_fwup.c b/src/W800_SDK_v1.00.10/platform/common/fwup/wm_fwup.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/fwup/wm_fwup.c rename to src/W800_SDK_v1.00.10/platform/common/fwup/wm_fwup.c diff --git a/src/W800 SDK v1.00.08/platform/common/mem/Makefile b/src/W800_SDK_v1.00.10/platform/common/mem/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/mem/Makefile rename to src/W800_SDK_v1.00.10/platform/common/mem/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/mem/wm_mem.c b/src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/mem/wm_mem.c rename to src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c diff --git a/src/W800 SDK v1.00.08/platform/common/params/Makefile b/src/W800_SDK_v1.00.10/platform/common/params/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/params/Makefile rename to src/W800_SDK_v1.00.10/platform/common/params/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/params/wm_param.c b/src/W800_SDK_v1.00.10/platform/common/params/wm_param.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/params/wm_param.c rename to src/W800_SDK_v1.00.10/platform/common/params/wm_param.c diff --git a/src/W800 SDK v1.00.08/platform/common/params/wm_param.h b/src/W800_SDK_v1.00.10/platform/common/params/wm_param.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/params/wm_param.h rename to src/W800_SDK_v1.00.10/platform/common/params/wm_param.h diff --git a/src/W800 SDK v1.00.08/platform/common/task/Makefile b/src/W800_SDK_v1.00.10/platform/common/task/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/task/Makefile rename to src/W800_SDK_v1.00.10/platform/common/task/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/task/wm_wl_mbox.c b/src/W800_SDK_v1.00.10/platform/common/task/wm_wl_mbox.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/task/wm_wl_mbox.c rename to src/W800_SDK_v1.00.10/platform/common/task/wm_wl_mbox.c diff --git a/src/W800 SDK v1.00.08/platform/common/task/wm_wl_task.c b/src/W800_SDK_v1.00.10/platform/common/task/wm_wl_task.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/task/wm_wl_task.c rename to src/W800_SDK_v1.00.10/platform/common/task/wm_wl_task.c diff --git a/src/W800 SDK v1.00.08/platform/common/task/wm_wl_timers.c b/src/W800_SDK_v1.00.10/platform/common/task/wm_wl_timers.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/task/wm_wl_timers.c rename to src/W800_SDK_v1.00.10/platform/common/task/wm_wl_timers.c diff --git a/src/W800 SDK v1.00.08/platform/common/utils/Makefile b/src/W800_SDK_v1.00.10/platform/common/utils/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/utils/Makefile rename to src/W800_SDK_v1.00.10/platform/common/utils/Makefile diff --git a/src/W800 SDK v1.00.08/platform/common/utils/utils.c b/src/W800_SDK_v1.00.10/platform/common/utils/utils.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/common/utils/utils.c rename to src/W800_SDK_v1.00.10/platform/common/utils/utils.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/7816/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/7816/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/7816/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/7816/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/7816/wm_7816.c b/src/W800_SDK_v1.00.10/platform/drivers/7816/wm_7816.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/7816/wm_7816.c rename to src/W800_SDK_v1.00.10/platform/drivers/7816/wm_7816.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/adc/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/adc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/adc/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/adc/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/adc/wm_adc.c b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/adc/wm_adc.c rename to src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/adc/wm_polyfit.c b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_polyfit.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/adc/wm_polyfit.c rename to src/W800_SDK_v1.00.10/platform/drivers/adc/wm_polyfit.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/cpu/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/cpu/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/cpu/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/cpu/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/cpu/wm_cpu.c b/src/W800_SDK_v1.00.10/platform/drivers/cpu/wm_cpu.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/cpu/wm_cpu.c rename to src/W800_SDK_v1.00.10/platform/drivers/cpu/wm_cpu.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/dma/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/dma/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/dma/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/dma/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/dma/wm_dma.c b/src/W800_SDK_v1.00.10/platform/drivers/dma/wm_dma.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/dma/wm_dma.c rename to src/W800_SDK_v1.00.10/platform/drivers/dma/wm_dma.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/efuse/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/efuse/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/efuse/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/efuse/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/efuse/wm_efuse.c b/src/W800_SDK_v1.00.10/platform/drivers/efuse/wm_efuse.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/efuse/wm_efuse.c rename to src/W800_SDK_v1.00.10/platform/drivers/efuse/wm_efuse.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/flash/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/flash/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/flash/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/flash/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/flash/wm_fls.c b/src/W800_SDK_v1.00.10/platform/drivers/flash/wm_fls.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/flash/wm_fls.c rename to src/W800_SDK_v1.00.10/platform/drivers/flash/wm_fls.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/flash/wm_fls_gd25qxx.c b/src/W800_SDK_v1.00.10/platform/drivers/flash/wm_fls_gd25qxx.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/flash/wm_fls_gd25qxx.c rename to src/W800_SDK_v1.00.10/platform/drivers/flash/wm_fls_gd25qxx.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/gpio/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/gpio/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/gpio/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/gpio/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/gpio/wm_gpio.c b/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/gpio/wm_gpio.c rename to src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/gpio/wm_gpio_afsel.c b/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/gpio/wm_gpio_afsel.c rename to src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/hspi/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/hspi/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/hspi/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/hspi/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/hspi/wm_hspi.c b/src/W800_SDK_v1.00.10/platform/drivers/hspi/wm_hspi.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/hspi/wm_hspi.c rename to src/W800_SDK_v1.00.10/platform/drivers/hspi/wm_hspi.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/i2c/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/i2c/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/i2c/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/i2c/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/i2c/wm_i2c.c b/src/W800_SDK_v1.00.10/platform/drivers/i2c/wm_i2c.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/i2c/wm_i2c.c rename to src/W800_SDK_v1.00.10/platform/drivers/i2c/wm_i2c.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/i2s/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/i2s/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/i2s/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/i2s/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/i2s/wm_i2s.c b/src/W800_SDK_v1.00.10/platform/drivers/i2s/wm_i2s.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/i2s/wm_i2s.c rename to src/W800_SDK_v1.00.10/platform/drivers/i2s/wm_i2s.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/internalflash/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/internalflash/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/internalflash/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/internalflash/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/internalflash/wm_internal_fls.c b/src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/internalflash/wm_internal_fls.c rename to src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/io/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/io/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/io/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/io/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/io/wm_io.c b/src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/io/wm_io.c rename to src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/irq/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/irq/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/irq/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/irq/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/irq/wm_irq.c b/src/W800_SDK_v1.00.10/platform/drivers/irq/wm_irq.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/irq/wm_irq.c rename to src/W800_SDK_v1.00.10/platform/drivers/irq/wm_irq.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/lcd/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/lcd/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/lcd/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/lcd/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/lcd/wm_lcd.c b/src/W800_SDK_v1.00.10/platform/drivers/lcd/wm_lcd.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/lcd/wm_lcd.c rename to src/W800_SDK_v1.00.10/platform/drivers/lcd/wm_lcd.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/pmu/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/pmu/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/pmu/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/pmu/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/pmu/wm_pmu.c b/src/W800_SDK_v1.00.10/platform/drivers/pmu/wm_pmu.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/pmu/wm_pmu.c rename to src/W800_SDK_v1.00.10/platform/drivers/pmu/wm_pmu.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/psram/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/psram/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/psram/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/psram/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/psram/wm_psram.c b/src/W800_SDK_v1.00.10/platform/drivers/psram/wm_psram.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/psram/wm_psram.c rename to src/W800_SDK_v1.00.10/platform/drivers/psram/wm_psram.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/pwm/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/pwm/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/pwm/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/pwm/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/pwm/wm_pwm.c b/src/W800_SDK_v1.00.10/platform/drivers/pwm/wm_pwm.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/pwm/wm_pwm.c rename to src/W800_SDK_v1.00.10/platform/drivers/pwm/wm_pwm.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/rtc/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/rtc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/rtc/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/rtc/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/rtc/wm_rtc.c b/src/W800_SDK_v1.00.10/platform/drivers/rtc/wm_rtc.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/rtc/wm_rtc.c rename to src/W800_SDK_v1.00.10/platform/drivers/rtc/wm_rtc.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/sasc/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/sasc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/sasc/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/sasc/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/sasc/wm_sasc.c b/src/W800_SDK_v1.00.10/platform/drivers/sasc/wm_sasc.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/sasc/wm_sasc.c rename to src/W800_SDK_v1.00.10/platform/drivers/sasc/wm_sasc.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/sdio_host/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/sdio_host/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/sdio_host/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/sdio_host/wm_sdio_host.c b/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/sdio_host/wm_sdio_host.c rename to src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/spi/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/spi/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/spi/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/spi/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/spi/wm_hostspi.c b/src/W800_SDK_v1.00.10/platform/drivers/spi/wm_hostspi.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/spi/wm_hostspi.c rename to src/W800_SDK_v1.00.10/platform/drivers/spi/wm_hostspi.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/spi/wm_spi_hal.h b/src/W800_SDK_v1.00.10/platform/drivers/spi/wm_spi_hal.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/spi/wm_spi_hal.h rename to src/W800_SDK_v1.00.10/platform/drivers/spi/wm_spi_hal.h diff --git a/src/W800 SDK v1.00.08/platform/drivers/timer/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/timer/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/timer/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/timer/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/timer/wm_timer.c b/src/W800_SDK_v1.00.10/platform/drivers/timer/wm_timer.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/timer/wm_timer.c rename to src/W800_SDK_v1.00.10/platform/drivers/timer/wm_timer.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/touchsensor/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/touchsensor/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/touchsensor/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/touchsensor/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/touchsensor/wm_touchsensor.c b/src/W800_SDK_v1.00.10/platform/drivers/touchsensor/wm_touchsensor.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/touchsensor/wm_touchsensor.c rename to src/W800_SDK_v1.00.10/platform/drivers/touchsensor/wm_touchsensor.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/uart/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/uart/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/uart/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/uart/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/uart/wm_uart.c b/src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/uart/wm_uart.c rename to src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c diff --git a/src/W800 SDK v1.00.08/platform/drivers/watchdog/Makefile b/src/W800_SDK_v1.00.10/platform/drivers/watchdog/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/watchdog/Makefile rename to src/W800_SDK_v1.00.10/platform/drivers/watchdog/Makefile diff --git a/src/W800 SDK v1.00.08/platform/drivers/watchdog/wm_watchdog.c b/src/W800_SDK_v1.00.10/platform/drivers/watchdog/wm_watchdog.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/drivers/watchdog/wm_watchdog.c rename to src/W800_SDK_v1.00.10/platform/drivers/watchdog/wm_watchdog.c diff --git a/src/W800 SDK v1.00.08/platform/inc/bitops.h b/src/W800_SDK_v1.00.10/platform/inc/bitops.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/bitops.h rename to src/W800_SDK_v1.00.10/platform/inc/bitops.h diff --git a/src/W800 SDK v1.00.08/platform/inc/common.h b/src/W800_SDK_v1.00.10/platform/inc/common.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/common.h rename to src/W800_SDK_v1.00.10/platform/inc/common.h diff --git a/src/W800 SDK v1.00.08/platform/inc/libtommath.h b/src/W800_SDK_v1.00.10/platform/inc/libtommath.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/libtommath.h rename to src/W800_SDK_v1.00.10/platform/inc/libtommath.h diff --git a/src/W800 SDK v1.00.08/platform/inc/md5.h b/src/W800_SDK_v1.00.10/platform/inc/md5.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/md5.h rename to src/W800_SDK_v1.00.10/platform/inc/md5.h diff --git a/src/W800 SDK v1.00.08/platform/inc/os.h b/src/W800_SDK_v1.00.10/platform/inc/os.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/os.h rename to src/W800_SDK_v1.00.10/platform/inc/os.h diff --git a/src/W800 SDK v1.00.08/platform/inc/rc4.h b/src/W800_SDK_v1.00.10/platform/inc/rc4.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/rc4.h rename to src/W800_SDK_v1.00.10/platform/inc/rc4.h diff --git a/src/W800 SDK v1.00.08/platform/inc/sha1.h b/src/W800_SDK_v1.00.10/platform/inc/sha1.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/sha1.h rename to src/W800_SDK_v1.00.10/platform/inc/sha1.h diff --git a/src/W800 SDK v1.00.08/platform/inc/sha256.h b/src/W800_SDK_v1.00.10/platform/inc/sha256.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/sha256.h rename to src/W800_SDK_v1.00.10/platform/inc/sha256.h diff --git a/src/W800 SDK v1.00.08/platform/inc/tls_common.h b/src/W800_SDK_v1.00.10/platform/inc/tls_common.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/tls_common.h rename to src/W800_SDK_v1.00.10/platform/inc/tls_common.h diff --git a/src/W800 SDK v1.00.08/platform/inc/tls_ieee80211.h b/src/W800_SDK_v1.00.10/platform/inc/tls_ieee80211.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/tls_ieee80211.h rename to src/W800_SDK_v1.00.10/platform/inc/tls_ieee80211.h diff --git a/src/W800 SDK v1.00.08/platform/inc/tls_wireless.h b/src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/tls_wireless.h rename to src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h diff --git a/src/W800 SDK v1.00.08/platform/inc/utils.h b/src/W800_SDK_v1.00.10/platform/inc/utils.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/utils.h rename to src/W800_SDK_v1.00.10/platform/inc/utils.h diff --git a/src/W800 SDK v1.00.08/platform/inc/wm_dbg.h b/src/W800_SDK_v1.00.10/platform/inc/wm_dbg.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/inc/wm_dbg.h rename to src/W800_SDK_v1.00.10/platform/inc/wm_dbg.h diff --git a/src/W800 SDK v1.00.08/platform/sys/Makefile b/src/W800_SDK_v1.00.10/platform/sys/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/platform/sys/Makefile rename to src/W800_SDK_v1.00.10/platform/sys/Makefile diff --git a/src/W800 SDK v1.00.08/platform/sys/tls_sys.c b/src/W800_SDK_v1.00.10/platform/sys/tls_sys.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/sys/tls_sys.c rename to src/W800_SDK_v1.00.10/platform/sys/tls_sys.c diff --git a/src/W800 SDK v1.00.08/platform/sys/tls_sys.h b/src/W800_SDK_v1.00.10/platform/sys/tls_sys.h similarity index 100% rename from src/W800 SDK v1.00.08/platform/sys/tls_sys.h rename to src/W800_SDK_v1.00.10/platform/sys/tls_sys.h diff --git a/src/W800 SDK v1.00.08/platform/sys/wm_main.c b/src/W800_SDK_v1.00.10/platform/sys/wm_main.c similarity index 100% rename from src/W800 SDK v1.00.08/platform/sys/wm_main.c rename to src/W800_SDK_v1.00.10/platform/sys/wm_main.c diff --git a/src/W800 SDK v1.00.08/src/app/Makefile b/src/W800_SDK_v1.00.10/src/app/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/Makefile rename to src/W800_SDK_v1.00.10/src/app/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/Makefile b/src/W800_SDK_v1.00.10/src/app/bleapp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/Makefile rename to src/W800_SDK_v1.00.10/src/app/bleapp/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_demo.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_demo.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_demo.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_demo.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_multi_conn_demo.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_multi_conn_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_multi_conn_demo.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_multi_conn_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_multi_conn_demo.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_multi_conn_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_api_multi_conn_demo.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_api_multi_conn_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_peer_manager.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_peer_manager.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_peer_manager.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_peer_manager.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_util.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_util.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_util.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_util.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_client_util.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_client_util.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_gap.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_gap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_gap.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_gap.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_gap.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_gap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_gap.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_gap.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_level_server.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_level_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_level_server.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_level_server.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_level_server.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_level_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_level_server.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_level_server.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_client.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_client.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_client.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_client.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_client.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_client.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_server.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_server.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_server.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_server.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_gen_onoff_server.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_gen_onoff_server.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_health_server.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_health_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_health_server.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_health_server.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_health_server.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_health_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_health_server.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_health_server.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_light_model.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_light_model.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_light_model.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_light_model.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_light_model.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_light_model.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_light_model.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_light_model.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_node_demo.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_node_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_node_demo.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_node_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_node_demo.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_node_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_node_demo.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_node_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_vnd_model.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_vnd_model.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_vnd_model.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_vnd_model.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_vnd_model.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_vnd_model.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_mesh_vnd_model.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_mesh_vnd_model.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_api_demo.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_api_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_api_demo.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_api_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_api_demo.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_api_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_api_demo.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_api_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_app.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_app.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_app.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_app.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_prof.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_prof.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_prof.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_prof.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_prof.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_prof.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_server_wifi_prof.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_prof.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_uart_if.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_uart_if.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_uart_if.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_ble_uart_if.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_app.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_app.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_app.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_app.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_app.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_app.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_app.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_app.h diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_util.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_util.c rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_util.c diff --git a/src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_util.h b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/bleapp/wm_bt_util.h rename to src/W800_SDK_v1.00.10/src/app/bleapp/wm_bt_util.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/Makefile b/src/W800_SDK_v1.00.10/src/app/btapp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/Makefile rename to src/W800_SDK_v1.00.10/src/app/btapp/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_audio_sink.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_audio_sink.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_audio_sink.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_audio_sink.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_audio_sink.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_audio_sink.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_audio_sink.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_audio_sink.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_demo.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_demo.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_demo.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_demo.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_multi_conn_demo.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_multi_conn_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_multi_conn_demo.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_multi_conn_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_multi_conn_demo.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_multi_conn_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_api_multi_conn_demo.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_api_multi_conn_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_demo.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_demo.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_demo.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_client_demo.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_client_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_dm_api.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_dm_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_dm_api.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_dm_api.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_gap.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_gap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_gap.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_gap.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_gap.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_gap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_gap.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_gap.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_api_demo.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_api_demo.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_api_demo.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_api_demo.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_api_demo.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_api_demo.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_api_demo.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_api_demo.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_demo_prof.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_demo_prof.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_demo_prof.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_demo_prof.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_demo_prof.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_demo_prof.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_demo_prof.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_demo_prof.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_app.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_app.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_app.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_app.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_app.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_app.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_app.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_app.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_prof.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_prof.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_prof.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_prof.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_prof.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_prof.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_server_wifi_prof.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_server_wifi_prof.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_uart_if.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_uart_if.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_uart_if.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_uart_if.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_ble_uart_if.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_uart_if.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_ble_uart_if.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_ble_uart_if.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_app.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_app.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_app.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_app.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_app.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_app.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_app.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_app.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_client.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_client.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_client.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_client.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_client.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_client.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_server.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_server.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_server.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_server.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_spp_server.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_spp_server.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_util.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_util.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_util.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_bt_util.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_bt_util.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_bt_util.h diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_hfp_hsp_client.c b/src/W800_SDK_v1.00.10/src/app/btapp/wm_hfp_hsp_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_hfp_hsp_client.c rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_hfp_hsp_client.c diff --git a/src/W800 SDK v1.00.08/src/app/btapp/wm_hfp_hsp_client.h b/src/W800_SDK_v1.00.10/src/app/btapp/wm_hfp_hsp_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/btapp/wm_hfp_hsp_client.h rename to src/W800_SDK_v1.00.10/src/app/btapp/wm_hfp_hsp_client.h diff --git a/src/W800 SDK v1.00.08/src/app/cJSON/Makefile b/src/W800_SDK_v1.00.10/src/app/cJSON/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/cJSON/Makefile rename to src/W800_SDK_v1.00.10/src/app/cJSON/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/cJSON/cJSON.c b/src/W800_SDK_v1.00.10/src/app/cJSON/cJSON.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/cJSON/cJSON.c rename to src/W800_SDK_v1.00.10/src/app/cJSON/cJSON.c diff --git a/src/W800 SDK v1.00.08/src/app/cJSON/cJSON.h b/src/W800_SDK_v1.00.10/src/app/cJSON/cJSON.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/cJSON/cJSON.h rename to src/W800_SDK_v1.00.10/src/app/cJSON/cJSON.h diff --git a/src/W800 SDK v1.00.08/src/app/dhcpserver/Makefile b/src/W800_SDK_v1.00.10/src/app/dhcpserver/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dhcpserver/Makefile rename to src/W800_SDK_v1.00.10/src/app/dhcpserver/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/dhcpserver/dhcp_server.c b/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dhcpserver/dhcp_server.c rename to src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c diff --git a/src/W800 SDK v1.00.08/src/app/dhcpserver/dhcp_server.h b/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dhcpserver/dhcp_server.h rename to src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.h diff --git a/src/W800 SDK v1.00.08/src/app/dnsserver/Makefile b/src/W800_SDK_v1.00.10/src/app/dnsserver/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dnsserver/Makefile rename to src/W800_SDK_v1.00.10/src/app/dnsserver/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/dnsserver/dns_server.c b/src/W800_SDK_v1.00.10/src/app/dnsserver/dns_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dnsserver/dns_server.c rename to src/W800_SDK_v1.00.10/src/app/dnsserver/dns_server.c diff --git a/src/W800 SDK v1.00.08/src/app/dnsserver/dns_server.h b/src/W800_SDK_v1.00.10/src/app/dnsserver/dns_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/dnsserver/dns_server.h rename to src/W800_SDK_v1.00.10/src/app/dnsserver/dns_server.h diff --git a/src/W800 SDK v1.00.08/src/app/factorycmd/Makefile b/src/W800_SDK_v1.00.10/src/app/factorycmd/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/factorycmd/Makefile rename to src/W800_SDK_v1.00.10/src/app/factorycmd/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/factorycmd/factory_atcmd.c b/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/factorycmd/factory_atcmd.c rename to src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c diff --git a/src/W800 SDK v1.00.08/src/app/factorycmd/factory_atcmd.h b/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/factorycmd/factory_atcmd.h rename to src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.h diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/LICENSE.txt b/src/W800_SDK_v1.00.10/src/app/fatfs/LICENSE.txt similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/LICENSE.txt rename to src/W800_SDK_v1.00.10/src/app/fatfs/LICENSE.txt diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/Makefile b/src/W800_SDK_v1.00.10/src/app/fatfs/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/Makefile rename to src/W800_SDK_v1.00.10/src/app/fatfs/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/diskio.c b/src/W800_SDK_v1.00.10/src/app/fatfs/diskio.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/diskio.c rename to src/W800_SDK_v1.00.10/src/app/fatfs/diskio.c diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/diskio.h b/src/W800_SDK_v1.00.10/src/app/fatfs/diskio.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/diskio.h rename to src/W800_SDK_v1.00.10/src/app/fatfs/diskio.h diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/ff.c b/src/W800_SDK_v1.00.10/src/app/fatfs/ff.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/ff.c rename to src/W800_SDK_v1.00.10/src/app/fatfs/ff.c diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/ff.h b/src/W800_SDK_v1.00.10/src/app/fatfs/ff.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/ff.h rename to src/W800_SDK_v1.00.10/src/app/fatfs/ff.h diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/ffconf.h b/src/W800_SDK_v1.00.10/src/app/fatfs/ffconf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/ffconf.h rename to src/W800_SDK_v1.00.10/src/app/fatfs/ffconf.h diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/ffsystem.c b/src/W800_SDK_v1.00.10/src/app/fatfs/ffsystem.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/ffsystem.c rename to src/W800_SDK_v1.00.10/src/app/fatfs/ffsystem.c diff --git a/src/W800 SDK v1.00.08/src/app/fatfs/ffunicode.c b/src/W800_SDK_v1.00.10/src/app/fatfs/ffunicode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/fatfs/ffunicode.c rename to src/W800_SDK_v1.00.10/src/app/fatfs/ffunicode.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClient.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClient.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClient.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClient.h rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.h diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientAuth.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientAuth.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientAuth.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientAuth.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientAuth.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientAuth.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientAuth.h rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientAuth.h diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientCommon.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientCommon.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientCommon.h rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientCommon.h diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientString.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientString.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientString.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientString.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientString.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientString.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientString.h rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientString.h diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientWrapper.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientWrapper.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientWrapper.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/HTTPClientWrapper.h rename to src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/Makefile b/src/W800_SDK_v1.00.10/src/app/httpclient/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/Makefile rename to src/W800_SDK_v1.00.10/src/app/httpclient/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/wm_httpclient_if.c b/src/W800_SDK_v1.00.10/src/app/httpclient/wm_httpclient_if.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/wm_httpclient_if.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/wm_httpclient_if.c diff --git a/src/W800 SDK v1.00.08/src/app/httpclient/wm_httpclient_task.c b/src/W800_SDK_v1.00.10/src/app/httpclient/wm_httpclient_task.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/httpclient/wm_httpclient_task.c rename to src/W800_SDK_v1.00.10/src/app/httpclient/wm_httpclient_task.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/Makefile b/src/W800_SDK_v1.00.10/src/app/iperf/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/Makefile rename to src/W800_SDK_v1.00.10/src/app/iperf/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/iperf/config.h b/src/W800_SDK_v1.00.10/src/app/iperf/config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/config.h rename to src/W800_SDK_v1.00.10/src/app/iperf/config.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_api.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_api.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_api.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_api.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_client_api.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_client_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_client_api.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_client_api.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_client_api.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_client_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_client_api.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_client_api.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_error.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_error.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_error.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_error.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_error.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_error.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_error.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_error.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_locale.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_locale.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_locale.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_locale.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_locale.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_locale.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_locale.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_locale.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_main.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_main.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_main.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_net.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_net.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_net.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_net.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_net.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_net.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_net.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_net.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_queue.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_queue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_queue.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_queue.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_server_api.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_server_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_server_api.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_server_api.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_server_api.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_server_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_server_api.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_server_api.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_tcp.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_tcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_tcp.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_tcp.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_tcp.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_tcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_tcp.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_tcp.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_timer.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_timer.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_timer.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_timer.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_timer.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_timer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_timer.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_timer.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_udp.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_udp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_udp.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_udp.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_udp.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_udp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_udp.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_udp.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_units.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_units.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_units.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_units.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_units.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_units.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_units.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_units.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_util.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_util.c rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_util.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/iperf_util.h b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/iperf_util.h rename to src/W800_SDK_v1.00.10/src/app/iperf/iperf_util.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/tcp_info.c b/src/W800_SDK_v1.00.10/src/app/iperf/tcp_info.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/tcp_info.c rename to src/W800_SDK_v1.00.10/src/app/iperf/tcp_info.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/tcp_window_size.c b/src/W800_SDK_v1.00.10/src/app/iperf/tcp_window_size.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/tcp_window_size.c rename to src/W800_SDK_v1.00.10/src/app/iperf/tcp_window_size.c diff --git a/src/W800 SDK v1.00.08/src/app/iperf/tcp_window_size.h b/src/W800_SDK_v1.00.10/src/app/iperf/tcp_window_size.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/tcp_window_size.h rename to src/W800_SDK_v1.00.10/src/app/iperf/tcp_window_size.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/version.h b/src/W800_SDK_v1.00.10/src/app/iperf/version.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/version.h rename to src/W800_SDK_v1.00.10/src/app/iperf/version.h diff --git a/src/W800 SDK v1.00.08/src/app/iperf/wm_perf.c b/src/W800_SDK_v1.00.10/src/app/iperf/wm_perf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/iperf/wm_perf.c rename to src/W800_SDK_v1.00.10/src/app/iperf/wm_perf.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/Makefile b/src/W800_SDK_v1.00.10/src/app/libcoap/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/Makefile rename to src/W800_SDK_v1.00.10/src/app/libcoap/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/address.c b/src/W800_SDK_v1.00.10/src/app/libcoap/address.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/address.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/address.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/async.c b/src/W800_SDK_v1.00.10/src/app/libcoap/async.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/async.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/async.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/block.c b/src/W800_SDK_v1.00.10/src/app/libcoap/block.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/block.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/block.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/coap_io.c b/src/W800_SDK_v1.00.10/src/app/libcoap/coap_io.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/coap_io.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/coap_io.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/coap_io_lwip.c b/src/W800_SDK_v1.00.10/src/app/libcoap/coap_io_lwip.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/coap_io_lwip.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/coap_io_lwip.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/coap_time.c b/src/W800_SDK_v1.00.10/src/app/libcoap/coap_time.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/coap_time.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/coap_time.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/debug.c b/src/W800_SDK_v1.00.10/src/app/libcoap/debug.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/debug.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/debug.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/encode.c b/src/W800_SDK_v1.00.10/src/app/libcoap/encode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/encode.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/encode.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/hashkey.c b/src/W800_SDK_v1.00.10/src/app/libcoap/hashkey.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/hashkey.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/hashkey.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/address.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/address.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/address.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/address.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/async.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/async.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/async.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/async.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/bits.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/bits.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/bits.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/bits.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/block.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/block.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/block.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/block.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/coap.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/coap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/coap.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/coap.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/coap_config.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/coap_config.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_config.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/coap_io.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_io.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/coap_io.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_io.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/coap_time.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_time.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/coap_time.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/coap_time.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/debug_libcoap.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/debug_libcoap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/debug_libcoap.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/debug_libcoap.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/encode.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/encode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/encode.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/encode.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/hashkey.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/hashkey.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/hashkey.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/hashkey.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/libcoap.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/libcoap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/libcoap.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/libcoap.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/lwippools.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/lwippools.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/lwippools.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/lwippools.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/mem.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/mem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/mem.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/mem.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/mem_libcoap.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/mem_libcoap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/mem_libcoap.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/mem_libcoap.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/net.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/net.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/net.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/net.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/option.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/option.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/option.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/option.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/pdu.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/pdu.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/pdu.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/pdu.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/prng.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/prng.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/prng.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/prng.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/resource.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/resource.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/resource.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/resource.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/str.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/str.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/str.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/str.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/subscribe.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/subscribe.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/subscribe.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/subscribe.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/uri.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/uri.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/uri.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/uri.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/uthash.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/uthash.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/uthash.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/uthash.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/include/utlist.h b/src/W800_SDK_v1.00.10/src/app/libcoap/include/utlist.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/include/utlist.h rename to src/W800_SDK_v1.00.10/src/app/libcoap/include/utlist.h diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/mem_libcoap.c b/src/W800_SDK_v1.00.10/src/app/libcoap/mem_libcoap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/mem_libcoap.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/mem_libcoap.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/net.c b/src/W800_SDK_v1.00.10/src/app/libcoap/net.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/net.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/net.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/option.c b/src/W800_SDK_v1.00.10/src/app/libcoap/option.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/option.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/option.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/pdu.c b/src/W800_SDK_v1.00.10/src/app/libcoap/pdu.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/pdu.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/pdu.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/resource.c b/src/W800_SDK_v1.00.10/src/app/libcoap/resource.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/resource.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/resource.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/str.c b/src/W800_SDK_v1.00.10/src/app/libcoap/str.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/str.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/str.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/subscribe.c b/src/W800_SDK_v1.00.10/src/app/libcoap/subscribe.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/subscribe.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/subscribe.c diff --git a/src/W800 SDK v1.00.08/src/app/libcoap/uri_libcoap.c b/src/W800_SDK_v1.00.10/src/app/libcoap/uri_libcoap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libcoap/uri_libcoap.c rename to src/W800_SDK_v1.00.10/src/app/libcoap/uri_libcoap.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/Makefile b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/Makefile rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/alloc.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/alloc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/alloc.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/alloc.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/base64-decode.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/base64-decode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/base64-decode.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/base64-decode.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client-handshake.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client-handshake.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client-handshake.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client-handshake.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client-parser.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client-parser.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client-parser.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client-parser.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/client.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/client.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/context.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/context.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/context.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/context.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/daemonize.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/daemonize.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/daemonize.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/daemonize.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension-permessage-deflate.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/extension.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/extension.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/getifaddrs.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/getifaddrs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/getifaddrs.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/getifaddrs.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/getifaddrs.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/getifaddrs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/getifaddrs.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/getifaddrs.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/handshake.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/handshake.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/handshake.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/handshake.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/header.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/header.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/header.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/header.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/hpack.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/hpack.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/hpack.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/hpack.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/http2.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/http2.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/http2.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/http2.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/huftable.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/huftable.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/huftable.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/huftable.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp-conf.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp-conf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp-conf.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp-conf.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lejp.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lejp.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lextable-strings.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lextable-strings.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lextable-strings.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lextable-strings.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lextable.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lextable.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lextable.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lextable.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libev.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libev.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libev.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libev.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libuv.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libuv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libuv.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libuv.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libwebsockets.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libwebsockets.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libwebsockets.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libwebsockets.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libwebsockets.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libwebsockets.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/libwebsockets.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/libwebsockets.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws-plat-wm.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws-plat-wm.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws_config.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws_config.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws_config.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws_config_private.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws_config_private.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/lws_config_private.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws_config_private.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/minihuf.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/minihuf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/minihuf.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/minihuf.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/minilex.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/minilex.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/minilex.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/minilex.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/output.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/output.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/output.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/output.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/parsers.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/parsers.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/parsers.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/parsers.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/pollfd.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/pollfd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/pollfd.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/pollfd.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/private-libwebsockets.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/private-libwebsockets.h rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/rewrite.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/rewrite.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/rewrite.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/rewrite.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/server-handshake.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/server-handshake.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/server-handshake.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/server-handshake.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/server.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/server.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/server.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/service.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/service.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/service.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/service.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/sha-1.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/sha-1.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/sha-1.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/sha-1.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/smtp.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/smtp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/smtp.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/smtp.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-client.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-client.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-client.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-http2.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-http2.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-http2.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-http2.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-server.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl-server.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl-server.c diff --git a/src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/libwebsockets-2.1-stable/ssl.c rename to src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/ssl.c diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/Makefile b/src/W800_SDK_v1.00.10/src/app/mDNS/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/Makefile rename to src/W800_SDK_v1.00.10/src/app/mDNS/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/APSCommonServices.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/APSCommonServices.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/APSCommonServices.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/APSCommonServices.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/Makefile b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/Makefile rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNS.c b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNS.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNS.c rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNS.c diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNS.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNS.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNS.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNS.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSClientAPI.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSClientAPI.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSClientAPI.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSClientAPI.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSDebug.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSDebug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSDebug.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSDebug.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSEmbeddedAPI.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSCore/mDNSPlatformFunctions.h diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/Makefile b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/Makefile rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/mDNSPosix.c b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/mDNSPosix.c rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c diff --git a/src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/mDNSPosix.h b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mDNS/mDNSPosix/mDNSPosix.h rename to src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/Makefile b/src/W800_SDK_v1.00.10/src/app/mbedtls/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/Makefile rename to src/W800_SDK_v1.00.10/src/app/mbedtls/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/aes.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/aes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/aes.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/aes.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/aesni.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/aesni.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/aesni.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/aesni.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/arc4.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/arc4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/arc4.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/arc4.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/asn1.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/asn1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/asn1.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/asn1.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/asn1write.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/asn1write.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/asn1write.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/asn1write.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/base64.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/base64.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/base64.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/base64.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/bignum.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/bignum.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/bignum.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/bignum.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/blowfish.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/blowfish.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/blowfish.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/blowfish.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/bn_mul.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/bn_mul.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/bn_mul.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/bn_mul.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/camellia.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/camellia.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/camellia.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/camellia.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ccm.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ccm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ccm.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ccm.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/certs.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/certs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/certs.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/certs.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/check_config.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/check_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/check_config.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/check_config.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cipher.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cipher.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cipher.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cipher.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cipher_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cipher_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cipher_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cipher_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cmac.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cmac.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/cmac.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/cmac.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/compat-1.3.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/compat-1.3.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/compat-1.3.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/compat-1.3.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/config.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/config.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ctr_drbg.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ctr_drbg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ctr_drbg.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ctr_drbg.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/debug.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/debug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/debug.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/debug.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/des.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/des.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/des.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/des.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/dhm.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/dhm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/dhm.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/dhm.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecdh.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecdh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecdh.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecdh.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecdsa.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecdsa.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecdsa.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecdsa.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecjpake.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecjpake.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecjpake.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecjpake.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecp.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecp.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecp.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecp_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecp_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ecp_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ecp_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/entropy.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/entropy.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/entropy.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/entropy.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/entropy_poll.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/entropy_poll.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/entropy_poll.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/entropy_poll.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/error.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/error.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/error.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/error.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/gcm.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/gcm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/gcm.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/gcm.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/havege.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/havege.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/havege.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/havege.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/hmac_drbg.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/hmac_drbg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/hmac_drbg.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/hmac_drbg.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md2.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md2.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md2.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md2.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md4.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md4.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md4.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md5.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md5.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md5.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md5.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/md_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/md_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/memory_buffer_alloc.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/memory_buffer_alloc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/memory_buffer_alloc.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/memory_buffer_alloc.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/net.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/net.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/net.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/net.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/net_sockets.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/net_sockets.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/net_sockets.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/net_sockets.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/oid.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/oid.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/oid.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/oid.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/padlock.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/padlock.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/padlock.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/padlock.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pem.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pem.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pem.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pk.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pk.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pk.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pk.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pk_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pk_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pk_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pk_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs11.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs11.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs11.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs11.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs12.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs12.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs12.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs12.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs5.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs5.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/pkcs5.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/pkcs5.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/platform.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/platform.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/platform.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/platform.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/platform_time.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/platform_time.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/platform_time.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/platform_time.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ripemd160.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ripemd160.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ripemd160.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ripemd160.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/rsa.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/rsa.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/rsa.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/rsa.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/rsa_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/rsa_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/rsa_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/rsa_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha1.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha1.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha1.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha256.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha256.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha256.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha256.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha512.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha512.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/sha512.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/sha512.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_cache.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_cache.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_cache.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_cache.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_ciphersuites.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_ciphersuites.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_ciphersuites.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_ciphersuites.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_cookie.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_cookie.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_cookie.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_cookie.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_internal.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_internal.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_internal.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_ticket.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_ticket.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/ssl_ticket.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/ssl_ticket.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/threading.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/threading.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/threading.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/threading.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/timing.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/timing.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/timing.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/timing.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/version.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/version.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/version.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/version.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_crl.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_crl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_crl.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_crl.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_crt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_crt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_crt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_crt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_csr.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_csr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/x509_csr.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/x509_csr.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/xtea.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/xtea.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/include/mbedtls/xtea.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/xtea.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/Makefile b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/Makefile rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/aes.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/aes.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/aes.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/aes.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/aesni.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/aesni.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/aesni.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/aesni.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/arc4.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/arc4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/arc4.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/arc4.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/asn1parse.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/asn1parse.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/asn1parse.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/asn1parse.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/asn1write.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/asn1write.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/asn1write.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/asn1write.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/base64.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/base64.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/base64.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/base64.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/bignum.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/bignum.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/bignum.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/bignum.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/blowfish.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/blowfish.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/blowfish.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/blowfish.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/camellia.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/camellia.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/camellia.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/camellia.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ccm.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ccm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ccm.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ccm.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/certs.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/certs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/certs.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/certs.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/cipher.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/cipher.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/cipher.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/cipher.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/cipher_wrap.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/cipher_wrap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/cipher_wrap.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/cipher_wrap.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/cmac.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/cmac.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/cmac.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/cmac.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ctr_drbg.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ctr_drbg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ctr_drbg.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ctr_drbg.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/debug.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/debug.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/debug.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/debug.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/des.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/des.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/des.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/des.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/dhm.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/dhm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/dhm.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/dhm.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ecdh.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecdh.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ecdh.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecdh.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ecdsa.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecdsa.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ecdsa.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecdsa.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ecjpake.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecjpake.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ecjpake.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecjpake.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ecp.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ecp.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecp.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ecp_curves.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecp_curves.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ecp_curves.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ecp_curves.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/entropy.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/entropy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/entropy.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/entropy.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/entropy_poll.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/entropy_poll.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/entropy_poll.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/entropy_poll.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/error.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/error.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/error.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/error.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/gcm.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/gcm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/gcm.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/gcm.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/havege.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/havege.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/havege.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/havege.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/hmac_drbg.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/hmac_drbg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/hmac_drbg.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/hmac_drbg.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/md.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/md.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/md.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/md.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/md2.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/md2.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/md2.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/md2.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/md4.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/md4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/md4.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/md4.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/md5.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/md5.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/md5.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/md5.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/md_wrap.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/md_wrap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/md_wrap.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/md_wrap.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/memory_buffer_alloc.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/memory_buffer_alloc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/memory_buffer_alloc.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/memory_buffer_alloc.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/net_sockets.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/net_sockets.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/net_sockets.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/net_sockets.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/oid.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/oid.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/oid.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/oid.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/padlock.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/padlock.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/padlock.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/padlock.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pem.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pem.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pem.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pem.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pk.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pk.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pk.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pk.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pk_wrap.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pk_wrap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pk_wrap.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pk_wrap.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs11.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs11.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs11.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs11.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs12.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs12.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs12.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs12.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs5.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs5.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pkcs5.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkcs5.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pkparse.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkparse.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pkparse.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkparse.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/pkwrite.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkwrite.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/pkwrite.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/pkwrite.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/platform.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/platform.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/platform.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/platform.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ripemd160.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ripemd160.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ripemd160.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ripemd160.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/rsa.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/rsa.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/rsa.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/rsa.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/rsa_internal.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/rsa_internal.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/rsa_internal.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/rsa_internal.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/sha1.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha1.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/sha1.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha1.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/sha256.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha256.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/sha256.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha256.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/sha512.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha512.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/sha512.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/sha512.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cache.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cache.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cache.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cache.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_ciphersuites.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_ciphersuites.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_ciphersuites.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_ciphersuites.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cli.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cli.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cli.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cli.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cookie.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cookie.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_cookie.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_cookie.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_srv.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_srv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_srv.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_srv.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_ticket.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_ticket.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_ticket.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_ticket.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_tls.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_tls.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/ssl_tls.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/ssl_tls.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/threading.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/threading.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/threading.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/threading.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/timing.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/timing.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/timing.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/timing.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/version.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/version.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/version.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/version.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/version_features.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/version_features.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/version_features.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/version_features.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_create.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_create.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_create.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_create.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_crl.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_crl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_crl.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_crl.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_crt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_crt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_crt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_crt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_csr.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_csr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509_csr.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509_csr.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509write_crt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509write_crt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509write_crt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509write_crt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/x509write_csr.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509write_csr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/x509write_csr.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/x509write_csr.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/library/xtea.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/library/xtea.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/library/xtea.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/library/xtea.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/Makefile b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/Makefile rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/aes_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/aes_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/aes_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/aes_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/aes_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/aes_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/aes_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/aes_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/arc4_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/arc4_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/arc4_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/arc4_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/arc4_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/arc4_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/arc4_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/arc4_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/des_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/des_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/des_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/des_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/des_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/des_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/des_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/des_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/hardware_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/hardware_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/hardware_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/hardware_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/md5_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/md5_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/md5_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/md5_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/md5_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/md5_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/md5_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/md5_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/net_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/net_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/net_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/net_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/net_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/net_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/net_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/net_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/sha1_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/sha1_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/sha1_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/sha1_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/sha1_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/sha1_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/sha1_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/sha1_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/timing_alt.c b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/timing_alt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/timing_alt.c rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/timing_alt.c diff --git a/src/W800 SDK v1.00.08/src/app/mbedtls/ports/timing_alt.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/ports/timing_alt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mbedtls/ports/timing_alt.h rename to src/W800_SDK_v1.00.10/src/app/mbedtls/ports/timing_alt.h diff --git a/src/W800 SDK v1.00.08/src/app/mqtt/Makefile b/src/W800_SDK_v1.00.10/src/app/mqtt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mqtt/Makefile rename to src/W800_SDK_v1.00.10/src/app/mqtt/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/mqtt/libemqtt.c b/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mqtt/libemqtt.c rename to src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c diff --git a/src/W800 SDK v1.00.08/src/app/mqtt/libemqtt.h b/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/mqtt/libemqtt.h rename to src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.h diff --git a/src/W800 SDK v1.00.08/src/app/ntp/Makefile b/src/W800_SDK_v1.00.10/src/app/ntp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ntp/Makefile rename to src/W800_SDK_v1.00.10/src/app/ntp/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/ntp/ntp_client.c b/src/W800_SDK_v1.00.10/src/app/ntp/ntp_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ntp/ntp_client.c rename to src/W800_SDK_v1.00.10/src/app/ntp/ntp_client.c diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/Makefile b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/Makefile rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/airkiss.h b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/airkiss.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/airkiss.h rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/airkiss.h diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_airkiss.c b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_airkiss.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_airkiss.c rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_airkiss.c diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_lsd.c b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_lsd.c rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_lsd.h b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_oneshot_lsd.h rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h diff --git a/src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_wifi_oneshot.c b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/oneshotconfig/wm_wifi_oneshot.c rename to src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c diff --git a/src/W800 SDK v1.00.08/src/app/ota/Makefile b/src/W800_SDK_v1.00.10/src/app/ota/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ota/Makefile rename to src/W800_SDK_v1.00.10/src/app/ota/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/ota/wm_http_fwup.c b/src/W800_SDK_v1.00.10/src/app/ota/wm_http_fwup.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ota/wm_http_fwup.c rename to src/W800_SDK_v1.00.10/src/app/ota/wm_http_fwup.c diff --git a/src/W800 SDK v1.00.08/src/app/ota/wm_http_fwup.h b/src/W800_SDK_v1.00.10/src/app/ota/wm_http_fwup.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ota/wm_http_fwup.h rename to src/W800_SDK_v1.00.10/src/app/ota/wm_http_fwup.h diff --git a/src/W800 SDK v1.00.08/src/app/ota/wm_socket_fwup.c b/src/W800_SDK_v1.00.10/src/app/ota/wm_socket_fwup.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ota/wm_socket_fwup.c rename to src/W800_SDK_v1.00.10/src/app/ota/wm_socket_fwup.c diff --git a/src/W800 SDK v1.00.08/src/app/ota/wm_socket_fwup.h b/src/W800_SDK_v1.00.10/src/app/ota/wm_socket_fwup.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ota/wm_socket_fwup.h rename to src/W800_SDK_v1.00.10/src/app/ota/wm_socket_fwup.h diff --git a/src/W800 SDK v1.00.08/src/app/ping/Makefile b/src/W800_SDK_v1.00.10/src/app/ping/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ping/Makefile rename to src/W800_SDK_v1.00.10/src/app/ping/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/ping/ping.c b/src/W800_SDK_v1.00.10/src/app/ping/ping.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ping/ping.c rename to src/W800_SDK_v1.00.10/src/app/ping/ping.c diff --git a/src/W800 SDK v1.00.08/src/app/ping/ping.h b/src/W800_SDK_v1.00.10/src/app/ping/ping.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/ping/ping.h rename to src/W800_SDK_v1.00.10/src/app/ping/ping.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/Makefile b/src/W800_SDK_v1.00.10/src/app/polarssl/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/Makefile rename to src/W800_SDK_v1.00.10/src/app/polarssl/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/aes.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/aes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/aes.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/aes.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/arc4.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/arc4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/arc4.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/arc4.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/asn1.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/asn1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/asn1.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/asn1.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/base64.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/base64.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/base64.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/base64.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/bignum.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/bignum.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/bignum.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/bignum.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/bn_mul.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/bn_mul.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/bn_mul.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/bn_mul.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/camellia.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/camellia.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/camellia.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/camellia.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/certs.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/certs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/certs.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/certs.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/cipher.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/cipher.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/cipher.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/cipher.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/cipher_wrap.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/cipher_wrap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/cipher_wrap.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/cipher_wrap.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/config.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/config.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/config.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/debug.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/debug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/debug.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/debug.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/des.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/des.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/des.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/des.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/dhm.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/dhm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/dhm.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/dhm.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/error.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/error.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/error.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/error.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md2.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md2.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md2.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md2.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md4.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md4.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md4.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md5.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md5.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md5.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md5.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md_wrap.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md_wrap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/md_wrap.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/md_wrap.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/net.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/net.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/net.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/net.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/openssl.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/openssl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/openssl.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/openssl.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/pem.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/pem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/pem.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/pem.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/rsa.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/rsa.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/rsa.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/rsa.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha1.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha1.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha1.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha2.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha2.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha2.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha2.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha4.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/sha4.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/sha4.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/ssl.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/ssl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/ssl.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/ssl.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/x509.h b/src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/x509.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/include/polarssl/x509.h rename to src/W800_SDK_v1.00.10/src/app/polarssl/include/polarssl/x509.h diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/Makefile b/src/W800_SDK_v1.00.10/src/app/polarssl/library/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/Makefile rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/arc4.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/arc4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/arc4.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/arc4.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/asn1parse.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/asn1parse.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/asn1parse.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/asn1parse.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/base64.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/base64.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/base64.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/base64.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/cipher.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/cipher.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/cipher.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/cipher.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/cipher_wrap.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/cipher_wrap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/cipher_wrap.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/cipher_wrap.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/error.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/error.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/error.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/error.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/md.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/md.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/md.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/md.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/md_wrap.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/md_wrap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/md_wrap.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/md_wrap.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/pem.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/pem.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/pem.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/pem.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_bignum.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_bignum.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_bignum.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_bignum.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_debug.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_debug.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_debug.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_debug.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_md5.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_md5.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_md5.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_md5.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_sha1.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_sha1.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/polarssl_sha1.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/polarssl_sha1.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/rsa.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/rsa.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/rsa.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/rsa.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/ssl_cli.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/ssl_cli.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/ssl_cli.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/ssl_cli.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/ssl_tls.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/ssl_tls.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/ssl_tls.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/ssl_tls.c diff --git a/src/W800 SDK v1.00.08/src/app/polarssl/library/x509parse.c b/src/W800_SDK_v1.00.10/src/app/polarssl/library/x509parse.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/polarssl/library/x509parse.c rename to src/W800_SDK_v1.00.10/src/app/polarssl/library/x509parse.c diff --git a/src/W800 SDK v1.00.08/src/app/sslserver/Makefile b/src/W800_SDK_v1.00.10/src/app/sslserver/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/sslserver/Makefile rename to src/W800_SDK_v1.00.10/src/app/sslserver/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/sslserver/wm_ssl_server.c b/src/W800_SDK_v1.00.10/src/app/sslserver/wm_ssl_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/sslserver/wm_ssl_server.c rename to src/W800_SDK_v1.00.10/src/app/sslserver/wm_ssl_server.c diff --git a/src/W800 SDK v1.00.08/src/app/web/Makefile b/src/W800_SDK_v1.00.10/src/app/web/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/Makefile rename to src/W800_SDK_v1.00.10/src/app/web/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/web/fs.c b/src/W800_SDK_v1.00.10/src/app/web/fs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs.c rename to src/W800_SDK_v1.00.10/src/app/web/fs.c diff --git a/src/W800 SDK v1.00.08/src/app/web/fs.h b/src/W800_SDK_v1.00.10/src/app/web/fs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs.h rename to src/W800_SDK_v1.00.10/src/app/web/fs.h diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/404.html b/src/W800_SDK_v1.00.10/src/app/web/fs/404.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/404.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/404.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/advance.html b/src/W800_SDK_v1.00.10/src/app/web/fs/advance.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/advance.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/advance.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/basic.html b/src/W800_SDK_v1.00.10/src/app/web/fs/basic.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/basic.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/basic.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/firmware.html b/src/W800_SDK_v1.00.10/src/app/web/fs/firmware.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/firmware.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/firmware.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/index.html b/src/W800_SDK_v1.00.10/src/app/web/fs/index.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/index.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/index.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/jump.html b/src/W800_SDK_v1.00.10/src/app/web/fs/jump.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/jump.html rename to src/W800_SDK_v1.00.10/src/app/web/fs/jump.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs/style.css b/src/W800_SDK_v1.00.10/src/app/web/fs/style.css similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs/style.css rename to src/W800_SDK_v1.00.10/src/app/web/fs/style.css diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/404.html b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/404.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/404.html rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/404.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/basic.html b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/basic.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/basic.html rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/basic.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/firmware.html b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/firmware.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/firmware.html rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/firmware.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/index.html b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/index.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/index.html rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/index.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/jump.html b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/jump.html similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/jump.html rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/jump.html diff --git a/src/W800 SDK v1.00.08/src/app/web/fs_ap_config/style.css b/src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/style.css similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fs_ap_config/style.css rename to src/W800_SDK_v1.00.10/src/app/web/fs_ap_config/style.css diff --git a/src/W800 SDK v1.00.08/src/app/web/fsdata.c b/src/W800_SDK_v1.00.10/src/app/web/fsdata.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fsdata.c rename to src/W800_SDK_v1.00.10/src/app/web/fsdata.c diff --git a/src/W800 SDK v1.00.08/src/app/web/fsdata.h b/src/W800_SDK_v1.00.10/src/app/web/fsdata.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fsdata.h rename to src/W800_SDK_v1.00.10/src/app/web/fsdata.h diff --git a/src/W800 SDK v1.00.08/src/app/web/fsdata_ap_config.c b/src/W800_SDK_v1.00.10/src/app/web/fsdata_ap_config.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/fsdata_ap_config.c rename to src/W800_SDK_v1.00.10/src/app/web/fsdata_ap_config.c diff --git a/src/W800 SDK v1.00.08/src/app/web/goall b/src/W800_SDK_v1.00.10/src/app/web/goall similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/goall rename to src/W800_SDK_v1.00.10/src/app/web/goall diff --git a/src/W800 SDK v1.00.08/src/app/web/http.h b/src/W800_SDK_v1.00.10/src/app/web/http.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/http.h rename to src/W800_SDK_v1.00.10/src/app/web/http.h diff --git a/src/W800 SDK v1.00.08/src/app/web/httpd.c b/src/W800_SDK_v1.00.10/src/app/web/httpd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/httpd.c rename to src/W800_SDK_v1.00.10/src/app/web/httpd.c diff --git a/src/W800 SDK v1.00.08/src/app/web/httpd.h b/src/W800_SDK_v1.00.10/src/app/web/httpd.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/httpd.h rename to src/W800_SDK_v1.00.10/src/app/web/httpd.h diff --git a/src/W800 SDK v1.00.08/src/app/web/makefs b/src/W800_SDK_v1.00.10/src/app/web/makefs similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/makefs rename to src/W800_SDK_v1.00.10/src/app/web/makefs diff --git a/src/W800 SDK v1.00.08/src/app/web/web.c b/src/W800_SDK_v1.00.10/src/app/web/web.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/web/web.c rename to src/W800_SDK_v1.00.10/src/app/web/web.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/Makefile b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/Makefile rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/Makefile diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_ri.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_ri.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_ri.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_ri.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_ri.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_ri.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_cmdp_ri.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_ri.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_hspi_task.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_hspi_task.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_hspi_task.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_hspi_task.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_hspi_task.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_hspi_task.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_hspi_task.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_hspi_task.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_rmms.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_rmms.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_rmms.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_rmms.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_rmms.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_rmms.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_rmms.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_rmms.h diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_uart_task.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_uart_task.c similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_uart_task.c rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_uart_task.c diff --git a/src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_uart_task.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_uart_task.h similarity index 100% rename from src/W800 SDK v1.00.08/src/app/wm_atcmd/wm_uart_task.h rename to src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_uart_task.h diff --git a/src/W800 SDK v1.00.08/src/bt/AStyle.exe b/src/W800_SDK_v1.00.10/src/bt/AStyle.exe similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/AStyle.exe rename to src/W800_SDK_v1.00.10/src/bt/AStyle.exe diff --git a/src/W800 SDK v1.00.08/src/bt/astyle.bat b/src/W800_SDK_v1.00.10/src/bt/astyle.bat similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/astyle.bat rename to src/W800_SDK_v1.00.10/src/bt/astyle.bat diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/README.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/README.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/README.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/README.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_att.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_att.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_att.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_att.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gap.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gap.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gap.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gap.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gattc.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gattc.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gattc.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gattc.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gatts.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gatts.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_gatts.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_gatts.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs_id.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs_id.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs_id.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs_id.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs_return_codes.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs_return_codes.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_hs/ble_hs_return_codes.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_hs/ble_hs_return_codes.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_sec.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_sec.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_sec.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_sec.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_addr.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_addr.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_addr.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_addr.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_lp_clock.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_lp_clock.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_lp_clock.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_lp_clock.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_setup_intro.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_setup_intro.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_setup_intro.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_setup_intro.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_sync_cb.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_sync_cb.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/ble_setup/ble_sync_cb.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/ble_setup/ble_sync_cb.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_GAP.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_GAP.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_GAP.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_GAP.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_GATT.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_GATT.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_GATT.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_GATT.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_advdata.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_advdata.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_advdata.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_advdata.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_api.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_api.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/btshell/btshell_api.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/btshell/btshell_api.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/conf.py b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/conf.py similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/conf.py rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/conf.py diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/doxygen.xml b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/doxygen.xml similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/doxygen.xml rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/doxygen.xml diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/index.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/index.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/index.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/index.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/index.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/index.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/index.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/mesh_lightning_model.jpg b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/mesh_lightning_model.jpg similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/mesh_lightning_model.jpg rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/mesh_lightning_model.jpg diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/mesh_topology.jpg b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/mesh_topology.jpg similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/mesh_topology.jpg rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/mesh_topology.jpg diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/sample.rst b/src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/sample.rst similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/docs/mesh/sample.rst rename to src/W800_SDK_v1.00.10/src/bt/blehost/docs/mesh/sample.rst diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/aes.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/aes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/aes.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/aes.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cbc_mode.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cbc_mode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cbc_mode.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cbc_mode.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ccm_mode.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ccm_mode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ccm_mode.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ccm_mode.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cmac_mode.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cmac_mode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cmac_mode.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/cmac_mode.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/constants.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/constants.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/constants.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/constants.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_mode.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_mode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_mode.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_mode.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_prng.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_prng.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_prng.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ctr_prng.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dh.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dh.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dh.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dsa.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dsa.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dsa.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_dsa.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/ecc_platform_specific.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac_prng.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac_prng.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac_prng.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/hmac_prng.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/sha256.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/sha256.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/sha256.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/sha256.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/utils.h b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/utils.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/include/tinycrypt/utils.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/include/tinycrypt/utils.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/aes_decrypt.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/aes_encrypt.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/bleutils.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/bleutils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/bleutils.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/bleutils.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/cbc_mode.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/cbc_mode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/cbc_mode.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/cbc_mode.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ccm_mode.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ccm_mode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ccm_mode.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ccm_mode.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/cmac_mode.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/cmac_mode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/cmac_mode.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/cmac_mode.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ctr_mode.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ctr_mode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ctr_mode.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ctr_mode.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ctr_prng.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ctr_prng.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ctr_prng.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ctr_prng.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_dh.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_dh.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_dh.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_dh.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_dsa.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_platform_specific.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_platform_specific.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/ecc_platform_specific.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/ecc_platform_specific.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/hmac.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/hmac.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/hmac.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/hmac.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/hmac_prng.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/hmac_prng.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/hmac_prng.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/hmac_prng.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/sha256.c b/src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/sha256.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/ext/tinycrypt/src/sha256.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/ext/tinycrypt/src/sha256.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_att.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_att.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_att.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_att.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_eddystone.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_eddystone.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_eddystone.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_eddystone.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_gap.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_gap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_gap.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_gap.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_gatt.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_gatt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_gatt.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_gatt.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_adv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_adv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_adv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_adv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_hci.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_hci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_hci.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_hci.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_id.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_id.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_id.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_id.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_log.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_log.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_log.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_log.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_mbuf.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_mbuf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_mbuf.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_mbuf.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_stop.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_stop.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_hs_stop.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_hs_stop.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_ibeacon.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_ibeacon.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_ibeacon.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_ibeacon.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_l2cap.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_l2cap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_l2cap.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_l2cap.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_monitor.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_monitor.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_monitor.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_monitor.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_sm.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_sm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_sm.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_sm.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_store.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_store.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_store.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_store.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_uuid.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_uuid.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/include/host/ble_uuid.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/include/host/ble_uuid.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/access.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/access.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/access.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/access.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_cli.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_cli.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_cli.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_cli.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_srv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_srv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_srv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/cfg_srv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/glue.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/glue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/glue.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/glue.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/health_cli.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/health_cli.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/health_cli.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/health_cli.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/health_srv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/health_srv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/health_srv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/health_srv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/main.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/main.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/main.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/main.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/mesh.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/mesh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/mesh.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/mesh.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/model_cli.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/model_cli.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/model_cli.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/model_cli.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/model_srv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/model_srv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/model_srv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/model_srv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/porting.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/porting.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/porting.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/porting.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/proxy.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/proxy.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/proxy.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/proxy.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/slist.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/slist.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/slist.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/slist.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/testing.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/testing.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/include/mesh/testing.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/include/mesh/testing.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/access.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/access.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/access.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/access.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/access.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/access.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/access.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/access.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/adv.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/adv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/adv.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/adv.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/adv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/adv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/adv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/adv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/atomic.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/atomic.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/atomic.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/atomic.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/beacon.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/beacon.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/beacon.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/beacon.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/beacon.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/beacon.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/beacon.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/beacon.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/cfg_cli.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/cfg_cli.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/cfg_cli.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/cfg_cli.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/cfg_srv.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/cfg_srv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/cfg_srv.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/cfg_srv.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/crypto.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/crypto.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/crypto.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/crypto.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/crypto.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/crypto.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/crypto.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/crypto.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/foundation.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/foundation.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/foundation.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/foundation.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/friend.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/friend.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/friend.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/friend.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/friend.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/friend.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/friend.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/friend.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/glue.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/glue.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/glue.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/glue.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/health_cli.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/health_cli.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/health_cli.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/health_cli.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/health_srv.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/health_srv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/health_srv.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/health_srv.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/light_model.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/light_model.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/light_model.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/light_model.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/light_model.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/light_model.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/light_model.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/light_model.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/lpn.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/lpn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/lpn.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/lpn.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/lpn.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/lpn.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/lpn.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/lpn.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/mesh.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/mesh.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/mesh.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/mesh.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/mesh_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/mesh_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/mesh_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/mesh_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/model_cli.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/model_cli.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/model_cli.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/model_cli.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/model_srv.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/model_srv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/model_srv.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/model_srv.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/net.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/net.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/net.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/net.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/net.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/net.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/net.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/net.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/nodes.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/nodes.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/nodes.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/nodes.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/nodes.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/nodes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/nodes.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/nodes.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/prov.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/prov.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/prov.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/prov.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/prov.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/prov.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/prov.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/prov.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/proxy.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/proxy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/proxy.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/proxy.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/proxy.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/proxy.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/proxy.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/proxy.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/settings.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/settings.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/settings.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/settings.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/settings.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/settings.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/settings.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/settings.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/shell.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/shell.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/shell.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/shell.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/shell.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/shell.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/shell.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/shell.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/testing.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/testing.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/testing.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/testing.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/testing.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/testing.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/testing.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/testing.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/transport.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/transport.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/transport.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/transport.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/transport.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/transport.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/transport.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/transport.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/mesh/src/wm_ble_mesh_store.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/include/services/bas/ble_svc_bas.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/include/services/bas/ble_svc_bas.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/include/services/bas/ble_svc_bas.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/include/services/bas/ble_svc_bas.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/pkg.yml b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/pkg.yml similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/pkg.yml rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/pkg.yml diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/src/ble_svc_bas.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/src/ble_svc_bas.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/src/ble_svc_bas.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/src/ble_svc_bas.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/syscfg.yml b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/syscfg.yml similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/bas/syscfg.yml rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/bas/syscfg.yml diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/include/services/dis/ble_svc_dis.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/include/services/dis/ble_svc_dis.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/include/services/dis/ble_svc_dis.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/include/services/dis/ble_svc_dis.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/pkg.yml b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/pkg.yml similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/pkg.yml rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/pkg.yml diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/src/ble_svc_dis.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/src/ble_svc_dis.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/src/ble_svc_dis.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/src/ble_svc_dis.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/syscfg.yml b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/syscfg.yml similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/dis/syscfg.yml rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/dis/syscfg.yml diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/include/services/gap/ble_svc_gap.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/include/services/gap/ble_svc_gap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/include/services/gap/ble_svc_gap.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/include/services/gap/ble_svc_gap.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/src/ble_svc_gap.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/src/ble_svc_gap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gap/src/ble_svc_gap.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gap/src/ble_svc_gap.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/include/services/gatt/ble_svc_gatt.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/src/ble_svc_gatt.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/src/ble_svc_gatt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/services/gatt/src/ble_svc_gatt.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/services/gatt/src/ble_svc_gatt.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_clt.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_clt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_clt.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_clt.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_cmd.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_cmd_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_cmd_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_cmd_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_cmd_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_svr.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_svr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_att_svr.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_att_svr.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_eddystone.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_eddystone.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_eddystone.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_eddystone.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gap.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gap.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gap.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gap_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gap_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gap_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gap_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatt_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatt_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatt_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatt_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gattc.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gattc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gattc.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gattc.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatts.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatts.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatts.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatts.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatts_lcl.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatts_lcl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_gatts_lcl.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_gatts_lcl.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_adv.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_adv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_adv.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_adv.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_adv_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_adv_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_adv_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_adv_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_atomic.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_atomic.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_atomic.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_atomic.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_atomic_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_atomic_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_atomic_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_atomic_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_cfg.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_conn.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_conn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_conn.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_conn.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_conn_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_conn_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_conn_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_conn_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_flow.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_flow.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_flow.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_flow.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_flow_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_flow_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_flow_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_flow_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_evt.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_util.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_hci_util.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_hci_util.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_id.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_id.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_id.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_id.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_id_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_id_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_id_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_id_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_log.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_log.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_log.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_log.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mbuf.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mbuf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mbuf.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mbuf.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mbuf_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_misc.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_misc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_misc.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_misc.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mqueue.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mqueue.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_mqueue.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_mqueue.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_periodic_sync_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_pvcy.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_pvcy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_pvcy.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_pvcy.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_pvcy_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_shutdown.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_shutdown.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_shutdown.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_shutdown.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_startup.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_startup.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_startup.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_startup.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_startup_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_startup_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_startup_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_startup_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_stop.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_stop.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_hs_stop.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_hs_stop.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_ibeacon.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_ibeacon.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_ibeacon.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_ibeacon.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_coc.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_coc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_coc.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_coc.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_coc_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_l2cap_sig_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_monitor.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_monitor.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_monitor.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_monitor.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_monitor_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_monitor_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_monitor_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_monitor_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_alg.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_alg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_alg.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_alg.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_cmd.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_lgcy.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_lgcy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_lgcy.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_lgcy.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_sc.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_sc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_sm_sc.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_sm_sc.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_store.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_store.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_store.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_store.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_store_util.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_store_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_store_util.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_store_util.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_uuid.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_uuid.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_uuid.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_uuid.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_uuid_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_uuid_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/src/ble_uuid_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/src/ble_uuid_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/include/store/config/ble_store_config.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/include/store/config/ble_store_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/include/store/config/ble_store_config.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/include/store/config/ble_store_config.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/include/store/config/wm_bt_storage.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/include/store/config/wm_bt_storage.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/include/store/config/wm_bt_storage.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/include/store/config/wm_bt_storage.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_config.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_config.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_config.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_config.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_config_priv.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_config_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_config_priv.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_config_priv.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_nvram.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_nvram.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/ble_store_nvram.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/ble_store_nvram.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/wm_bt_storage.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/wm_bt_storage.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/config/src/wm_bt_storage.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/config/src/wm_bt_storage.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/include/store/ram/ble_store_ram.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/include/store/ram/ble_store_ram.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/include/store/ram/ble_store_ram.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/include/store/ram/ble_store_ram.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/src/ble_store_ram.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/src/ble_store_ram.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/store/ram/src/ble_store_ram.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/store/ram/src/ble_store_ram.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/include/host/util/util.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/include/host/util/util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/include/host/util/util.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/include/host/util/util.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/src/addr.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/src/addr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/host/util/src/addr.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/host/util/src/addr.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/ble.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/ble.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/ble.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/ble.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/ble_hci_trans.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/ble_hci_trans.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/ble_hci_trans.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/ble_hci_trans.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/hci_common.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/hci_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/hci_common.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/hci_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_npl.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_npl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_npl.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_npl.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_opt.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_opt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_opt.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_opt.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_opt_auto.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_opt_auto.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/include/nimble/nimble_opt_auto.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/include/nimble/nimble_opt_auto.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/include/transport/uart/ble_hci_uart.h b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/include/transport/uart/ble_hci_uart.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/include/transport/uart/ble_hci_uart.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/include/transport/uart/ble_hci_uart.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/src/ble_hci_uart.c b/src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/src/ble_hci_uart.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/nimble/transport/uart/src/ble_hci_uart.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/nimble/transport/uart/src/ble_hci_uart.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/hal/hal_timer.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/hal/hal_timer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/hal/hal_timer.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/hal/hal_timer.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/hal/hal_uart.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/hal/hal_uart.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/hal/hal_uart.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/hal/hal_uart.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log/log.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log/log.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log/log.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log/log.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log_common/ignore.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log_common/ignore.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log_common/ignore.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log_common/ignore.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log_common/log_common.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log_common/log_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/log_common/log_common.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/log_common/log_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/logcfg/logcfg.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/logcfg/logcfg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/logcfg/logcfg.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/logcfg/logcfg.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/mem/mem.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/mem/mem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/mem/mem.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/mem/mem.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/modlog/modlog.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/modlog/modlog.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/modlog/modlog.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/modlog/modlog.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/nimble_npl_os.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/nimble_npl_os.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/nimble_npl_os.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/nimble_npl_os.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/nimble_port.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/nimble_port.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/nimble_port.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/nimble_port.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/tls_nimble.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/tls_nimble.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/nimble/tls_nimble.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/nimble/tls_nimble.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/endian.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/endian.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/endian.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/endian.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/npl_freertos.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/npl_freertos.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/npl_freertos.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/npl_freertos.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_cputime.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_cputime.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_cputime.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_cputime.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_error.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_error.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_error.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_error.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_mbuf.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_mbuf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_mbuf.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_mbuf.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_mempool.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_mempool.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_mempool.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_mempool.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_trace_api.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_trace_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/os_trace_api.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/os_trace_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/queue.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/queue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/queue.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/queue.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/util.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/os/util.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/os/util.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/stats/stats.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/stats/stats.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/stats/stats.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/stats/stats.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/syscfg/syscfg.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/syscfg/syscfg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/syscfg/syscfg.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/syscfg/syscfg.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/sysflash/sysflash.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/sysflash/sysflash.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/sysflash/sysflash.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/sysflash/sysflash.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/sysinit/sysinit.h b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/sysinit/sysinit.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/include/sysinit/sysinit.h rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/include/sysinit/sysinit.h diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/endian.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/endian.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/endian.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/endian.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/mem.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/mem.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/mem.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/mem.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/nimble_port.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/nimble_port.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/nimble_port.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/nimble_port.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/npl_os_freertos.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/npl_os_freertos.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/npl_os_freertos.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/npl_os_freertos.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_mbuf.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_mbuf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_mbuf.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_mbuf.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_mempool.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_mempool.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_mempool.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_mempool.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_msys_init.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_msys_init.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/os_msys_init.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/os_msys_init.c diff --git a/src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/tls_nimble.c b/src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/tls_nimble.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/blehost/porting/w800/src/tls_nimble.c rename to src/W800_SDK_v1.00.10/src/bt/blehost/porting/w800/src/tls_nimble.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_at.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_at.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_at.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_at.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_ci.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_ci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_ci.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_ci.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_cmd.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_rfc.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_rfc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_rfc.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_rfc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_sco.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_sco.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_sco.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_sco.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ag/bta_ag_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ag/bta_ag_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ar/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/ar/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ar/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ar/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/ar/bta_ar.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/ar/bta_ar.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/ar/bta_ar.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/ar/bta_ar.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_aact.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_aact.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_aact.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_aact.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_ci.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_ci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_ci.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_ci.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_ssm.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_ssm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/av/bta_av_ssm.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/av/bta_av_ssm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_ci.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_ci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_ci.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_ci.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_pm.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_pm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_pm.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_pm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_sco.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_sco.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/dm/bta_dm_sco.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/dm/bta_dm_sco.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_cache.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_cache.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_cache.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_cache.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gattc_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gattc_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/gatt/bta_gatts_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/gatt/bta_gatts_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_at.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_at.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_at.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_at.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_cmd.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_cmd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_cmd.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_cmd.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_co.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_rfc.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_rfc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_rfc.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_rfc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_sco.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_sco.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_sco.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_sco.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hf_client/bta_hf_client_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hf_client/bta_hf_client_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_le.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_le.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_le.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_le.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hh/bta_hh_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hh/bta_hh_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_ci.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_ci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_ci.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_ci.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/hl/bta_hl_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/hl/bta_hl_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_at.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_at.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_at.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_at.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_ci.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_ci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_ci.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_ci.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ag_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ag_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ar_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ar_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ar_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ar_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ar_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ar_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_ar_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_ar_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_ci.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_ci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_ci.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_ci.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_sbc.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_sbc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_av_sbc.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_av_sbc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_ci.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_ci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_ci.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_ci.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_dm_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_dm_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatt_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatt_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatt_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatt_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gattc_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gattc_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gattc_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gattc_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatts_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatts_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatts_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatts_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatts_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatts_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_gatts_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_gatts_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_at.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_at.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_at.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_at.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hf_client_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hf_client_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hh_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hh_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_ci.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_ci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_ci.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_ci.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_hl_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_hl_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_jv_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_jv_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_mce_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_mce_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_mce_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_mce_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_mce_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_mce_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_mce_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_mce_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_op_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_op_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_op_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_op_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_ci.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_ci.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_ci.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_ci.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_co.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pan_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pan_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pbs_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pbs_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_pbs_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_pbs_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sdp_api.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sdp_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sdp_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sdp_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sdp_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sdp_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sdp_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sdp_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sys.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sys.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sys.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sys.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sys_int.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sys_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/bta_sys_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/bta_sys_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/ptim.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/ptim.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/ptim.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/ptim.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/include/utl.h b/src/W800_SDK_v1.00.10/src/bt/host/bta/include/utl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/include/utl.h rename to src/W800_SDK_v1.00.10/src/bt/host/bta/include/utl.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/jv/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/jv/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/jv/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/jv/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/jv/bta_jv_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/jv/bta_jv_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/mce/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/mce/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/mce/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/mce/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/mce/bta_mce_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/mce/bta_mce_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/pan/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/pan/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/pan/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/pan/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_ci.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_ci.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_ci.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_ci.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/pan/bta_pan_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/pan/bta_pan_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sdp/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sdp/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_act.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_api.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sdp/bta_sdp_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sdp/bta_sdp_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_cfg.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_cfg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_cfg.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_cfg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_conn.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_conn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_conn.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_conn.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_main.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/bta_sys_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/bta_sys_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/ptim.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/ptim.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/ptim.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/ptim.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/bta/sys/utl.c b/src/W800_SDK_v1.00.10/src/bt/host/bta/sys/utl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/bta/sys/utl.c rename to src/W800_SDK_v1.00.10/src/bt/host/bta/sys/utl.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/btcore/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/bdaddr.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/bdaddr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/bdaddr.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/bdaddr.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/device_class.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/device_class.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/device_class.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/device_class.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/device_features.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/device_features.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/device_features.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/device_features.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/event_mask.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/event_mask.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/event_mask.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/event_mask.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/hal_util.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/hal_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/hal_util.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/hal_util.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/iac.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/iac.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/iac.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/iac.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/module.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/module.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/module.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/module.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/osi_module.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/osi_module.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/osi_module.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/osi_module.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/property.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/property.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/property.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/property.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/uuid.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/uuid.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/uuid.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/uuid.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/include/version.h b/src/W800_SDK_v1.00.10/src/bt/host/btcore/include/version.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/include/version.h rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/include/version.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/btcore/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/src/bdaddr.c b/src/W800_SDK_v1.00.10/src/bt/host/btcore/src/bdaddr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/src/bdaddr.c rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/src/bdaddr.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/src/device_class.c b/src/W800_SDK_v1.00.10/src/bt/host/btcore/src/device_class.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/src/device_class.c rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/src/device_class.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/src/property.c b/src/W800_SDK_v1.00.10/src/bt/host/btcore/src/property.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/src/property.c rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/src/property.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btcore/src/uuid.c b/src/W800_SDK_v1.00.10/src/bt/host/btcore/src/uuid.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btcore/src/uuid.c rename to src/W800_SDK_v1.00.10/src/bt/host/btcore/src/uuid.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/btif/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/btif/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_ag_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_ag_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_ag_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_ag_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_av_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_av_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_av_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_av_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_dm_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_dm_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_dm_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_dm_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_gatts_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_gatts_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_gatts_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_gatts_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_hh_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_hh_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_hh_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_hh_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_hl_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_hl_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_hl_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_hl_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_pan_co.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_pan_co.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/co/bta_pan_co.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/co/bta_pan_co.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_api.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av_api.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av_co.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av_co.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_av_co.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_av_co.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_avrcp_audio_track.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_avrcp_audio_track.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_avrcp_audio_track.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_avrcp_audio_track.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_common.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_common.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_config.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_config.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_config.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_config_transcode.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_config_transcode.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_config_transcode.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_config_transcode.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug_btsnoop.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug_btsnoop.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug_btsnoop.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug_btsnoop.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug_conn.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug_conn.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_debug_conn.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_debug_conn.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_dm.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_dm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_dm.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_dm.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt_multi_adv_util.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt_multi_adv_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt_multi_adv_util.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt_multi_adv_util.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt_util.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_gatt_util.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_gatt_util.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_hh.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_hh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_hh.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_hh.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_hl.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_hl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_hl.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_hl.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_mce.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_mce.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_mce.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_mce.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_media.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_media.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_media.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_media.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_pan.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_pan.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_pan.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_pan.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_pan_internal.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_pan_internal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_pan_internal.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_pan_internal.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_profile_queue.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_profile_queue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_profile_queue.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_profile_queue.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sdp.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sdp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sdp.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sdp.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sm.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sm.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sm.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_l2cap.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_l2cap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_l2cap.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_l2cap.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_rfc.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_rfc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_rfc.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_rfc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_sco.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_sco.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_sco.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_sco.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_sdp.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_sdp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_sdp.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_sdp.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_thread.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_thread.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_thread.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_thread.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_util.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_sock_util.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_sock_util.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_storage.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_storage.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_storage.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_storage.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_uid.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_uid.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_uid.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_uid.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_util.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_util.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/btif_util.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/btif_util.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/stack_manager.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/stack_manager.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/stack_manager.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/stack_manager.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/include/uinput.h b/src/W800_SDK_v1.00.10/src/bt/host/btif/include/uinput.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/include/uinput.h rename to src/W800_SDK_v1.00.10/src/bt/host/btif/include/uinput.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/bluetooth.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/bluetooth.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/bluetooth.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/bluetooth.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_av.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_av.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_av.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_av.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_core.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_core.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_core.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_core.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_dm.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_dm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_dm.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_dm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_client.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_client.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_client.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_dm.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_dm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_dm.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_dm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_multi_adv_util.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_multi_adv_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_multi_adv_util.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_multi_adv_util.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_server.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_server.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_server.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_util.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_gatt_util.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_gatt_util.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hf.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hf.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hf.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hf_client.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hf_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hf_client.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hf_client.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hh.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hh.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hh.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hh.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hl.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_hl.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_hl.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_mce.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_mce.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_mce.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_mce.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_media_task.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_media_task.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_media_task.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_media_task.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_pan.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_pan.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_pan.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_pan.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_profile_queue.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_profile_queue.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_profile_queue.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_profile_queue.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_rc.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_rc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_rc.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_rc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sdp_server.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sdp_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sdp_server.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sdp_server.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sm.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_sm.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_sm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_spp.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_spp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_spp.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_spp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_storage.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_storage.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_storage.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_storage.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_util.c b/src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_util.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/btif/src/btif_util.c rename to src/W800_SDK_v1.00.10/src/bt/host/btif/src/btif_util.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/conf/Android.mk b/src/W800_SDK_v1.00.10/src/bt/host/conf/Android.mk similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/conf/Android.mk rename to src/W800_SDK_v1.00.10/src/bt/host/conf/Android.mk diff --git a/src/W800 SDK v1.00.08/src/bt/host/conf/bt_did.conf b/src/W800_SDK_v1.00.10/src/bt/host/conf/bt_did.conf similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/conf/bt_did.conf rename to src/W800_SDK_v1.00.10/src/bt/host/conf/bt_did.conf diff --git a/src/W800 SDK v1.00.08/src/bt/host/conf/bt_stack.conf b/src/W800_SDK_v1.00.10/src/bt/host/conf/bt_stack.conf similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/conf/bt_stack.conf rename to src/W800_SDK_v1.00.10/src/bt/host/conf/bt_stack.conf diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_assert.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_assert.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_assert.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_assert.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_bitstream.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_bitstream.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_bitstream.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_bitstream.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_bt_spec.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc_private.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc_private.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc_private.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_codec_sbc_private.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_common.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_common.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_cpu_dep.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_modules.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_modules.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_modules.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_modules.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_osinterface.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_osinterface.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_osinterface.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_osinterface.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_status.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_status.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_status.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_status.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_stddefs.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_stddefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_stddefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_stddefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_string.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_string.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_string.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_string.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_time.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_time.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_time.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_time.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_utils.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_utils.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/include/oi_utils.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/include/oi_utils.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/alloc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/alloc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/alloc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/alloc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitalloc-sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitalloc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitstream-decode.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitstream-decode.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/bitstream-decode.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/bitstream-decode.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-oina.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-oina.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-oina.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-oina.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-private.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-private.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-private.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-private.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/decoder-sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/dequant.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/dequant.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/dequant.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/dequant.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/framing-sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/framing-sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/framing-sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/framing-sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/framing.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/framing.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/framing.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/framing.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/oi_codec_version.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/oi_codec_version.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/oi_codec_version.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/oi_codec_version.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/readsamplesjoint.inc b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/readsamplesjoint.inc similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/readsamplesjoint.inc rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/readsamplesjoint.inc diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-8-generated.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-8-generated.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-8-generated.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-8-generated.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-dct8.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-dct8.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-dct8.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-dct8.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/decoder/srce/synthesis-sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_dct.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_dct.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_dct.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_dct.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_enc_func_declare.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_enc_func_declare.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_enc_func_declare.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_enc_func_declare.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_encoder.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_encoder.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_encoder.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_encoder.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_if.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_if.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_if.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_if.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_types.h b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_types.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/include/sbc_types.h rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/include/sbc_types.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_analysis.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_dct_coeffs.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_mono.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_bit_alloc_ste.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_enc_coeffs.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_encoder.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_packing.c b/src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_packing.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/embdrv/sbc/encoder/srce/sbc_packing.c rename to src/W800_SDK_v1.00.10/src/bt/host/embdrv/sbc/encoder/srce/sbc_packing.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/Android.mk b/src/W800_SDK_v1.00.10/src/bt/host/gki/Android.mk similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/Android.mk rename to src/W800_SDK_v1.00.10/src/bt/host/gki/Android.mk diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/gki/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/gki/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/gki.h b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/gki.h rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_buffer.c b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_buffer.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_buffer.c rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_buffer.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_common.h b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_common.h rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_debug.c b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_debug.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_debug.c rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_debug.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_time.c b/src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_time.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/common/gki_time.c rename to src/W800_SDK_v1.00.10/src/bt/host/gki/common/gki_time.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/wm/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/gki/wm/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/wm/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/gki/wm/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/wm/data_types.h b/src/W800_SDK_v1.00.10/src/bt/host/gki/wm/data_types.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/wm/data_types.h rename to src/W800_SDK_v1.00.10/src/bt/host/gki/wm/data_types.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/wm/gki_int.h b/src/W800_SDK_v1.00.10/src/bt/host/gki/wm/gki_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/wm/gki_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/gki/wm/gki_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/gki/wm/gki_wm.c b/src/W800_SDK_v1.00.10/src/bt/host/gki/wm/gki_wm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/gki/wm/gki_wm.c rename to src/W800_SDK_v1.00.10/src/bt/host/gki/wm/gki_wm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/hci/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/hci/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_hci_bdroid.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_hci_bdroid.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_hci_bdroid.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_hci_bdroid.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_hci_lib.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_hci_lib.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_hci_lib.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_hci_lib.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_vendor_lib.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_vendor_lib.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/bt_vendor_lib.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/bt_vendor_lib.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/btsnoop.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/btsnoop.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/btsnoop.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/btsnoop.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/btsnoop_mem.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/btsnoop_mem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/btsnoop_mem.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/btsnoop_mem.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/buffer_allocator.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/buffer_allocator.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/buffer_allocator.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/buffer_allocator.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_audio.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_audio.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_audio.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_audio.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_hal.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_hal.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_hal.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_hal.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_inject.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_inject.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_inject.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_inject.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_internals.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_internals.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_internals.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_internals.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_layer.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_layer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_layer.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_layer.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_packet_factory.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_packet_factory.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_packet_factory.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_packet_factory.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_packet_parser.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_packet_parser.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hci_packet_parser.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hci_packet_parser.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/hcih.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/hcih.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/hcih.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/hcih.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/low_power_manager.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/low_power_manager.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/low_power_manager.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/low_power_manager.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/packet_fragmenter.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/packet_fragmenter.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/packet_fragmenter.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/packet_fragmenter.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/userial.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/userial.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/userial.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/userial.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/include/vendor.h b/src/W800_SDK_v1.00.10/src/bt/host/hci/include/vendor.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/include/vendor.h rename to src/W800_SDK_v1.00.10/src/bt/host/hci/include/vendor.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/hci/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/hci/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/src/bt_hci_bdroid.c b/src/W800_SDK_v1.00.10/src/bt/host/hci/src/bt_hci_bdroid.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/src/bt_hci_bdroid.c rename to src/W800_SDK_v1.00.10/src/bt/host/hci/src/bt_hci_bdroid.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/src/hci_h4.c b/src/W800_SDK_v1.00.10/src/bt/host/hci/src/hci_h4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/src/hci_h4.c rename to src/W800_SDK_v1.00.10/src/bt/host/hci/src/hci_h4.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/hci/src/utils.c b/src/W800_SDK_v1.00.10/src/bt/host/hci/src/utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/hci/src/utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/hci/src/utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/audio_a2dp_hw.h b/src/W800_SDK_v1.00.10/src/bt/host/include/audio_a2dp_hw.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/audio_a2dp_hw.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/audio_a2dp_hw.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bdroid_buildcfg.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bdroid_buildcfg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bdroid_buildcfg.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bdroid_buildcfg.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bluetooth.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bluetooth.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bluetooth.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bluetooth.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_av.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_av.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_av.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_av.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_common.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_common.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_common.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_common.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_common_types.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_common_types.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_common_types.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_common_types.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_client.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_client.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_client.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_dm.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_dm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_dm.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_dm.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_server.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_server.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_server.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_types.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_types.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_gatt_types.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_gatt_types.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_hf.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_hf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_hf.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_hf.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_hf_client.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_hf_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_hf_client.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_hf_client.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_hh.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_hh.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_hh.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_hh.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_hl.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_hl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_hl.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_hl.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_mce.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_mce.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_mce.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_mce.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_pan.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_pan.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_pan.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_pan.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_rc.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_rc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_rc.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_rc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_sdp.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_sdp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_sdp.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_sdp.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_sock.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_sock.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_sock.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_sock.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_target.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_target.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_target.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_target.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_trace.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_trace.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_trace.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_trace.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bt_utils.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bt_utils.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bt_utils.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bt_utils.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bte.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bte.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bte.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bte.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/bte_appl.h b/src/W800_SDK_v1.00.10/src/bt/host/include/bte_appl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/bte_appl.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/bte_appl.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/generic.h b/src/W800_SDK_v1.00.10/src/bt/host/include/generic.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/generic.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/generic.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/gki_target.h b/src/W800_SDK_v1.00.10/src/bt/host/include/gki_target.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/gki_target.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/gki_target.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/gki_target_ble.h b/src/W800_SDK_v1.00.10/src/bt/host/include/gki_target_ble.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/gki_target_ble.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/gki_target_ble.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/include/stack_config.h b/src/W800_SDK_v1.00.10/src/bt/host/include/stack_config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/include/stack_config.h rename to src/W800_SDK_v1.00.10/src/bt/host/include/stack_config.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/main/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/main/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/bte_init.c b/src/W800_SDK_v1.00.10/src/bt/host/main/bte_init.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/bte_init.c rename to src/W800_SDK_v1.00.10/src/bt/host/main/bte_init.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/bte_logmsg.c b/src/W800_SDK_v1.00.10/src/bt/host/main/bte_logmsg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/bte_logmsg.c rename to src/W800_SDK_v1.00.10/src/bt/host/main/bte_logmsg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/bte_main.c b/src/W800_SDK_v1.00.10/src/bt/host/main/bte_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/bte_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/main/bte_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/wm_bt_storage.c b/src/W800_SDK_v1.00.10/src/bt/host/main/wm_bt_storage.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/wm_bt_storage.c rename to src/W800_SDK_v1.00.10/src/bt/host/main/wm_bt_storage.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/main/wm_bt_storage.h b/src/W800_SDK_v1.00.10/src/bt/host/main/wm_bt_storage.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/main/wm_bt_storage.h rename to src/W800_SDK_v1.00.10/src/bt/host/main/wm_bt_storage.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/osi/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/osi/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/alarm.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/alarm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/alarm.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/alarm.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/allocation_tracker.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/allocation_tracker.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/allocation_tracker.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/allocation_tracker.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/allocator.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/allocator.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/allocator.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/allocator.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/array.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/array.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/array.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/array.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/buffer.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/buffer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/buffer.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/buffer.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/compat.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/compat.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/compat.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/compat.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/config.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/config.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/config.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/config.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/data_dispatcher.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/data_dispatcher.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/data_dispatcher.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/data_dispatcher.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/eager_reader.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/eager_reader.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/eager_reader.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/eager_reader.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/fixed_queue.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/fixed_queue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/fixed_queue.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/fixed_queue.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/future.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/future.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/future.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/future.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_functions.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_functions.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_functions.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_functions.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_map.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_map.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_map.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_map.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_map_utils.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_map_utils.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/hash_map_utils.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/hash_map_utils.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/list.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/list.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/list.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/list.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/log.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/log.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/log.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/log.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/metrics.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/metrics.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/metrics.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/metrics.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/mutex.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/mutex.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/mutex.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/mutex.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/osi.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/osi.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/osi.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/osi.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/properties.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/properties.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/properties.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/properties.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/reactor.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/reactor.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/reactor.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/reactor.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/ringbuffer.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/ringbuffer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/ringbuffer.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/ringbuffer.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/semaphore.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/semaphore.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/semaphore.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/semaphore.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/socket.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/socket.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/socket_utils/socket_local.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket_utils/socket_local.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/socket_utils/socket_local.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket_utils/socket_local.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/socket_utils/sockets.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket_utils/sockets.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/socket_utils/sockets.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/socket_utils/sockets.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/thread.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/thread.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/thread.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/thread.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/include/wakelock.h b/src/W800_SDK_v1.00.10/src/bt/host/osi/include/wakelock.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/include/wakelock.h rename to src/W800_SDK_v1.00.10/src/bt/host/osi/include/wakelock.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/buffer.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/buffer.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/buffer.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/buffer.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/compat.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/compat.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/compat.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/compat.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/fixed_queue.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/fixed_queue.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/fixed_queue.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/fixed_queue.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/hash_map.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/hash_map.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/hash_map.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/hash_map.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/list.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/list.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/list.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/list.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/mutex.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/mutex.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/mutex.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/mutex.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/osi/src/ringbuffer.c b/src/W800_SDK_v1.00.10/src/bt/host/osi/src/ringbuffer.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/osi/src/ringbuffer.c rename to src/W800_SDK_v1.00.10/src/bt/host/osi/src/ringbuffer.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/a2d_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/a2d_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/a2d_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/a2d_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/a2d_sbc.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/a2d_sbc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/a2dp/a2d_sbc.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/a2dp/a2d_sbc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_ccb.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_ccb.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_ccb.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_ccb.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_l2c.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_l2c.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_l2c.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_l2c.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_lcb.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_lcb.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_lcb.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_lcb.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_lcb_act.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_lcb_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avct/avct_lcb_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avct/avct_lcb_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ad.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ad.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ad.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ad.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ccb.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ccb.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ccb.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ccb.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ccb_act.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ccb_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_ccb_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_ccb_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_l2c.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_l2c.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_l2c.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_l2c.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_msg.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_msg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_msg.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_msg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_scb.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_scb.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_scb.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_scb.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_scb_act.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_scb_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avdt/avdt_scb_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avdt/avdt_scb_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_bld_ct.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_bld_ct.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_bld_ct.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_bld_ct.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_bld_tg.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_bld_tg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_bld_tg.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_bld_tg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_opt.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_opt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_opt.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_opt.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_pars_ct.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_pars_ct.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_pars_ct.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_pars_ct.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_pars_tg.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_pars_tg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_pars_tg.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_pars_tg.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_sdp.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_sdp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_sdp.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_sdp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/avrc/avrc_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/avrc/avrc_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/bnep/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/bnep/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/bnep/bnep_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/bnep/bnep_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_acl.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_acl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_acl.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_acl.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_addr.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_addr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_addr.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_addr.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_adv_filter.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_adv_filter.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_adv_filter.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_adv_filter.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_batchscan.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_batchscan.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_batchscan.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_batchscan.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_bgconn.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_bgconn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_bgconn.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_bgconn.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_cont_energy.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_cont_energy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_cont_energy.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_cont_energy.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_gap.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_gap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_gap.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_gap.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_multi_adv.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_multi_adv.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_multi_adv.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_multi_adv.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_privacy.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_privacy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_ble_privacy.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_ble_privacy.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_dev.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_dev.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_dev.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_dev.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_devctl.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_devctl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_devctl.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_devctl.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_inq.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_inq.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_inq.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_inq.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_pm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_pm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_pm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_pm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_sco.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_sco.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_sco.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_sco.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_sec.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_sec.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btm/btm_sec.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btm/btm_sec.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btu/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/btu/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btu/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btu/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_hcif.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_hcif.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_hcif.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_hcif.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_init.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_init.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_init.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_init.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_task.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_task.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/btu/btu_task.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/btu/btu_task.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gap/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/gap/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gap/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gap/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_ble.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_ble.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_ble.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_ble.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_conn.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_conn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_conn.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_conn.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gap/gap_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gap/gap_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/att_protocol.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/att_protocol.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/att_protocol.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/att_protocol.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_attr.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_attr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_attr.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_attr.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_auth.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_auth.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_auth.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_auth.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_cl.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_cl.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_cl.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_cl.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_db.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_db.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_db.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_db.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_sr.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_sr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_sr.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_sr.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/gatt/gatt_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/gatt/gatt_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hcic/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hcic/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hcic/hciblecmds.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/hciblecmds.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hcic/hciblecmds.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/hciblecmds.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hcic/hcicmds.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/hcicmds.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hcic/hcicmds.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hcic/hcicmds.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hid/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/hid/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hid/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hid/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hid/hidh_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/hid/hidh_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hid/hidh_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hid/hidh_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/hid/hidh_conn.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/hid/hidh_conn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/hid/hidh_conn.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/hid/hidh_conn.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_sbc.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_sbc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/a2d_sbc.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/a2d_sbc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_defs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_defs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_defs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_defs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avct_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avct_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_defs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_defs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_defs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_defs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avdt_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdt_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avdtc_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdtc_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avdtc_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avdtc_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_defs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_defs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_defs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_defs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/avrc_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/avrc_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/bnep_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/bnep_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/bnep_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/bnep_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/bt_buffer_q.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/bt_buffer_q.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/bt_buffer_q.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/bt_buffer_q.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/bt_types.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/bt_types.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/bt_types.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/bt_types.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_ble_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_ble_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_ble_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_ble_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_ble_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_ble_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_ble_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_ble_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/btm_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/btm_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/btu.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/btu.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/btu.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/btu.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/dyn_mem.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/dyn_mem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/dyn_mem.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/dyn_mem.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/gap_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/gap_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/gap_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/gap_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/gap_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/gap_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/gap_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/gap_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/gatt_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/gatt_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/gatt_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/gatt_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/gatt_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/gatt_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/gatt_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/gatt_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/gattdefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/gattdefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/gattdefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/gattdefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hcidefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hcidefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hcidefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hcidefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hcimsgs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hcimsgs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hcimsgs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hcimsgs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hid_conn.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hid_conn.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hid_conn.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hid_conn.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hiddefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hiddefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hiddefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hiddefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hidh_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hidh_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hidh_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hidh_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/hidh_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/hidh_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/hidh_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/hidh_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/l2c_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2c_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/l2c_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2c_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/l2c_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2c_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/l2c_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2c_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/l2cap_client.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2cap_client.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/l2cap_client.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2cap_client.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/l2cdefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2cdefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/l2cdefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/l2cdefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_defs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_defs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_defs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_defs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/mca_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/mca_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/p_256_ecc_pp.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/p_256_ecc_pp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/p_256_ecc_pp.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/p_256_ecc_pp.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/p_256_multprecision.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/p_256_multprecision.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/p_256_multprecision.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/p_256_multprecision.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/pan_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/pan_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/pan_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/pan_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/pan_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/pan_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/pan_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/pan_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/port_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/port_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/port_ext.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_ext.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/port_ext.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_ext.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/port_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/port_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/port_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/profiles_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/profiles_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/profiles_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/profiles_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/rfc_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/rfc_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/rfc_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/rfc_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/rfcdefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/rfcdefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/rfcdefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/rfcdefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/sdp_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdp_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/sdp_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdp_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/sdpdefs.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdpdefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/sdpdefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdpdefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/sdpint.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdpint.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/sdpint.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/sdpint.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/smp_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/smp_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/smp_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/smp_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/smp_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/smp_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/smp_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/smp_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_api.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_api.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_battery_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_battery_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_battery_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_battery_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_dis_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_dis_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_dis_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_dis_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_eng_int.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_eng_int.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/include/srvc_eng_int.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/include/srvc_eng_int.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_ble.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_ble.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_ble.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_ble.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_csm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_csm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_csm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_csm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_fcr.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_fcr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_fcr.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_fcr.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_link.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_link.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_link.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_link.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_ucd.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_ucd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_ucd.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_ucd.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2c_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2c_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2cap_client.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2cap_client.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/l2cap/l2cap_client.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/l2cap/l2cap_client.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_cact.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_cact.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_cact.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_cact.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_csm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_csm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_csm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_csm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_dact.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_dact.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_dact.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_dact.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_dsm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_dsm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_dsm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_dsm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_l2c.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_l2c.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_l2c.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_l2c.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/mcap/mca_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/mcap/mca_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/pan/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/pan/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/pan/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/pan/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/pan/pan_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/pan/pan_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_rfc.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_rfc.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_rfc.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_rfc.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/port_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/port_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_l2cap_if.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_l2cap_if.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_l2cap_if.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_l2cap_if.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_mx_fsm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_mx_fsm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_mx_fsm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_mx_fsm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_port_fsm.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_port_fsm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_port_fsm.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_port_fsm.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_port_if.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_port_if.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_port_if.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_port_if.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_ts_frames.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_ts_frames.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_ts_frames.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_ts_frames.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/rfcomm/rfc_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/rfcomm/rfc_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_db.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_db.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_db.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_db.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_discovery.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_discovery.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_discovery.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_discovery.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_server.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_server.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_server.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/sdp/sdp_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/sdp/sdp_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/aes.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/aes.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/aes.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/aes.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/aes.h b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/aes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/aes.h rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/aes.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_curvepara.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_curvepara.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_curvepara.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_curvepara.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_ecc_pp.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_ecc_pp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_ecc_pp.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_ecc_pp.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_multprecision.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_multprecision.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/p_256_multprecision.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/p_256_multprecision.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_act.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_act.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_act.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_act.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_api.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_api.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_api.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_api.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_br_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_br_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_br_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_br_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_cmac.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_cmac.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_cmac.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_cmac.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_keys.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_keys.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_keys.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_keys.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_l2c.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_l2c.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_l2c.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_l2c.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_main.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_main.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_main.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_main.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_utils.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/smp/smp_utils.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/smp/smp_utils.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/srvc/Makefile b/src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/srvc/Makefile rename to src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/Makefile diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_battery.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_battery.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_battery.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_battery.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_dis.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_dis.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_dis.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_dis.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_eng.c b/src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_eng.c similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/stack/srvc/srvc_eng.c rename to src/W800_SDK_v1.00.10/src/bt/host/stack/srvc/srvc_eng.c diff --git a/src/W800 SDK v1.00.08/src/bt/host/udrv/include/uipc.h b/src/W800_SDK_v1.00.10/src/bt/host/udrv/include/uipc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/udrv/include/uipc.h rename to src/W800_SDK_v1.00.10/src/bt/host/udrv/include/uipc.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/udrv/ulinux/uipc_linux.h b/src/W800_SDK_v1.00.10/src/bt/host/udrv/ulinux/uipc_linux.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/udrv/ulinux/uipc_linux.h rename to src/W800_SDK_v1.00.10/src/bt/host/udrv/ulinux/uipc_linux.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/vnd/ble/vendor_hcidefs.h b/src/W800_SDK_v1.00.10/src/bt/host/vnd/ble/vendor_hcidefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/vnd/ble/vendor_hcidefs.h rename to src/W800_SDK_v1.00.10/src/bt/host/vnd/ble/vendor_hcidefs.h diff --git a/src/W800 SDK v1.00.08/src/bt/host/vnd/include/vendor_api.h b/src/W800_SDK_v1.00.10/src/bt/host/vnd/include/vendor_api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/bt/host/vnd/include/vendor_api.h rename to src/W800_SDK_v1.00.10/src/bt/host/vnd/include/vendor_api.h diff --git a/src/W800 SDK v1.00.08/src/network/Makefile b/src/W800_SDK_v1.00.10/src/network/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/Makefile rename to src/W800_SDK_v1.00.10/src/network/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/api2.0.3/Makefile b/src/W800_SDK_v1.00.10/src/network/api2.0.3/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/api2.0.3/Makefile rename to src/W800_SDK_v1.00.10/src/network/api2.0.3/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/api2.0.3/tls_netconn.c b/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/api2.0.3/tls_netconn.c rename to src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.c diff --git a/src/W800 SDK v1.00.08/src/network/api2.0.3/tls_netconn.h b/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/api2.0.3/tls_netconn.h rename to src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.h diff --git a/src/W800 SDK v1.00.08/src/network/api2.0.3/tls_sockets.c b/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/api2.0.3/tls_sockets.c rename to src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/FILES similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/FILES diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/Filelists.mk b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Filelists.mk similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/Filelists.mk rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Filelists.mk diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/api_lib.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_lib.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/api_lib.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_lib.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/api_msg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_msg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/api_msg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_msg.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/err.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/err.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/err.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/err.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netbuf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netbuf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netbuf.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netbuf.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netdb.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netdb.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netdb.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netdb.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netifapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netifapi.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/netifapi.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netifapi.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/pppapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/pppapi.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/sockets.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/sockets.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/tcpip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/tcpip.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/api/tcpip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/tcpip.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/404.html b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/404.html similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/404.html rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/404.html diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/index.html b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/index.html similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fs/index.html rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/index.html diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fsdata.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fsdata.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fsdata.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/fsdata.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/httpd.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/httpd.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/httpd_structs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/httpd_structs.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/mdns/mdns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mdns/mdns.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/mdns/mdns.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mdns/mdns.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/mqtt/mqtt.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mqtt/mqtt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/mqtt/mqtt.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mqtt/mqtt.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/README b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/README rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_core.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_core.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_snmp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_msg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_msg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_msg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_msg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_raw.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_raw.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_raw.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_raw.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_table.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_table.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_table.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_table.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_traps.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_traps.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmp_traps.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_traps.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/sntp/sntp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/sntp/sntp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/sntp/sntp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/sntp/sntp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/tftp/tftp_server.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/tftp/tftp_server.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/apps/tftp/tftp_server.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/tftp/tftp_server.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/alg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/alg.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/alg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/alg.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/def.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/def.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/def.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/def.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/dns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/dns.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/dns.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/dns.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/inet_chksum.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/inet_chksum.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/inet_chksum.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/inet_chksum.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/init.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/init.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/init.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/init.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ip.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ip.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/autoip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/autoip.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/autoip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/autoip.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/dhcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/dhcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/dhcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/dhcp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/etharp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/etharp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/etharp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/etharp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/icmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/icmp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/icmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/icmp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/igmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/igmp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/igmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/igmp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4_addr.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_addr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4_addr.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_addr.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_frag.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip4_frag.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_frag.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv4/ip_frag.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/dhcp6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/dhcp6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/dhcp6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/dhcp6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ethip6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ethip6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ethip6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ethip6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/icmp6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/icmp6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/icmp6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/icmp6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/inet6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/inet6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/inet6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/inet6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6_addr.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_addr.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6_addr.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_addr.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_frag.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/ip6_frag.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_frag.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/mld6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/mld6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/mld6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/mld6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/nd6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/nd6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/ipv6/nd6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/nd6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/mem.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/mem.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/mem.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/mem.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/memp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/memp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/memp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/memp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/netif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/netif.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/netif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/netif.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/pbuf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/pbuf.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/pbuf.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/pbuf.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/raw.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/raw.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/raw.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/raw.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/stats.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/stats.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/stats.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/stats.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/sys.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/sys.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/sys.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/sys.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp_in.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_in.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp_in.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_in.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp_out.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_out.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/tcp_out.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_out.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/timeouts.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timeouts.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/timeouts.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timeouts.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/timers.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/timers.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/udp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/udp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/core/udp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/udp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/cc.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/cc.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/cc.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/cc.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/perf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/perf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/perf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/perf.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/sys_arch.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/sys_arch.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/arch/sys_arch.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/sys_arch.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/alg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/alg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/alg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/alg.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/api.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/api.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/api.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/api.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/FILES similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/FILES diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/fs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/fs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/fs.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/fs.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/httpd.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/httpd.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mqtt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mqtt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/sntp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/sntp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/arch.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/arch.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/autoip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/autoip.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/autoip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/autoip.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/debug.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/debug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/debug.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/debug.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/def.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/def.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/def.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/def.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dhcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dhcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dhcp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dhcp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dns.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/dns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dns.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/err.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/err.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/err.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/err.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/errno.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/errno.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/errno.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/errno.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/etharp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/etharp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ethip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ethip6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ethip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ethip6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/icmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/icmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/icmp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/icmp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/igmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/igmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/igmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/igmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/inet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/inet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/inet_chksum.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet_chksum.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/inet_chksum.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet_chksum.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/init.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/init.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/init.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/init.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_addr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_addr.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_frag.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip4_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_frag.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_addr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_addr.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_frag.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip6_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_frag.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_addr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_addr.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_frag.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/ip_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_frag.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/lwipopts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/lwipopts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/lwipopts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/lwipopts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/mem.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mem.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/mem.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mem.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/memp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/memp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/memp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/memp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/mld6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mld6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/mld6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mld6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/nd6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/nd6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/nd6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/nd6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netbuf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netbuf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netbuf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netbuf.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netdb.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netdb.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netdb.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netdb.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netif.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netif.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netifapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netifapi.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/netifapi.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netifapi.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/opt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/opt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/opt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/opt.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/pbuf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pbuf.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/pbuf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pbuf.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/pppapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/pppapi.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/api_msg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/api_msg.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/api_msg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/api_msg.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/memp_std.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_std.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/memp_std.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_std.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/autoip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/autoip.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/autoip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/autoip.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/dhcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dhcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/dhcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dhcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/dns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dns.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/dns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dns.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/etharp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/etharp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ethernet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ethernet.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ethernet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ethernet.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/icmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/icmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/icmp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/icmp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/igmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/igmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/igmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/igmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip4.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/ip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/mld6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/mld6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/mld6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/mld6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/nd6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/nd6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/nd6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/nd6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/tcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/tcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/tcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/tcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/udp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/udp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/prot/udp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/udp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/raw.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/raw.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/raw.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/raw.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sio.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sio.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sio.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sio.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/snmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/snmp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/snmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/snmp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sockets.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sockets.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sockets.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sockets.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/stats.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/stats.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/stats.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/stats.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sys.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sys.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/sys.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sys.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/tcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/tcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/tcpip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcpip.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/tcpip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcpip.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/timeouts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timeouts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/timeouts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timeouts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/timers.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/timers.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/udp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/udp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/lwip/udp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/udp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/etharp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/etharp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ethernet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernet.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ethernet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernet.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ethernetif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernetif.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ethernetif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernetif.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/lowpan6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/lowpan6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/lowpan6_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/lowpan6_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ccp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ccp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ccp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ccp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap-new.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-new.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap-new.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-new.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/eap.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/eap.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eap.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ecp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ecp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ecp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ecp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/eui64.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eui64.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/eui64.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eui64.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/fsm.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/fsm.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/fsm.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/fsm.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ipcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ipcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/lcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/lcp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/lcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/lcp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/magic.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/magic.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/magic.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/magic.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/mppe.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/mppe.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/mppe.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/mppe.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppapi.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppapi.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppapi.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppoe.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppoe.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppoe.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppoe.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppos.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppos.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/pppos.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppos.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/upap.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/upap.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/upap.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/upap.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/vj.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/vj.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/ppp/vj.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/vj.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/slipif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/slipif.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/netif/slipif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/slipif.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/errno.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/errno.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/errno.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/errno.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/netdb.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/netdb.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/netdb.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/netdb.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/sys/socket.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/sys/socket.h similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/include/posix/sys/socket.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/sys/socket.h diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/FILES similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/FILES diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ethernet.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernet.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ethernet.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernet.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ethernetif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernetif.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ethernetif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernetif.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/lowpan6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/lowpan6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/auth.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/auth.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/auth.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/auth.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ccp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ccp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ccp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ccp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap-md5.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-md5.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap-md5.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-md5.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap-new.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-new.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap-new.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-new.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap_ms.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap_ms.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/chap_ms.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap_ms.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/demand.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/demand.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/demand.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/demand.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/eap.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/eap.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eap.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ecp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ecp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ecp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ecp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/eui64.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eui64.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/eui64.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eui64.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/fsm.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/fsm.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/fsm.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/fsm.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ipcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ipcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipcp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ipv6cp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipv6cp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ipv6cp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipv6cp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/lcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/lcp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/lcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/lcp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/magic.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/magic.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/magic.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/magic.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/mppe.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/mppe.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/mppe.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/mppe.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/multilink.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/multilink.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/multilink.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/multilink.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/README b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/README similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/README rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/README diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/des.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/des.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/des.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/des.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ppp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ppp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/ppp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ppp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppapi.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppapi.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppapi.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppcrypt.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppcrypt.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppcrypt.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppcrypt.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppoe.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppoe.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppoe.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppoe.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppol2tp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppol2tp.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppol2tp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppol2tp.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppos.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppos.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/pppos.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppos.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/upap.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/upap.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/upap.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/upap.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/utils.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/utils.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/utils.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/utils.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/vj.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/vj.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/ppp/vj.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/vj.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/slipif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/slipif.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/slipif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/slipif.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/wm_ethernet.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/wm_ethernet.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/netif/wm_ethernet.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/wm_ethernet.c diff --git a/src/W800 SDK v1.00.08/src/network/lwip2.0.3/sys_arch.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/sys_arch.c similarity index 100% rename from src/W800 SDK v1.00.08/src/network/lwip2.0.3/sys_arch.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.0.3/sys_arch.c diff --git a/src/W800 SDK v1.00.08/src/os/Makefile b/src/W800_SDK_v1.00.10/src/os/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/os/Makefile rename to src/W800_SDK_v1.00.10/src/os/Makefile diff --git a/src/W800 SDK v1.00.08/src/os/rtos/Makefile b/src/W800_SDK_v1.00.10/src/os/rtos/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/Makefile rename to src/W800_SDK_v1.00.10/src/os/rtos/Makefile diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/FreeRTOS.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/FreeRTOS.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/FreeRTOSConfig.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/FreeRTOSConfig.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/StackMacros.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/StackMacros.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/StackMacros.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/StackMacros.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/atomic.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/atomic.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/atomic.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/atomic.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/croutine.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/croutine.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/croutine.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/croutine.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/deprecated_definitions.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/deprecated_definitions.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/deprecated_definitions.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/deprecated_definitions.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/event_groups.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/event_groups.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/event_groups.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/event_groups.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/lexicon.txt b/src/W800_SDK_v1.00.10/src/os/rtos/include/lexicon.txt similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/lexicon.txt rename to src/W800_SDK_v1.00.10/src/os/rtos/include/lexicon.txt diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/list.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/list.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/list.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/list.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/message_buffer.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/message_buffer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/message_buffer.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/message_buffer.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/mpu_prototypes.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/mpu_prototypes.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/mpu_prototypes.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/mpu_prototypes.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/mpu_wrappers.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/mpu_wrappers.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/mpu_wrappers.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/mpu_wrappers.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/portable.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/portable.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/portable.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/portable.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/portmacro.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/portmacro.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/portmacro.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/portmacro.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/projdefs.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/projdefs.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/projdefs.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/projdefs.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/queue.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/queue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/queue.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/queue.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/rtoslist.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/rtoslist.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/rtoslist.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/rtoslist.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/rtosqueue.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/rtosqueue.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/rtosqueue.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/rtosqueue.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/rtostimers.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/rtostimers.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/rtostimers.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/rtostimers.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/semphr.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/semphr.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/semphr.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/semphr.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/stack_macros.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/stack_macros.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/stack_macros.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/stack_macros.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/stdint.readme b/src/W800_SDK_v1.00.10/src/os/rtos/include/stdint.readme similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/stdint.readme rename to src/W800_SDK_v1.00.10/src/os/rtos/include/stdint.readme diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/stream_buffer.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/stream_buffer.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/stream_buffer.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/stream_buffer.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/task.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/task.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/task.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/task.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/include/timers.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/timers.h similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/include/timers.h rename to src/W800_SDK_v1.00.10/src/os/rtos/include/timers.h diff --git a/src/W800 SDK v1.00.08/src/os/rtos/ports/Makefile b/src/W800_SDK_v1.00.10/src/os/rtos/ports/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/ports/Makefile rename to src/W800_SDK_v1.00.10/src/os/rtos/ports/Makefile diff --git a/src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/Makefile b/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/Makefile rename to src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/Makefile diff --git a/src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/cpu_task_sw.S b/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/cpu_task_sw.S similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/cpu_task_sw.S rename to src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/cpu_task_sw.S diff --git a/src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/port.c b/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/ports/xt804/port.c rename to src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/Makefile b/src/W800_SDK_v1.00.10/src/os/rtos/source/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/Makefile rename to src/W800_SDK_v1.00.10/src/os/rtos/source/Makefile diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/croutine.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/croutine.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/croutine.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/croutine.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/event_groups.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/event_groups.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/event_groups.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/event_groups.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/heap_2.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/heap_2.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/heap_2.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/heap_2.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/heap_3.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/heap_3.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/heap_3.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/heap_3.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/list.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/list.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/list.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/list.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/queue.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/queue.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/queue.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/queue.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/stream_buffer.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/stream_buffer.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/stream_buffer.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/stream_buffer.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/tasks.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/tasks.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/source/timers.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/timers.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/source/timers.c rename to src/W800_SDK_v1.00.10/src/os/rtos/source/timers.c diff --git a/src/W800 SDK v1.00.08/src/os/rtos/wm_osal_rtos.c b/src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c similarity index 100% rename from src/W800 SDK v1.00.08/src/os/rtos/wm_osal_rtos.c rename to src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c diff --git a/src/W800 SDK v1.00.08/tools/w800/.config b/src/W800_SDK_v1.00.10/tools/w800/.config similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/.config rename to src/W800_SDK_v1.00.10/tools/w800/.config diff --git a/src/W800 SDK v1.00.08/tools/w800/.config_backup b/src/W800_SDK_v1.00.10/tools/w800/.config_backup similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/.config_backup rename to src/W800_SDK_v1.00.10/tools/w800/.config_backup diff --git a/src/W800 SDK v1.00.08/tools/w800/README.md b/src/W800_SDK_v1.00.10/tools/w800/README.md similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/README.md rename to src/W800_SDK_v1.00.10/tools/w800/README.md diff --git a/src/W800 SDK v1.00.08/tools/w800/ca/cakey.pem b/src/W800_SDK_v1.00.10/tools/w800/ca/cakey.pem similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/ca/cakey.pem rename to src/W800_SDK_v1.00.10/tools/w800/ca/cakey.pem diff --git a/src/W800 SDK v1.00.08/tools/w800/ca/capub.pem b/src/W800_SDK_v1.00.10/tools/w800/ca/capub.pem similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/ca/capub.pem rename to src/W800_SDK_v1.00.10/tools/w800/ca/capub.pem diff --git a/src/W800 SDK v1.00.08/tools/w800/ca/capub_1.pem b/src/W800_SDK_v1.00.10/tools/w800/ca/capub_1.pem similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/ca/capub_1.pem rename to src/W800_SDK_v1.00.10/tools/w800/ca/capub_1.pem diff --git a/src/W800 SDK v1.00.08/tools/w800/ca/capub_1_N.dat b/src/W800_SDK_v1.00.10/tools/w800/ca/capub_1_N.dat similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/ca/capub_1_N.dat rename to src/W800_SDK_v1.00.10/tools/w800/ca/capub_1_N.dat diff --git a/src/W800 SDK v1.00.08/tools/w800/ca/key.txt b/src/W800_SDK_v1.00.10/tools/w800/ca/key.txt similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/ca/key.txt rename to src/W800_SDK_v1.00.10/tools/w800/ca/key.txt diff --git a/src/W800 SDK v1.00.08/tools/w800/conf.mk b/src/W800_SDK_v1.00.10/tools/w800/conf.mk similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/conf.mk rename to src/W800_SDK_v1.00.10/tools/w800/conf.mk diff --git a/src/W800 SDK v1.00.08/tools/w800/config/Makefile b/src/W800_SDK_v1.00.10/tools/w800/config/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/Makefile rename to src/W800_SDK_v1.00.10/tools/w800/config/Makefile diff --git a/src/W800 SDK v1.00.08/tools/w800/config/confdata.c b/src/W800_SDK_v1.00.10/tools/w800/config/confdata.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/confdata.c rename to src/W800_SDK_v1.00.10/tools/w800/config/confdata.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/expr.c b/src/W800_SDK_v1.00.10/tools/w800/config/expr.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/expr.c rename to src/W800_SDK_v1.00.10/tools/w800/config/expr.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/expr.h b/src/W800_SDK_v1.00.10/tools/w800/config/expr.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/expr.h rename to src/W800_SDK_v1.00.10/tools/w800/config/expr.h diff --git a/src/W800 SDK v1.00.08/tools/w800/config/images.c b/src/W800_SDK_v1.00.10/tools/w800/config/images.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/images.c rename to src/W800_SDK_v1.00.10/tools/w800/config/images.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/list.h b/src/W800_SDK_v1.00.10/tools/w800/config/list.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/list.h rename to src/W800_SDK_v1.00.10/tools/w800/config/list.h diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lkc.h b/src/W800_SDK_v1.00.10/tools/w800/config/lkc.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lkc.h rename to src/W800_SDK_v1.00.10/tools/w800/config/lkc.h diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lkc_proto.h b/src/W800_SDK_v1.00.10/tools/w800/config/lkc_proto.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lkc_proto.h rename to src/W800_SDK_v1.00.10/tools/w800/config/lkc_proto.h diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/checklist.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/checklist.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/checklist.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/checklist.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/dialog.h b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/dialog.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/dialog.h rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/dialog.h diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/inputbox.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/inputbox.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/inputbox.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/inputbox.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/menubox.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/menubox.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/menubox.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/menubox.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/textbox.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/textbox.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/textbox.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/textbox.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/util.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/util.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/util.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/util.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/lxdialog/yesno.c b/src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/yesno.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/lxdialog/yesno.c rename to src/W800_SDK_v1.00.10/tools/w800/config/lxdialog/yesno.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/mconf.c b/src/W800_SDK_v1.00.10/tools/w800/config/mconf.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/mconf.c rename to src/W800_SDK_v1.00.10/tools/w800/config/mconf.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/menu.c b/src/W800_SDK_v1.00.10/tools/w800/config/menu.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/menu.c rename to src/W800_SDK_v1.00.10/tools/w800/config/menu.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/symbol.c b/src/W800_SDK_v1.00.10/tools/w800/config/symbol.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/symbol.c rename to src/W800_SDK_v1.00.10/tools/w800/config/symbol.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/util.c b/src/W800_SDK_v1.00.10/tools/w800/config/util.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/util.c rename to src/W800_SDK_v1.00.10/tools/w800/config/util.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/zconf.gperf b/src/W800_SDK_v1.00.10/tools/w800/config/zconf.gperf similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/zconf.gperf rename to src/W800_SDK_v1.00.10/tools/w800/config/zconf.gperf diff --git a/src/W800 SDK v1.00.08/tools/w800/config/zconf.hash.c b/src/W800_SDK_v1.00.10/tools/w800/config/zconf.hash.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/zconf.hash.c rename to src/W800_SDK_v1.00.10/tools/w800/config/zconf.hash.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/zconf.lex.c b/src/W800_SDK_v1.00.10/tools/w800/config/zconf.lex.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/zconf.lex.c rename to src/W800_SDK_v1.00.10/tools/w800/config/zconf.lex.c diff --git a/src/W800 SDK v1.00.08/tools/w800/config/zconf.tab.c b/src/W800_SDK_v1.00.10/tools/w800/config/zconf.tab.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/config/zconf.tab.c rename to src/W800_SDK_v1.00.10/tools/w800/config/zconf.tab.c diff --git a/src/W800 SDK v1.00.08/tools/w800/inc.mk b/src/W800_SDK_v1.00.10/tools/w800/inc.mk similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/inc.mk rename to src/W800_SDK_v1.00.10/tools/w800/inc.mk diff --git a/src/W800 SDK v1.00.08/tools/w800/mconfig.sh b/src/W800_SDK_v1.00.10/tools/w800/mconfig.sh similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/mconfig.sh rename to src/W800_SDK_v1.00.10/tools/w800/mconfig.sh diff --git a/src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/CDK_WS.cdkws b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/CDK_WS.cdkws similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/CDK_WS.cdkws rename to src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/CDK_WS.cdkws diff --git a/src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj rename to src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj diff --git a/src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj rename to src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj diff --git a/src/W800 SDK v1.00.08/tools/w800/rules.mk b/src/W800_SDK_v1.00.10/tools/w800/rules.mk similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/rules.mk rename to src/W800_SDK_v1.00.10/tools/w800/rules.mk diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/W800_Flash_Tool.elf b/src/W800_SDK_v1.00.10/tools/w800/utilities/W800_Flash_Tool.elf similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/W800_Flash_Tool.elf rename to src/W800_SDK_v1.00.10/tools/w800/utilities/W800_Flash_Tool.elf diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/aft_build_project.sh b/src/W800_SDK_v1.00.10/tools/w800/utilities/aft_build_project.sh similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/aft_build_project.sh rename to src/W800_SDK_v1.00.10/tools/w800/utilities/aft_build_project.sh diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/cdk_aft_build.sh b/src/W800_SDK_v1.00.10/tools/w800/utilities/cdk_aft_build.sh similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/cdk_aft_build.sh rename to src/W800_SDK_v1.00.10/tools/w800/utilities/cdk_aft_build.sh diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/download.mk b/src/W800_SDK_v1.00.10/tools/w800/utilities/download.mk similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/download.mk rename to src/W800_SDK_v1.00.10/tools/w800/utilities/download.mk diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/flashinit b/src/W800_SDK_v1.00.10/tools/w800/utilities/flashinit similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/flashinit rename to src/W800_SDK_v1.00.10/tools/w800/utilities/flashinit diff --git a/src/W800 SDK v1.00.08/tools/w800/utilities/gdb.init b/src/W800_SDK_v1.00.10/tools/w800/utilities/gdb.init similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/utilities/gdb.init rename to src/W800_SDK_v1.00.10/tools/w800/utilities/gdb.init diff --git a/src/W800 SDK v1.00.08/tools/w800/w800_secboot.bin b/src/W800_SDK_v1.00.10/tools/w800/w800_secboot.bin similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/w800_secboot.bin rename to src/W800_SDK_v1.00.10/tools/w800/w800_secboot.bin diff --git a/src/W800 SDK v1.00.08/tools/w800/w800_secboot.img b/src/W800_SDK_v1.00.10/tools/w800/w800_secboot.img similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/w800_secboot.img rename to src/W800_SDK_v1.00.10/tools/w800/w800_secboot.img diff --git a/src/W800 SDK v1.00.08/tools/w800/wconfig b/src/W800_SDK_v1.00.10/tools/w800/wconfig similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/wconfig rename to src/W800_SDK_v1.00.10/tools/w800/wconfig diff --git a/src/W800 SDK v1.00.08/tools/w800/wm_getver.c b/src/W800_SDK_v1.00.10/tools/w800/wm_getver.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/wm_getver.c rename to src/W800_SDK_v1.00.10/tools/w800/wm_getver.c diff --git a/src/W800 SDK v1.00.08/tools/w800/wm_getver.exe b/src/W800_SDK_v1.00.10/tools/w800/wm_getver.exe similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/wm_getver.exe rename to src/W800_SDK_v1.00.10/tools/w800/wm_getver.exe diff --git a/src/W800 SDK v1.00.08/tools/w800/wm_tool.c b/src/W800_SDK_v1.00.10/tools/w800/wm_tool.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/wm_tool.c rename to src/W800_SDK_v1.00.10/tools/w800/wm_tool.c diff --git a/src/W800 SDK v1.00.08/tools/w800/wm_tool.exe b/src/W800_SDK_v1.00.10/tools/w800/wm_tool.exe similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/wm_tool.exe rename to src/W800_SDK_v1.00.10/tools/w800/wm_tool.exe diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/Makefile b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/Makefile similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/Makefile rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/Makefile diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/adler32.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/adler32.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/adler32.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/adler32.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/configure b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/configure similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/configure rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/configure diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/crc32.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/crc32.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/crc32.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/crc32.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/crc32.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/crc32.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/crc32.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/crc32.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/deflate.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/deflate.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/deflate.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/deflate.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/deflate.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/deflate.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/deflate.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/deflate.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzclose.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzclose.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzclose.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzclose.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzguts.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzguts.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzguts.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzguts.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzlib.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzlib.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzlib.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzlib.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzwrite.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzwrite.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/gzwrite.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/gzwrite.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/minigzip.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/minigzip.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/minigzip.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/minigzip.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/trees.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/trees.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/trees.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/trees.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/trees.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/trees.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/trees.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/trees.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zconf.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zconf.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zconf.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zconf.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.3.pdf b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.3.pdf similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.3.pdf rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.3.pdf diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.h diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.pc b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.pc similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zlib.pc rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zlib.pc diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zutil.c b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zutil.c similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zutil.c rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zutil.c diff --git a/src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zutil.h b/src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zutil.h similarity index 100% rename from src/W800 SDK v1.00.08/tools/w800/zlib-1.2.11/zutil.h rename to src/W800_SDK_v1.00.10/tools/w800/zlib-1.2.11/zutil.h From 1c6b25a74baf4d6b476e6cd212d8deae1ad003ab Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 19 Feb 2023 16:24:35 +0100 Subject: [PATCH 2/5] SDK V1.00.10 uses Lwip version 2.1.3 --- src/W800_SDK_v1.00.10/include/app/wm_netif.h | 2 +- .../include/app/wm_netif2.0.3.h | 437 -- .../include/app/wm_wifi_oneshot.h | 4 +- src/W800_SDK_v1.00.10/include/net/wm_socket.h | 2 +- .../{wm_socket2.0.3.h => wm_socket2.1.3.h} | 187 +- .../include/net/wm_sockets.h | 2 +- .../include/net/wm_sockets2.0.3.h | 1179 ---- .../include/net/wm_sockets2.1.3.h | 26 + .../src/network/api2.0.3/tls_sockets.c | 122 - .../src/network/{api2.0.3 => api_wm}/Makefile | 0 .../{api2.0.3 => api_wm}/tls_netconn.c | 11 +- .../{api2.0.3 => api_wm}/tls_netconn.h | 0 .../src/network/lwip2.0.3/api/pppapi.c | 370 -- .../src/network/lwip2.0.3/api/sockets.c | 2846 --------- .../lwip2.0.3/apps/httpd/httpd_structs.h | 114 - .../network/lwip2.0.3/apps/lwiperf/lwiperf.c | 661 --- .../lwip2.0.3/apps/netbiosns/netbiosns.c | 367 -- .../CCodeGeneration/CCodeGeneration.csproj | 67 - .../LwipMibCompiler/CCodeGeneration/CFile.cs | 54 - .../CCodeGeneration/CGenerator.cs | 119 - .../LwipMibCompiler/CCodeGeneration/Code.cs | 56 - .../CCodeGeneration/CodeContainerBase.cs | 139 - .../CCodeGeneration/Comment.cs | 75 - .../CCodeGeneration/EmptyLine.cs | 64 - .../CCodeGeneration/Function.cs | 129 - .../CCodeGeneration/FunctionDeclaration.cs | 114 - .../CCodeGeneration/IfThenElse.cs | 137 - .../LwipMibCompiler/CCodeGeneration/PP_If.cs | 67 - .../CCodeGeneration/PP_Ifdef.cs | 76 - .../CCodeGeneration/PP_Include.cs | 71 - .../CCodeGeneration/PlainText.cs | 49 - .../Properties/AssemblyInfo.cs | 36 - .../LwipMibCompiler/CCodeGeneration/Switch.cs | 146 - .../CCodeGeneration/VariableDeclaration.cs | 82 - .../CCodeGeneration/VariableType.cs | 130 - .../snmp/LwipMibCompiler/LwipMibCompiler.sln | 47 - .../LwipMibCompiler/LwipMibCompiler.csproj | 73 - .../LwipMibCompiler/Program.cs | 477 -- .../Properties/AssemblyInfo.cs | 36 - .../LwipMibCompiler/app.config | 3 - .../LwipMibViewer/FormMain.Designer.cs | 166 - .../LwipMibCompiler/LwipMibViewer/FormMain.cs | 217 - .../LwipMibViewer/FormMain.resx | 298 - .../LwipMibViewer/LwipMibViewer.csproj | 94 - .../LwipMibCompiler/LwipMibViewer/Program.cs | 51 - .../LwipMibViewer/Properties/AssemblyInfo.cs | 36 - .../Properties/Resources.Designer.cs | 63 - .../LwipMibViewer/Properties/Resources.resx | 117 - .../Properties/Settings.Designer.cs | 26 - .../Properties/Settings.settings | 7 - .../LwipMibCompiler/LwipMibViewer/app.config | 3 - .../LwipSnmpCodeGeneration/IRestriction.cs | 120 - .../LwipSnmpCodeGeneration/LwipSnmp.cs | 199 - .../LwipSnmpCodeGeneration.csproj | 72 - .../LwipSnmpCodeGeneration/MibCFile.cs | 196 - .../LwipSnmpCodeGeneration/MibHeaderFile.cs | 129 - .../Properties/AssemblyInfo.cs | 36 - .../LwipSnmpCodeGeneration/SnmpMib.cs | 97 - .../LwipSnmpCodeGeneration/SnmpNode.cs | 119 - .../SnmpScalarAggregationNode.cs | 293 - .../SnmpScalarArrayNode.cs | 105 - .../LwipSnmpCodeGeneration/SnmpScalarNode.cs | 395 -- .../SnmpScalarNodeBits.cs | 121 - .../SnmpScalarNodeCounter64.cs | 72 - .../SnmpScalarNodeInt.cs | 86 - .../SnmpScalarNodeObjectIdentifier.cs | 90 - .../SnmpScalarNodeOctetString.cs | 118 - .../SnmpScalarNodeTruthValue.cs | 66 - .../SnmpScalarNodeUint.cs | 91 - .../LwipSnmpCodeGeneration/SnmpTableNode.cs | 332 -- .../LwipSnmpCodeGeneration/SnmpTreeNode.cs | 241 - .../Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB | 131 - .../LwipMibCompiler/Mibs/IANA-CHARSET-MIB | 345 -- .../Mibs/IANA/IANA-ITU-ALARM-TC-MIB | 333 -- .../Mibs/IANA/IANA-LANGUAGE-MIB | 127 - .../LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB | 67 - .../LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB | 770 --- .../Mibs/IANA/IANA-PRINTER-MIB | 1319 ----- .../Mibs/IANA/IANA-RTPROTO-MIB | 92 - .../Mibs/IANA/IANATn3270eTC-MIB | 306 - .../LwipMibCompiler/Mibs/IANA/IANAifType-MIB | 572 -- .../apps/snmp/LwipMibCompiler/Mibs/IF-MIB | 1899 ------ .../LwipMibCompiler/Mibs/INET-ADDRESS-MIB | 421 -- .../apps/snmp/LwipMibCompiler/Mibs/IP-MIB | 5254 ----------------- .../apps/snmp/LwipMibCompiler/Mibs/RFC-1212 | 75 - .../apps/snmp/LwipMibCompiler/Mibs/RFC-1215 | 34 - .../snmp/LwipMibCompiler/Mibs/RFC1065-SMI | 132 - .../snmp/LwipMibCompiler/Mibs/RFC1155-SMI | 129 - .../snmp/LwipMibCompiler/Mibs/RFC1158-MIB | 1493 ----- .../snmp/LwipMibCompiler/Mibs/RFC1213-MIB | 2621 -------- .../snmp/LwipMibCompiler/Mibs/SNMPv2-CONF | 318 - .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB | 903 --- .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI | 352 -- .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC | 786 --- .../apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM | 194 - .../apps/snmp/LwipMibCompiler/Mibs/TCP-MIB | 829 --- .../apps/snmp/LwipMibCompiler/Mibs/UDP-MIB | 579 -- .../SharpSnmpLib/Mib/DisplayHint.cs | 84 - .../Elements/Entities/AgentCapabilities.cs | 29 - .../Mib/Elements/Entities/EntityBase.cs | 46 - .../Mib/Elements/Entities/IEntity.cs | 62 - .../Mib/Elements/Entities/ModuleCompliance.cs | 23 - .../Mib/Elements/Entities/ModuleIdentity.cs | 10 - .../Elements/Entities/NotificationGroup.cs | 22 - .../Mib/Elements/Entities/NotificationType.cs | 11 - .../Mib/Elements/Entities/ObjectGroup.cs | 22 - .../Mib/Elements/Entities/ObjectIdentity.cs | 21 - .../Mib/Elements/Entities/ObjectType.cs | 336 -- .../Elements/Entities/OidValueAssignment.cs | 30 - .../SharpSnmpLib/Mib/Elements/Exports.cs | 56 - .../SharpSnmpLib/Mib/Elements/IDeclaration.cs | 18 - .../SharpSnmpLib/Mib/Elements/IElement.cs | 35 - .../Mib/Elements/ITypeReferrer.cs | 10 - .../SharpSnmpLib/Mib/Elements/Imports.cs | 81 - .../SharpSnmpLib/Mib/Elements/ImportsFrom.cs | 60 - .../SharpSnmpLib/Mib/Elements/TrapType.cs | 48 - .../Mib/Elements/Types/BaseType.cs | 54 - .../Mib/Elements/Types/BitsType.cs | 26 - .../SharpSnmpLib/Mib/Elements/Types/Choice.cs | 35 - .../Mib/Elements/Types/ITypeAssignment.cs | 6 - .../Mib/Elements/Types/IntegerType.cs | 117 - .../Mib/Elements/Types/IpAddressType.cs | 21 - .../SharpSnmpLib/Mib/Elements/Types/Macro.cs | 34 - .../Elements/Types/ObjectIdentifierType.cs | 11 - .../Mib/Elements/Types/OctetStringType.cs | 31 - .../Mib/Elements/Types/OpaqueType.cs | 11 - .../Mib/Elements/Types/Sequence.cs | 46 - .../Mib/Elements/Types/SequenceOf.cs | 23 - .../Mib/Elements/Types/TextualConvention.cs | 238 - .../Mib/Elements/Types/TypeAssignment.cs | 147 - .../Mib/Elements/Types/UnsignedType.cs | 103 - .../SharpSnmpLib/Mib/IModule.cs | 81 - .../SharpSnmpLib/Mib/ISymbolEnumerator.cs | 9 - .../LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs | 581 -- .../SharpSnmpLib/Mib/MaxAccess.cs | 17 - .../SharpSnmpLib/Mib/MibDocument.cs | 57 - .../SharpSnmpLib/Mib/MibException.cs | 113 - .../SharpSnmpLib/Mib/MibModule.cs | 294 - .../SharpSnmpLib/Mib/MibResolver.cs | 97 - .../SharpSnmpLib/Mib/MibTree.cs | 105 - .../SharpSnmpLib/Mib/MibTreeNode.cs | 112 - .../SharpSnmpLib/Mib/MibTypesResolver.cs | 216 - .../SharpSnmpLib/Mib/ObjectIdentifier.cs | 54 - .../SharpSnmpLib/Mib/Status.cs | 17 - .../SharpSnmpLib/Mib/Symbol.cs | 357 -- .../SharpSnmpLib/Mib/SymbolList.cs | 146 - .../SharpSnmpLib/Mib/ValueMap.cs | 103 - .../SharpSnmpLib/Mib/ValueRange.cs | 76 - .../SharpSnmpLib/Properties/AssemblyInfo.cs | 61 - .../Properties/Resources.Designer.cs | 63 - .../SharpSnmpLib/Properties/Resources.resx | 120 - .../SharpSnmpLib/SharpSnmpLib.Mib.csproj | 139 - .../LwipMibCompiler/SharpSnmpLib/license.txt | 458 -- .../SharpSnmpLib/sharpsnmplib.snk | Bin 596 -> 0 bytes .../example/compile_udp_mib.sh | 1 - .../src/network/lwip2.0.3/apps/snmp/README | 38 - .../lwip2.0.3/apps/snmp/snmpv3_dummy.c | 145 - .../src/network/lwip2.0.3/core/ipv4/ip_frag.c | 897 --- .../src/network/lwip2.0.3/core/timers.c | 572 -- .../src/network/lwip2.0.3/include/lwip/arch.h | 315 - .../network/lwip2.0.3/include/lwip/pppapi.h | 151 - .../network/lwip2.0.3/include/lwip/timers.h | 106 - .../src/network/lwip2.0.3/netif/lowpan6.c | 1193 ---- .../lwip2.0.3/netif/ppp/polarssl/Makefile | 13 - .../network/{lwip2.0.3 => lwip2.1.3}/FILES | 0 .../src/network/lwip2.1.3/Filelists.cmake | 279 + .../{lwip2.0.3 => lwip2.1.3}/Filelists.mk | 42 +- .../network/{lwip2.0.3 => lwip2.1.3}/Makefile | 0 .../{lwip2.0.3 => lwip2.1.3}/api/Makefile | 4 - .../{lwip2.0.3 => lwip2.1.3}/api/api_lib.c | 673 ++- .../{lwip2.0.3 => lwip2.1.3}/api/api_msg.c | 1185 ++-- .../{lwip2.0.3 => lwip2.1.3}/api/err.c | 38 +- .../src/network/lwip2.1.3/api/if_api.c | 102 + .../{lwip2.0.3 => lwip2.1.3}/api/netbuf.c | 10 +- .../{lwip2.0.3 => lwip2.1.3}/api/netdb.c | 54 +- .../{lwip2.0.3 => lwip2.1.3}/api/netifapi.c | 179 +- .../src/network/lwip2.1.3/api/sockets.c | 4166 +++++++++++++ .../{lwip2.0.3 => lwip2.1.3}/api/tcpip.c | 246 +- .../apps/altcp_tls/altcp_tls_mbedtls.c | 1270 ++++ .../apps/altcp_tls/altcp_tls_mbedtls_mem.c | 210 + .../apps/altcp_tls/altcp_tls_mbedtls_mem.h} | 48 +- .../altcp_tls/altcp_tls_mbedtls_structs.h | 83 + .../lwip2.1.3/apps/http/altcp_proxyconnect.c | 584 ++ .../apps/httpd => lwip2.1.3/apps/http}/fs.c | 43 +- .../httpd => lwip2.1.3/apps/http}/fs/404.html | 0 .../apps/http}/fs/img/sics.gif | Bin .../apps/http}/fs/index.html | 0 .../httpd => lwip2.1.3/apps/http}/fsdata.c | 101 +- .../httpd => lwip2.1.3/apps/http}/fsdata.h | 41 +- .../network/lwip2.1.3/apps/http/http_client.c | 909 +++ .../httpd => lwip2.1.3/apps/http}/httpd.c | 849 +-- .../lwip2.1.3/apps/http/httpd_structs.h | 123 + .../apps/http}/makefsdata/makefsdata | 0 .../apps/http}/makefsdata/makefsdata.c | 654 +- .../apps/http}/makefsdata/readme.txt | 0 .../lwip2.1.3/apps/http/makefsdata/tinydir.h | 808 +++ .../network/lwip2.1.3/apps/lwiperf/lwiperf.c | 841 +++ .../{lwip2.0.3 => lwip2.1.3}/apps/mdns/mdns.c | 671 ++- .../{lwip2.0.3 => lwip2.1.3}/apps/mqtt/mqtt.c | 402 +- .../lwip2.1.3/apps/netbiosns/netbiosns.c | 533 ++ .../src/network/lwip2.1.3/apps/smtp/smtp.c | 1555 +++++ .../apps/snmp/snmp_asn1.c | 273 +- .../apps/snmp/snmp_asn1.h | 33 +- .../apps/snmp/snmp_core.c | 230 +- .../apps/snmp/snmp_core_priv.h | 17 +- .../apps/snmp/snmp_mib2.c | 6 +- .../apps/snmp/snmp_mib2_icmp.c | 164 +- .../apps/snmp/snmp_mib2_interfaces.c | 259 +- .../apps/snmp/snmp_mib2_ip.c | 462 +- .../apps/snmp/snmp_mib2_snmp.c | 200 +- .../apps/snmp/snmp_mib2_system.c | 159 +- .../apps/snmp/snmp_mib2_tcp.c | 251 +- .../apps/snmp/snmp_mib2_udp.c | 143 +- .../apps/snmp/snmp_msg.c | 597 +- .../apps/snmp/snmp_msg.h | 37 +- .../apps/snmp/snmp_netconn.c | 26 +- .../apps/snmp/snmp_pbuf_stream.c | 18 +- .../apps/snmp/snmp_pbuf_stream.h | 19 +- .../apps/snmp/snmp_raw.c | 19 +- .../apps/snmp/snmp_scalar.c | 72 +- .../apps/snmp/snmp_snmpv2_framework.c | 90 + .../lwip2.1.3/apps/snmp/snmp_snmpv2_usm.c | 410 ++ .../apps/snmp/snmp_table.c | 79 +- .../apps/snmp/snmp_threadsync.c | 76 +- .../apps/snmp/snmp_traps.c | 81 +- .../apps/snmp/snmpv3.c | 8 +- .../apps/snmp/snmpv3_mbedtls.c | 91 +- .../apps/snmp/snmpv3_priv.h | 21 +- .../{lwip2.0.3 => lwip2.1.3}/apps/sntp/sntp.c | 412 +- .../apps/tftp/tftp_server.c | 130 +- .../{lwip2.0.3 => lwip2.1.3}/core/Makefile | 4 - .../{lwip2.0.3 => lwip2.1.3}/core/alg.c | 0 .../src/network/lwip2.1.3/core/altcp.c | 717 +++ .../src/network/lwip2.1.3/core/altcp_alloc.c | 87 + .../src/network/lwip2.1.3/core/altcp_tcp.c | 577 ++ .../{lwip2.0.3 => lwip2.1.3}/core/def.c | 72 +- .../{lwip2.0.3 => lwip2.1.3}/core/dns.c | 220 +- .../core/inet_chksum.c | 71 +- .../{lwip2.0.3 => lwip2.1.3}/core/init.c | 159 +- .../{lwip2.0.3 => lwip2.1.3}/core/ip.c | 53 +- .../core/ipv4/Makefile | 4 - .../core/ipv4/autoip.c | 152 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv4/dhcp.c | 1016 ++-- .../core/ipv4/etharp.c | 312 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv4/icmp.c | 327 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv4/igmp.c | 223 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv4/ip4.c | 403 +- .../core/ipv4/ip4_addr.c | 108 +- .../core/ipv4/ip4_frag.c | 184 +- .../core/ipv6/Makefile | 0 .../src/network/lwip2.1.3/core/ipv6/dhcp6.c | 821 +++ .../core/ipv6/ethip6.c | 5 + .../core/ipv6/icmp6.c | 198 +- .../core/ipv6/inet6.c | 0 .../{lwip2.0.3 => lwip2.1.3}/core/ipv6/ip6.c | 828 ++- .../core/ipv6/ip6_addr.c | 95 +- .../core/ipv6/ip6_frag.c | 259 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv6/mld6.c | 100 +- .../{lwip2.0.3 => lwip2.1.3}/core/ipv6/nd6.c | 900 ++- .../{lwip2.0.3 => lwip2.1.3}/core/mem.c | 439 +- .../{lwip2.0.3 => lwip2.1.3}/core/memp.c | 125 +- .../{lwip2.0.3 => lwip2.1.3}/core/netif.c | 1118 +++- .../{lwip2.0.3 => lwip2.1.3}/core/pbuf.c | 872 +-- .../{lwip2.0.3 => lwip2.1.3}/core/raw.c | 294 +- .../{lwip2.0.3 => lwip2.1.3}/core/stats.c | 30 +- .../{lwip2.0.3 => lwip2.1.3}/core/sys.c | 45 +- .../{lwip2.0.3 => lwip2.1.3}/core/tcp.c | 1186 ++-- .../{lwip2.0.3 => lwip2.1.3}/core/tcp_in.c | 1299 ++-- .../{lwip2.0.3 => lwip2.1.3}/core/tcp_out.c | 1383 +++-- .../{lwip2.0.3 => lwip2.1.3}/core/timeouts.c | 344 +- .../{lwip2.0.3 => lwip2.1.3}/core/udp.c | 414 +- .../include/arch/cc.h | 0 .../include/arch/perf.h | 0 .../include/arch/sys_arch.h | 0 .../include/compat/posix/arpa/inet.h} | 0 .../include/compat/posix/net/if.h} | 42 +- .../include/compat}/posix/netdb.h | 0 .../include/compat/posix/sys/socket.h} | 22 +- .../include/compat/stdc}/errno.h | 2 +- .../include/lwip/alg.h | 0 .../network/lwip2.1.3/include/lwip/altcp.h | 206 + .../lwip2.1.3/include/lwip/altcp_tcp.h | 72 + .../lwip2.1.3/include/lwip/altcp_tls.h | 143 + .../include/lwip/api.h | 85 +- .../include/lwip/apps/FILES | 0 .../include/lwip/apps/altcp_proxyconnect.h | 79 + .../lwip/apps/altcp_tls_mbedtls_opts.h | 105 + .../include/lwip/apps/fs.h | 25 +- .../lwip2.1.3/include/lwip/apps/http_client.h | 160 + .../include/lwip/apps/httpd.h | 69 +- .../include/lwip/apps/httpd_opts.h | 99 +- .../include/lwip/apps/lwiperf.h | 18 +- .../include/lwip/apps/mdns.h | 46 +- .../include/lwip/apps/mdns_opts.h | 7 + .../include/lwip/apps/mdns_priv.h | 8 + .../include/lwip/apps/mqtt.h | 99 +- .../include/lwip/apps/mqtt_opts.h | 2 +- .../lwip2.1.3/include/lwip/apps/mqtt_priv.h | 104 + .../include/lwip/apps/netbiosns.h | 8 + .../include/lwip/apps/netbiosns_opts.h | 7 + .../lwip2.1.3/include/lwip/apps/smtp.h | 128 + .../lwip2.1.3/include/lwip/apps/smtp_opts.h | 81 + .../include/lwip/apps/snmp.h | 7 + .../include/lwip/apps/snmp_core.h | 19 +- .../include/lwip/apps/snmp_mib2.h | 0 .../include/lwip/apps/snmp_opts.h | 16 +- .../include/lwip/apps/snmp_scalar.h | 0 .../include/lwip/apps/snmp_snmpv2_framework.h | 32 + .../include/lwip/apps/snmp_snmpv2_usm.h | 24 + .../include/lwip/apps/snmp_table.h | 0 .../include/lwip/apps/snmp_threadsync.h | 0 .../include/lwip/apps/snmpv3.h | 46 +- .../include/lwip/apps/sntp.h | 14 +- .../include/lwip/apps/sntp_opts.h | 70 +- .../include/lwip/apps/tftp_opts.h | 11 +- .../include/lwip/apps/tftp_server.h | 5 +- .../src/network/lwip2.1.3/include/lwip/arch.h | 404 ++ .../include/lwip/autoip.h | 0 .../include/lwip/debug.h | 13 +- .../include/lwip/def.h | 57 +- .../include/lwip/dhcp.h | 8 +- .../network/lwip2.1.3/include/lwip/dhcp6.h | 104 + .../include/lwip/dns.h | 1 + .../include/lwip/err.h | 18 +- .../include/lwip/errno.h | 7 +- .../include/lwip/etharp.h | 39 +- .../include/lwip/ethip6.h | 0 .../include/lwip/icmp.h | 0 .../include/lwip/icmp6.h | 4 +- .../include/lwip/if_api.h} | 54 +- .../include/lwip/igmp.h | 0 .../include/lwip/inet.h | 17 +- .../include/lwip/inet_chksum.h | 2 +- .../include/lwip/init.h | 6 +- .../lwip2.1.3/include/lwip/init.h.cmake.in | 100 + .../include/lwip/ip.h | 77 +- .../include/lwip/ip4.h | 10 +- .../include/lwip/ip4_addr.h | 65 +- .../include/lwip/ip4_frag.h | 0 .../include/lwip/ip6.h | 6 +- .../include/lwip/ip6_addr.h | 103 +- .../include/lwip/ip6_frag.h | 50 +- .../network/lwip2.1.3/include/lwip/ip6_zone.h | 304 + .../include/lwip/ip_addr.h | 86 +- .../include/lwip/mem.h | 1 - .../include/lwip/memp.h | 2 +- .../include/lwip/mld6.h | 0 .../include/lwip/nd6.h | 7 +- .../include/lwip/netbuf.h | 2 - .../include/lwip/netdb.h | 3 - .../include/lwip/netif.h | 251 +- .../include/lwip/netifapi.h | 113 +- .../include/lwip/opt.h | 859 ++- .../include/lwip/pbuf.h | 101 +- .../lwip2.1.3/include/lwip/priv/altcp_priv.h | 159 + .../include/lwip/priv/api_msg.h | 80 +- .../lwip2.1.3/include/lwip/priv/mem_priv.h | 84 + .../include/lwip/priv/memp_priv.h | 30 +- .../include/lwip/priv/memp_std.h | 17 +- .../include/lwip/priv/nd6_priv.h | 16 +- .../include/lwip/priv/raw_priv.h} | 58 +- .../include/lwip/priv/sockets_priv.h | 175 + .../include/lwip/priv/tcp_priv.h | 74 +- .../include/lwip/priv/tcpip_priv.h | 14 +- .../include/lwip/prot/autoip.h | 0 .../include/lwip/prot/dhcp.h | 7 +- .../lwip2.1.3/include/lwip/prot/dhcp6.h | 138 + .../include/lwip/prot/dns.h | 0 .../include/lwip/prot/etharp.h | 41 +- .../include/lwip/prot/ethernet.h | 55 +- .../lwip2.1.3/include/lwip/prot/iana.h | 97 + .../include/lwip/prot/icmp.h | 0 .../include/lwip/prot/icmp6.h | 2 + .../lwip2.1.3/include/lwip/prot/ieee.h | 91 + .../include/lwip/prot/igmp.h | 2 +- .../include/lwip/prot/ip.h | 8 + .../include/lwip/prot/ip4.h | 4 + .../include/lwip/prot/ip6.h | 128 +- .../include/lwip/prot/mld6.h | 1 + .../include/lwip/prot/nd6.h | 9 +- .../include/lwip/prot/tcp.h | 5 +- .../include/lwip/prot/udp.h | 0 .../include/lwip/raw.h | 33 +- .../include/lwip/sio.h | 0 .../include/lwip/snmp.h | 0 .../include/lwip/sockets.h | 302 +- .../include/lwip/stats.h | 12 +- .../include/lwip/sys.h | 153 +- .../include/lwip/tcp.h | 142 +- .../include/lwip/tcpbase.h} | 83 +- .../include/lwip/tcpip.h | 19 +- .../include/lwip/timeouts.h | 33 +- .../include/lwip/udp.h | 25 +- .../lwip => lwip2.1.3/include}/lwipopts.h | 20 +- .../lwip2.1.3/include/netif/bridgeif.h | 127 + .../lwip2.1.3/include/netif/bridgeif_opts.h | 90 + .../include/netif/etharp.h | 0 .../include/netif/ethernet.h | 1 + .../include/netif/ethernetif.h | 0 .../lwip2.1.3/include/netif/ieee802154.h | 112 + .../include/netif/lowpan6.h | 11 +- .../include/netif/lowpan6_ble.h} | 87 +- .../lwip2.1.3/include/netif/lowpan6_common.h | 82 + .../lwip2.1.3/include/netif/lowpan6_opts.h | 122 + .../include/netif/ppp/ccp.h | 8 + .../include/netif/ppp/chap-md5.h | 0 .../include/netif/ppp/chap-new.h | 8 + .../include/netif/ppp/chap_ms.h | 0 .../include/netif/ppp/eap.h | 0 .../include/netif/ppp/ecp.h | 12 + .../include/netif/ppp/eui64.h | 8 + .../include/netif/ppp/fsm.h | 7 + .../include/netif/ppp/ipcp.h | 8 + .../include/netif/ppp/ipv6cp.h | 8 + .../include/netif/ppp/lcp.h | 8 + .../include/netif/ppp/magic.h | 8 + .../include/netif/ppp/mppe.h | 8 + .../include/netif/ppp/polarssl/arc4.h | 0 .../include/netif/ppp/polarssl/des.h | 0 .../include/netif/ppp/polarssl/md4.h | 0 .../include/netif/ppp/polarssl/md5.h | 0 .../include/netif/ppp/polarssl/sha1.h | 0 .../include/netif/ppp/ppp.h | 8 + .../include/netif/ppp/ppp_impl.h | 99 +- .../include/netif/ppp/ppp_opts.h | 28 +- .../include/netif/ppp/pppapi.h | 0 .../include/netif/ppp/pppcrypt.h | 8 + .../include/netif/ppp/pppdebug.h | 8 + .../include/netif/ppp/pppoe.h | 16 +- .../include/netif/ppp/pppol2tp.h | 10 +- .../include/netif/ppp/pppos.h | 8 + .../include/netif/ppp/upap.h | 8 + .../include/netif/ppp/vj.h | 8 + .../include/netif/slipif.h | 0 .../network/lwip2.1.3/include/netif/zepif.h | 81 + .../{lwip2.0.3 => lwip2.1.3}/netif/FILES | 9 +- .../{lwip2.0.3 => lwip2.1.3}/netif/Makefile | 4 +- .../src/network/lwip2.1.3/netif/bridgeif.c | 563 ++ .../network/lwip2.1.3/netif/bridgeif_fdb.c | 212 + .../{lwip2.0.3 => lwip2.1.3}/netif/ethernet.c | 95 +- .../netif/ethernetif.c | 0 .../src/network/lwip2.1.3/netif/lowpan6.c | 920 +++ .../src/network/lwip2.1.3/netif/lowpan6_ble.c | 447 ++ .../network/lwip2.1.3/netif/lowpan6_common.c | 841 +++ .../netif/ppp/PPPD_FOLLOWUP | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/auth.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/ccp.c | 0 .../netif/ppp/chap-md5.c | 0 .../netif/ppp/chap-new.c | 0 .../netif/ppp/chap_ms.c | 0 .../netif/ppp/demand.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/eap.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/ecp.c | 0 .../netif/ppp/eui64.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/fsm.c | 2 +- .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/ipcp.c | 0 .../netif/ppp/ipv6cp.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/lcp.c | 0 .../netif/ppp/magic.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/mppe.c | 12 +- .../netif/ppp/multilink.c | 0 .../netif/ppp/polarssl/README | 0 .../netif/ppp/polarssl/arc4.c | 0 .../netif/ppp/polarssl/des.c | 0 .../netif/ppp/polarssl/md4.c | 0 .../netif/ppp/polarssl/md5.c | 0 .../netif/ppp/polarssl/sha1.c | 0 .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/ppp.c | 86 +- .../netif/ppp/pppapi.c | 0 .../netif/ppp/pppcrypt.c | 0 .../netif/ppp/pppoe.c | 95 +- .../netif/ppp/pppol2tp.c | 88 +- .../netif/ppp/pppos.c | 34 +- .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/upap.c | 4 +- .../netif/ppp/utils.c | 6 +- .../{lwip2.0.3 => lwip2.1.3}/netif/ppp/vj.c | 46 +- .../{lwip2.0.3 => lwip2.1.3}/netif/slipif.c | 139 +- .../netif/wm_ethernet.c | 0 .../src/network/lwip2.1.3/netif/zepif.c | 300 + .../{lwip2.0.3 => lwip2.1.3}/sys_arch.c | 2 +- 480 files changed, 38553 insertions(+), 51059 deletions(-) delete mode 100644 src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h rename src/W800_SDK_v1.00.10/include/net/{wm_socket2.0.3.h => wm_socket2.1.3.h} (62%) delete mode 100644 src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h create mode 100644 src/W800_SDK_v1.00.10/include/net/wm_sockets2.1.3.h delete mode 100644 src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c rename src/W800_SDK_v1.00.10/src/network/{api2.0.3 => api_wm}/Makefile (100%) rename src/W800_SDK_v1.00.10/src/network/{api2.0.3 => api_wm}/tls_netconn.c (99%) rename src/W800_SDK_v1.00.10/src/network/{api2.0.3 => api_wm}/tls_netconn.h (100%) delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-ADDRESS-FAMILY-NUMBERS-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA-CHARSET-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-ITU-ALARM-TC-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-LANGUAGE-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MALLOC-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-MAU-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-PRINTER-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c delete mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/FILES (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.cmake rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/Filelists.mk (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/Makefile (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/Makefile (69%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/api_lib.c (62%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/api_msg.c (62%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/err.c (76%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/if_api.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/netbuf.c (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/netdb.c (89%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/netifapi.c (57%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/sockets.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/api/tcpip.c (71%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/lwip/dhcp6.h => lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.h} (58%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_structs.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/altcp_proxyconnect.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fs.c (92%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fs/404.html (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fs/img/sics.gif (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fs/index.html (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fsdata.c (86%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/fsdata.h (75%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/http_client.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/httpd.c (79%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd_structs.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/makefsdata/makefsdata (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/makefsdata/makefsdata.c (64%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/httpd => lwip2.1.3/apps/http}/makefsdata/readme.txt (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/tinydir.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/lwiperf/lwiperf.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/mdns/mdns.c (79%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/mqtt/mqtt.c (71%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/netbiosns/netbiosns.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/smtp/smtp.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_asn1.c (88%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_asn1.h (80%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_core.c (88%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_core_priv.h (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2.c (95%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_icmp.c (58%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_interfaces.c (65%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_ip.c (69%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_snmp.c (65%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_system.c (77%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_tcp.c (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_mib2_udp.c (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_msg.c (78%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_msg.h (87%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_netconn.c (88%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_pbuf_stream.c (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_pbuf_stream.h (76%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_raw.c (88%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_scalar.c (71%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_framework.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_usm.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_table.c (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_threadsync.c (73%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmp_traps.c (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmpv3.c (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmpv3_mbedtls.c (78%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/snmp/snmpv3_priv.h (77%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/sntp/sntp.c (61%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/apps/tftp/tftp_server.c (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/Makefile (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/alg.c (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_alloc.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_tcp.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/def.c (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/dns.c (89%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/inet_chksum.c (91%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/init.c (55%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ip.c (80%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/Makefile (69%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/autoip.c (76%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/dhcp.c (65%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/etharp.c (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/icmp.c (51%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/igmp.c (81%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/ip4.c (74%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/ip4_addr.c (77%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv4/ip4_frag.c (84%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/Makefile (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/dhcp6.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/ethip6.c (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/icmp6.c (57%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/inet6.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/ip6.c (55%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/ip6_addr.c (78%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/ip6_frag.c (74%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/mld6.c (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/ipv6/nd6.c (66%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/mem.c (64%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/memp.c (73%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/netif.c (56%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/pbuf.c (64%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/raw.c (65%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/stats.c (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/sys.c (57%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/tcp.c (65%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/tcp_in.c (60%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/tcp_out.c (60%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/timeouts.c (62%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/core/udp.c (73%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/arch/cc.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/arch/perf.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/arch/sys_arch.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/posix/sys/socket.h => lwip2.1.3/include/compat/posix/arpa/inet.h} (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/core/ipv6/dhcp6.c => lwip2.1.3/include/compat/posix/net/if.h} (69%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include => lwip2.1.3/include/compat}/posix/netdb.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs => lwip2.1.3/include/compat/posix/sys/socket.h} (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/posix => lwip2.1.3/include/compat/stdc}/errno.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/alg.h (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tcp.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tls.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/api.h (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/FILES (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_proxyconnect.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_tls_mbedtls_opts.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/fs.h (81%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/http_client.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/httpd.h (79%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/httpd_opts.h (74%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/lwiperf.h (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/mdns.h (62%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/mdns_opts.h (89%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/mdns_priv.h (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/mqtt.h (77%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/mqtt_opts.h (99%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_priv.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/netbiosns.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/netbiosns_opts.h (92%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp_opts.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp.h (95%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_core.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_mib2.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_opts.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_scalar.h (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_framework.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_usm.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_table.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmp_threadsync.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/snmpv3.h (73%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/sntp.h (85%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/sntp_opts.h (68%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/tftp_opts.h (91%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/apps/tftp_server.h (95%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/arch.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/autoip.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/debug.h (92%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/def.h (80%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/dhcp.h (95%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp6.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/dns.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/err.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/errno.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/etharp.h (83%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ethip6.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/icmp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/icmp6.h (91%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/netif/lowpan6_opts.h => lwip2.1.3/include/lwip/if_api.h} (62%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/igmp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/inet.h (91%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/inet_chksum.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/init.h (93%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h.cmake.in rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip.h (84%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip4.h (93%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip4_addr.h (86%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip4_frag.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip6.h (95%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip6_addr.h (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip6_frag.h (62%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_zone.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/ip_addr.h (82%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/mem.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/memp.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/mld6.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/nd6.h (93%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/netbuf.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/netdb.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/netif.h (68%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/netifapi.h (63%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/opt.h (73%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/pbuf.h (68%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/altcp_priv.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/api_msg.h (80%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/mem_priv.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/memp_priv.h (80%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/memp_std.h (88%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/nd6_priv.h (89%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs => lwip2.1.3/include/lwip/priv/raw_priv.h} (64%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/sockets_priv.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/tcp_priv.h (90%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/priv/tcpip_priv.h (90%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/autoip.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/dhcp.h (97%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp6.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/dns.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/etharp.h (67%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/ethernet.h (68%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/iana.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/icmp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/icmp6.h (99%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ieee.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/igmp.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/ip.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/ip4.h (95%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/ip6.h (67%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/mld6.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/nd6.h (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/tcp.h (94%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/prot/udp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/raw.h (72%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/sio.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/snmp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/sockets.h (70%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/stats.h (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/sys.h (66%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/tcp.h (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs => lwip2.1.3/include/lwip/tcpbase.h} (58%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/tcpip.h (84%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/timeouts.h (76%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/lwip/udp.h (85%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/lwip => lwip2.1.3/include}/lwipopts.h (91%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif_opts.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/etharp.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ethernet.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ethernetif.h (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ieee802154.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/lowpan6.h (92%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3/include/lwip/ip_frag.h => lwip2.1.3/include/netif/lowpan6_ble.h} (51%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_common.h create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_opts.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ccp.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/chap-md5.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/chap-new.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/chap_ms.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/eap.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ecp.h (94%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/eui64.h (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/fsm.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ipcp.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ipv6cp.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/lcp.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/magic.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/mppe.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/polarssl/arc4.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/polarssl/des.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/polarssl/md4.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/polarssl/md5.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/polarssl/sha1.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ppp.h (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ppp_impl.h (86%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/ppp_opts.h (94%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppapi.h (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppcrypt.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppdebug.h (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppoe.h (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppol2tp.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/pppos.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/upap.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/ppp/vj.h (98%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/include/netif/slipif.h (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/zepif.h rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/FILES (76%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/Makefile (72%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif_fdb.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ethernet.c (75%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ethernetif.c (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_ble.c create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_common.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/PPPD_FOLLOWUP (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/auth.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/ccp.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/chap-md5.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/chap-new.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/chap_ms.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/demand.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/eap.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/ecp.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/eui64.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/fsm.c (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/ipcp.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/ipv6cp.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/lcp.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/magic.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/mppe.c (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/multilink.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/README (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/arc4.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/des.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/md4.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/md5.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/polarssl/sha1.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/ppp.c (97%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/pppapi.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/pppcrypt.c (100%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/pppoe.c (94%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/pppol2tp.c (92%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/pppos.c (96%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/upap.c (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/utils.c (99%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/ppp/vj.c (95%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/slipif.c (85%) rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/netif/wm_ethernet.c (100%) create mode 100644 src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/zepif.c rename src/W800_SDK_v1.00.10/src/network/{lwip2.0.3 => lwip2.1.3}/sys_arch.c (99%) diff --git a/src/W800_SDK_v1.00.10/include/app/wm_netif.h b/src/W800_SDK_v1.00.10/include/app/wm_netif.h index 2617101..2496748 100644 --- a/src/W800_SDK_v1.00.10/include/app/wm_netif.h +++ b/src/W800_SDK_v1.00.10/include/app/wm_netif.h @@ -10,6 +10,6 @@ #ifndef WM_NETIF_H #define WM_NETIF_H #include "wm_config.h" -#include "wm_netif2.0.3.h" +#include "wm_netif2.1.3.h" #endif /* WM_NETIF_H */ diff --git a/src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h b/src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h deleted file mode 100644 index 931f60f..0000000 --- a/src/W800_SDK_v1.00.10/include/app/wm_netif2.0.3.h +++ /dev/null @@ -1,437 +0,0 @@ -/** - * @file wm_netif2.0.3.h - * - * @brief netif203 module - * - * @author dave - * - * Copyright (c) 2014 Winner Microelectronics Co., Ltd. - */ - -#ifndef WM_NETIF2_0_3_H -#define WM_NETIF2_0_3_H - -#include "wm_config.h" -#include "wm_type_def.h" -#include "wm_sockets.h" -#include "wm_wifi.h" -#include "wm_params.h" - -/** MACRO for callback EVENT to join AP or create soft-AP successfully */ -#define NETIF_WIFI_JOIN_SUCCESS 0x1 -/** MACRO for callback EVENT to fail to join AP */ -#define NETIF_WIFI_JOIN_FAILED 0x2 -/** MACRO for callback EVENT to disconnect from AP or destroy soft-AP */ -#define NETIF_WIFI_DISCONNECTED 0x3 -/** MACRO for callbck EVENT to get IP address */ -#define NETIF_IP_NET_UP 0x4 -/** MACRO for callback EVNET to create AP successfully */ -#define NETIF_WIFI_SOFTAP_SUCCESS 0x5 -/** MACRO for callback EVNET to create soft-AP failed */ -#define NETIF_WIFI_SOFTAP_FAILED 0x6 -/** MACRO for callback EVNET to close soft-AP */ -#define NETIF_WIFI_SOFTAP_CLOSED 0x7 -/** MACRO for callback EVNET to inform soft ap's net */ -#define NETIF_IP_NET2_UP 0x8 - -#define NETIF_IPV6_NET_UP 0x9 - -/** These are the values for ip_addr_t.type */ -#define IPADDR_TYPE_V4 0U -#define IPADDR_TYPE_V6 6U -#define IPADDR_TYPE_ANY 46U - -#define IPV6_ADDR_MAX_NUM 3 - -#if 0 -struct ip_addr { - u32_t addr; -}; - -typedef struct ip_addr ip_addr_t; -#endif -#if 0 -struct ip4_addr { - u32_t addr; -}; -typedef struct ip4_addr ip4_addr_t; - -struct ip6_addr { - u32_t addr[4]; -}; -typedef struct ip6_addr ip6_addr_t; - -#if (TLS_CONFIG_IPV4 && TLS_CONFIG_IPV6) -typedef struct _ip_addr { - union { - ip6_addr_t ip6; - ip4_addr_t ip4; - } u_addr; - u8_t type; -} ip_addr_t; -#else -#if TLS_CONFIG_IPV4 -typedef ip4_addr_t ip_addr_t; -#else -typedef ip6_addr_t ip_addr_t; -#endif -#endif -#endif -struct tls_ethif { - ip_addr_t ip_addr; - ip_addr_t netmask; - ip_addr_t gw; -#if TLS_CONFIG_IPV6 - ip_addr_t ip6_addr[IPV6_ADDR_MAX_NUM]; -#endif - ip_addr_t dns1; - ip_addr_t dns2; - u8 status; //0:net down; 1:net up -#if TLS_CONFIG_IPV6 - u8 ipv6_status[IPV6_ADDR_MAX_NUM]; //0:net down; 1:net up -#endif -}; - -//type defination of netif status changed callback. -typedef void (*tls_netif_status_event_fn)(u8 status); - -/** - * @defgroup APP_APIs APP APIs - * @brief APP APIs - */ - -/** - * @addtogroup APP_APIs - * @{ - */ - -/** - * @defgroup NETIF_APIs NETIF APIs - * @brief network interface APIs - */ - -/** - * @addtogroup NETIF_APIs - * @{ - */ - -/** - * @brief This function is used to initialize TCP/IP Stack - * - * @param[in] None - * - * @retval 0 success - * @retval other failed - * - * @note None - */ -int tls_ethernet_init(void); - -/** - * @brief This function is used to get IP information stored in - tls_ethif struct - * - * @param[in] None - * - * @retval tls_ethif * Pointer to struct tls_ethif - * - * @note None - */ -struct tls_ethif * tls_netif_get_ethif(void); - -/** - * @brief This function is used to set tls_ethif status - * - * @param[in] status net status, 0-up, 1-down - * - * @return None - * - * @note None - */ -void tls_netif_set_status(u8 status); - -/** - * @brief This function is used to start DHCP Client - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_dhcp_start(void); - -/** - * @brief This function is used to stop DHCP client - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_dhcp_stop(void); - -/** - * @brief This function is used to change IP information - * - * @param[in] *ipaddr IP address - * @param[in] *netmask netmask - * @param[in] *gw default gateway - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_netif_set_addr(ip_addr_t *ipaddr, - ip_addr_t *netmask, - ip_addr_t *gw); - -/** - * @brief This function is used to set dns servers - * - * @param[in] numdns index of the DNS server to set - must be < DNS_MAX_SERVERS - * @param[in] *dnsserver IP address of the DNS server to set - * - * @return None - * - * @note None - */ -void tls_netif_dns_setserver(u8 numdns, ip_addr_t *dnsserver); - -/** - * @brief This function is used to bring up an interface,available - for processing traffic - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_netif_set_up(void); - -/** - * @brief This function is used to bring down an interface,disabling - any traffic processing - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_netif_set_down(void); - -/** - * @brief This function is used to add netif status changed callback - to event list,if exists, do nothing - * - * @param[in] event_fn pointer to tls_netif_status_event_fn - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_netif_add_status_event(tls_netif_status_event_fn event_fn); - -/** - * @brief This function is used to remove netif status changed - callback function from event list,if not exists, do nothing - * - * @param[in] event_fn pointer to tls_netif_status_event_fn - * - * @retval 0 success - * @retval Minus failed - * - * @note None - */ -err_t tls_netif_remove_status_event(tls_netif_status_event_fn event_fn); - -/** - * @brief This function is used to get pointer of netif - * - * @param[in] None - * - * @retval pointer of netif - * - * @note None - */ -struct netif *tls_get_netif(void); - -#if TLS_CONFIG_AP -/** - * @brief Start DHCP Server for a network interface - * * - * @retval DHCPS_ERR_SUCCESS - No error - * @retval DHCPS_ERR_MEM - Out of memory - * @retval DHCPS_ERR_LINKDOWN - The NI is inactive - * - * @note None - */ -INT8S tls_dhcps_start(void); - -/** - * @brief This function is used to stop DHCP Server - * - * @param[in] None - * - * @retval None - * - * @note None - */ -void tls_dhcps_stop(void); - -/** - * @brief Start the dns server's service - * * - * @retval DHCPS_ERR_SUCCESS - No error - * @retval DHCPS_ERR_MEM - Out of memory - * @retval DHCPS_ERR_LINKDOWN - The NI is inactive - * @retval DNSS_ERR_PARAM - Input parameter error - * - * @note None - */ -INT8S tls_dnss_start(INT8U * DnsName); - -/** - * @brief Stop the dns server's service - * - * @param[in] None - * - * @retval None - * - * @note None - */ -void tls_dnss_stop(void); - -/** - * @brief Get station's ip address by mac address - * - * @param[in] mac station's mac address - * - * @retval ip_addr station's ip address - * - * @note None - */ -ip_addr_t *tls_dhcps_getip(const u8_t *mac); - -/** - * @brief Get station's mac address by ip address - * - * @param[in] ip station's ip address - * - * @retval u8* station's mac address - * - * @note None - */ -u8 *tls_dhcps_getmac(const ip_addr_t *ip); -#endif //TLS_CONFIG_AP - -#if TLS_CONFIG_RMMS -/** - * @brief Start remote manager server. - * * - * @retval DHCPS_ERR_SUCCESS - No error - * @retval DHCPS_ERR_MEM - Out of memory - * @retval DHCPS_ERR_LINKDOWN - The NIF is inactive - * - * @note None - */ -INT8S tls_rmms_start(void); - -/** - * @brief Disable remote manager server - * - * @param[in] None - * - * @retval None - * - * @note None - */ -void tls_rmms_stop(void); -#endif - -#if TLS_CONFIG_AP -/** - * @brief This is used to bring up an interface for APSTA,available - for processing traffic - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note Can only be used at APSTA mode - */ -err_t tls_netif2_set_up(void); - -/** - * @brief This function is used to bring down an interface for APSTA, disabling - any traffic processing - * - * @param[in] None - * - * @retval 0 success - * @retval Minus failed - * - * @note Can only be used at APSTA mode - */ -err_t tls_netif2_set_down(void); - -/** - * @brief This function is used to change IP information for - a network interface for APSTA - * - * @param[in] *ipaddr IP address - * @param[in] *netmask netmask - * @param[in] *gw default gateway - * - * @retval 0 success - * @retval Minus failed - * - * @note Can only be used at APSTA mode - */ -err_t tls_netif2_set_addr(ip_addr_t *ipaddr, - ip_addr_t *netmask, - ip_addr_t *gw); -/*************************************************************************** -* Function: tls_dhcps_setdns -* Description: Set dhcp server's dns address. -* -* Input: numdns: the index of the DNS server to set must be less than DNS_MAX_SERVERS -* -* Output: None -* -* Return: None -* -* Date : 2015-3-10 -****************************************************************************/ -/** - * @brief Set dhcp server's dns address - * - * @param[in] numdns the index of the DNS server to set must be less than DNS_MAX_SERVERS - * - * @retval None - * - * @note Can only be used at APSTA mode - */ -void tls_dhcps_setdns(u8_t numdns); -#endif - -/** - * @} - */ - -/** - * @} - */ - -#endif //WM_NETIF_H diff --git a/src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h b/src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h index 71f1aee..10e2385 100644 --- a/src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h +++ b/src/W800_SDK_v1.00.10/include/app/wm_wifi_oneshot.h @@ -37,6 +37,8 @@ extern int tls_filter_module_srcmac(u8 *mac); /** WinnerMicro ONSHOT */ #define TLS_CONFIG_UDP_LSD_SPECIAL (ONESHOT_ON&& TLS_CONFIG_UDP_ONE_SHOT) +/** Delay start plcp receive*/ +#define TLS_CONFIG_ONESHOT_DELAY_SPECIAL ONESHOT_ON /** AP ONESHOT */ #define TLS_CONFIG_AP_MODE_ONESHOT (ONESHOT_ON && TLS_CONFIG_AP) @@ -45,7 +47,7 @@ extern int tls_filter_module_srcmac(u8 *mac); /** AIRKISS ONESHOT */ -#define TLS_CONFIG_AIRKISS_MODE_ONESHOT (ONESHOT_OFF && TLS_CONFIG_UDP_ONE_SHOT) +#define TLS_CONFIG_AIRKISS_MODE_ONESHOT (ONESHOT_ON && TLS_CONFIG_UDP_ONE_SHOT) #define AIRKISS_USE_SELF_WRITE 1 diff --git a/src/W800_SDK_v1.00.10/include/net/wm_socket.h b/src/W800_SDK_v1.00.10/include/net/wm_socket.h index d060d84..b2624c6 100644 --- a/src/W800_SDK_v1.00.10/include/net/wm_socket.h +++ b/src/W800_SDK_v1.00.10/include/net/wm_socket.h @@ -11,7 +11,7 @@ #ifndef WM_SOCKET_H #define WM_SOCKET_H #include "wm_config.h" -#include "wm_socket2.0.3.h" +#include "wm_socket2.1.3.h" #endif diff --git a/src/W800_SDK_v1.00.10/include/net/wm_socket2.0.3.h b/src/W800_SDK_v1.00.10/include/net/wm_socket2.1.3.h similarity index 62% rename from src/W800_SDK_v1.00.10/include/net/wm_socket2.0.3.h rename to src/W800_SDK_v1.00.10/include/net/wm_socket2.1.3.h index e3d87f6..587af12 100644 --- a/src/W800_SDK_v1.00.10/include/net/wm_socket2.0.3.h +++ b/src/W800_SDK_v1.00.10/include/net/wm_socket2.1.3.h @@ -1,17 +1,20 @@ /** - * @file wm_socket2.0.3.h + * @file wm_socket2.1.3.h * - * @brief socket203 Module + * @brief socket2.1.3 apis * - * @author dave + * @author winnermicro * * @copyright (c) 2014 Winner Microelectronics Co., Ltd. */ -#ifndef WM_SOCKET2_0_3_H -#define WM_SOCKET2_0_3_H +#ifndef WM_SOCKET2_1_3_H +#define WM_SOCKET2_1_3_H #include "wm_type_def.h" #include "wm_netif.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" + //socket state defination #define NETCONN_STATE_NONE 0 @@ -30,40 +33,6 @@ #define TLS_MAX_SOCKET_NUM 4 #define TLS_MAX_NETCONN_NUM 20 -/** Main packet buffer struct */ -struct pbuf { - /** next pbuf in singly linked pbuf chain */ - struct pbuf *next; - - /** pointer to the actual data in the buffer */ - void *payload; - - /** - * total length of this buffer and all next buffers in chain - * belonging to the same packet. - * - * For non-queue packet chains this is the invariant: - * p->tot_len == p->len + (p->next? p->next->tot_len: 0) - */ - u16_t tot_len; - - /** length of this buffer */ - u16_t len; - - /** pbuf_type as u8_t instead of enum to save space */ - u8_t /*pbuf_type*/ type; - - /** misc flags */ - u8_t flags; - - /** - * the reference count always equals the number of pointers - * that refer to this pbuf. This can be pointers from an application, - * the stack itself, or pbuf->next pointers from a chain. - */ - u16_t ref; -}; - /** * @brief This Function prototype for tcp error callback functions. Called when * receives a RST or is unexpectedly closed for any other reason. @@ -169,45 +138,6 @@ typedef err_t (*socket_accept_fn)(u8 skt_num, err_t err); */ typedef void(*socket_state_changed_fn)(u8 skt_num, u8 event, u8 state); -/** Definitions for error constants. */ -typedef enum { -/** No error, everything OK. */ - ERR_OK = 0, -/** Out of memory error. */ - ERR_MEM = -1, -/** Buffer error. */ - ERR_BUF = -2, -/** Timeout. */ - ERR_TIMEOUT = -3, -/** Routing problem. */ - ERR_RTE = -4, -/** Operation in progress */ - ERR_INPROGRESS = -5, -/** Illegal value. */ - ERR_VAL = -6, -/** Operation would block. */ - ERR_WOULDBLOCK = -7, -/** Address in use. */ - ERR_USE = -8, -/** Already connecting. */ - ERR_ALREADY = -9, -/** Conn already established.*/ - ERR_ISCONN = -10, -/** Not connected. */ - ERR_CONN = -11, -/** Low-level netif error */ - ERR_IF = -12, - -/** Connection aborted. */ - ERR_ABRT = -13, -/** Connection reset. */ - ERR_RST = -14, -/** Connection closed. */ - ERR_CLSD = -15, -/** Illegal argument. */ - ERR_ARG = -16 -} err_enum_t; - enum tls_socket_protocol{ SOCKET_PROTO_TCP, /* TCP Protocol */ SOCKET_PROTO_UDP, /* UDP Protocol */ @@ -317,106 +247,5 @@ int tls_socket_get_status(u8 skt_num, u8 *buf, u32 bufsize); */ int tls_socket_udp_sendto(u16 localport, u8 *ip_addr, u16 port, void *pdata, u16 len); -/** - * @ingroup pbuf - * Enumeration of pbuf layers - */ -typedef enum { - /** Includes spare room for transport layer header, e.g. UDP header. - * Use this if you intend to pass the pbuf to functions like udp_send(). - */ - PBUF_TRANSPORT, - /** Includes spare room for IP header. - * Use this if you intend to pass the pbuf to functions like raw_send(). - */ - PBUF_IP, - /** Includes spare room for link layer header (ethernet header). - * Use this if you intend to pass the pbuf to functions like ethernet_output(). - * @see PBUF_LINK_HLEN - */ - PBUF_LINK, - /** Includes spare room for additional encapsulation header before ethernet - * headers (e.g. 802.11). - * Use this if you intend to pass the pbuf to functions like netif->linkoutput(). - * @see PBUF_LINK_ENCAPSULATION_HLEN - */ - PBUF_RAW_TX, - /** Use this for input packets in a netif driver when calling netif->input() - * in the most common case - ethernet-layer netif driver. */ - PBUF_RAW -} pbuf_layer; - -/** - * @ingroup pbuf - * Enumeration of pbuf types - */ -typedef enum { - /** pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload - are allocated in one piece of contiguous memory (so the first payload byte - can be calculated from struct pbuf). - pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might - change in future versions). - This should be used for all OUTGOING packets (TX).*/ - PBUF_RAM, - /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in - totally different memory areas. Since it points to ROM, payload does not - have to be copied when queued for transmission. */ - PBUF_ROM, - /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change - so it has to be duplicated when queued before transmitting, depending on - who has a 'ref' to it. */ - PBUF_REF, - /** pbuf payload refers to RAM. This one comes from a pool and should be used - for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct - pbuf and its payload are allocated in one piece of contiguous memory (so - the first payload byte can be calculated from struct pbuf). - Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, - you are unable to receive TCP acks! */ - PBUF_POOL -} pbuf_type; - -/** -* @brief This Function allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). -* -* The actual memory allocated for the pbuf is determined by the -* layer at which the pbuf is allocated and the requested size -* (from the size parameter). -* -* @param[in] l layer flag to define header size -* @param[in] length size of the pbuf's payload -* @param[in] type this parameter decides how and where the pbuf -* -* @retval The allocated pbuf. If multiple pbufs where allocated, this -* is the first pbuf of a pbuf chain. -*/ -struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); - -/** -* @brief This Function for release the buffer that you receive within the socket_recv_fn callback function. -* Attention please: If you return ERR_OK in the socket_recv_fn callback function, you must call this -* function to release the buffer by yourself. Otherwise, the buffer do not need be -* released by your code. -* -* @param[in] p The buffer you received in the socket_recv_fn callback function. -* -* @retval The number of de-allocated pbufs -*/ -u8 pbuf_free(struct pbuf *p); - -/** -* @brief This Function for copy (part of) the contents of a packet buffer to an application supplied buffer. -* -* @param[in] p the pbuf from which to copy data. -* -* @param[in] dataptr the application supplied buffer -* -* @param[in] len length of data to copy (dataptr must be big enough). No more -* than buf->tot_len will be copied, irrespective of len -* -* @param[in] offset offset into the packet buffer from where to begin copying len bytes -* -* @retval The number of bytes copied, or 0 on failure -*/ -u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset); #endif diff --git a/src/W800_SDK_v1.00.10/include/net/wm_sockets.h b/src/W800_SDK_v1.00.10/include/net/wm_sockets.h index b0a7f94..6c7aa83 100644 --- a/src/W800_SDK_v1.00.10/include/net/wm_sockets.h +++ b/src/W800_SDK_v1.00.10/include/net/wm_sockets.h @@ -10,6 +10,6 @@ #ifndef WM_SOCKET_API_H #define WM_SOCKET_API_H #include "wm_config.h" -#include "wm_sockets2.0.3.h" +#include "wm_sockets2.1.3.h" #endif diff --git a/src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h b/src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h deleted file mode 100644 index 13ab6a5..0000000 --- a/src/W800_SDK_v1.00.10/include/net/wm_sockets2.0.3.h +++ /dev/null @@ -1,1179 +0,0 @@ -/** - * @file wm_sockets2.0.3.h - * - * @brief sockets2.0.3 apis - * - * @author winnermicro - * - * @copyright (c) 2014 Winner Microelectronics Co., Ltd. - */ -#ifndef WM_SOCKET_API2_0_3_H -#define WM_SOCKET_API2_0_3_H - -#include -#include "wm_type_def.h" -#include "wm_config.h" -#include - -/** If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED - to prevent this code from redefining it. */ -#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED) -typedef u8_t sa_family_t; -#endif -/** If your port already typedef's in_port_t, define IN_PORT_T_DEFINED - to prevent this code from redefining it. */ -#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED) -typedef u16_t in_port_t; -#endif - -/** If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED - to prevent this code from redefining it. */ -#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED) -#if !defined(_NEWLIB_VERSION_H__) -typedef u32_t in_addr_t; -#endif -#endif - -struct in_addr { - in_addr_t s_addr; -}; - -struct in6_addr { - union { - u32_t u32_addr[4]; - u8_t u8_addr[16]; - } un; -#define s6_addr un.u8_addr -}; - -/** 255.255.255.255 */ -#define IPADDR_NONE ((u32_t)0xffffffffUL) -/** 127.0.0.1 */ -#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL) -/** 0.0.0.0 */ -#define IPADDR_ANY ((u32_t)0x00000000UL) -/** 255.255.255.255 */ -#define IPADDR_BROADCAST ((u32_t)0xffffffffUL) - -/** 255.255.255.255 */ -#define INADDR_NONE IPADDR_NONE -/** 127.0.0.1 */ -#define INADDR_LOOPBACK IPADDR_LOOPBACK -/** 0.0.0.0 */ -#define INADDR_ANY IPADDR_ANY -/** 255.255.255.255 */ -#define INADDR_BROADCAST IPADDR_BROADCAST - -/** This macro can be used to initialize a variable of type struct in6_addr - to the IPv6 wildcard address. */ -#define IN6ADDR_ANY_INIT {{{0,0,0,0}}} -/** This macro can be used to initialize a variable of type struct in6_addr - to the IPv6 loopback address. */ -#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}} -/** This variable is initialized by the system to contain the wildcard IPv6 address. */ -extern const struct in6_addr in6addr_any; - -#if TLS_CONFIG_IPV4 -/** members are in network byte order */ -struct sockaddr_in { - u8_t sin_len; - sa_family_t sin_family; - in_port_t sin_port; - struct in_addr sin_addr; -#define SIN_ZERO_LEN 8 - char sin_zero[SIN_ZERO_LEN]; -}; -#endif /* TLS_CONFIG_IPV4 */ - -#if TLS_CONFIG_IPV6 -struct sockaddr_in6 { - u8_t sin6_len; /* length of this structure */ - sa_family_t sin6_family; /* AF_INET6 */ - in_port_t sin6_port; /* Transport layer port # */ - u32_t sin6_flowinfo; /* IPv6 flow information */ - struct in6_addr sin6_addr; /* IPv6 address */ - u32_t sin6_scope_id; /* Set of interfaces for scope */ -}; -#endif /* TLS_CONFIG_IPV6 */ - -struct sockaddr { - u8_t sa_len; - sa_family_t sa_family; - char sa_data[14]; -}; - -struct sockaddr_storage { - u8_t s2_len; - sa_family_t ss_family; - char s2_data1[2]; - u32_t s2_data2[3]; -#if TLS_CONFIG_IPV6 - u32_t s2_data3[3]; -#endif /* TLS_CONFIG_IPV6 */ -}; - -struct hostent { - char *h_name; /* Official name of the host. */ - char **h_aliases; /* A pointer to an array of pointers to alternative host names, - terminated by a null pointer. */ - int h_addrtype; /* Address type. */ - int h_length; /* The length, in bytes, of the address. */ - char **h_addr_list; /* A pointer to an array of pointers to network addresses (in - network byte order) for the host, terminated by a null pointer. */ -#define h_addr h_addr_list[0] /* for backward compatibility */ -}; - -struct sockaddr_store { - u8_t s2_len; - sa_family_t ss_family; - char s2_data1[2]; - u32_t s2_data2[3]; -#if TLS_CONFIG_IPV6 - u32_t s2_data3[3]; -#endif /* TLS_CONFIG_IPV6 */ -}; - -/** If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED - to prevent this code from redefining it. */ -#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) -typedef u32_t socklen_t; -#endif - -struct lwip_sock; - -/** Socket protocol types (TCP/UDP/RAW) */ -#define SOCK_STREAM 1 -#define SOCK_DGRAM 2 -#define SOCK_RAW 3 - -/** - * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) - */ -#define SO_REUSEADDR 0x0004 /* Allow local address reuse */ -#define SO_KEEPALIVE 0x0008 /* keep connections alive */ -#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ - - -/** - * Additional options, not kept in so_options. - */ -#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ -#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ -#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ -#define SO_LINGER 0x0080 /* linger on close if data present */ -#define SO_DONTLINGER ((int)(~SO_LINGER)) -#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ -#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ -#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ -#define SO_RCVBUF 0x1002 /* receive buffer size */ -#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ -#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ -#define SO_ERROR 0x1007 /* get error status and clear */ -#define SO_TYPE 0x1008 /* get socket type */ -#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ -#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ - -/** - * Structure used for manipulating linger option. - */ -struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time in seconds */ -}; - -/** - * Level number for (get/set)sockopt() to apply to socket itself. - */ -#define SOL_SOCKET 0xfff /* options for socket level */ - - -#define AF_UNSPEC 0 -#define AF_INET 2 -#if TLS_CONFIG_IPV6 -#define AF_INET6 10 -#else /* TLS_CONFIG_IPV6 */ -#define AF_INET6 AF_UNSPEC -#endif /* TLS_CONFIG_IPV6 */ -#define PF_INET AF_INET -#define PF_INET6 AF_INET6 -#define PF_UNSPEC AF_UNSPEC - -#define IPPROTO_IP 0 -#define IPPROTO_ICMP 1 -#define IPPROTO_TCP 6 -#define IPPROTO_UDP 17 -#if TLS_CONFIG_IPV6 -#define IPPROTO_IPV6 41 -#define IPPROTO_ICMPV6 58 -#endif /* TLS_CONFIG_IPV6 */ -#define IPPROTO_UDPLITE 136 -#define IPPROTO_RAW 255 - -/** Flags we can use with send and recv. */ -#define MSG_PEEK 0x01 /* Peeks at an incoming message */ -#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ -#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ -#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ -#define MSG_MORE 0x10 /* Sender will send more */ - - -/** - * Options for level IPPROTO_IP - */ -#define IP_TOS 1 -#define IP_TTL 2 - - -/* - * Options for level IPPROTO_TCP - */ -#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ -#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ -#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ -#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ -#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ - -#if TLS_CONFIG_IPV6 -/** - * Options for level IPPROTO_IPV6 - */ -#define IPV6_CHECKSUM 7 /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */ -#define IPV6_V6ONLY 27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */ -#endif /* TLS_CONFIG_IPV6 */ - -/** - * Options for level IPPROTO_UDPLITE - */ -#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ -#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ - -#if TLS_CONFIG_IGMP -/** - * Options and types for UDP multicast traffic handling - */ -#define IP_MULTICAST_TTL 5 -#define IP_MULTICAST_IF 6 -#define IP_MULTICAST_LOOP 7 -#endif /* TLS_CONFIG_IGMP */ - -#if 1// TLS_CONFIG_IGMP -/** - * Options and types related to multicast membership - */ -#define IP_ADD_MEMBERSHIP 3 -#define IP_DROP_MEMBERSHIP 4 - -typedef struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -} ip_mreq; - -#if TLS_CONFIG_IPV6 -#define IPV6_JOIN_GROUP 38 -#define IPV6_LEAVE_GROUP 39 -typedef struct ipv6_mreq { - struct in6_addr ipv6mr_multiaddr; /* IP multicast address of group */ - int ipv6mr_interface; /* index of interface */ -} ipv6_mreq; -#endif -#endif /* TLS_CONFIG_IGMP */ - -/** - * @brief The Type of Service provides an indication of the abstract - * parameters of the quality of service desired. These parameters are - * to be used to guide the selection of the actual service parameters - * when transmitting a datagram through a particular network. Several - * networks offer service precedence, which somehow treats high - * precedence traffic as more important than other traffic (generally - * by accepting only traffic above a certain precedence at time of high - * load). The major choice is a three way tradeoff between low-delay, - * high-reliability, and high-throughput. - * The use of the Delay, Throughput, and Reliability indications may - * increase the cost (in some sense) of the service. In many networks - * better performance for one of these parameters is coupled with worse - * performance on another. Except for very unusual cases at most two - * of these three indications should be set. - */ -#define IPTOS_TOS_MASK 0x1E -#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#define IPTOS_LOWCOST 0x02 -#define IPTOS_MINCOST IPTOS_LOWCOST - -/* - * @brief The Network Control precedence designation is intended to be used - * within a network only. The actual use and control of that - * designation is up to each network. The Internetwork Control - * designation is intended for use by gateway control originators only. - * If the actual use of these precedence designations is of concern to - * a particular network, it is the responsibility of that network to - * control the access to, and use of, those precedence designations. - */ -#define IPTOS_PREC_MASK 0xe0 -#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) -#define IPTOS_PREC_NETCONTROL 0xe0 -#define IPTOS_PREC_INTERNETCONTROL 0xc0 -#define IPTOS_PREC_CRITIC_ECP 0xa0 -#define IPTOS_PREC_FLASHOVERRIDE 0x80 -#define IPTOS_PREC_FLASH 0x60 -#define IPTOS_PREC_IMMEDIATE 0x40 -#define IPTOS_PREC_PRIORITY 0x20 -#define IPTOS_PREC_ROUTINE 0x00 - - -/* - * @brief Commands for ioctlsocket(), taken from the BSD file fcntl.h. - * lwip_ioctl only supports FIONREAD and FIONBIO, for now - * - * Ioctl's have the command encoded in the lower word, - * and the size of any in or out parameters in the upper - * word. The high 2 bits of the upper word are used - * to encode the in/out status of the parameter; for now - * we restrict parameters to at most 128 bytes. - */ -#if !defined(FIONREAD) || !defined(FIONBIO) -#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ -#define IOC_VOID 0x20000000UL /* no parameters */ -#define IOC_OUT 0x40000000UL /* copy out parameters */ -#define IOC_IN 0x80000000UL /* copy in parameters */ -#define IOC_INOUT (IOC_IN|IOC_OUT) - /* 0x20000000 distinguishes new & - old ioctl's */ -#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) - -#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) - -#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) -#endif /* !defined(FIONREAD) || !defined(FIONBIO) */ - -#ifndef FIONREAD -#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ -#endif -#ifndef FIONBIO -#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ -#endif - -/** Socket I/O Controls: unimplemented */ -#ifndef SIOCSHIWAT -#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ -#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ -#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ -#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ -#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ -#endif - -/** commands for fnctl */ -#ifndef F_GETFL -#define F_GETFL 3 -#endif -#ifndef F_SETFL -#define F_SETFL 4 -#endif - -/** File status flags and file access modes for fnctl, - these are bits in an int. */ -#ifndef O_NONBLOCK -#define O_NONBLOCK 1 /* nonblocking I/O */ -#endif -#ifndef O_NDELAY -#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */ -#endif - -#ifndef SHUT_RD - #define SHUT_RD 0 - #define SHUT_WR 1 - #define SHUT_RDWR 2 -#endif - -/** FD_SET used for lwip_select */ -#ifndef FD_SET -#undef FD_SETSIZE - -#ifndef LWIP_SOCKET_OFFSET -#define LWIP_SOCKET_OFFSET 0 -#endif - -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 8 -#endif - -/** Make FD_SETSIZE match NUM_SOCKETS in socket.c */ -#define FD_SETSIZE MEMP_NUM_NETCONN -#define FDSETSAFESET(n, code) do { \ - if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \ - code; }} while(0) -#define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\ - (code) : 0) -#define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) -#define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) -#define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) -#define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) - -typedef struct fd_set -{ - unsigned char fd_bits [(FD_SETSIZE+7)/8]; -} fd_set; - -#elif LWIP_SOCKET_OFFSET -#error LWIP_SOCKET_OFFSET does not work with external FD_SET! -#endif /* FD_SET */ - -/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided - * by your system, set this to 0 and include in cc.h */ -#ifndef LWIP_TIMEVAL_PRIVATE -#define LWIP_TIMEVAL_PRIVATE 0 -#endif - -#if LWIP_TIMEVAL_PRIVATE -struct timeval { - long tv_sec; /* seconds */ - long tv_usec; /* and microseconds */ -}; -#endif /* LWIP_TIMEVAL_PRIVATE */ -int accept(int s, struct sockaddr *addr, socklen_t *addrlen); - -int bind(int s, const struct sockaddr *name, socklen_t namelen); - -int shutdown(int s, int how); - -int closesocket(int s); - -int connect(int s, const struct sockaddr *name, socklen_t namelen); - -int getsockname(int s, struct sockaddr *name, socklen_t *namelen); - -int getpeername(int s, struct sockaddr *name, socklen_t *namelen); - -int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); - -int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); - -int listen(int s, int backlog); - -int recv(int s, void *mem, size_t len, int flags); - -int recvfrom(int s, void *mem, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen); - -int send(int s, const void *data, size_t size, int flags); - -int sendto(int s, const void *data, size_t size, int flags, - const struct sockaddr *to, socklen_t tolen); - -int socket(int domain, int type, int protocol); - -int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, - struct timeval *timeout); - -int ioctlsocket(int s, long cmd, void *argp); - -int fcntl(int s, int cmd, int val); - -struct hostent* gethostbyname(const char *name); - -/** @ingroup socket */ -#define read(s,mem,len) recv(s,mem,len,0) -/** @ingroup socket */ -#ifndef PPP_SUPPORT -#define write(s,dataptr,len) send(s,dataptr,len,0) -#endif -/** @ingroup socket */ -#define close(s) closesocket(s) -/** @ingroup socket */ -#define ioctl(s,cmd,argp) ioctlsocket(s,cmd,argp) - -u32_t ipaddr_addr(const char *cp); - -#ifdef htonl -#undef htonl -#endif /* htonl */ -#ifdef ntohl -#undef ntohl -#endif /* ntohl */ -#ifdef htons -#undef htons -#endif /* htons */ -#ifdef ntohs -#undef ntohs -#endif /* ntohs */ - -#define htons(n) (((n & 0xff) << 8) | ((n & 0xff00) >> 8)) -#define htonl(n) (((n & 0xff) << 24) |\ - ((n & 0xff00) << 8) |\ - ((n & 0xff0000UL) >> 8) |\ - ((n & 0xff000000UL) >> 24)) -#define ntohs(n) htons(n) -#define ntohl(n) htonl(n) - -/** Create u32_t value from bytes */ -#define LWIP_MAKEU32(a,b,c,d) (((u32_t)((a) & 0xff) << 24) | \ - ((u32_t)((b) & 0xff) << 16) | \ - ((u32_t)((c) & 0xff) << 8) | \ - (u32_t)((d) & 0xff)) -#define PP_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \ - (((x) & 0x0000ff00UL) << 8) | \ - (((x) & 0x00ff0000UL) >> 8) | \ - (((x) & 0xff000000UL) >> 24)) - -#if TLS_CONFIG_IPV4 -/** This is the aligned version of ip4_addr_t, - used as local variable, on the stack, etc. */ -struct ip4_addr { - u32_t addr; -}; - -/** ip4_addr_t uses a struct for convenience only, so that the same defines can - * operate both on ip4_addr_t as well as on ip4_addr_p_t. */ -typedef struct ip4_addr ip4_addr_t; - -/** Set an IP address given by the four byte-parts */ -#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) - -/** MEMCPY-like copying of IP addresses where addresses are known to be - * 16-bit-aligned if the port is correctly configured (so a port could define - * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ -#ifndef IPADDR2_COPY -#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) -#endif - -/** Copy IP address - faster than ip4_addr_set: no NULL check */ -#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) -/** Safely copy one IP address to another (src may be NULL) */ -#define ip4_addr_set(dest, src) ((dest)->addr = \ - ((src) == NULL ? 0 : \ - (src)->addr)) -/** Set complete address to zero */ -#define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) -/** Set address to IPADDR_ANY (no need for lwip_htonl()) */ -#define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) -/** Set address to loopback address */ -#define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK)) -/** Check if an address is in the loopback region */ -#define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) << 24)) -/** Safely copy one IP address to another and change byte order - * from host- to network-order. */ -#define ip4_addr_set_hton(dest, src) ((dest)->addr = \ - ((src) == NULL ? 0:\ - lwip_htonl((src)->addr))) -/** IPv4 only: set the IP address given as an u32_t */ -#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) -/** IPv4 only: get the IP address as an u32_t */ -#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) - -/** Get the network address by combining host address with netmask */ -#define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0) - -/** - * @brief Determine if two address are on the same network. - * - * @arg addr1 IP address 1 - * @arg addr2 IP address 2 - * @arg mask network identifier mask - * @return !0 if the network identifiers of both address match - */ -#define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ - (mask)->addr) == \ - ((addr2)->addr & \ - (mask)->addr)) -#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) - -#define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY) -#define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1))) - -#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) -u8_t ip4_addr_netmask_valid(u32_t netmask); - -#define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL)) - -#define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL)) - -#define ip4_addr_debug_print_parts(debug, a, b, c, d) \ - LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d)) -#define ip4_addr_debug_print(debug, ipaddr) \ - ip4_addr_debug_print_parts(debug, \ - (u16_t)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0)) -#define ip4_addr_debug_print_val(debug, ipaddr) \ - ip4_addr_debug_print_parts(debug, \ - ip4_addr1_16(&(ipaddr)), \ - ip4_addr2_16(&(ipaddr)), \ - ip4_addr3_16(&(ipaddr)), \ - ip4_addr4_16(&(ipaddr))) - -/** Get one byte from the 4-byte address */ -#define ip4_addr1(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[0]) -#define ip4_addr2(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[1]) -#define ip4_addr3(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[2]) -#define ip4_addr4(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[3]) -/** These are cast to u16_t, with the intent that they are often arguments - * to printf using the U16_F format from cc.h. */ -#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) -#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) -#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) -#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) - -#define IP4ADDR_STRLEN_MAX 16 - -/** For backwards compatibility */ -#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr) - -u32_t ipaddr_addr(const char *cp); -int ip4addr_aton(const char *cp, ip4_addr_t *addr); -/** returns ptr to static buffer; not reentrant! */ -char *ip4addr_ntoa(const ip4_addr_t *addr); -char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); - - -/** directly map this to the lwip internal functions */ -#define inet_addr(cp) ipaddr_addr(cp) -#define inet_aton(cp, addr) ip4addr_aton(cp, (ip4_addr_t*)addr) -#define inet_ntoa(addr) ipaddr_ntoa((ip_addr_t*)&(addr)) -#endif - -#if TLS_CONFIG_IPV6 -/** This is the aligned version of ip6_addr_t, - used as local variable, on the stack, etc. */ -struct ip6_addr { - u32_t addr[4]; -}; - -/** IPv6 address */ -typedef struct ip6_addr ip6_addr_t; - -/** Set an IPv6 partial address given by byte-parts */ -#define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \ - (ip6addr)->addr[index] = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) - -/** Set a full IPv6 address by passing the 4 u32_t indices in network byte order - (use PP_HTONL() for constants) */ -#define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) do { \ - (ip6addr)->addr[0] = idx0; \ - (ip6addr)->addr[1] = idx1; \ - (ip6addr)->addr[2] = idx2; \ - (ip6addr)->addr[3] = idx3; } while(0) - -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0])) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1])) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2])) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff)) -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3])) & 0xffff)) - -/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */ -#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ - (dest).addr[1] = (src).addr[1]; \ - (dest).addr[2] = (src).addr[2]; \ - (dest).addr[3] = (src).addr[3];}while(0) -/** Safely copy one IPv6 address to another (src may be NULL) */ -#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \ - (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \ - (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \ - (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0) - -/** Set complete address to zero */ -#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = 0;}while(0) - -/** Set address to ipv6 'any' (no need for lwip_htonl()) */ -#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr) -/** Set address to ipv6 loopback address */ -#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) -/** Safely copy one IPv6 address to another and change byte order - * from host- to network-order. */ -#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \ - (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \ - (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \ - (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0) - - -/** - * @brief Determine if two IPv6 address are on the same network. - * - * @arg addr1 IPv6 address 1 - * @arg addr2 IPv6 address 2 - * @return !0 if the network identifiers of both address match - */ -#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ - ((addr1)->addr[1] == (addr2)->addr[1])) - -#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ - ((addr1)->addr[1] == (addr2)->addr[1]) && \ - ((addr1)->addr[2] == (addr2)->addr[2]) && \ - ((addr1)->addr[3] == (addr2)->addr[3])) - -#define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL) - -#define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \ - ((ip6addr).addr[1] == 0) && \ - ((ip6addr).addr[2] == 0) && \ - ((ip6addr).addr[3] == 0)) -#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr))) - -#define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) - -#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL)) - -#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL)) - -#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL)) - -#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL)) - -#define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL))) - -#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) -#define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL)) -#define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL)) -#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL)) -#define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf) -#define IP6_MULTICAST_SCOPE_RESERVED 0x0 -#define IP6_MULTICAST_SCOPE_RESERVED0 0x0 -#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1 -#define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2 -#define IP6_MULTICAST_SCOPE_RESERVED3 0x3 -#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4 -#define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5 -#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8 -#define IP6_MULTICAST_SCOPE_GLOBAL 0xe -#define IP6_MULTICAST_SCOPE_RESERVEDF 0xf -#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL)) -#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL)) -#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL)) -#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL)) -#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL)) -#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL)) - -/** @todo define get/set for well-know multicast addresses, e.g. ff02::1 */ -#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) - -#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) -#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) - -#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL))) -#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0) - -#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ - (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) ) - -#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \ - (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0) - -#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0) && \ - ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ - ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3]))) - -/* IPv6 address states. */ -#define IP6_ADDR_INVALID 0x00 -#define IP6_ADDR_TENTATIVE 0x08 -#define IP6_ADDR_TENTATIVE_1 0x09 /* 1 probe sent */ -#define IP6_ADDR_TENTATIVE_2 0x0a /* 2 probes sent */ -#define IP6_ADDR_TENTATIVE_3 0x0b /* 3 probes sent */ -#define IP6_ADDR_TENTATIVE_4 0x0c /* 4 probes sent */ -#define IP6_ADDR_TENTATIVE_5 0x0d /* 5 probes sent */ -#define IP6_ADDR_TENTATIVE_6 0x0e /* 6 probes sent */ -#define IP6_ADDR_TENTATIVE_7 0x0f /* 7 probes sent */ -#define IP6_ADDR_VALID 0x10 /* This bit marks an address as valid (preferred or deprecated) */ -#define IP6_ADDR_PREFERRED 0x30 -#define IP6_ADDR_DEPRECATED 0x10 /* Same as VALID (valid but not preferred) */ - -#define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */ - -#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID) -#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE) -#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */ -#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED) -#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED) - -#define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \ - LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \ - a, b, c, d, e, f, g, h)) -#define ip6_addr_debug_print(debug, ipaddr) \ - ip6_addr_debug_print_parts(debug, \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0), \ - (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0)) -#define ip6_addr_debug_print_val(debug, ipaddr) \ - ip6_addr_debug_print_parts(debug, \ - IP6_ADDR_BLOCK1(&(ipaddr)), \ - IP6_ADDR_BLOCK2(&(ipaddr)), \ - IP6_ADDR_BLOCK3(&(ipaddr)), \ - IP6_ADDR_BLOCK4(&(ipaddr)), \ - IP6_ADDR_BLOCK5(&(ipaddr)), \ - IP6_ADDR_BLOCK6(&(ipaddr)), \ - IP6_ADDR_BLOCK7(&(ipaddr)), \ - IP6_ADDR_BLOCK8(&(ipaddr))) - -#define IP6ADDR_STRLEN_MAX 46 - -int ip6addr_aton(const char *cp, ip6_addr_t *addr); -/** returns ptr to static buffer; not reentrant! */ -char *ip6addr_ntoa(const ip6_addr_t *addr); -char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen); - -#endif - -/** @ingroup ipaddr - * IP address types for use in ip_addr_t.type member. - * @see tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type(). - */ -enum lwip_ip_addr_type { - /** IPv4 */ - IPADDR_TYPE_V4 = 0U, - /** IPv6 */ - IPADDR_TYPE_V6 = 6U, - /** IPv4+IPv6 ("dual-stack") */ - IPADDR_TYPE_ANY = 46U -}; - -#if TLS_CONFIG_IPV4&&TLS_CONFIG_IPV6 -/** - * @ingroup ipaddr - * A union struct for both IP version's addresses. - * ATTENTION: watch out for its size when adding IPv6 address scope! - */ -typedef struct ip_addr { - union { - ip6_addr_t ip6; - ip4_addr_t ip4; - } u_addr; - /** @ref lwip_ip_addr_type */ - u8_t type; -} ip_addr_t; - -extern const ip_addr_t ip_addr_any_type; - -/** @ingroup ip4addr */ -#define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 } -/** @ingroup ip4addr */ -#define IPADDR4_INIT_BYTES(a,b,c,d) IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d))) -/** @ingroup ip6addr */ -#define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } } }, IPADDR_TYPE_V6 } -/** @ingroup ip6addr */ -#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } }, IPADDR_TYPE_V6 } - -/** @ingroup ipaddr */ -#define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY) -/** @ingroup ipaddr */ -#define IPADDR_ANY_TYPE_INIT { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY } - -/** @ingroup ip4addr */ -#define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4) -/** @ingroup ip6addr */ -#define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6) -/** @ingroup ip4addr */ -#define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr))) -/** @ingroup ip6addr */ -#define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr))) - -#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0) -#define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0) -#define IP_GET_TYPE(ipaddr) ((ipaddr)->type) - -#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr)) -#define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) - -/** @ingroup ip6addr - * Convert generic ip address to specific protocol version - */ -#define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6)) -/** @ingroup ip4addr - * Convert generic ip address to specific protocol version - */ -#define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4)) - -/** @ingroup ip4addr */ -#define IP_ADDR4(ipaddr,a,b,c,d) do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \ - IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0) -/** @ingroup ip6addr */ -#define IP_ADDR6(ipaddr,i0,i1,i2,i3) do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \ - IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0) -/** @ingroup ip6addr */ -#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) - -/** @ingroup ipaddr */ -#define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \ - ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \ - ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0) -/** @ingroup ip6addr */ -#define ip_addr_copy_from_ip6(dest, src) do{ \ - ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0) -/** @ingroup ip4addr */ -#define ip_addr_copy_from_ip4(dest, src) do{ \ - ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0) -/** @ingroup ip4addr */ -#define ip_addr_set_ip4_u32(ipaddr, val) do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \ - IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) -/** @ingroup ip4addr */ -#define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \ - ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0) -/** @ingroup ipaddr */ -#define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \ - ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \ - ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0) -/** @ingroup ipaddr */ -#define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src) -/** @ingroup ipaddr */ -#define ip_addr_set_zero(ipaddr) do{ \ - ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0) -/** @ingroup ip5addr */ -#define ip_addr_set_zero_ip4(ipaddr) do{ \ - ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0) -/** @ingroup ip6addr */ -#define ip_addr_set_zero_ip6(ipaddr) do{ \ - ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0) -/** @ingroup ipaddr */ -#define ip_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \ - ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) -/** @ingroup ipaddr */ -#define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \ - ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) -/** @ingroup ipaddr */ -#define ip_addr_set_hton(dest, src) do{if(IP_IS_V6(src)){ \ - ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0) -/** @ingroup ipaddr */ -#define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \ - ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \ - ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0) -/** @ingroup ipaddr */ -#define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \ - 0 : \ - ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask)) -/** @ingroup ipaddr */ -#define ip_addr_cmp(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \ - ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ - ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) -/** @ingroup ipaddr */ -#define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \ - ip6_addr_isany(ip_2_ip6(ipaddr)) : \ - ip4_addr_isany(ip_2_ip4(ipaddr))) -/** @ingroup ipaddr */ -#define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \ - ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \ - ip4_addr_isany_val(*ip_2_ip4(&(ipaddr)))) -/** @ingroup ipaddr */ -#define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \ - 0 : \ - ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif)) -/** @ingroup ipaddr */ -#define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \ - ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \ - ip4_addr_ismulticast(ip_2_ip4(ipaddr))) -/** @ingroup ipaddr */ -#define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \ - ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \ - ip4_addr_isloopback(ip_2_ip4(ipaddr))) -/** @ingroup ipaddr */ -#define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \ - ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \ - ip4_addr_islinklocal(ip_2_ip4(ipaddr))) -#define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \ - ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \ - ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0) -#define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \ - ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \ - ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0) -/** @ingroup ipaddr */ -#define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \ - ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr)))) -/** @ingroup ipaddr */ -#define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \ - ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen))) -int ipaddr_aton(const char *cp, ip_addr_t *addr); - -/** @ingroup ipaddr */ -#define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX - -/** @ingroup ipaddr */ -#define ip4_2_ipv4_mapped_ipv6(ip6addr, ip4addr) do { \ - (ip6addr)->addr[3] = (ip4addr)->addr; \ - (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[0] = 0; } while(0); - -/** @ingroup ipaddr */ -#define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \ - (ip4addr)->addr = (ip6addr)->addr[3]; - -#define IP46_ADDR_ANY(type) (((type) == IPADDR_TYPE_V6)? IP6_ADDR_ANY : IP4_ADDR_ANY) - -#else -#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1 -#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1 - -#if TLS_CONFIG_IPV4 -typedef ip4_addr_t ip_addr_t; -#define IPADDR4_INIT(u32val) { u32val } -#define IPADDR4_INIT_BYTES(a,b,c,d) IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d))) -#define IP_IS_V4_VAL(ipaddr) 1 -#define IP_IS_V6_VAL(ipaddr) 0 -#define IP_IS_V4(ipaddr) 1 -#define IP_IS_V6(ipaddr) 0 -#define IP_IS_ANY_TYPE_VAL(ipaddr) 0 -#define IP_SET_TYPE_VAL(ipaddr, iptype) -#define IP_SET_TYPE(ipaddr, iptype) -#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4 -#define ip_2_ip4(ipaddr) (ipaddr) -#define IP_ADDR4(ipaddr,a,b,c,d) IP4_ADDR(ipaddr,a,b,c,d) - -#define ip_addr_copy(dest, src) ip4_addr_copy(dest, src) -#define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src) -#define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val) -#define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr)) -#define ip_addr_set(dest, src) ip4_addr_set(dest, src) -#define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src) -#define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr) -#define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr) -#define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr) -#define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr) -#define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src) -#define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask) -#define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask) -#define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2) -#define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr) -#define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr) -#define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr) -#define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr) -#define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif) -#define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr) -#define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr) -#define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr) -#define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr) -#define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen) -#define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr) - -#define IPADDR_STRLEN_MAX IP4ADDR_STRLEN_MAX - -#define IP46_ADDR_ANY(type) (IP4_ADDR_ANY) -#else -typedef ip6_addr_t ip_addr_t; -#define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } } -#define IPADDR6_INIT_HOST(a, b, c, d) { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } -#define IP_IS_V4_VAL(ipaddr) 0 -#define IP_IS_V6_VAL(ipaddr) 1 -#define IP_IS_V4(ipaddr) 0 -#define IP_IS_V6(ipaddr) 1 -#define IP_IS_ANY_TYPE_VAL(ipaddr) 0 -#define IP_SET_TYPE_VAL(ipaddr, iptype) -#define IP_SET_TYPE(ipaddr, iptype) -#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6 -#define ip_2_ip6(ipaddr) (ipaddr) -#define IP_ADDR6(ipaddr,i0,i1,i2,i3) IP6_ADDR(ipaddr,i0,i1,i2,i3) -#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) - -#define ip_addr_copy(dest, src) ip6_addr_copy(dest, src) -#define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src) -#define ip_addr_set(dest, src) ip6_addr_set(dest, src) -#define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src) -#define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr) -#define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr) -#define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr) -#define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr) -#define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src) -#define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target) -#define ip_addr_netcmp(addr1, addr2, mask) 0 -#define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2) -#define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr) -#define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr) -#define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr) -#define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr) -#define ip_addr_isbroadcast(addr, netif) 0 -#define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr) -#define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr) -#define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr) -#define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr) -#define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen) -#define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr) - -#define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX - -#define IP46_ADDR_ANY(type) (IP6_ADDR_ANY) -#endif -#endif - - -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN IP4ADDR_STRLEN_MAX -#endif -#if TLS_CONFIG_IPV6 -#ifndef INET6_ADDRSTRLEN -#define INET6_ADDRSTRLEN IP6ADDR_STRLEN_MAX -#endif -#endif - -#if TLS_CONFIG_IPV4 && TLS_CONFIG_IPV6 -/** @ingroup socket */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \ - : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)) -/** @ingroup socket */ -#define inet_pton(af,src,dst) \ - (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \ - : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)) -#elif TLS_CONFIG_IPV4 /* TLS_CONFIG_IPV4 && TLS_CONFIG_IPV6 */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL) -#define inet_pton(af,src,dst) \ - (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0) -#else /* TLS_CONFIG_IPV4 && TLS_CONFIG_IPV6 */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL) -#define inet_pton(af,src,dst) \ - (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0) -#endif /* TLS_CONFIG_IPV4 && TLS_CONFIG_IPV6 */ - -extern void print_ipaddr(ip_addr_t *ip); - -extern struct netif *wm_ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src); -#endif diff --git a/src/W800_SDK_v1.00.10/include/net/wm_sockets2.1.3.h b/src/W800_SDK_v1.00.10/include/net/wm_sockets2.1.3.h new file mode 100644 index 0000000..236237f --- /dev/null +++ b/src/W800_SDK_v1.00.10/include/net/wm_sockets2.1.3.h @@ -0,0 +1,26 @@ +/** + * @file wm_sockets2.1.3.h + * + * @brief sockets2.1.3 apis + * + * @author winnermicro + * + * @copyright (c) 2014 Winner Microelectronics Co., Ltd. + */ +#ifndef WM_SOCKET_API2_1_3_H +#define WM_SOCKET_API2_1_3_H + +#include +#include "wm_type_def.h" +#include "wm_config.h" +#include + +#include "lwip/ip_addr.h" +#include "lwip/sockets.h" +#include "lwip/netdb.h" + +extern void print_ipaddr(ip_addr_t *ip); +extern struct netif *wm_ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src); + +#endif + diff --git a/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c b/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c deleted file mode 100644 index 900a48a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_sockets.c +++ /dev/null @@ -1,122 +0,0 @@ -#include "lwip/opt.h" - -#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/sockets.h" - -extern struct hostent* lwip_gethostbyname(const char *name); -int -accept(int s, struct sockaddr *addr, socklen_t *addrlen) -{ - return lwip_accept(s, addr, addrlen); -} - -int -bind(int s, const struct sockaddr *name, socklen_t namelen) -{ - return lwip_bind(s, name, namelen); -} - -int -shutdown(int s, int how) -{ - return lwip_shutdown(s, how); -} - -int -closesocket(int s) -{ - return lwip_close(s); -} - -int -connect(int s, const struct sockaddr *name, socklen_t namelen) -{ - return lwip_connect(s, name, namelen); -} - -int -getsockname(int s, struct sockaddr *name, socklen_t *namelen) -{ - return lwip_getsockname(s, name, namelen); -} - -int -getpeername(int s, struct sockaddr *name, socklen_t *namelen) -{ - return lwip_getpeername(s, name, namelen); -} - -int -setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) -{ - return lwip_setsockopt(s, level, optname, optval, optlen); -} - -int -getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) -{ - return lwip_getsockopt(s, level, optname, optval, optlen); -} - -int -listen(int s, int backlog) -{ - return lwip_listen(s, backlog); -} - -int -recv(int s, void *mem, size_t len, int flags) -{ - return lwip_recv(s, mem, len, flags); -} - -int -recvfrom(int s, void *mem, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen) -{ - return lwip_recvfrom(s, mem, len, flags, from, fromlen); -} - -int -send(int s, const void *data, size_t size, int flags) -{ - return lwip_send(s, data, size, flags); -} - -int -sendto(int s, const void *data, size_t size, int flags, - const struct sockaddr *to, socklen_t tolen) -{ - return lwip_sendto(s, data, size, flags, to, tolen); -} - -int -socket(int domain, int type, int protocol) -{ - return lwip_socket(domain, type, protocol); -} - -int -select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, - struct timeval *timeout) -{ - return lwip_select(maxfdp1, readset, writeset, exceptset, timeout); -} - -int -ioctlsocket(int s, long cmd, void *argp) -{ - return lwip_ioctl(s, cmd, argp); -} - -int -fcntl(int s, int cmd, int val) -{ - return lwip_fcntl(s, cmd, val); -} -struct hostent* gethostbyname(const char *name){ - return lwip_gethostbyname(name); -} - -#endif /* LWIP_SOCKET */ diff --git a/src/W800_SDK_v1.00.10/src/network/api2.0.3/Makefile b/src/W800_SDK_v1.00.10/src/network/api_wm/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/api2.0.3/Makefile rename to src/W800_SDK_v1.00.10/src/network/api_wm/Makefile diff --git a/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.c b/src/W800_SDK_v1.00.10/src/network/api_wm/tls_netconn.c similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.c rename to src/W800_SDK_v1.00.10/src/network/api_wm/tls_netconn.c index 7dcdaee..4f1911a 100644 --- a/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.c +++ b/src/W800_SDK_v1.00.10/src/network/api_wm/tls_netconn.c @@ -67,7 +67,6 @@ struct tls_netconn *get_server_conn(struct tls_netconn *conn) static struct tls_netconn *net_alloc_socket(struct tls_netconn *conn) { int sock=-1, i=0, j=0; - u32 cpu_sr; struct tls_netconn * conn_t = NULL; for (i = 0; i < TLS_MAX_NETCONN_NUM; i++) @@ -98,9 +97,9 @@ static struct tls_netconn *net_alloc_socket(struct tls_netconn *conn) TLS_DBGPRT_ERR("sock < 0\n"); return NULL; } - cpu_sr = tls_os_set_critical(); + conn_t = tls_mem_alloc(sizeof(struct tls_netconn)); - tls_os_release_critical(cpu_sr); + if (NULL != conn_t) { p_net_conn[sock] = conn_t; memset(conn_t, 0, sizeof(struct tls_netconn)); @@ -410,7 +409,7 @@ static err_t net_tcp_recv_cb(void *arg, LWIP_UNUSED_ARG(pcb); LWIP_ASSERT("must have a pcb argument", pcb != NULL); - LWIP_ASSERT("must have an argument", arg < 0); + //LWIP_ASSERT("must have an argument", arg < 0); socketno = (int)arg; conn = tls_net_get_socket(socketno); if(conn == NULL || TRUE != conn->used) @@ -716,7 +715,7 @@ static void net_udp_recv_cb(void *arg, struct udp_pcb *pcb, //TLS_DBGPRT_INFO("=====>\n"); LWIP_UNUSED_ARG(pcb); /* only used for asserts... */ LWIP_ASSERT("recv_udp must have a pcb argument", pcb != NULL); - LWIP_ASSERT("recv_udp must have an argument", arg < 0); + //LWIP_ASSERT("recv_udp must have an argument", arg < 0); socketno = (int)arg; conn = tls_net_get_socket(socketno); if(conn == NULL || conn->used != TRUE || NULL == pcb){ @@ -959,7 +958,7 @@ static err_t net_skt_tcp_send(struct tls_net_msg *net_msg) err = tcp_write(pcb, net_msg->dataptr, net_msg->len, TCP_WRITE_FLAG_COPY); if (err == ERR_OK){ //sys_sem_signal(&net_msg->conn->op_completed); - tcp_output(pcb); + err = tcp_output(pcb); } else { diff --git a/src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.h b/src/W800_SDK_v1.00.10/src/network/api_wm/tls_netconn.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/api2.0.3/tls_netconn.h rename to src/W800_SDK_v1.00.10/src/network/api_wm/tls_netconn.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c deleted file mode 100644 index 754cdc2..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/pppapi.c +++ /dev/null @@ -1,370 +0,0 @@ -/** - * @file - * Point To Point Protocol Sequential API module - * - */ - -/* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#include "lwip/opt.h" - -#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pppapi.h" -#include "lwip/priv/tcpip_priv.h" -#include "netif/ppp/pppoe.h" -#include "netif/ppp/pppol2tp.h" -#include "netif/ppp/pppos.h" - -/** - * Call ppp_set_default() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_set_default(struct pppapi_msg_msg *msg) -{ - ppp_set_default(msg->ppp); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_set_default() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -void -pppapi_set_default(ppp_pcb *pcb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_set_default; - msg.msg.ppp = pcb; - TCPIP_PPPAPI(&msg); -} - - -/** - * Call ppp_set_auth() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_set_auth(struct pppapi_msg_msg *msg) -{ - ppp_set_auth(msg->ppp, msg->msg.setauth.authtype, - msg->msg.setauth.user, msg->msg.setauth.passwd); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_set_auth() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -void -pppapi_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_set_auth; - msg.msg.ppp = pcb; - msg.msg.msg.setauth.authtype = authtype; - msg.msg.msg.setauth.user = user; - msg.msg.msg.setauth.passwd = passwd; - TCPIP_PPPAPI(&msg); -} - - -#if PPP_NOTIFY_PHASE -/** - * Call ppp_set_notify_phase_callback() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_set_notify_phase_callback(struct pppapi_msg_msg *msg) -{ - ppp_set_notify_phase_callback(msg->ppp, msg->msg.setnotifyphasecb.notify_phase_cb); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_set_notify_phase_callback() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -void -pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_set_notify_phase_callback; - msg.msg.ppp = pcb; - msg.msg.msg.setnotifyphasecb.notify_phase_cb = notify_phase_cb; - TCPIP_PPPAPI(&msg); -} -#endif /* PPP_NOTIFY_PHASE */ - - -#if PPPOS_SUPPORT -/** - * Call pppos_create() inside the tcpip_thread context. - */ -static void -pppapi_do_pppos_create(struct pppapi_msg_msg *msg) -{ - msg->ppp = pppos_create(msg->msg.serialcreate.pppif, msg->msg.serialcreate.output_cb, - msg->msg.serialcreate.link_status_cb, msg->msg.serialcreate.ctx_cb); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call pppos_create() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -ppp_pcb* -pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, - ppp_link_status_cb_fn link_status_cb, void *ctx_cb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_pppos_create; - msg.msg.msg.serialcreate.pppif = pppif; - msg.msg.msg.serialcreate.output_cb = output_cb; - msg.msg.msg.serialcreate.link_status_cb = link_status_cb; - msg.msg.msg.serialcreate.ctx_cb = ctx_cb; - TCPIP_PPPAPI(&msg); - return msg.msg.ppp; -} -#endif /* PPPOS_SUPPORT */ - - -#if PPPOE_SUPPORT -/** - * Call pppoe_create() inside the tcpip_thread context. - */ -static void -pppapi_do_pppoe_create(struct pppapi_msg_msg *msg) -{ - - msg->ppp = pppoe_create(msg->msg.ethernetcreate.pppif, msg->msg.ethernetcreate.ethif, - msg->msg.ethernetcreate.service_name, msg->msg.ethernetcreate.concentrator_name, - msg->msg.ethernetcreate.link_status_cb, msg->msg.ethernetcreate.ctx_cb); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call pppoe_create() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -ppp_pcb* -pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name, - const char *concentrator_name, ppp_link_status_cb_fn link_status_cb, - void *ctx_cb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_pppoe_create; - msg.msg.msg.ethernetcreate.pppif = pppif; - msg.msg.msg.ethernetcreate.ethif = ethif; - msg.msg.msg.ethernetcreate.service_name = service_name; - msg.msg.msg.ethernetcreate.concentrator_name = concentrator_name; - msg.msg.msg.ethernetcreate.link_status_cb = link_status_cb; - msg.msg.msg.ethernetcreate.ctx_cb = ctx_cb; - TCPIP_PPPAPI(&msg); - return msg.msg.ppp; -} -#endif /* PPPOE_SUPPORT */ - - -#if PPPOL2TP_SUPPORT -/** - * Call pppol2tp_create() inside the tcpip_thread context. - */ -static void -pppapi_do_pppol2tp_create(struct pppapi_msg_msg *msg) -{ - msg->ppp = pppol2tp_create(msg->msg.l2tpcreate.pppif, - msg->msg.l2tpcreate.netif, msg->msg.l2tpcreate.ipaddr, msg->msg.l2tpcreate.port, -#if PPPOL2TP_AUTH_SUPPORT - msg->msg.l2tpcreate.secret, - msg->msg.l2tpcreate.secret_len, -#else /* PPPOL2TP_AUTH_SUPPORT */ - NULL, -#endif /* PPPOL2TP_AUTH_SUPPORT */ - msg->msg.l2tpcreate.link_status_cb, msg->msg.l2tpcreate.ctx_cb); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call pppol2tp_create() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -ppp_pcb* -pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port, - const u8_t *secret, u8_t secret_len, - ppp_link_status_cb_fn link_status_cb, void *ctx_cb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_pppol2tp_create; - msg.msg.msg.l2tpcreate.pppif = pppif; - msg.msg.msg.l2tpcreate.netif = netif; - msg.msg.msg.l2tpcreate.ipaddr = ipaddr; - msg.msg.msg.l2tpcreate.port = port; -#if PPPOL2TP_AUTH_SUPPORT - msg.msg.msg.l2tpcreate.secret = secret; - msg.msg.msg.l2tpcreate.secret_len = secret_len; -#endif /* PPPOL2TP_AUTH_SUPPORT */ - msg.msg.msg.l2tpcreate.link_status_cb = link_status_cb; - msg.msg.msg.l2tpcreate.ctx_cb = ctx_cb; - TCPIP_PPPAPI(&msg); - return msg.msg.ppp; -} -#endif /* PPPOL2TP_SUPPORT */ - - -/** - * Call ppp_connect() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_connect(struct pppapi_msg_msg *msg) -{ - msg->err = ppp_connect(msg->ppp, msg->msg.connect.holdoff); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_connect() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -err_t -pppapi_connect(ppp_pcb *pcb, u16_t holdoff) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_connect; - msg.msg.ppp = pcb; - msg.msg.msg.connect.holdoff = holdoff; - TCPIP_PPPAPI(&msg); - return msg.msg.err; -} - - -#if PPP_SERVER -/** - * Call ppp_listen() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_listen(struct pppapi_msg_msg *msg) -{ - msg->err = ppp_listen(msg->ppp, msg->msg.listen.addrs); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_listen() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -err_t -pppapi_listen(ppp_pcb *pcb, struct ppp_addrs *addrs) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_listen; - msg.msg.ppp = pcb; - msg.msg.msg.listen.addrs = addrs; - TCPIP_PPPAPI(&msg); - return msg.msg.err; -} -#endif /* PPP_SERVER */ - - -/** - * Call ppp_close() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_close(struct pppapi_msg_msg *msg) -{ - msg->err = ppp_close(msg->ppp, msg->msg.close.nocarrier); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_close() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -err_t -pppapi_close(ppp_pcb *pcb, u8_t nocarrier) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_close; - msg.msg.ppp = pcb; - msg.msg.msg.close.nocarrier = nocarrier; - TCPIP_PPPAPI(&msg); - return msg.msg.err; -} - - -/** - * Call ppp_free() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_free(struct pppapi_msg_msg *msg) -{ - msg->err = ppp_free(msg->ppp); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_free() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -err_t -pppapi_free(ppp_pcb *pcb) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_free; - msg.msg.ppp = pcb; - TCPIP_PPPAPI(&msg); - return msg.msg.err; -} - - -/** - * Call ppp_ioctl() inside the tcpip_thread context. - */ -static void -pppapi_do_ppp_ioctl(struct pppapi_msg_msg *msg) -{ - msg->err = ppp_ioctl(msg->ppp, msg->msg.ioctl.cmd, msg->msg.ioctl.arg); - TCPIP_PPPAPI_ACK(msg); -} - -/** - * Call ppp_ioctl() in a thread-safe way by running that function inside the - * tcpip_thread context. - */ -err_t -pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg) -{ - struct pppapi_msg msg; - msg.function = pppapi_do_ppp_ioctl; - msg.msg.ppp = pcb; - msg.msg.msg.ioctl.cmd = cmd; - msg.msg.msg.ioctl.arg = arg; - TCPIP_PPPAPI(&msg); - return msg.msg.err; -} - - -#endif /* LWIP_PPP_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c deleted file mode 100644 index c389b4e..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/sockets.c +++ /dev/null @@ -1,2846 +0,0 @@ -/** - * @file - * Sockets BSD-Like API module - * - * @defgroup socket Socket API - * @ingroup sequential_api - * BSD-style socket API.\n - * Thread-safe, to be called from non-TCPIP threads only.\n - * Can be activated by defining @ref LWIP_SOCKET to 1.\n - * Header is in posix/sys/socket.h\b - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - * Improved by Marc Boucher and David Haas - * - */ - -#include "lwip/opt.h" - -#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/sockets.h" -#include "lwip/api.h" -#include "lwip/sys.h" -#include "lwip/igmp.h" -#include "lwip/inet.h" -#include "lwip/tcp.h" -#include "lwip/raw.h" -#include "lwip/udp.h" -#include "lwip/memp.h" -#include "lwip/pbuf.h" -#include "lwip/priv/tcpip_priv.h" -#if LWIP_CHECKSUM_ON_COPY -#include "lwip/inet_chksum.h" -#endif - -#include -#include - -/* If the netconn API is not required publicly, then we include the necessary - files here to get the implementation */ -#if !LWIP_NETCONN -#undef LWIP_NETCONN -#define LWIP_NETCONN 1 -#include "api_msg.c" -#include "api_lib.c" -#include "netbuf.c" -#undef LWIP_NETCONN -#define LWIP_NETCONN 0 -#endif - -#if LWIP_IPV4 -#define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \ - (sin)->sin_len = sizeof(struct sockaddr_in); \ - (sin)->sin_family = AF_INET; \ - (sin)->sin_port = lwip_htons((port)); \ - inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \ - memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0) -#define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipaddr, port) do { \ - inet_addr_to_ip4addr(ip_2_ip4(ipaddr), &((sin)->sin_addr)); \ - (port) = lwip_ntohs((sin)->sin_port); }while(0) -#endif /* LWIP_IPV4 */ - -#if LWIP_IPV6 -#define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \ - (sin6)->sin6_len = sizeof(struct sockaddr_in6); \ - (sin6)->sin6_family = AF_INET6; \ - (sin6)->sin6_port = lwip_htons((port)); \ - (sin6)->sin6_flowinfo = 0; \ - inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \ - (sin6)->sin6_scope_id = 0; }while(0) -#define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \ - inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \ - (port) = lwip_ntohs((sin6)->sin6_port); }while(0) -#endif /* LWIP_IPV6 */ - -#if LWIP_IPV4 && LWIP_IPV6 -static void sockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port); - -#define IS_SOCK_ADDR_LEN_VALID(namelen) (((namelen) == sizeof(struct sockaddr_in)) || \ - ((namelen) == sizeof(struct sockaddr_in6))) -#define IS_SOCK_ADDR_TYPE_VALID(name) (((name)->sa_family == AF_INET) || \ - ((name)->sa_family == AF_INET6)) -#define SOCK_ADDR_TYPE_MATCH(name, sock) \ - ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \ - (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type)))) -#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) do { \ - if (IP_IS_V6(ipaddr)) { \ - IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port); \ - } else { \ - IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port); \ - } } while(0) -#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) sockaddr_to_ipaddr_port(sockaddr, ipaddr, &(port)) -#define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? \ - (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6)) -#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */ -#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in6)) -#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET6) -#define SOCK_ADDR_TYPE_MATCH(name, sock) 1 -#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \ - IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port) -#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \ - SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, port) -#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type) -#else /*-> LWIP_IPV4: LWIP_IPV4 && LWIP_IPV6 */ -#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in)) -#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET) -#define SOCK_ADDR_TYPE_MATCH(name, sock) 1 -#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \ - IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port) -#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \ - SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, port) -#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type) -#endif /* LWIP_IPV6 */ - -#define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) (((name)->sa_family == AF_UNSPEC) || \ - IS_SOCK_ADDR_TYPE_VALID(name)) -#define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \ - SOCK_ADDR_TYPE_MATCH(name, sock)) -#define IS_SOCK_ADDR_ALIGNED(name) ((((mem_ptr_t)(name)) % 4) == 0) - - -#define LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype) do { if ((optlen) < sizeof(opttype)) { return EINVAL; }}while(0) -#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \ - LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \ - if ((sock)->conn == NULL) { return EINVAL; } }while(0) -#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \ - LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \ - if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { return EINVAL; } }while(0) -#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \ - if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { return ENOPROTOOPT; } }while(0) - - -#define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name) API_VAR_REF(name) -#define LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_setgetsockopt_data, name) -#define LWIP_SETGETSOCKOPT_DATA_VAR_FREE(name) API_VAR_FREE(MEMP_SOCKET_SETGETSOCKOPT_DATA, name) -#if LWIP_MPU_COMPATIBLE -#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \ - name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \ - if (name == NULL) { \ - sock_set_errno(sock, ENOMEM); \ - return -1; \ - } }while(0) -#else /* LWIP_MPU_COMPATIBLE */ -#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) -#endif /* LWIP_MPU_COMPATIBLE */ - -#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD -#define LWIP_SO_SNDRCVTIMEO_OPTTYPE int -#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) (*(int *)(optval) = (val)) -#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((s32_t)*(const int*)(optval)) -#else -#define LWIP_SO_SNDRCVTIMEO_OPTTYPE struct timeval -#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) do { \ - s32_t loc = (val); \ - ((struct timeval *)(optval))->tv_sec = (loc) / 1000U; \ - ((struct timeval *)(optval))->tv_usec = ((loc) % 1000U) * 1000U; }while(0) -#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000U) + (((const struct timeval *)(optval))->tv_usec / 1000U)) -#endif - -#define NUM_SOCKETS MEMP_NUM_NETCONN - -/** This is overridable for the rare case where more than 255 threads - * select on the same socket... - */ -#ifndef SELWAIT_T -#define SELWAIT_T u8_t -#endif - -/** Contains all internal pointers and states used for a socket */ -struct lwip_sock { - /** sockets currently are built on netconns, each socket has one netconn */ - struct netconn *conn; - /** data that was left from the previous read */ - void *lastdata; - /** offset in the data that was left from the previous read */ - u16_t lastoffset; - /** number of times data was received, set by event_callback(), - tested by the receive and select functions */ - s16_t rcvevent; - /** number of times data was ACKed (free send buffer), set by event_callback(), - tested by select */ - u16_t sendevent; - /** error happened for this socket, set by event_callback(), tested by select */ - u16_t errevent; - /** last error that occurred on this socket (in fact, all our errnos fit into an u8_t) */ - u8_t err; - /** counter of how many threads are waiting for this socket using select */ - SELWAIT_T select_waiting; -}; - -#if LWIP_NETCONN_SEM_PER_THREAD -#define SELECT_SEM_T sys_sem_t* -#define SELECT_SEM_PTR(sem) (sem) -#else /* LWIP_NETCONN_SEM_PER_THREAD */ -#define SELECT_SEM_T sys_sem_t -#define SELECT_SEM_PTR(sem) (&(sem)) -#endif /* LWIP_NETCONN_SEM_PER_THREAD */ - -/** Description for a task waiting in select */ -struct lwip_select_cb { - /** Pointer to the next waiting task */ - struct lwip_select_cb *next; - /** Pointer to the previous waiting task */ - struct lwip_select_cb *prev; - /** readset passed to select */ - fd_set *readset; - /** writeset passed to select */ - fd_set *writeset; - /** unimplemented: exceptset passed to select */ - fd_set *exceptset; - /** don't signal the same semaphore twice: set to 1 when signalled */ - int sem_signalled; - /** semaphore to wake up a task waiting for select */ - SELECT_SEM_T sem; -}; - -/** A struct sockaddr replacement that has the same alignment as sockaddr_in/ - * sockaddr_in6 if instantiated. - */ -union sockaddr_aligned { - struct sockaddr sa; -#if LWIP_IPV6 - struct sockaddr_in6 sin6; -#endif /* LWIP_IPV6 */ -#if LWIP_IPV4 - struct sockaddr_in sin; -#endif /* LWIP_IPV4 */ -}; - -#if LWIP_IGMP -/* Define the number of IPv4 multicast memberships, default is one per socket */ -#ifndef LWIP_SOCKET_MAX_MEMBERSHIPS -#define LWIP_SOCKET_MAX_MEMBERSHIPS NUM_SOCKETS -#endif - -/* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when - a socket is closed */ -struct lwip_socket_multicast_pair { - /** the socket */ - struct lwip_sock* sock; - /** the interface address */ - ip4_addr_t if_addr; - /** the group address */ - ip4_addr_t multi_addr; -}; - -struct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS]; - -static int lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr); -static void lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr); -static void lwip_socket_drop_registered_memberships(int s); -#endif /* LWIP_IGMP */ - -/** The global array of available sockets */ -static struct lwip_sock sockets[NUM_SOCKETS]; -/** The global list of tasks waiting for select */ -static struct lwip_select_cb *select_cb_list; -/** This counter is increased from lwip_select when the list is changed - and checked in event_callback to see if it has changed. */ -static volatile int select_cb_ctr; - -#if LWIP_SOCKET_SET_ERRNO -#ifndef set_errno -#define set_errno(err) do { errno = (err); } while(0) -#endif -#else /* LWIP_SOCKET_SET_ERRNO */ -#define set_errno(err) -#endif /* LWIP_SOCKET_SET_ERRNO */ - -#define sock_set_errno(sk, e) do { \ - const int sockerr = (e); \ - sk->err = (u8_t)sockerr; \ - set_errno(sockerr); \ -} while (0) - -/* Forward declaration of some functions */ -static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len); -#if !LWIP_TCPIP_CORE_LOCKING -static void lwip_getsockopt_callback(void *arg); -static void lwip_setsockopt_callback(void *arg); -#endif -static u8_t lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen); -static u8_t lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen); - -#if LWIP_IPV4 && LWIP_IPV6 -static void -sockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port) -{ - if ((sockaddr->sa_family) == AF_INET6) { - SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, *port); - ipaddr->type = IPADDR_TYPE_V6; - } else { - SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, *port); - ipaddr->type = IPADDR_TYPE_V4; - } -} -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - -/** LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */ -void -lwip_socket_thread_init(void) -{ - netconn_thread_init(); -} - -/** LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */ -void -lwip_socket_thread_cleanup(void) -{ - netconn_thread_cleanup(); -} - -/** - * Map a externally used socket index to the internal socket representation. - * - * @param s externally used socket index - * @return struct lwip_sock for the socket or NULL if not found - */ -static struct lwip_sock * -get_socket(int s) -{ - struct lwip_sock *sock; - - s -= LWIP_SOCKET_OFFSET; - - if ((s < 0) || (s >= NUM_SOCKETS)) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s + LWIP_SOCKET_OFFSET)); - set_errno(EBADF); - return NULL; - } - - sock = &sockets[s]; - - if (!sock->conn) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s + LWIP_SOCKET_OFFSET)); - set_errno(EBADF); - return NULL; - } - - return sock; -} - -/** - * Same as get_socket but doesn't set errno - * - * @param s externally used socket index - * @return struct lwip_sock for the socket or NULL if not found - */ -static struct lwip_sock * -tryget_socket(int s) -{ - s -= LWIP_SOCKET_OFFSET; - if ((s < 0) || (s >= NUM_SOCKETS)) { - return NULL; - } - if (!sockets[s].conn) { - return NULL; - } - return &sockets[s]; -} - -/** - * Allocate a new socket for a given netconn. - * - * @param newconn the netconn for which to allocate a socket - * @param accepted 1 if socket has been created by accept(), - * 0 if socket has been created by socket() - * @return the index of the new socket; -1 on error - */ -static int -alloc_socket(struct netconn *newconn, int accepted) -{ - int i; - SYS_ARCH_DECL_PROTECT(lev); - - /* allocate a new socket identifier */ - for (i = 0; i < NUM_SOCKETS; ++i) { - /* Protect socket array */ - SYS_ARCH_PROTECT(lev); - if (!sockets[i].conn /*&& (sockets[i].select_waiting == 0)*/) { - sockets[i].conn = newconn; - /* The socket is not yet known to anyone, so no need to protect - after having marked it as used. */ - SYS_ARCH_UNPROTECT(lev); - sockets[i].lastdata = NULL; - sockets[i].lastoffset = 0; - sockets[i].rcvevent = 0; - /* TCP sendbuf is empty, but the socket is not yet writable until connected - * (unless it has been created by accept()). */ - sockets[i].sendevent = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1); - sockets[i].errevent = 0; - sockets[i].err = 0; - return i + LWIP_SOCKET_OFFSET; - } - SYS_ARCH_UNPROTECT(lev); - } - return -1; -} - -/** Free a socket. The socket's netconn must have been - * delete before! - * - * @param sock the socket to free - * @param is_tcp != 0 for TCP sockets, used to free lastdata - */ -static void -free_socket(struct lwip_sock *sock, int is_tcp) -{ - void *lastdata; - - lastdata = sock->lastdata; - sock->lastdata = NULL; - sock->lastoffset = 0; - sock->err = 0; - - /* Protect socket array */ - SYS_ARCH_SET(sock->conn, NULL); - /* don't use 'sock' after this line, as another task might have allocated it */ - - if (lastdata != NULL) { - if (is_tcp) { - pbuf_free((struct pbuf *)lastdata); - } else { - netbuf_delete((struct netbuf *)lastdata); - } - } -} - -/* Below this, the well-known socket functions are implemented. - * Use google.com or opengroup.org to get a good description :-) - * - * Exceptions are documented! - */ - -int -lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) -{ - struct lwip_sock *sock, *nsock; - struct netconn *newconn; - ip_addr_t naddr; - u16_t port = 0; - int newsock; - err_t err; - SYS_ARCH_DECL_PROTECT(lev); - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s)); - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0)) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s)); - set_errno(EWOULDBLOCK); - return -1; - } - - /* wait for a new connection */ - err = netconn_accept(sock->conn, &newconn); - if (err != ERR_OK) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err)); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { - sock_set_errno(sock, EOPNOTSUPP); - } else if (err == ERR_CLSD) { - sock_set_errno(sock, EINVAL); - } else { - sock_set_errno(sock, err_to_errno(err)); - } - return -1; - } - LWIP_ASSERT("newconn != NULL", newconn != NULL); - - newsock = alloc_socket(newconn, 1); - if (newsock == -1) { - netconn_delete(newconn); - sock_set_errno(sock, ENFILE); - return -1; - } - LWIP_ASSERT("invalid socket index", (newsock >= LWIP_SOCKET_OFFSET) && (newsock < NUM_SOCKETS + LWIP_SOCKET_OFFSET)); - LWIP_ASSERT("newconn->callback == event_callback", newconn->callback == event_callback); - nsock = &sockets[newsock - LWIP_SOCKET_OFFSET]; - - /* See event_callback: If data comes in right away after an accept, even - * though the server task might not have created a new socket yet. - * In that case, newconn->socket is counted down (newconn->socket--), - * so nsock->rcvevent is >= 1 here! - */ - SYS_ARCH_PROTECT(lev); - nsock->rcvevent += (s16_t)(-1 - newconn->socket); - newconn->socket = newsock; - SYS_ARCH_UNPROTECT(lev); - - /* Note that POSIX only requires us to check addr is non-NULL. addrlen must - * not be NULL if addr is valid. - */ - if (addr != NULL) { - union sockaddr_aligned tempaddr; - /* get the IP address and port of the remote host */ - err = netconn_peer(newconn, &naddr, &port); - if (err != ERR_OK) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err)); - netconn_delete(newconn); - free_socket(nsock, 1); - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL); - - IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port); - if (*addrlen > tempaddr.sa.sa_len) { - *addrlen = tempaddr.sa.sa_len; - } - MEMCPY(addr, &tempaddr, *addrlen); - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock)); - ip_addr_debug_print_val(SOCKETS_DEBUG, naddr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port)); - } else { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d", s, newsock)); - } - - sock_set_errno(sock, 0); - return newsock; -} - -int -lwip_bind(int s, const struct sockaddr *name, socklen_t namelen) -{ - struct lwip_sock *sock; - ip_addr_t local_addr; - u16_t local_port; - err_t err; - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (!SOCK_ADDR_TYPE_MATCH(name, sock)) { - /* sockaddr does not match socket type (IPv4/IPv6) */ - sock_set_errno(sock, err_to_errno(ERR_VAL)); - return -1; - } - - /* check size, family and alignment of 'name' */ - LWIP_ERROR("lwip_bind: invalid address", (IS_SOCK_ADDR_LEN_VALID(namelen) && - IS_SOCK_ADDR_TYPE_VALID(name) && IS_SOCK_ADDR_ALIGNED(name)), - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - LWIP_UNUSED_ARG(namelen); - - SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s)); - ip_addr_debug_print_val(SOCKETS_DEBUG, local_addr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", local_port)); - -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ - if (IP_IS_V6_VAL(local_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&local_addr))) { - unmap_ipv4_mapped_ipv6(ip_2_ip4(&local_addr), ip_2_ip6(&local_addr)); - IP_SET_TYPE_VAL(local_addr, IPADDR_TYPE_V4); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - err = netconn_bind(sock->conn, &local_addr, local_port); - - if (err != ERR_OK) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err)); - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s)); - sock_set_errno(sock, 0); - return 0; -} - -int -lwip_close(int s) -{ - struct lwip_sock *sock; - int is_tcp = 0; - err_t err; - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s)); - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (sock->conn != NULL) { - is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP; - } else { - LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata == NULL); - } - -#if LWIP_IGMP - /* drop all possibly joined IGMP memberships */ - lwip_socket_drop_registered_memberships(s); -#endif /* LWIP_IGMP */ - - err = netconn_delete(sock->conn); - if (err != ERR_OK) { - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - - free_socket(sock, is_tcp); - set_errno(0); - return 0; -} - -int -lwip_connect(int s, const struct sockaddr *name, socklen_t namelen) -{ - struct lwip_sock *sock; - err_t err; - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock)) { - /* sockaddr does not match socket type (IPv4/IPv6) */ - sock_set_errno(sock, err_to_errno(ERR_VAL)); - return -1; - } - - LWIP_UNUSED_ARG(namelen); - if (name->sa_family == AF_UNSPEC) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s)); - err = netconn_disconnect(sock->conn); - } else { - ip_addr_t remote_addr; - u16_t remote_port; - - /* check size, family and alignment of 'name' */ - LWIP_ERROR("lwip_connect: invalid address", IS_SOCK_ADDR_LEN_VALID(namelen) && - IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) && IS_SOCK_ADDR_ALIGNED(name), - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - - SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s)); - ip_addr_debug_print_val(SOCKETS_DEBUG, remote_addr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", remote_port)); - -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ - if (IP_IS_V6_VAL(remote_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&remote_addr))) { - unmap_ipv4_mapped_ipv6(ip_2_ip4(&remote_addr), ip_2_ip6(&remote_addr)); - IP_SET_TYPE_VAL(remote_addr, IPADDR_TYPE_V4); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - err = netconn_connect(sock->conn, &remote_addr, remote_port); - } - - if (err != ERR_OK) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err)); - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s)); - sock_set_errno(sock, 0); - return 0; -} - -/** - * Set a socket into listen mode. - * The socket may not have been used for another connection previously. - * - * @param s the socket to set to listening mode - * @param backlog (ATTENTION: needs TCP_LISTEN_BACKLOG=1) - * @return 0 on success, non-zero on failure - */ -int -lwip_listen(int s, int backlog) -{ - struct lwip_sock *sock; - err_t err; - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog)); - - sock = get_socket(s); - if (!sock) { - return -1; - } - - /* limit the "backlog" parameter to fit in an u8_t */ - backlog = LWIP_MIN(LWIP_MAX(backlog, 0), 0xff); - - err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog); - - if (err != ERR_OK) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err)); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { - sock_set_errno(sock, EOPNOTSUPP); - return -1; - } - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - - sock_set_errno(sock, 0); - return 0; -} - -int -lwip_recvfrom(int s, void *mem, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen) -{ - struct lwip_sock *sock; - void *buf = NULL; - struct pbuf *p; - u16_t buflen, copylen; - int off = 0; - u8_t done = 0; - err_t err; - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags)); - sock = get_socket(s); - if (!sock) { - return -1; - } - - do { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: top while sock->lastdata=%p\n", sock->lastdata)); - /* Check if there is data left from the last recv operation. */ - if (sock->lastdata) { - buf = sock->lastdata; - } else { - /* If this is non-blocking call, then check first */ - if (((flags & MSG_DONTWAIT) || netconn_is_nonblocking(sock->conn)) && - (sock->rcvevent <= 0)) { - if (off > 0) { - /* already received data, return that */ - sock_set_errno(sock, 0); - return off; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s)); - set_errno(EWOULDBLOCK); - return -1; - } - - /* No data was left from the previous operation, so we try to get - some from the network. */ - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - err = netconn_recv_tcp_pbuf(sock->conn, (struct pbuf **)&buf); - } else { - err = netconn_recv(sock->conn, (struct netbuf **)&buf); - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: netconn_recv err=%d, netbuf=%p\n", - err, buf)); - - if (err != ERR_OK) { - if (off > 0) { - if (err == ERR_CLSD) { - /* closed but already received data, ensure select gets the FIN, too */ - event_callback(sock->conn, NETCONN_EVT_RCVPLUS, 0); - } - /* already received data, return that */ - sock_set_errno(sock, 0); - return off; - } - /* We should really do some error checking here. */ - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL, error is \"%s\"!\n", - s, lwip_strerr(err))); - sock_set_errno(sock, err_to_errno(err)); - if (err == ERR_CLSD) { - return 0; - } else { - return -1; - } - } - LWIP_ASSERT("buf != NULL", buf != NULL); - sock->lastdata = buf; - } - - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - p = (struct pbuf *)buf; - } else { - p = ((struct netbuf *)buf)->p; - } - buflen = p->tot_len; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: buflen=%"U16_F" len=%"SZT_F" off=%d sock->lastoffset=%"U16_F"\n", - buflen, len, off, sock->lastoffset)); - - buflen -= sock->lastoffset; - - if (len > buflen) { - copylen = buflen; - } else { - copylen = (u16_t)len; - } - - /* copy the contents of the received buffer into - the supplied memory pointer mem */ - pbuf_copy_partial(p, (u8_t*)mem + off, copylen, sock->lastoffset); - - off += copylen; - - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - LWIP_ASSERT("invalid copylen, len would underflow", len >= copylen); - len -= copylen; - if ((len <= 0) || - (p->flags & PBUF_FLAG_PUSH) || - (sock->rcvevent <= 0) || - ((flags & MSG_PEEK) != 0)) { - done = 1; - } - } else { - done = 1; - } - - /* Check to see from where the data was.*/ - if (done) { -#if !SOCKETS_DEBUG - if (from && fromlen) -#endif /* !SOCKETS_DEBUG */ - { - u16_t port; - ip_addr_t tmpaddr; - ip_addr_t *fromaddr; - union sockaddr_aligned saddr; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s)); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - fromaddr = &tmpaddr; - netconn_getaddr(sock->conn, fromaddr, &port, 0); - } else { - port = netbuf_fromport((struct netbuf *)buf); - fromaddr = netbuf_fromaddr((struct netbuf *)buf); - } - -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */ - if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) && IP_IS_V4(fromaddr)) { - ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr)); - IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port); - ip_addr_debug_print(SOCKETS_DEBUG, fromaddr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off)); -#if SOCKETS_DEBUG - if (from && fromlen) -#endif /* SOCKETS_DEBUG */ - { - if (*fromlen > saddr.sa.sa_len) { - *fromlen = saddr.sa.sa_len; - } - MEMCPY(from, &saddr, *fromlen); - } - } - } - - /* If we don't peek the incoming message... */ - if ((flags & MSG_PEEK) == 0) { - /* If this is a TCP socket, check if there is data left in the - buffer. If so, it should be saved in the sock structure for next - time around. */ - if ((NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) && (buflen - copylen > 0)) { - sock->lastdata = buf; - sock->lastoffset += copylen; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: lastdata now netbuf=%p\n", buf)); - } else { - sock->lastdata = NULL; - sock->lastoffset = 0; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: deleting netbuf=%p\n", buf)); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { - pbuf_free((struct pbuf *)buf); - } else { - netbuf_delete((struct netbuf *)buf); - } - buf = NULL; - } - } - } while (!done); - - sock_set_errno(sock, 0); - return off; -} - -int -lwip_read(int s, void *mem, size_t len) -{ - return lwip_recvfrom(s, mem, len, 0, NULL, NULL); -} - -int -lwip_recv(int s, void *mem, size_t len, int flags) -{ - return lwip_recvfrom(s, mem, len, flags, NULL, NULL); -} - -int -lwip_send(int s, const void *data, size_t size, int flags) -{ - struct lwip_sock *sock; - err_t err; - u8_t write_flags; - size_t written; - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n", - s, data, size, flags)); - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { -#if (LWIP_UDP || LWIP_RAW) - return lwip_sendto(s, data, size, flags, NULL, 0); -#else /* (LWIP_UDP || LWIP_RAW) */ - sock_set_errno(sock, err_to_errno(ERR_ARG)); - return -1; -#endif /* (LWIP_UDP || LWIP_RAW) */ - } - - write_flags = NETCONN_COPY | - ((flags & MSG_MORE) ? NETCONN_MORE : 0) | - ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0); - written = 0; - err = netconn_write_partly(sock->conn, data, size, write_flags, &written); - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written)); - sock_set_errno(sock, err_to_errno(err)); - return (err == ERR_OK ? (int)written : -1); -} - -int -lwip_sendmsg(int s, const struct msghdr *msg, int flags) -{ - struct lwip_sock *sock; - int i; -#if LWIP_TCP - u8_t write_flags; - size_t written; -#endif - int size = 0; - err_t err = ERR_OK; - - sock = get_socket(s); - if (!sock) { - return -1; - } - - LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL, - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - - LWIP_UNUSED_ARG(msg->msg_control); - LWIP_UNUSED_ARG(msg->msg_controllen); - LWIP_UNUSED_ARG(msg->msg_flags); - LWIP_ERROR("lwip_sendmsg: invalid msghdr iov", (msg->msg_iov != NULL && msg->msg_iovlen != 0), - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { -#if LWIP_TCP - write_flags = NETCONN_COPY | - ((flags & MSG_MORE) ? NETCONN_MORE : 0) | - ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0); - - for (i = 0; i < msg->msg_iovlen; i++) { - u8_t apiflags = write_flags; - if (i + 1 < msg->msg_iovlen) { - apiflags |= NETCONN_MORE; - } - written = 0; - err = netconn_write_partly(sock->conn, msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len, write_flags, &written); - if (err == ERR_OK) { - size += written; - /* check that the entire IO vector was accepected, if not return a partial write */ - if (written != msg->msg_iov[i].iov_len) - break; - } - /* none of this IO vector was accepted, but previous was, return partial write and conceal ERR_WOULDBLOCK */ - else if (err == ERR_WOULDBLOCK && size > 0) { - err = ERR_OK; - /* let ERR_WOULDBLOCK persist on the netconn since we are returning ERR_OK */ - break; - } else { - size = -1; - break; - } - } - sock_set_errno(sock, err_to_errno(err)); - return size; -#else /* LWIP_TCP */ - sock_set_errno(sock, err_to_errno(ERR_ARG)); - return -1; -#endif /* LWIP_TCP */ - } - /* else, UDP and RAW NETCONNs */ -#if LWIP_UDP || LWIP_RAW - { - struct netbuf *chain_buf; - - LWIP_UNUSED_ARG(flags); - LWIP_ERROR("lwip_sendmsg: invalid msghdr name", (((msg->msg_name == NULL) && (msg->msg_namelen == 0)) || - IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)) , - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - - /* initialize chain buffer with destination */ - chain_buf = netbuf_new(); - if (!chain_buf) { - sock_set_errno(sock, err_to_errno(ERR_MEM)); - return -1; - } - if (msg->msg_name) { - u16_t remote_port; - SOCKADDR_TO_IPADDR_PORT((const struct sockaddr *)msg->msg_name, &chain_buf->addr, remote_port); - netbuf_fromport(chain_buf) = remote_port; - } -#if LWIP_NETIF_TX_SINGLE_PBUF - for (i = 0; i < msg->msg_iovlen; i++) { - size += msg->msg_iov[i].iov_len; - } - /* Allocate a new netbuf and copy the data into it. */ - if (netbuf_alloc(chain_buf, (u16_t)size) == NULL) { - err = ERR_MEM; - } else { - /* flatten the IO vectors */ - size_t offset = 0; - for (i = 0; i < msg->msg_iovlen; i++) { - MEMCPY(&((u8_t*)chain_buf->p->payload)[offset], msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len); - offset += msg->msg_iov[i].iov_len; - } -#if LWIP_CHECKSUM_ON_COPY - { - /* This can be improved by using LWIP_CHKSUM_COPY() and aggregating the checksum for each IO vector */ - u16_t chksum = ~inet_chksum_pbuf(chain_buf->p); - netbuf_set_chksum(chain_buf, chksum); - } -#endif /* LWIP_CHECKSUM_ON_COPY */ - err = ERR_OK; - } -#else /* LWIP_NETIF_TX_SINGLE_PBUF */ - /* create a chained netbuf from the IO vectors. NOTE: we assemble a pbuf chain - manually to avoid having to allocate, chain, and delete a netbuf for each iov */ - for (i = 0; i < msg->msg_iovlen; i++) { - struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF); - if (p == NULL) { - err = ERR_MEM; /* let netbuf_delete() cleanup chain_buf */ - break; - } - p->payload = msg->msg_iov[i].iov_base; - LWIP_ASSERT("iov_len < u16_t", msg->msg_iov[i].iov_len <= 0xFFFF); - p->len = p->tot_len = (u16_t)msg->msg_iov[i].iov_len; - /* netbuf empty, add new pbuf */ - if (chain_buf->p == NULL) { - chain_buf->p = chain_buf->ptr = p; - /* add pbuf to existing pbuf chain */ - } else { - pbuf_cat(chain_buf->p, p); - } - } - /* save size of total chain */ - if (err == ERR_OK) { - size = netbuf_len(chain_buf); - } -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - - if (err == ERR_OK) { -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ - if (IP_IS_V6_VAL(chain_buf->addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&chain_buf->addr))) { - unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf->addr), ip_2_ip6(&chain_buf->addr)); - IP_SET_TYPE_VAL(chain_buf->addr, IPADDR_TYPE_V4); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - /* send the data */ - err = netconn_send(sock->conn, chain_buf); - } - - /* deallocated the buffer */ - netbuf_delete(chain_buf); - - sock_set_errno(sock, err_to_errno(err)); - return (err == ERR_OK ? size : -1); - } -#else /* LWIP_UDP || LWIP_RAW */ - sock_set_errno(sock, err_to_errno(ERR_ARG)); - return -1; -#endif /* LWIP_UDP || LWIP_RAW */ -} - -int -lwip_sendto(int s, const void *data, size_t size, int flags, - const struct sockaddr *to, socklen_t tolen) -{ - struct lwip_sock *sock; - err_t err; - u16_t short_size; - u16_t remote_port; - struct netbuf buf; - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { -#if LWIP_TCP - return lwip_send(s, data, size, flags); -#else /* LWIP_TCP */ - LWIP_UNUSED_ARG(flags); - sock_set_errno(sock, err_to_errno(ERR_ARG)); - return -1; -#endif /* LWIP_TCP */ - } - - /* @todo: split into multiple sendto's? */ - LWIP_ASSERT("lwip_sendto: size must fit in u16_t", size <= 0xffff); - short_size = (u16_t)size; - LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) || - (IS_SOCK_ADDR_LEN_VALID(tolen) && - IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))), - sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); - LWIP_UNUSED_ARG(tolen); - - /* initialize a buffer */ - buf.p = buf.ptr = NULL; -#if LWIP_CHECKSUM_ON_COPY - buf.flags = 0; -#endif /* LWIP_CHECKSUM_ON_COPY */ - if (to) { - SOCKADDR_TO_IPADDR_PORT(to, &buf.addr, remote_port); - } else { - remote_port = 0; - ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr); - } - netbuf_fromport(&buf) = remote_port; - - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, short_size=%"U16_F", flags=0x%x to=", - s, data, short_size, flags)); - ip_addr_debug_print(SOCKETS_DEBUG, &buf.addr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port)); - - /* make the buffer point to the data that should be sent */ -#if LWIP_NETIF_TX_SINGLE_PBUF - /* Allocate a new netbuf and copy the data into it. */ - if (netbuf_alloc(&buf, short_size) == NULL) { - err = ERR_MEM; - } else { -#if LWIP_CHECKSUM_ON_COPY - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_RAW) { - u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size); - netbuf_set_chksum(&buf, chksum); - } else -#endif /* LWIP_CHECKSUM_ON_COPY */ - { - MEMCPY(buf.p->payload, data, short_size); - } - err = ERR_OK; - } -#else /* LWIP_NETIF_TX_SINGLE_PBUF */ - err = netbuf_ref(&buf, data, short_size); -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - if (err == ERR_OK) { -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ - if (IP_IS_V6_VAL(buf.addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&buf.addr))) { - unmap_ipv4_mapped_ipv6(ip_2_ip4(&buf.addr), ip_2_ip6(&buf.addr)); - IP_SET_TYPE_VAL(buf.addr, IPADDR_TYPE_V4); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - /* send the data */ - err = netconn_send(sock->conn, &buf); - } - - /* deallocated the buffer */ - netbuf_free(&buf); - - sock_set_errno(sock, err_to_errno(err)); - return (err == ERR_OK ? short_size : -1); -} - -int -lwip_socket(int domain, int type, int protocol) -{ - struct netconn *conn; - int i; - - LWIP_UNUSED_ARG(domain); /* @todo: check this */ - - /* create a netconn */ - switch (type) { - case SOCK_RAW: - conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW), - (u8_t)protocol, event_callback); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", - domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); - break; - case SOCK_DGRAM: - conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, - ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)) , - event_callback); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", - domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); - break; - case SOCK_STREAM: - conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), event_callback); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", - domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", - domain, type, protocol)); - set_errno(EINVAL); - return -1; - } - - if (!conn) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); - set_errno(ENOBUFS); - return -1; - } - - i = alloc_socket(conn, 0); - - if (i == -1) { - netconn_delete(conn); - set_errno(ENFILE); - return -1; - } - conn->socket = i; - LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); - set_errno(0); - return i; -} - -int -lwip_write(int s, const void *data, size_t size) -{ - return lwip_send(s, data, size, 0); -} - -int -lwip_writev(int s, const struct iovec *iov, int iovcnt) -{ - struct msghdr msg; - - msg.msg_name = NULL; - msg.msg_namelen = 0; - /* Hack: we have to cast via number to cast from 'const' pointer to non-const. - Blame the opengroup standard for this inconsistency. */ - msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov); - msg.msg_iovlen = iovcnt; - msg.msg_control = NULL; - msg.msg_controllen = 0; - msg.msg_flags = 0; - return lwip_sendmsg(s, &msg, 0); -} - -/** - * Go through the readset and writeset lists and see which socket of the sockets - * set in the sets has events. On return, readset, writeset and exceptset have - * the sockets enabled that had events. - * - * @param maxfdp1 the highest socket index in the sets - * @param readset_in set of sockets to check for read events - * @param writeset_in set of sockets to check for write events - * @param exceptset_in set of sockets to check for error events - * @param readset_out set of sockets that had read events - * @param writeset_out set of sockets that had write events - * @param exceptset_out set os sockets that had error events - * @return number of sockets that had events (read/write/exception) (>= 0) - */ -static int -lwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in, - fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out) -{ - int i, nready = 0; - fd_set lreadset, lwriteset, lexceptset; - struct lwip_sock *sock; - SYS_ARCH_DECL_PROTECT(lev); - - FD_ZERO(&lreadset); - FD_ZERO(&lwriteset); - FD_ZERO(&lexceptset); - - /* Go through each socket in each list to count number of sockets which - currently match */ - for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) { - /* if this FD is not in the set, continue */ - if (!(readset_in && FD_ISSET(i, readset_in)) && - !(writeset_in && FD_ISSET(i, writeset_in)) && - !(exceptset_in && FD_ISSET(i, exceptset_in))) { - continue; - } - /* First get the socket's status (protected)... */ - SYS_ARCH_PROTECT(lev); - sock = tryget_socket(i); - if (sock != NULL) { - void* lastdata = sock->lastdata; - s16_t rcvevent = sock->rcvevent; - u16_t sendevent = sock->sendevent; - u16_t errevent = sock->errevent; - SYS_ARCH_UNPROTECT(lev); - - /* ... then examine it: */ - /* See if netconn of this socket is ready for read */ - if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) { - FD_SET(i, &lreadset); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i)); - nready++; - } - /* See if netconn of this socket is ready for write */ - if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) { - FD_SET(i, &lwriteset); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i)); - nready++; - } - /* See if netconn of this socket had an error */ - if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) { - FD_SET(i, &lexceptset); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i)); - nready++; - } - } else { - SYS_ARCH_UNPROTECT(lev); - /* continue on to next FD in list */ - } - } - /* copy local sets to the ones provided as arguments */ - *readset_out = lreadset; - *writeset_out = lwriteset; - *exceptset_out = lexceptset; - - LWIP_ASSERT("nready >= 0", nready >= 0); - return nready; -} - -int -lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, - struct timeval *timeout) -{ - u32_t waitres = 0; - int nready; - fd_set lreadset, lwriteset, lexceptset; - u32_t msectimeout; - struct lwip_select_cb select_cb; - int i; - int maxfdp2; -#if LWIP_NETCONN_SEM_PER_THREAD - int waited = 0; -#endif - SYS_ARCH_DECL_PROTECT(lev); - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%"S32_F" tvusec=%"S32_F")\n", - maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, - timeout ? (s32_t)timeout->tv_sec : (s32_t)-1, - timeout ? (s32_t)timeout->tv_usec : (s32_t)-1)); - - /* Go through each socket in each list to count number of sockets which - currently match */ - nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); - - /* If we don't have any current events, then suspend if we are supposed to */ - if (!nready) { - if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) { - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n")); - /* This is OK as the local fdsets are empty and nready is zero, - or we would have returned earlier. */ - goto return_copy_fdsets; - } - - /* None ready: add our semaphore to list: - We don't actually need any dynamic memory. Our entry on the - list is only valid while we are in this function, so it's ok - to use local variables. */ - - select_cb.next = NULL; - select_cb.prev = NULL; - select_cb.readset = readset; - select_cb.writeset = writeset; - select_cb.exceptset = exceptset; - select_cb.sem_signalled = 0; -#if LWIP_NETCONN_SEM_PER_THREAD - select_cb.sem = LWIP_NETCONN_THREAD_SEM_GET(); -#else /* LWIP_NETCONN_SEM_PER_THREAD */ - if (sys_sem_new(&select_cb.sem, 0) != ERR_OK) { - /* failed to create semaphore */ - set_errno(ENOMEM); - return -1; - } -#endif /* LWIP_NETCONN_SEM_PER_THREAD */ - - /* Protect the select_cb_list */ - SYS_ARCH_PROTECT(lev); - - /* Put this select_cb on top of list */ - select_cb.next = select_cb_list; - if (select_cb_list != NULL) { - select_cb_list->prev = &select_cb; - } - select_cb_list = &select_cb; - /* Increasing this counter tells event_callback that the list has changed. */ - select_cb_ctr++; - - /* Now we can safely unprotect */ - SYS_ARCH_UNPROTECT(lev); - - /* Increase select_waiting for each socket we are interested in */ - maxfdp2 = maxfdp1; - for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) { - if ((readset && FD_ISSET(i, readset)) || - (writeset && FD_ISSET(i, writeset)) || - (exceptset && FD_ISSET(i, exceptset))) { - struct lwip_sock *sock; - SYS_ARCH_PROTECT(lev); - sock = tryget_socket(i); - if (sock != NULL) { - sock->select_waiting++; - LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); - } else { - /* Not a valid socket */ - nready = -1; - maxfdp2 = i; - SYS_ARCH_UNPROTECT(lev); - break; - } - SYS_ARCH_UNPROTECT(lev); - } - } - - if (nready >= 0) { - /* Call lwip_selscan again: there could have been events between - the last scan (without us on the list) and putting us on the list! */ - nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); - if (!nready) { - /* Still none ready, just wait to be woken */ - if (timeout == 0) { - /* Wait forever */ - msectimeout = 0; - } else { - msectimeout = ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000)); - if (msectimeout == 0) { - /* Wait 1ms at least (0 means wait forever) */ - msectimeout = 1; - } - } - - waitres = sys_arch_sem_wait(SELECT_SEM_PTR(select_cb.sem), msectimeout); -#if LWIP_NETCONN_SEM_PER_THREAD - waited = 1; -#endif - } - } - - /* Decrease select_waiting for each socket we are interested in */ - for (i = LWIP_SOCKET_OFFSET; i < maxfdp2; i++) { - if ((readset && FD_ISSET(i, readset)) || - (writeset && FD_ISSET(i, writeset)) || - (exceptset && FD_ISSET(i, exceptset))) { - struct lwip_sock *sock; - SYS_ARCH_PROTECT(lev); - sock = tryget_socket(i); - if (sock != NULL) { - /* for now, handle select_waiting==0... */ - LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); - if (sock->select_waiting > 0) { - sock->select_waiting--; - } - } else { - /* Not a valid socket */ - nready = -1; - } - SYS_ARCH_UNPROTECT(lev); - } - } - /* Take us off the list */ - SYS_ARCH_PROTECT(lev); - if (select_cb.next != NULL) { - select_cb.next->prev = select_cb.prev; - } - if (select_cb_list == &select_cb) { - LWIP_ASSERT("select_cb.prev == NULL", select_cb.prev == NULL); - select_cb_list = select_cb.next; - } else { - LWIP_ASSERT("select_cb.prev != NULL", select_cb.prev != NULL); - select_cb.prev->next = select_cb.next; - } - /* Increasing this counter tells event_callback that the list has changed. */ - select_cb_ctr++; - SYS_ARCH_UNPROTECT(lev); - -#if LWIP_NETCONN_SEM_PER_THREAD - if (select_cb.sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) { - /* don't leave the thread-local semaphore signalled */ - sys_arch_sem_wait(select_cb.sem, 1); - } -#else /* LWIP_NETCONN_SEM_PER_THREAD */ - sys_sem_free(&select_cb.sem); -#endif /* LWIP_NETCONN_SEM_PER_THREAD */ - - if (nready < 0) { - /* This happens when a socket got closed while waiting */ - set_errno(EBADF); - return -1; - } - - if (waitres == SYS_ARCH_TIMEOUT) { - /* Timeout */ - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n")); - /* This is OK as the local fdsets are empty and nready is zero, - or we would have returned earlier. */ - goto return_copy_fdsets; - } - - /* See what's set */ - nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); - } - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready)); -return_copy_fdsets: - set_errno(0); - if (readset) { - *readset = lreadset; - } - if (writeset) { - *writeset = lwriteset; - } - if (exceptset) { - *exceptset = lexceptset; - } - return nready; -} - -/** - * Callback registered in the netconn layer for each socket-netconn. - * Processes recvevent (data available) and wakes up tasks waiting for select. - */ -static void -event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) -{ - int s; - struct lwip_sock *sock; - struct lwip_select_cb *scb; - int last_select_cb_ctr; - SYS_ARCH_DECL_PROTECT(lev); - - LWIP_UNUSED_ARG(len); - - /* Get socket */ - if (conn) { - s = conn->socket; - if (s < 0) { - /* Data comes in right away after an accept, even though - * the server task might not have created a new socket yet. - * Just count down (or up) if that's the case and we - * will use the data later. Note that only receive events - * can happen before the new socket is set up. */ - SYS_ARCH_PROTECT(lev); - if (conn->socket < 0) { - if (evt == NETCONN_EVT_RCVPLUS) { - conn->socket--; - } - SYS_ARCH_UNPROTECT(lev); - return; - } - s = conn->socket; - SYS_ARCH_UNPROTECT(lev); - } - - sock = get_socket(s); - if (!sock) { - return; - } - } else { - return; - } - - SYS_ARCH_PROTECT(lev); - /* Set event as required */ - switch (evt) { - case NETCONN_EVT_RCVPLUS: - sock->rcvevent++; - break; - case NETCONN_EVT_RCVMINUS: - sock->rcvevent--; - break; - case NETCONN_EVT_SENDPLUS: - sock->sendevent = 1; - break; - case NETCONN_EVT_SENDMINUS: - sock->sendevent = 0; - break; - case NETCONN_EVT_ERROR: - sock->errevent = 1; - break; - default: - LWIP_ASSERT("unknown event", 0); - break; - } - - if (sock->select_waiting == 0) { - /* noone is waiting for this socket, no need to check select_cb_list */ - SYS_ARCH_UNPROTECT(lev); - return; - } - - /* Now decide if anyone is waiting for this socket */ - /* NOTE: This code goes through the select_cb_list list multiple times - ONLY IF a select was actually waiting. We go through the list the number - of waiting select calls + 1. This list is expected to be small. */ - - /* At this point, SYS_ARCH is still protected! */ -again: - for (scb = select_cb_list; scb != NULL; scb = scb->next) { - /* remember the state of select_cb_list to detect changes */ - last_select_cb_ctr = select_cb_ctr; - if (scb->sem_signalled == 0) { - /* semaphore not signalled yet */ - int do_signal = 0; - /* Test this select call for our socket */ - if (sock->rcvevent > 0) { - if (scb->readset && FD_ISSET(s, scb->readset)) { - do_signal = 1; - } - } - if (sock->sendevent != 0) { - if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) { - do_signal = 1; - } - } - if (sock->errevent != 0) { - if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) { - do_signal = 1; - } - } - if (do_signal) { - scb->sem_signalled = 1; - /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might - lead to the select thread taking itself off the list, invalidating the semaphore. */ - sys_sem_signal(SELECT_SEM_PTR(scb->sem)); - } - } - /* unlock interrupts with each step */ - SYS_ARCH_UNPROTECT(lev); - /* this makes sure interrupt protection time is short */ - SYS_ARCH_PROTECT(lev); - if (last_select_cb_ctr != select_cb_ctr) { - /* someone has changed select_cb_list, restart at the beginning */ - goto again; - } - } - SYS_ARCH_UNPROTECT(lev); -} - -/** - * Close one end of a full-duplex connection. - */ -int -lwip_shutdown(int s, int how) -{ - struct lwip_sock *sock; - err_t err; - u8_t shut_rx = 0, shut_tx = 0; - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how)); - - sock = get_socket(s); - if (!sock) { - return -1; - } - - if (sock->conn != NULL) { - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { - sock_set_errno(sock, EOPNOTSUPP); - return -1; - } - } else { - sock_set_errno(sock, ENOTCONN); - return -1; - } - - if (how == SHUT_RD) { - shut_rx = 1; - } else if (how == SHUT_WR) { - shut_tx = 1; - } else if (how == SHUT_RDWR) { - shut_rx = 1; - shut_tx = 1; - } else { - sock_set_errno(sock, EINVAL); - return -1; - } - err = netconn_shutdown(sock->conn, shut_rx, shut_tx); - - sock_set_errno(sock, err_to_errno(err)); - return (err == ERR_OK ? 0 : -1); -} - -static int -lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local) -{ - struct lwip_sock *sock; - union sockaddr_aligned saddr; - ip_addr_t naddr; - u16_t port; - err_t err; - - sock = get_socket(s); - if (!sock) { - return -1; - } - - /* get the IP address and port */ - err = netconn_getaddr(sock->conn, &naddr, &port, local); - if (err != ERR_OK) { - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - -#if LWIP_IPV4 && LWIP_IPV6 - /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */ - if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) && - IP_IS_V4_VAL(naddr)) { - ip4_2_ipv4_mapped_ipv6(ip_2_ip6(&naddr), ip_2_ip4(&naddr)); - IP_SET_TYPE_VAL(naddr, IPADDR_TYPE_V6); - } -#endif /* LWIP_IPV4 && LWIP_IPV6 */ - - IPADDR_PORT_TO_SOCKADDR(&saddr, &naddr, port); - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getaddrname(%d, addr=", s)); - ip_addr_debug_print_val(SOCKETS_DEBUG, naddr); - LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", port)); - - if (*namelen > saddr.sa.sa_len) { - *namelen = saddr.sa.sa_len; - } - MEMCPY(name, &saddr, *namelen); - - sock_set_errno(sock, 0); - return 0; -} - -int -lwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen) -{ - return lwip_getaddrname(s, name, namelen, 0); -} - -int -lwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen) -{ - return lwip_getaddrname(s, name, namelen, 1); -} - -int -lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) -{ - u8_t err; - struct lwip_sock *sock = get_socket(s); -#if !LWIP_TCPIP_CORE_LOCKING - LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data); -#endif /* !LWIP_TCPIP_CORE_LOCKING */ - - if (!sock) { - return -1; - } - - if ((NULL == optval) || (NULL == optlen)) { - sock_set_errno(sock, EFAULT); - return -1; - } - -#if LWIP_TCPIP_CORE_LOCKING - /* core-locking can just call the -impl function */ - LOCK_TCPIP_CORE(); - err = lwip_getsockopt_impl(s, level, optname, optval, optlen); - UNLOCK_TCPIP_CORE(); - -#else /* LWIP_TCPIP_CORE_LOCKING */ - -#if LWIP_MPU_COMPATIBLE - /* MPU_COMPATIBLE copies the optval data, so check for max size here */ - if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) { - sock_set_errno(sock, ENOBUFS); - return -1; - } -#endif /* LWIP_MPU_COMPATIBLE */ - - LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock); - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = *optlen; -#if !LWIP_MPU_COMPATIBLE - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.p = optval; -#endif /* !LWIP_MPU_COMPATIBLE */ - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0; -#if LWIP_NETCONN_SEM_PER_THREAD - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET(); -#else - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed; -#endif - err = tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data)); - if (err != ERR_OK) { - LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - sys_arch_sem_wait((sys_sem_t*)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0); - - /* write back optlen and optval */ - *optlen = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen; -#if LWIP_MPU_COMPATIBLE - MEMCPY(optval, LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen); -#endif /* LWIP_MPU_COMPATIBLE */ - - /* maybe lwip_getsockopt_internal has changed err */ - err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err; - LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); -#endif /* LWIP_TCPIP_CORE_LOCKING */ - - sock_set_errno(sock, err); - return err ? -1 : 0; -} - -#if !LWIP_TCPIP_CORE_LOCKING -/** lwip_getsockopt_callback: only used without CORE_LOCKING - * to get into the tcpip_thread - */ -static void -lwip_getsockopt_callback(void *arg) -{ - struct lwip_setgetsockopt_data *data; - LWIP_ASSERT("arg != NULL", arg != NULL); - data = (struct lwip_setgetsockopt_data*)arg; - - data->err = lwip_getsockopt_impl(data->s, data->level, data->optname, -#if LWIP_MPU_COMPATIBLE - data->optval, -#else /* LWIP_MPU_COMPATIBLE */ - data->optval.p, -#endif /* LWIP_MPU_COMPATIBLE */ - &data->optlen); - - sys_sem_signal((sys_sem_t*)(data->completed_sem)); -} -#endif /* LWIP_TCPIP_CORE_LOCKING */ - -/** lwip_getsockopt_impl: the actual implementation of getsockopt: - * same argument as lwip_getsockopt, either called directly or through callback - */ -static u8_t -lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen) -{ - u8_t err = 0; - struct lwip_sock *sock = tryget_socket(s); - if (!sock) { - return EBADF; - } - - switch (level) { - -/* Level: SOL_SOCKET */ - case SOL_SOCKET: - switch (optname) { - -#if LWIP_TCP - case SO_ACCEPTCONN: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); - if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) { - return ENOPROTOOPT; - } - if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) { - *(int*)optval = 1; - } else { - *(int*)optval = 0; - } - break; -#endif /* LWIP_TCP */ - - /* The option flags */ - case SO_BROADCAST: - case SO_KEEPALIVE: -#if SO_REUSE - case SO_REUSEADDR: -#endif /* SO_REUSE */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); - *(int*)optval = ip_get_option(sock->conn->pcb.ip, optname); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", - s, optname, (*(int*)optval?"on":"off"))); - break; - - case SO_TYPE: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); - switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) { - case NETCONN_RAW: - *(int*)optval = SOCK_RAW; - break; - case NETCONN_TCP: - *(int*)optval = SOCK_STREAM; - break; - case NETCONN_UDP: - *(int*)optval = SOCK_DGRAM; - break; - default: /* unrecognized socket type */ - *(int*)optval = netconn_type(sock->conn); - LWIP_DEBUGF(SOCKETS_DEBUG, - ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n", - s, *(int *)optval)); - } /* switch (netconn_type(sock->conn)) */ - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n", - s, *(int *)optval)); - break; - - case SO_ERROR: - LWIP_SOCKOPT_CHECK_OPTLEN(*optlen, int); - /* only overwrite ERR_OK or temporary errors */ - if (((sock->err == 0) || (sock->err == EINPROGRESS)) && (sock->conn != NULL)) { - sock_set_errno(sock, err_to_errno(sock->conn->last_err)); - } - *(int *)optval = (sock->err == 0xFF ? (int)-1 : (int)sock->err); - sock->err = 0; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", - s, *(int *)optval)); - break; - -#if LWIP_SO_SNDTIMEO - case SO_SNDTIMEO: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); - LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn)); - break; -#endif /* LWIP_SO_SNDTIMEO */ -#if LWIP_SO_RCVTIMEO - case SO_RCVTIMEO: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); - LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn)); - break; -#endif /* LWIP_SO_RCVTIMEO */ -#if LWIP_SO_RCVBUF - case SO_RCVBUF: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); - *(int *)optval = netconn_get_recvbufsize(sock->conn); - break; -#endif /* LWIP_SO_RCVBUF */ -#if LWIP_SO_LINGER - case SO_LINGER: - { - s16_t conn_linger; - struct linger* linger = (struct linger*)optval; - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger); - conn_linger = sock->conn->linger; - if (conn_linger >= 0) { - linger->l_onoff = 1; - linger->l_linger = (int)conn_linger; - } else { - linger->l_onoff = 0; - linger->l_linger = 0; - } - } - break; -#endif /* LWIP_SO_LINGER */ -#if LWIP_UDP - case SO_NO_CHECK: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP); -#if LWIP_UDPLITE - if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) { - /* this flag is only available for UDP, not for UDP lite */ - return EAFNOSUPPORT; - } -#endif /* LWIP_UDPLITE */ - *(int*)optval = (udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_NOCHKSUM) ? 1 : 0; - break; -#endif /* LWIP_UDP*/ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - -/* Level: IPPROTO_IP */ - case IPPROTO_IP: - switch (optname) { - case IP_TTL: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); - *(int*)optval = sock->conn->pcb.ip->ttl; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n", - s, *(int *)optval)); - break; - case IP_TOS: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); - *(int*)optval = sock->conn->pcb.ip->tos; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n", - s, *(int *)optval)); - break; -#if LWIP_MULTICAST_TX_OPTIONS - case IP_MULTICAST_TTL: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) { - return ENOPROTOOPT; - } - *(u8_t*)optval = udp_get_multicast_ttl(sock->conn->pcb.udp); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n", - s, *(int *)optval)); - break; - case IP_MULTICAST_IF: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr); - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) { - return ENOPROTOOPT; - } - inet_addr_from_ip4addr((struct in_addr*)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp)); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%"X32_F"\n", - s, *(u32_t *)optval)); - break; - case IP_MULTICAST_LOOP: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t); - if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) { - *(u8_t*)optval = 1; - } else { - *(u8_t*)optval = 0; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\n", - s, *(int *)optval)); - break; -#endif /* LWIP_MULTICAST_TX_OPTIONS */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - -#if LWIP_TCP -/* Level: IPPROTO_TCP */ - case IPPROTO_TCP: - /* Special case: all IPPROTO_TCP option take an int */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP); - if (sock->conn->pcb.tcp->state == LISTEN) { - return EINVAL; - } - switch (optname) { - case TCP_NODELAY: - *(int*)optval = tcp_nagle_disabled(sock->conn->pcb.tcp); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n", - s, (*(int*)optval)?"on":"off") ); - break; - case TCP_KEEPALIVE: - *(int*)optval = (int)sock->conn->pcb.tcp->keep_idle; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\n", - s, *(int *)optval)); - break; - -#if LWIP_TCP_KEEPALIVE - case TCP_KEEPIDLE: - *(int*)optval = (int)(sock->conn->pcb.tcp->keep_idle/1000); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) = %d\n", - s, *(int *)optval)); - break; - case TCP_KEEPINTVL: - *(int*)optval = (int)(sock->conn->pcb.tcp->keep_intvl/1000); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) = %d\n", - s, *(int *)optval)); - break; - case TCP_KEEPCNT: - *(int*)optval = (int)sock->conn->pcb.tcp->keep_cnt; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) = %d\n", - s, *(int *)optval)); - break; -#endif /* LWIP_TCP_KEEPALIVE */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_TCP */ - -#if LWIP_IPV6 -/* Level: IPPROTO_IPV6 */ - case IPPROTO_IPV6: - switch (optname) { - case IPV6_V6ONLY: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); - *(int*)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\n", - s, *(int *)optval)); - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_IPV6 */ - -#if LWIP_UDP && LWIP_UDPLITE - /* Level: IPPROTO_UDPLITE */ - case IPPROTO_UDPLITE: - /* Special case: all IPPROTO_UDPLITE option take an int */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); - /* If this is no UDP lite socket, ignore any options. */ - if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) { - return ENOPROTOOPT; - } - switch (optname) { - case UDPLITE_SEND_CSCOV: - *(int*)optval = sock->conn->pcb.udp->chksum_len_tx; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n", - s, (*(int*)optval)) ); - break; - case UDPLITE_RECV_CSCOV: - *(int*)optval = sock->conn->pcb.udp->chksum_len_rx; - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n", - s, (*(int*)optval)) ); - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_UDP */ - /* Level: IPPROTO_RAW */ - case IPPROTO_RAW: - switch (optname) { -#if LWIP_IPV6 && LWIP_RAW - case IPV6_CHECKSUM: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW); - if (sock->conn->pcb.raw->chksum_reqd == 0) { - *(int *)optval = -1; - } else { - *(int *)optval = sock->conn->pcb.raw->chksum_offset; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n", - s, (*(int*)optval)) ); - break; -#endif /* LWIP_IPV6 && LWIP_RAW */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", - s, level, optname)); - err = ENOPROTOOPT; - break; - } /* switch (level) */ - - return err; -} - -int -lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) -{ - u8_t err = 0; - struct lwip_sock *sock = get_socket(s); -#if !LWIP_TCPIP_CORE_LOCKING - LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data); -#endif /* !LWIP_TCPIP_CORE_LOCKING */ - - if (!sock) { - return -1; - } - - if (NULL == optval) { - sock_set_errno(sock, EFAULT); - return -1; - } - -#if LWIP_TCPIP_CORE_LOCKING - /* core-locking can just call the -impl function */ - LOCK_TCPIP_CORE(); - err = lwip_setsockopt_impl(s, level, optname, optval, optlen); - UNLOCK_TCPIP_CORE(); - -#else /* LWIP_TCPIP_CORE_LOCKING */ - -#if LWIP_MPU_COMPATIBLE - /* MPU_COMPATIBLE copies the optval data, so check for max size here */ - if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) { - sock_set_errno(sock, ENOBUFS); - return -1; - } -#endif /* LWIP_MPU_COMPATIBLE */ - - LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock); - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname; - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = optlen; -#if LWIP_MPU_COMPATIBLE - MEMCPY(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, optval, optlen); -#else /* LWIP_MPU_COMPATIBLE */ - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.pc = (const void*)optval; -#endif /* LWIP_MPU_COMPATIBLE */ - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0; -#if LWIP_NETCONN_SEM_PER_THREAD - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET(); -#else - LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed; -#endif - err = tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data)); - if (err != ERR_OK) { - LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); - sock_set_errno(sock, err_to_errno(err)); - return -1; - } - sys_arch_sem_wait((sys_sem_t*)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0); - - /* maybe lwip_getsockopt_internal has changed err */ - err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err; - LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); -#endif /* LWIP_TCPIP_CORE_LOCKING */ - - sock_set_errno(sock, err); - return err ? -1 : 0; -} - -#if !LWIP_TCPIP_CORE_LOCKING -/** lwip_setsockopt_callback: only used without CORE_LOCKING - * to get into the tcpip_thread - */ -static void -lwip_setsockopt_callback(void *arg) -{ - struct lwip_setgetsockopt_data *data; - LWIP_ASSERT("arg != NULL", arg != NULL); - data = (struct lwip_setgetsockopt_data*)arg; - - data->err = lwip_setsockopt_impl(data->s, data->level, data->optname, -#if LWIP_MPU_COMPATIBLE - data->optval, -#else /* LWIP_MPU_COMPATIBLE */ - data->optval.pc, -#endif /* LWIP_MPU_COMPATIBLE */ - data->optlen); - - sys_sem_signal((sys_sem_t*)(data->completed_sem)); -} -#endif /* LWIP_TCPIP_CORE_LOCKING */ - -/** lwip_setsockopt_impl: the actual implementation of setsockopt: - * same argument as lwip_setsockopt, either called directly or through callback - */ -static u8_t -lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen) -{ - u8_t err = 0; - struct lwip_sock *sock = tryget_socket(s); - if (!sock) { - return EBADF; - } - - switch (level) { - -/* Level: SOL_SOCKET */ - case SOL_SOCKET: - switch (optname) { - - /* SO_ACCEPTCONN is get-only */ - - /* The option flags */ - case SO_BROADCAST: - case SO_KEEPALIVE: -#if SO_REUSE - case SO_REUSEADDR: -#endif /* SO_REUSE */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); - if (*(const int*)optval) { - ip_set_option(sock->conn->pcb.ip, optname); - } else { - ip_reset_option(sock->conn->pcb.ip, optname); - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n", - s, optname, (*(const int*)optval?"on":"off"))); - break; - - /* SO_TYPE is get-only */ - /* SO_ERROR is get-only */ - -#if LWIP_SO_SNDTIMEO - case SO_SNDTIMEO: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); - netconn_set_sendtimeout(sock->conn, LWIP_SO_SNDRCVTIMEO_GET_MS(optval)); - break; -#endif /* LWIP_SO_SNDTIMEO */ -#if LWIP_SO_RCVTIMEO - case SO_RCVTIMEO: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); - netconn_set_recvtimeout(sock->conn, (int)LWIP_SO_SNDRCVTIMEO_GET_MS(optval)); - break; -#endif /* LWIP_SO_RCVTIMEO */ -#if LWIP_SO_RCVBUF - case SO_RCVBUF: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int); - netconn_set_recvbufsize(sock->conn, *(const int*)optval); - break; -#endif /* LWIP_SO_RCVBUF */ -#if LWIP_SO_LINGER - case SO_LINGER: - { - const struct linger* linger = (const struct linger*)optval; - LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger); - if (linger->l_onoff) { - int lingersec = linger->l_linger; - if (lingersec < 0) { - return EINVAL; - } - if (lingersec > 0xFFFF) { - lingersec = 0xFFFF; - } - sock->conn->linger = (s16_t)lingersec; - } else { - sock->conn->linger = -1; - } - } - break; -#endif /* LWIP_SO_LINGER */ -#if LWIP_UDP - case SO_NO_CHECK: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP); -#if LWIP_UDPLITE - if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) { - /* this flag is only available for UDP, not for UDP lite */ - return EAFNOSUPPORT; - } -#endif /* LWIP_UDPLITE */ - if (*(const int*)optval) { - udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_NOCHKSUM); - } else { - udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_NOCHKSUM); - } - break; -#endif /* LWIP_UDP */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - -/* Level: IPPROTO_IP */ - case IPPROTO_IP: - switch (optname) { - case IP_TTL: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); - sock->conn->pcb.ip->ttl = (u8_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\n", - s, sock->conn->pcb.ip->ttl)); - break; - case IP_TOS: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); - sock->conn->pcb.ip->tos = (u8_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\n", - s, sock->conn->pcb.ip->tos)); - break; -#if LWIP_MULTICAST_TX_OPTIONS - case IP_MULTICAST_TTL: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP); - udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t*)optval)); - break; - case IP_MULTICAST_IF: - { - ip4_addr_t if_addr; - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP); - inet_addr_to_ip4addr(&if_addr, (const struct in_addr*)optval); - udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr); - } - break; - case IP_MULTICAST_LOOP: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP); - if (*(const u8_t*)optval) { - udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_MULTICAST_LOOP); - } else { - udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_MULTICAST_LOOP); - } - break; -#endif /* LWIP_MULTICAST_TX_OPTIONS */ -#if LWIP_IGMP - case IP_ADD_MEMBERSHIP: - case IP_DROP_MEMBERSHIP: - { - /* If this is a TCP or a RAW socket, ignore these options. */ - /* @todo: assign membership to this socket so that it is dropped when closing the socket */ - err_t igmp_err; - const struct ip_mreq *imr = (const struct ip_mreq *)optval; - ip4_addr_t if_addr; - ip4_addr_t multi_addr; - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP); - inet_addr_to_ip4addr(&if_addr, &imr->imr_interface); - inet_addr_to_ip4addr(&multi_addr, &imr->imr_multiaddr); - if (optname == IP_ADD_MEMBERSHIP) { - if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) { - /* cannot track membership (out of memory) */ - err = ENOMEM; - igmp_err = ERR_OK; - } else { - igmp_err = igmp_joingroup(&if_addr, &multi_addr); - } - } else { - igmp_err = igmp_leavegroup(&if_addr, &multi_addr); - lwip_socket_unregister_membership(s, &if_addr, &multi_addr); - } - if (igmp_err != ERR_OK) { - err = EADDRNOTAVAIL; - } - } - break; -#endif /* LWIP_IGMP */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - -#if LWIP_TCP -/* Level: IPPROTO_TCP */ - case IPPROTO_TCP: - /* Special case: all IPPROTO_TCP option take an int */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP); - if (sock->conn->pcb.tcp->state == LISTEN) { - return EINVAL; - } - switch (optname) { - case TCP_NODELAY: - if (*(const int*)optval) { - tcp_nagle_disable(sock->conn->pcb.tcp); - } else { - tcp_nagle_enable(sock->conn->pcb.tcp); - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n", - s, (*(const int *)optval)?"on":"off") ); - break; - case TCP_KEEPALIVE: - sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n", - s, sock->conn->pcb.tcp->keep_idle)); - break; - -#if LWIP_TCP_KEEPALIVE - case TCP_KEEPIDLE: - sock->conn->pcb.tcp->keep_idle = 1000*(u32_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %"U32_F"\n", - s, sock->conn->pcb.tcp->keep_idle)); - break; - case TCP_KEEPINTVL: - sock->conn->pcb.tcp->keep_intvl = 1000*(u32_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %"U32_F"\n", - s, sock->conn->pcb.tcp->keep_intvl)); - break; - case TCP_KEEPCNT: - sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int*)optval); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %"U32_F"\n", - s, sock->conn->pcb.tcp->keep_cnt)); - break; -#endif /* LWIP_TCP_KEEPALIVE */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_TCP*/ - -#if LWIP_IPV6 -/* Level: IPPROTO_IPV6 */ - case IPPROTO_IPV6: - switch (optname) { - case IPV6_V6ONLY: - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP); - if (*(const int*)optval) { - netconn_set_ipv6only(sock->conn, 1); - } else { - netconn_set_ipv6only(sock->conn, 0); - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\n", - s, (netconn_get_ipv6only(sock->conn) ? 1 : 0))); - break; -#if LWIP_IPV6_MLD - case IPV6_JOIN_GROUP: - case IPV6_LEAVE_GROUP: - { - ip_addr_t multiaddr; - ip_addr_t if_addr; - struct ipv6_mreq *imr6 = (struct ipv6_mreq *)optval; - memcpy((char *)&multiaddr.u_addr.ip6, (char *)&imr6->ipv6mr_multiaddr.s6_addr, 16); - multiaddr.type = IPADDR_TYPE_V6; - memcpy((char *)&if_addr.u_addr.ip6, (char *)&in6addr_any.s6_addr, 16); - if_addr.type = IPADDR_TYPE_V6; - if(optname == IPV6_JOIN_GROUP) - mld6_joingroup(ip_2_ip6(&if_addr), ip_2_ip6(&multiaddr)); - else - mld6_leavegroup(ip_2_ip6(&if_addr), ip_2_ip6(&multiaddr)); - } - break; -#endif //LWIP_IPV6_MLD - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_IPV6 */ - -#if LWIP_UDP && LWIP_UDPLITE - /* Level: IPPROTO_UDPLITE */ - case IPPROTO_UDPLITE: - /* Special case: all IPPROTO_UDPLITE option take an int */ - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); - /* If this is no UDP lite socket, ignore any options. */ - if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) { - return ENOPROTOOPT; - } - switch (optname) { - case UDPLITE_SEND_CSCOV: - if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) { - /* don't allow illegal values! */ - sock->conn->pcb.udp->chksum_len_tx = 8; - } else { - sock->conn->pcb.udp->chksum_len_tx = (u16_t)*(const int*)optval; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\n", - s, (*(const int*)optval)) ); - break; - case UDPLITE_RECV_CSCOV: - if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) { - /* don't allow illegal values! */ - sock->conn->pcb.udp->chksum_len_rx = 8; - } else { - sock->conn->pcb.udp->chksum_len_rx = (u16_t)*(const int*)optval; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n", - s, (*(const int*)optval)) ); - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; -#endif /* LWIP_UDP */ - /* Level: IPPROTO_RAW */ - case IPPROTO_RAW: - switch (optname) { -#if LWIP_IPV6 && LWIP_RAW - case IPV6_CHECKSUM: - /* It should not be possible to disable the checksum generation with ICMPv6 - * as per RFC 3542 chapter 3.1 */ - if(sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) { - return EINVAL; - } - - LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW); - if (*(const int *)optval < 0) { - sock->conn->pcb.raw->chksum_reqd = 0; - } else if (*(const int *)optval & 1) { - /* Per RFC3542, odd offsets are not allowed */ - return EINVAL; - } else { - sock->conn->pcb.raw->chksum_reqd = 1; - sock->conn->pcb.raw->chksum_offset = (u16_t)*(const int *)optval; - } - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n", - s, sock->conn->pcb.raw->chksum_reqd)); - break; -#endif /* LWIP_IPV6 && LWIP_RAW */ - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n", - s, optname)); - err = ENOPROTOOPT; - break; - } /* switch (optname) */ - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", - s, level, optname)); - err = ENOPROTOOPT; - break; - } /* switch (level) */ - - return err; -} - -int -lwip_ioctl(int s, long cmd, void *argp) -{ - struct lwip_sock *sock = get_socket(s); - u8_t val; -#if LWIP_SO_RCVBUF - u16_t buflen = 0; - int recv_avail; -#endif /* LWIP_SO_RCVBUF */ - - if (!sock) { - return -1; - } - - switch (cmd) { -#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE - case FIONREAD: - if (!argp) { - sock_set_errno(sock, EINVAL); - return -1; - } -#if LWIP_FIONREAD_LINUXMODE - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { - struct pbuf *p; - if (sock->lastdata) { - p = ((struct netbuf *)sock->lastdata)->p; - *((int*)argp) = p->tot_len - sock->lastoffset; - } else { - struct netbuf *rxbuf; - err_t err; - if (sock->rcvevent <= 0) { - *((int*)argp) = 0; - } else { - err = netconn_recv(sock->conn, &rxbuf); - if (err != ERR_OK) { - *((int*)argp) = 0; - } else { - sock->lastdata = rxbuf; - sock->lastoffset = 0; - *((int*)argp) = rxbuf->p->tot_len; - } - } - } - return 0; - } -#endif /* LWIP_FIONREAD_LINUXMODE */ - -#if LWIP_SO_RCVBUF - /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */ - SYS_ARCH_GET(sock->conn->recv_avail, recv_avail); - if (recv_avail < 0) { - recv_avail = 0; - } - *((int*)argp) = recv_avail; - - /* Check if there is data left from the last recv operation. /maq 041215 */ - if (sock->lastdata) { - struct pbuf *p = (struct pbuf *)sock->lastdata; - if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { - p = ((struct netbuf *)p)->p; - } - buflen = p->tot_len; - buflen -= sock->lastoffset; - - *((int*)argp) += buflen; - } - - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t*)argp))); - sock_set_errno(sock, 0); - return 0; -#else /* LWIP_SO_RCVBUF */ - break; -#endif /* LWIP_SO_RCVBUF */ -#endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */ - - case (long)FIONBIO: - val = 0; - if (argp && *(u32_t*)argp) { - val = 1; - } - netconn_set_nonblocking(sock->conn, val); - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val)); - sock_set_errno(sock, 0); - return 0; - - default: - break; - } /* switch (cmd) */ - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp)); - sock_set_errno(sock, ENOSYS); /* not yet implemented */ - return -1; -} - -/** A minimal implementation of fcntl. - * Currently only the commands F_GETFL and F_SETFL are implemented. - * Only the flag O_NONBLOCK is implemented. - */ -int -lwip_fcntl(int s, int cmd, int val) -{ - struct lwip_sock *sock = get_socket(s); - int ret = -1; - - if (!sock) { - return -1; - } - - switch (cmd) { - case F_GETFL: - ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0; - sock_set_errno(sock, 0); - break; - case F_SETFL: - if ((val & ~O_NONBLOCK) == 0) { - /* only O_NONBLOCK, all other bits are zero */ - netconn_set_nonblocking(sock->conn, val & O_NONBLOCK); - ret = 0; - sock_set_errno(sock, 0); - } else { - sock_set_errno(sock, ENOSYS); /* not yet implemented */ - } - break; - default: - LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_fcntl(%d, UNIMPL: %d, %d)\n", s, cmd, val)); - sock_set_errno(sock, ENOSYS); /* not yet implemented */ - break; - } - return ret; -} - -#if LWIP_IGMP -/** Register a new IGMP membership. On socket close, the membership is dropped automatically. - * - * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). - * - * @return 1 on success, 0 on failure - */ -static int -lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) -{ - struct lwip_sock *sock = get_socket(s); - int i; - - if (!sock) { - return 0; - } - - for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { - if (socket_ipv4_multicast_memberships[i].sock == NULL) { - socket_ipv4_multicast_memberships[i].sock = sock; - ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr); - ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr); - return 1; - } - } - return 0; -} - -/** Unregister a previously registered membership. This prevents dropping the membership - * on socket close. - * - * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). - */ -static void -lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) -{ - struct lwip_sock *sock = get_socket(s); - int i; - - if (!sock) { - return; - } - - for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { - if ((socket_ipv4_multicast_memberships[i].sock == sock) && - ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) && - ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) { - socket_ipv4_multicast_memberships[i].sock = NULL; - ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); - ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); - return; - } - } -} - -/** Drop all memberships of a socket that were not dropped explicitly via setsockopt. - * - * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK). - */ -static void -lwip_socket_drop_registered_memberships(int s) -{ - struct lwip_sock *sock = get_socket(s); - int i; - - if (!sock) { - return; - } - - for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { - if (socket_ipv4_multicast_memberships[i].sock == sock) { - ip_addr_t multi_addr, if_addr; - ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr); - ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[i].if_addr); - socket_ipv4_multicast_memberships[i].sock = NULL; - ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); - ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); - - netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE); - } - } -} -#endif /* LWIP_IGMP */ -#endif /* LWIP_SOCKET */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h deleted file mode 100644 index fbd135a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd_structs.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef LWIP_HTTPD_STRUCTS_H -#define LWIP_HTTPD_STRUCTS_H - -#include "lwip/apps/httpd.h" - -#if LWIP_HTTPD_DYNAMIC_HEADERS -/** This struct is used for a list of HTTP header strings for various - * filename extensions. */ -typedef struct -{ - const char *extension; - const char *content_type; -} tHTTPHeader; - -/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and - * RFC 2616 HTTP/1.1 for header field definitions) */ -static const char * const g_psHTTPHeaderStrings[] = -{ - "HTTP/1.0 200 OK\r\n", - "HTTP/1.0 404 File not found\r\n", - "HTTP/1.0 400 Bad Request\r\n", - "HTTP/1.0 501 Not Implemented\r\n", - "HTTP/1.1 200 OK\r\n", - "HTTP/1.1 404 File not found\r\n", - "HTTP/1.1 400 Bad Request\r\n", - "HTTP/1.1 501 Not Implemented\r\n", - "Content-Length: ", - "Connection: Close\r\n", - "Connection: keep-alive\r\n", - "Connection: keep-alive\r\nContent-Length: ", - "Server: "HTTPD_SERVER_AGENT"\r\n", - "\r\n

404: The requested file cannot be found.

\r\n" -#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE - ,"Connection: keep-alive\r\nContent-Length: 77\r\n\r\n

404: The requested file cannot be found.

\r\n" -#endif -}; - -/* Indexes into the g_psHTTPHeaderStrings array */ -#define HTTP_HDR_OK 0 /* 200 OK */ -#define HTTP_HDR_NOT_FOUND 1 /* 404 File not found */ -#define HTTP_HDR_BAD_REQUEST 2 /* 400 Bad request */ -#define HTTP_HDR_NOT_IMPL 3 /* 501 Not Implemented */ -#define HTTP_HDR_OK_11 4 /* 200 OK */ -#define HTTP_HDR_NOT_FOUND_11 5 /* 404 File not found */ -#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */ -#define HTTP_HDR_NOT_IMPL_11 7 /* 501 Not Implemented */ -#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/ -#define HTTP_HDR_CONN_CLOSE 9 /* Connection: Close (HTTP 1.1) */ -#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */ -#define HTTP_HDR_KEEPALIVE_LEN 11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/ -#define HTTP_HDR_SERVER 12 /* Server: HTTPD_SERVER_AGENT */ -#define DEFAULT_404_HTML 13 /* default 404 body */ -#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE -#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */ -#endif - - -#define HTTP_HDR_HTML "Content-type: text/html\r\n\r\n" -#define HTTP_HDR_SSI "Content-type: text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache\r\n\r\n" -#define HTTP_HDR_GIF "Content-type: image/gif\r\n\r\n" -#define HTTP_HDR_PNG "Content-type: image/png\r\n\r\n" -#define HTTP_HDR_JPG "Content-type: image/jpeg\r\n\r\n" -#define HTTP_HDR_BMP "Content-type: image/bmp\r\n\r\n" -#define HTTP_HDR_ICO "Content-type: image/x-icon\r\n\r\n" -#define HTTP_HDR_APP "Content-type: application/octet-stream\r\n\r\n" -#define HTTP_HDR_JS "Content-type: application/javascript\r\n\r\n" -#define HTTP_HDR_RA "Content-type: application/javascript\r\n\r\n" -#define HTTP_HDR_CSS "Content-type: text/css\r\n\r\n" -#define HTTP_HDR_SWF "Content-type: application/x-shockwave-flash\r\n\r\n" -#define HTTP_HDR_XML "Content-type: text/xml\r\n\r\n" -#define HTTP_HDR_PDF "Content-type: application/pdf\r\n\r\n" -#define HTTP_HDR_JSON "Content-type: application/json\r\n\r\n" - -#define HTTP_HDR_DEFAULT_TYPE "Content-type: text/plain\r\n\r\n" - -/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES - * and http://www.iana.org/assignments/media-types for registered content types - * and subtypes) */ -static const tHTTPHeader g_psHTTPHeaders[] = -{ - { "html", HTTP_HDR_HTML}, - { "htm", HTTP_HDR_HTML}, - { "shtml",HTTP_HDR_SSI}, - { "shtm", HTTP_HDR_SSI}, - { "ssi", HTTP_HDR_SSI}, - { "gif", HTTP_HDR_GIF}, - { "png", HTTP_HDR_PNG}, - { "jpg", HTTP_HDR_JPG}, - { "bmp", HTTP_HDR_BMP}, - { "ico", HTTP_HDR_ICO}, - { "class",HTTP_HDR_APP}, - { "cls", HTTP_HDR_APP}, - { "js", HTTP_HDR_JS}, - { "ram", HTTP_HDR_RA}, - { "css", HTTP_HDR_CSS}, - { "swf", HTTP_HDR_SWF}, - { "xml", HTTP_HDR_XML}, - { "xsl", HTTP_HDR_XML}, - { "pdf", HTTP_HDR_PDF}, - { "json", HTTP_HDR_JSON} -}; - -#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader)) - -#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ - -#if LWIP_HTTPD_SSI -static const char * const g_pcSSIExtensions[] = { - ".shtml", ".shtm", ".ssi", ".xml" -}; -#define NUM_SHTML_EXTENSIONS (sizeof(g_pcSSIExtensions) / sizeof(const char *)) -#endif /* LWIP_HTTPD_SSI */ - -#endif /* LWIP_HTTPD_STRUCTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c deleted file mode 100644 index efabe47..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/lwiperf/lwiperf.c +++ /dev/null @@ -1,661 +0,0 @@ -/** - * @file - * lwIP iPerf server implementation - */ - -/** - * @defgroup iperf Iperf server - * @ingroup apps - * - * This is a simple performance measuring server to check your bandwith using - * iPerf2 on a PC as client. - * It is currently a minimal implementation providing an IPv4 TCP server only. - * - * @todo: implement UDP mode and IPv6 - */ - -/* - * Copyright (c) 2014 Simon Goldschmidt - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Simon Goldschmidt - */ - -#include "lwip/apps/lwiperf.h" - -#include "lwip/tcp.h" -#include "lwip/sys.h" - -#include - -/* Currently, only TCP-over-IPv4 is implemented (does iperf support IPv6 anyway?) */ -#if LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API - -/** Specify the idle timeout (in seconds) after that the test fails */ -#ifndef LWIPERF_TCP_MAX_IDLE_SEC -#define LWIPERF_TCP_MAX_IDLE_SEC 10U -#endif -#if LWIPERF_TCP_MAX_IDLE_SEC > 255 -#error LWIPERF_TCP_MAX_IDLE_SEC must fit into an u8_t -#endif - -/* File internal memory allocation (struct lwiperf_*): this defaults to - the heap */ -#ifndef LWIPERF_ALLOC -#define LWIPERF_ALLOC(type) mem_malloc(sizeof(type)) -#define LWIPERF_FREE(type, item) mem_free(item) -#endif - -/** If this is 1, check that received data has the correct format */ -#ifndef LWIPERF_CHECK_RX_DATA -#define LWIPERF_CHECK_RX_DATA 0 -#endif - -/** This is the Iperf settings struct sent from the client */ -typedef struct _lwiperf_settings { -#define LWIPERF_FLAGS_ANSWER_TEST 0x80000000 -#define LWIPERF_FLAGS_ANSWER_NOW 0x00000001 - u32_t flags; - u32_t num_threads; /* unused for now */ - u32_t remote_port; - u32_t buffer_len; /* unused for now */ - u32_t win_band; /* TCP window / UDP rate: unused for now */ - u32_t amount; /* pos. value: bytes?; neg. values: time (unit is 10ms: 1/100 second) */ -} lwiperf_settings_t; - -/** Basic connection handle */ -struct _lwiperf_state_base; -typedef struct _lwiperf_state_base lwiperf_state_base_t; -struct _lwiperf_state_base { - /* 1=tcp, 0=udp */ - u8_t tcp; - /* 1=server, 0=client */ - u8_t server; - lwiperf_state_base_t* next; - lwiperf_state_base_t* related_server_state; -}; - -/** Connection handle for a TCP iperf session */ -typedef struct _lwiperf_state_tcp { - lwiperf_state_base_t base; - struct tcp_pcb* server_pcb; - struct tcp_pcb* conn_pcb; - u32_t time_started; - lwiperf_report_fn report_fn; - void* report_arg; - u8_t poll_count; - u8_t next_num; - u32_t bytes_transferred; - lwiperf_settings_t settings; - u8_t have_settings_buf; -} lwiperf_state_tcp_t; - -/** List of active iperf sessions */ -static lwiperf_state_base_t* lwiperf_all_connections; -/** A const buffer to send from: we want to measure sending, not copying! */ -static const u8_t lwiperf_txbuf_const[1600] = { - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', - '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9', -}; - -static err_t lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb); -static void lwiperf_tcp_err(void *arg, err_t err); - -/** Add an iperf session to the 'active' list */ -static void -lwiperf_list_add(lwiperf_state_base_t* item) -{ - if (lwiperf_all_connections == NULL) { - lwiperf_all_connections = item; - } else { - item = lwiperf_all_connections; - } -} - -/** Remove an iperf session from the 'active' list */ -static void -lwiperf_list_remove(lwiperf_state_base_t* item) -{ - lwiperf_state_base_t* prev = NULL; - lwiperf_state_base_t* iter; - for (iter = lwiperf_all_connections; iter != NULL; prev = iter, iter = iter->next) { - if (iter == item) { - if (prev == NULL) { - lwiperf_all_connections = iter->next; - } else { - prev->next = item; - } - /* @debug: ensure this item is listed only once */ - for (iter = iter->next; iter != NULL; iter = iter->next) { - LWIP_ASSERT("duplicate entry", iter != item); - } - break; - } - } -} - -/** Call the report function of an iperf tcp session */ -static void -lwip_tcp_conn_report(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type) -{ - if ((conn != NULL) && (conn->report_fn != NULL)) { - u32_t now, duration_ms, bandwidth_kbitpsec; - now = sys_now(); - duration_ms = now - conn->time_started; - if (duration_ms == 0) { - bandwidth_kbitpsec = 0; - } else { - bandwidth_kbitpsec = (conn->bytes_transferred / duration_ms) * 8U; - } - conn->report_fn(conn->report_arg, report_type, - &conn->conn_pcb->local_ip, conn->conn_pcb->local_port, - &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port, - conn->bytes_transferred, duration_ms, bandwidth_kbitpsec); - } -} - -/** Close an iperf tcp session */ -static void -lwiperf_tcp_close(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type) -{ - err_t err; - - lwip_tcp_conn_report(conn, report_type); - lwiperf_list_remove(&conn->base); - if (conn->conn_pcb != NULL) { - tcp_arg(conn->conn_pcb, NULL); - tcp_poll(conn->conn_pcb, NULL, 0); - tcp_sent(conn->conn_pcb, NULL); - tcp_recv(conn->conn_pcb, NULL); - tcp_err(conn->conn_pcb, NULL); - err = tcp_close(conn->conn_pcb); - if (err != ERR_OK) { - /* don't want to wait for free memory here... */ - tcp_abort(conn->conn_pcb); - } - } else { - /* no conn pcb, this is the server pcb */ - err = tcp_close(conn->server_pcb); - LWIP_ASSERT("error", err != ERR_OK); - } - LWIPERF_FREE(lwiperf_state_tcp_t, conn); -} - -/** Try to send more data on an iperf tcp session */ -static err_t -lwiperf_tcp_client_send_more(lwiperf_state_tcp_t* conn) -{ - int send_more; - err_t err; - u16_t txlen; - u16_t txlen_max; - void* txptr; - u8_t apiflags; - - LWIP_ASSERT("conn invalid", (conn != NULL) && conn->base.tcp && (conn->base.server == 0)); - - do { - send_more = 0; - if (conn->settings.amount & PP_HTONL(0x80000000)) { - /* this session is time-limited */ - u32_t now = sys_now(); - u32_t diff_ms = now - conn->time_started; - u32_t time = (u32_t)-(s32_t)lwip_htonl(conn->settings.amount); - u32_t time_ms = time * 10; - if (diff_ms >= time_ms) { - /* time specified by the client is over -> close the connection */ - lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT); - return ERR_OK; - } - } else { - /* this session is byte-limited */ - u32_t amount_bytes = lwip_htonl(conn->settings.amount); - /* @todo: this can send up to 1*MSS more than requested... */ - if (amount_bytes >= conn->bytes_transferred) { - /* all requested bytes transferred -> close the connection */ - lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT); - return ERR_OK; - } - } - - if (conn->bytes_transferred < 24) { - /* transmit the settings a first time */ - txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred]; - txlen_max = (u16_t)(24 - conn->bytes_transferred); - apiflags = TCP_WRITE_FLAG_COPY; - } else if (conn->bytes_transferred < 48) { - /* transmit the settings a second time */ - txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred - 24]; - txlen_max = (u16_t)(48 - conn->bytes_transferred); - apiflags = TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE; - send_more = 1; - } else { - /* transmit data */ - /* @todo: every x bytes, transmit the settings again */ - txptr = LWIP_CONST_CAST(void*, &lwiperf_txbuf_const[conn->bytes_transferred % 10]); - txlen_max = TCP_MSS; - if (conn->bytes_transferred == 48) { /* @todo: fix this for intermediate settings, too */ - txlen_max = TCP_MSS - 24; - } - apiflags = 0; /* no copying needed */ - send_more = 1; - } - txlen = txlen_max; - do { - err = tcp_write(conn->conn_pcb, txptr, txlen, apiflags); - if (err == ERR_MEM) { - txlen /= 2; - } - } while ((err == ERR_MEM) && (txlen >= (TCP_MSS/2))); - - if (err == ERR_OK) { - conn->bytes_transferred += txlen; - } else { - send_more = 0; - } - } while(send_more); - - tcp_output(conn->conn_pcb); - return ERR_OK; -} - -/** TCP sent callback, try to send more data */ -static err_t -lwiperf_tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) -{ - lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg; - /* @todo: check 'len' (e.g. to time ACK of all data)? for now, we just send more... */ - LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb); - LWIP_UNUSED_ARG(tpcb); - LWIP_UNUSED_ARG(len); - - conn->poll_count = 0; - - return lwiperf_tcp_client_send_more(conn); -} - -/** TCP connected callback (active connection), send data now */ -static err_t -lwiperf_tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err) -{ - lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg; - LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb); - LWIP_UNUSED_ARG(tpcb); - if (err != ERR_OK) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); - return ERR_OK; - } - conn->poll_count = 0; - conn->time_started = sys_now(); - return lwiperf_tcp_client_send_more(conn); -} - -/** Start TCP connection back to the client (either parallel or after the - * receive test has finished. - */ -static err_t -lwiperf_tx_start(lwiperf_state_tcp_t* conn) -{ - err_t err; - lwiperf_state_tcp_t* client_conn; - struct tcp_pcb* newpcb; - ip_addr_t remote_addr; - u16_t remote_port; - - client_conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t); - if (client_conn == NULL) { - return ERR_MEM; - } - newpcb = tcp_new(); - if (newpcb == NULL) { - LWIPERF_FREE(lwiperf_state_tcp_t, client_conn); - return ERR_MEM; - } - - MEMCPY(client_conn, conn, sizeof(lwiperf_state_tcp_t)); - client_conn->base.server = 0; - client_conn->server_pcb = NULL; - client_conn->conn_pcb = newpcb; - client_conn->time_started = sys_now(); /* @todo: set this again on 'connected' */ - client_conn->poll_count = 0; - client_conn->next_num = 4; /* initial nr is '4' since the header has 24 byte */ - client_conn->bytes_transferred = 0; - client_conn->settings.flags = 0; /* prevent the remote side starting back as client again */ - - tcp_arg(newpcb, client_conn); - tcp_sent(newpcb, lwiperf_tcp_client_sent); - tcp_poll(newpcb, lwiperf_tcp_poll, 2U); - tcp_err(newpcb, lwiperf_tcp_err); - - ip_addr_copy(remote_addr, conn->conn_pcb->remote_ip); - remote_port = (u16_t)lwip_htonl(client_conn->settings.remote_port); - - err = tcp_connect(newpcb, &remote_addr, remote_port, lwiperf_tcp_client_connected); - if (err != ERR_OK) { - lwiperf_tcp_close(client_conn, LWIPERF_TCP_ABORTED_LOCAL); - return err; - } - lwiperf_list_add(&client_conn->base); - return ERR_OK; -} - -/** Receive data on an iperf tcp session */ -static err_t -lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) -{ - u8_t tmp; - u16_t tot_len; - u32_t packet_idx; - struct pbuf* q; - lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg; - - LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb); - LWIP_UNUSED_ARG(tpcb); - - if (err != ERR_OK) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); - return ERR_OK; - } - if (p == NULL) { - /* connection closed -> test done */ - if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) == - PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) { - /* client requested transmission after end of test */ - lwiperf_tx_start(conn); - } - lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_SERVER); - return ERR_OK; - } - tot_len = p->tot_len; - - conn->poll_count = 0; - - if ((!conn->have_settings_buf) || ((conn->bytes_transferred -24) % (1024*128) == 0)) { - /* wait for 24-byte header */ - if (p->tot_len < sizeof(lwiperf_settings_t)) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); - pbuf_free(p); - return ERR_VAL; - } - if (!conn->have_settings_buf) { - if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL); - pbuf_free(p); - return ERR_VAL; - } - conn->have_settings_buf = 1; - if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) == - PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) { - /* client requested parallel transmission test */ - err_t err2 = lwiperf_tx_start(conn); - if (err2 != ERR_OK) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR); - pbuf_free(p); - return err2; - } - } - } else { - if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); - pbuf_free(p); - return ERR_VAL; - } - } - conn->bytes_transferred += sizeof(lwiperf_settings_t); - if (conn->bytes_transferred <= 24) { - conn->time_started = sys_now(); - tcp_recved(tpcb, p->tot_len); - pbuf_free(p); - return ERR_OK; - } - conn->next_num = 4; /* 24 bytes received... */ - tmp = pbuf_header(p, -24); - LWIP_ASSERT("pbuf_header failed", tmp == 0); - } - - packet_idx = 0; - for (q = p; q != NULL; q = q->next) { -#if LWIPERF_CHECK_RX_DATA - const u8_t* payload = (const u8_t*)q->payload; - u16_t i; - for (i = 0; i < q->len; i++) { - u8_t val = payload[i]; - u8_t num = val - '0'; - if (num == conn->next_num) { - conn->next_num++; - if (conn->next_num == 10) { - conn->next_num = 0; - } - } else { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); - pbuf_free(p); - return ERR_VAL; - } - } -#endif - packet_idx += q->len; - } - LWIP_ASSERT("count mismatch", packet_idx == p->tot_len); - conn->bytes_transferred += packet_idx; - tcp_recved(tpcb, tot_len); - pbuf_free(p); - return ERR_OK; -} - -/** Error callback, iperf tcp session aborted */ -static void -lwiperf_tcp_err(void *arg, err_t err) -{ - lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg; - LWIP_UNUSED_ARG(err); - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); -} - -/** TCP poll callback, try to send more data */ -static err_t -lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb) -{ - lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg; - LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb); - LWIP_UNUSED_ARG(tpcb); - if (++conn->poll_count >= LWIPERF_TCP_MAX_IDLE_SEC) { - lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL); - return ERR_OK; /* lwiperf_tcp_close frees conn */ - } - - if (!conn->base.server) { - lwiperf_tcp_client_send_more(conn); - } - - return ERR_OK; -} - -/** This is called when a new client connects for an iperf tcp session */ -static err_t -lwiperf_tcp_accept(void *arg, struct tcp_pcb *newpcb, err_t err) -{ - lwiperf_state_tcp_t *s, *conn; - if ((err != ERR_OK) || (newpcb == NULL) || (arg == NULL)) { - return ERR_VAL; - } - - s = (lwiperf_state_tcp_t*)arg; - conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t); - if (conn == NULL) { - return ERR_MEM; - } - memset(conn, 0, sizeof(lwiperf_state_tcp_t)); - conn->base.tcp = 1; - conn->base.server = 1; - conn->base.related_server_state = &s->base; - conn->server_pcb = s->server_pcb; - conn->conn_pcb = newpcb; - conn->time_started = sys_now(); - conn->report_fn = s->report_fn; - conn->report_arg = s->report_arg; - - /* setup the tcp rx connection */ - tcp_arg(newpcb, conn); - tcp_recv(newpcb, lwiperf_tcp_recv); - tcp_poll(newpcb, lwiperf_tcp_poll, 2U); - tcp_err(conn->conn_pcb, lwiperf_tcp_err); - - lwiperf_list_add(&conn->base); - return ERR_OK; -} - -/** - * @ingroup iperf - * Start a TCP iperf server on the default TCP port (5001) and listen for - * incoming connections from iperf clients. - * - * @returns a connection handle that can be used to abort the server - * by calling @ref lwiperf_abort() - */ -void* -lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg) -{ - return lwiperf_start_tcp_server(IP_ADDR_ANY, LWIPERF_TCP_PORT_DEFAULT, - report_fn, report_arg); -} - -/** - * @ingroup iperf - * Start a TCP iperf server on a specific IP address and port and listen for - * incoming connections from iperf clients. - * - * @returns a connection handle that can be used to abort the server - * by calling @ref lwiperf_abort() - */ -void* -lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port, - lwiperf_report_fn report_fn, void* report_arg) -{ - err_t err; - struct tcp_pcb* pcb; - lwiperf_state_tcp_t* s; - - if (local_addr == NULL) { - return NULL; - } - - s = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t); - if (s == NULL) { - return NULL; - } - memset(s, 0, sizeof(lwiperf_state_tcp_t)); - s->base.tcp = 1; - s->base.server = 1; - s->report_fn = report_fn; - s->report_arg = report_arg; - - pcb = tcp_new(); - if (pcb != NULL) { - err = tcp_bind(pcb, local_addr, local_port); - if (err == ERR_OK) { - s->server_pcb = tcp_listen_with_backlog(pcb, 1); - } - } - if (s->server_pcb == NULL) { - if (pcb != NULL) { - tcp_close(pcb); - } - LWIPERF_FREE(lwiperf_state_tcp_t, s); - return NULL; - } - pcb = NULL; - - tcp_arg(s->server_pcb, s); - tcp_accept(s->server_pcb, lwiperf_tcp_accept); - - lwiperf_list_add(&s->base); - return s; -} - -/** - * @ingroup iperf - * Abort an iperf session (handle returned by lwiperf_start_tcp_server*()) - */ -void -lwiperf_abort(void* lwiperf_session) -{ - lwiperf_state_base_t* i, *dealloc, *last = NULL; - - for (i = lwiperf_all_connections; i != NULL; ) { - if ((i == lwiperf_session) || (i->related_server_state == lwiperf_session)) { - dealloc = i; - i = i->next; - if (last != NULL) { - last->next = i; - } - LWIPERF_FREE(lwiperf_state_tcp_t, dealloc); /* @todo: type? */ - } else { - last = i; - i = i->next; - } - } -} - -#endif /* LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c deleted file mode 100644 index 2dfbe65..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/netbiosns/netbiosns.c +++ /dev/null @@ -1,367 +0,0 @@ -/** - * @file - * NetBIOS name service responder - */ - -/** - * @defgroup netbiosns NETBIOS responder - * @ingroup apps - * - * This is an example implementation of a NetBIOS name server. - * It responds to name queries for a configurable name. - * Name resolving is not supported. - * - * Note that the device doesn't broadcast it's own name so can't - * detect duplicate names! - */ - -/* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#include "lwip/apps/netbiosns.h" - -#if LWIP_IPV4 && LWIP_UDP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/def.h" -#include "lwip/udp.h" -#include "lwip/netif.h" - -#include - -/** default port number for "NetBIOS Name service */ -#define NETBIOS_PORT 137 - -/** size of a NetBIOS name */ -#define NETBIOS_NAME_LEN 16 - -/** The Time-To-Live for NetBIOS name responds (in seconds) - * Default is 300000 seconds (3 days, 11 hours, 20 minutes) */ -#define NETBIOS_NAME_TTL 300000u - -/** NetBIOS header flags */ -#define NETB_HFLAG_RESPONSE 0x8000U -#define NETB_HFLAG_OPCODE 0x7800U -#define NETB_HFLAG_OPCODE_NAME_QUERY 0x0000U -#define NETB_HFLAG_AUTHORATIVE 0x0400U -#define NETB_HFLAG_TRUNCATED 0x0200U -#define NETB_HFLAG_RECURS_DESIRED 0x0100U -#define NETB_HFLAG_RECURS_AVAILABLE 0x0080U -#define NETB_HFLAG_BROADCAST 0x0010U -#define NETB_HFLAG_REPLYCODE 0x0008U -#define NETB_HFLAG_REPLYCODE_NOERROR 0x0000U - -/** NetBIOS name flags */ -#define NETB_NFLAG_UNIQUE 0x8000U -#define NETB_NFLAG_NODETYPE 0x6000U -#define NETB_NFLAG_NODETYPE_HNODE 0x6000U -#define NETB_NFLAG_NODETYPE_MNODE 0x4000U -#define NETB_NFLAG_NODETYPE_PNODE 0x2000U -#define NETB_NFLAG_NODETYPE_BNODE 0x0000U - -/** NetBIOS message header */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct netbios_hdr { - PACK_STRUCT_FIELD(u16_t trans_id); - PACK_STRUCT_FIELD(u16_t flags); - PACK_STRUCT_FIELD(u16_t questions); - PACK_STRUCT_FIELD(u16_t answerRRs); - PACK_STRUCT_FIELD(u16_t authorityRRs); - PACK_STRUCT_FIELD(u16_t additionalRRs); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** NetBIOS message name part */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct netbios_name_hdr { - PACK_STRUCT_FLD_8(u8_t nametype); - PACK_STRUCT_FLD_8(u8_t encname[(NETBIOS_NAME_LEN*2)+1]); - PACK_STRUCT_FIELD(u16_t type); - PACK_STRUCT_FIELD(u16_t cls); - PACK_STRUCT_FIELD(u32_t ttl); - PACK_STRUCT_FIELD(u16_t datalen); - PACK_STRUCT_FIELD(u16_t flags); - PACK_STRUCT_FLD_S(ip4_addr_p_t addr); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** NetBIOS message */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct netbios_resp -{ - struct netbios_hdr resp_hdr; - struct netbios_name_hdr resp_name; -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#ifdef NETBIOS_LWIP_NAME -#define NETBIOS_LOCAL_NAME NETBIOS_LWIP_NAME -#else -static char netbiosns_local_name[NETBIOS_NAME_LEN]; -#define NETBIOS_LOCAL_NAME netbiosns_local_name -#endif - -struct udp_pcb *netbiosns_pcb; - -/** Decode a NetBIOS name (from packet to string) */ -static int -netbiosns_name_decode(char *name_enc, char *name_dec, int name_dec_len) -{ - char *pname; - char cname; - char cnbname; - int idx = 0; - - LWIP_UNUSED_ARG(name_dec_len); - - /* Start decoding netbios name. */ - pname = name_enc; - for (;;) { - /* Every two characters of the first level-encoded name - * turn into one character in the decoded name. */ - cname = *pname; - if (cname == '\0') - break; /* no more characters */ - if (cname == '.') - break; /* scope ID follows */ - if (cname < 'A' || cname > 'Z') { - /* Not legal. */ - return -1; - } - cname -= 'A'; - cnbname = cname << 4; - pname++; - - cname = *pname; - if (cname == '\0' || cname == '.') { - /* No more characters in the name - but we're in - * the middle of a pair. Not legal. */ - return -1; - } - if (cname < 'A' || cname > 'Z') { - /* Not legal. */ - return -1; - } - cname -= 'A'; - cnbname |= cname; - pname++; - - /* Do we have room to store the character? */ - if (idx < NETBIOS_NAME_LEN) { - /* Yes - store the character. */ - name_dec[idx++] = (cnbname!=' '?cnbname:'\0'); - } - } - - return 0; -} - -#if 0 /* function currently unused */ -/** Encode a NetBIOS name (from string to packet) - currently unused because - we don't ask for names. */ -static int -netbiosns_name_encode(char *name_enc, char *name_dec, int name_dec_len) -{ - char *pname; - char cname; - unsigned char ucname; - int idx = 0; - - /* Start encoding netbios name. */ - pname = name_enc; - - for (;;) { - /* Every two characters of the first level-encoded name - * turn into one character in the decoded name. */ - cname = *pname; - if (cname == '\0') - break; /* no more characters */ - if (cname == '.') - break; /* scope ID follows */ - if ((cname < 'A' || cname > 'Z') && (cname < '0' || cname > '9')) { - /* Not legal. */ - return -1; - } - - /* Do we have room to store the character? */ - if (idx >= name_dec_len) { - return -1; - } - - /* Yes - store the character. */ - ucname = cname; - name_dec[idx++] = ('A'+((ucname>>4) & 0x0F)); - name_dec[idx++] = ('A'+( ucname & 0x0F)); - pname++; - } - - /* Fill with "space" coding */ - for (;idx < name_dec_len - 1;) { - name_dec[idx++] = 'C'; - name_dec[idx++] = 'A'; - } - - /* Terminate string */ - name_dec[idx] = '\0'; - - return 0; -} -#endif /* 0 */ - -/** NetBIOS Name service recv callback */ -static void -netbiosns_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) -{ - LWIP_UNUSED_ARG(arg); - - /* if packet is valid */ - if (p != NULL) { - char netbios_name[NETBIOS_NAME_LEN+1]; - struct netbios_hdr* netbios_hdr = (struct netbios_hdr*)p->payload; - struct netbios_name_hdr* netbios_name_hdr = (struct netbios_name_hdr*)(netbios_hdr+1); - - /* we only answer if we got a default interface */ - if (netif_default != NULL) { - /* @todo: do we need to check answerRRs/authorityRRs/additionalRRs? */ - /* if the packet is a NetBIOS name query question */ - if (((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_OPCODE)) == PP_NTOHS(NETB_HFLAG_OPCODE_NAME_QUERY)) && - ((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_RESPONSE)) == 0) && - (netbios_hdr->questions == PP_NTOHS(1))) { - /* decode the NetBIOS name */ - netbiosns_name_decode((char*)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name)); - /* if the packet is for us */ - if (lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) == 0) { - struct pbuf *q; - struct netbios_resp *resp; - - q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM); - if (q != NULL) { - resp = (struct netbios_resp*)q->payload; - - /* prepare NetBIOS header response */ - resp->resp_hdr.trans_id = netbios_hdr->trans_id; - resp->resp_hdr.flags = PP_HTONS(NETB_HFLAG_RESPONSE | - NETB_HFLAG_OPCODE_NAME_QUERY | - NETB_HFLAG_AUTHORATIVE | - NETB_HFLAG_RECURS_DESIRED); - resp->resp_hdr.questions = 0; - resp->resp_hdr.answerRRs = PP_HTONS(1); - resp->resp_hdr.authorityRRs = 0; - resp->resp_hdr.additionalRRs = 0; - - /* prepare NetBIOS header datas */ - MEMCPY( resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname)); - resp->resp_name.nametype = netbios_name_hdr->nametype; - resp->resp_name.type = netbios_name_hdr->type; - resp->resp_name.cls = netbios_name_hdr->cls; - resp->resp_name.ttl = PP_HTONL(NETBIOS_NAME_TTL); - resp->resp_name.datalen = PP_HTONS(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr)); - resp->resp_name.flags = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE); - ip4_addr_copy(resp->resp_name.addr, *netif_ip4_addr(netif_default)); - - /* send the NetBIOS response */ - udp_sendto(upcb, q, addr, port); - - /* free the "reference" pbuf */ - pbuf_free(q); - } - } - } - } - /* free the pbuf */ - pbuf_free(p); - } -} - -/** - * @ingroup netbiosns - * Init netbios responder - */ -void -netbiosns_init(void) -{ -#ifdef NETBIOS_LWIP_NAME - LWIP_ASSERT("NetBIOS name is too long!", strlen(NETBIOS_LWIP_NAME) < NETBIOS_NAME_LEN); -#endif - - netbiosns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY); - if (netbiosns_pcb != NULL) { - /* we have to be allowed to send broadcast packets! */ - ip_set_option(netbiosns_pcb, SOF_BROADCAST); - udp_bind(netbiosns_pcb, IP_ANY_TYPE, NETBIOS_PORT); - udp_recv(netbiosns_pcb, netbiosns_recv, netbiosns_pcb); - } -} - -#ifndef NETBIOS_LWIP_NAME -/** - * @ingroup netbiosns - * Set netbios name. ATTENTION: the hostname must be less than 15 characters! - */ -void -netbiosns_set_name(const char* hostname) -{ - size_t copy_len = strlen(hostname); - LWIP_ASSERT("NetBIOS name is too long!", copy_len < NETBIOS_NAME_LEN); - if (copy_len >= NETBIOS_NAME_LEN) { - copy_len = NETBIOS_NAME_LEN - 1; - } - MEMCPY(netbiosns_local_name, hostname, copy_len + 1); -} -#endif - -/** - * @ingroup netbiosns - * Stop netbios responder - */ -void -netbiosns_stop(void) -{ - if (netbiosns_pcb != NULL) { - udp_remove(netbiosns_pcb); - netbiosns_pcb = NULL; - } -} - -#endif /* LWIP_IPV4 && LWIP_UDP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj deleted file mode 100644 index 06d5075..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CCodeGeneration.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B} - Library - Properties - CCodeGeneration - CCodeGeneration - v4.0 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs deleted file mode 100644 index 6f12274..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CFile.cs +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace CCodeGeneration -{ - public class CFile: CodeContainerBase - { - public CFile() - { - base.IncreaseLevel = false; - } - - public void Save(CGenerator generator) - { - if (generator == null) - { - throw new ArgumentNullException("generator"); - } - - this.GenerateCode(0, generator); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs deleted file mode 100644 index 4e8dfbc..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CGenerator.cs +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.IO; - -namespace CCodeGeneration -{ - public class CGenerator - { - public TextWriter OutputStream { get; private set; } - public string File { get; private set; } - public uint IndentCount { get; private set; } - public string IndentChar { get; private set; } - public string NewLine { get; private set; } - - public CGenerator(System.IO.TextWriter outputStream, string file, uint indentCount, string indentChar, string newLine) - { - this.OutputStream = outputStream; - this.File = file; - this.IndentCount = indentCount; - this.IndentChar = indentChar; - this.NewLine = newLine; - } - - public string FileName - { - get - { - if (!String.IsNullOrWhiteSpace(this.File)) - { - return Path.GetFileName(this.File); - } - - return null; - } - } - - public void WriteSequence(string value, uint repetitions) - { - while (repetitions > 0) - { - this.OutputStream.Write(value); - repetitions--; - } - } - - public void IndentLine(int level) - { - while (level > 0) - { - WriteSequence(this.IndentChar, this.IndentCount); - level--; - } - } - - public void WriteNewLine() - { - this.OutputStream.Write(this.NewLine); - } - - public void WriteMultilineString(string value, int level = 0) - { - if (String.IsNullOrEmpty(value)) - { - return; - } - - // only \n and \r\n are recognized as linebreaks - string[] lines = value.Split(new char[] { '\n' }, StringSplitOptions.None); - - for (int l = 0; l < (lines.Length - 1); l++) - { - if (lines[l].EndsWith("\r")) - { - this.OutputStream.Write(lines[l].Substring(0, lines[l].Length-1)); - } - else - { - this.OutputStream.Write(lines[l]); - } - - this.WriteNewLine(); - this.IndentLine(level); - } - - this.OutputStream.Write(lines[lines.Length - 1]); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs deleted file mode 100644 index 4834508..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Code.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -namespace CCodeGeneration -{ - public class Code: CodeElement - { - public string Code_ { get; set; } - - public Code() - { - } - - public Code(string code) - { - this.Code_ = code; - } - - public override void GenerateCode(int level, CGenerator generator) - { - generator.IndentLine(level); - generator.WriteMultilineString(this.Code_, level); - generator.WriteNewLine(); - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs deleted file mode 100644 index 4327d92..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeContainerBase.cs +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System.Collections.Generic; -using System; - -namespace CCodeGeneration -{ - public class CodeContainerBase: CodeElement - { - private readonly List declarations = new List(); - private readonly List innerElements = new List(); - private bool increaseLevel = true; - - public List Declarations - { - get { return this.declarations; } - } - - public List InnerElements - { - get { return this.innerElements; } - } - - protected bool IncreaseLevel - { - get { return this.increaseLevel; } - set { this.increaseLevel = value; } - } - - public void AddElements(IList elements, params CodeElement[] spacerElements) - { - if (elements != null) - { - if ((spacerElements == null) || (spacerElements.Length == 0)) - { - this.innerElements.AddRange(elements); - } - else - { - bool spacerAdded = false; - - foreach (CodeElement element in elements) - { - this.innerElements.Add(element); - this.innerElements.AddRange(spacerElements); - spacerAdded = true; - } - - if (spacerAdded) - { - // remove last spacer again - this.innerElements.RemoveRange(this.innerElements.Count - spacerElements.Length, spacerElements.Length); - } - } - } - } - - public CodeElement AddElement(CodeElement element) - { - if (element != null) - { - this.innerElements.Add(element); - } - - return element; - } - - public Code AddCode(string code) - { - return this.AddElement(new Code(code)) as Code; - } - - public Code AddCodeFormat(string codeFormat, params object[] args) - { - return this.AddElement(new Code(String.Format(codeFormat, args))) as Code; - } - - public CodeElement AddDeclaration(CodeElement declaration) - { - if (declaration != null) - { - this.declarations.Add(declaration); - } - - return declaration; - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (this.increaseLevel) - level++; - - if (this.declarations.Count > 0) - { - foreach (CodeElement element in this.declarations) - { - element.GenerateCode(level, generator); - } - - EmptyLine.SingleLine.GenerateCode(level, generator); - } - - foreach (CodeElement element in this.innerElements) - { - element.GenerateCode(level, generator); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs deleted file mode 100644 index 51779be..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Comment.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -namespace CCodeGeneration -{ - public class Comment: CodeElement - { - public const string CommentStart = "/*"; - public const string CommentEnd = "*/"; - - public string Comment_ { get; set; } - public bool SingleLine { get; set; } - - public Comment() - { - } - - public Comment(string comment, bool singleLine = false) - { - this.Comment_ = comment; - this.SingleLine = singleLine; - } - - public override void GenerateCode(int level, CGenerator generator) - { - generator.IndentLine(level); - generator.OutputStream.Write(CommentStart); - - if (!this.SingleLine) - { - generator.WriteNewLine(); - generator.IndentLine(level); - generator.WriteMultilineString(this.Comment_, level); - generator.WriteNewLine(); - generator.IndentLine(level); - } - else - { - generator.OutputStream.Write(" " + Comment_ + " "); - } - - generator.OutputStream.Write(CommentEnd); - generator.WriteNewLine(); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs deleted file mode 100644 index 604c947..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/EmptyLine.cs +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -namespace CCodeGeneration -{ - public class EmptyLine : CodeElement - { - public static readonly EmptyLine SingleLine = new EmptyLine(); - public static readonly EmptyLine TwoLines = new EmptyLine(2); - public static readonly EmptyLine ThreeLines = new EmptyLine(3); - - public uint Count { get; set; } - - public EmptyLine() - { - this.Count = 1; - } - - public EmptyLine(uint count) - { - this.Count = count; - } - - public override void GenerateCode(int level, CGenerator generator) - { - uint c = this.Count; - - while (c > 0) - { - generator.WriteNewLine(); - c--; - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs deleted file mode 100644 index d81f6e5..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Function.cs +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; - -namespace CCodeGeneration -{ - public class Function: CodeContainerBase - { - public string Name { get; set; } - public bool IsStatic { get; set; } - - private readonly List parameter = new List(); - private VariableType returnType = VariableType.Void; - - public Function() - { - } - - public Function(string name, bool isStatic = false) - { - this.Name = name; - this.IsStatic = isStatic; - } - - public List Parameter - { - get { return this.parameter; } - } - - public VariableType ReturnType - { - get { return this.returnType; } - set - { - if (value == null) - { - throw new ArgumentNullException("ReturnValue"); - } - this.returnType = value; - } - } - - public static Function FromDeclaration(FunctionDeclaration decl) - { - Function result = new Function(decl.Name, decl.IsStatic); - result.ReturnType = decl.ReturnType.Clone() as VariableType; - - foreach (VariableType param in decl.Parameter) - { - result.parameter.Add(param.Clone() as VariableType); - } - - return result; - } - - public override void GenerateCode(int level, CGenerator generator) - { - generator.IndentLine(level); - - if (this.IsStatic) - { - generator.OutputStream.Write("static "); - } - - this.returnType.GenerateCode(generator); - generator.OutputStream.Write(" " + this.Name + "("); - - if (this.Parameter.Count > 0) - { - for (int i = 0; i < this.parameter.Count; i++) - { - this.parameter[i].GenerateCode(generator); - - if (i < (this.parameter.Count - 1)) - { - generator.OutputStream.Write(", "); - } - } - } - else - { - generator.OutputStream.Write("void"); - } - - generator.OutputStream.Write(")"); - generator.WriteNewLine(); - generator.IndentLine(level); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - base.GenerateCode(level, generator); - - generator.IndentLine(level); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs deleted file mode 100644 index 3bc4288..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/FunctionDeclaration.cs +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; - -namespace CCodeGeneration -{ - public class FunctionDeclaration: CodeElement - { - public string Name { get; set; } - public bool IsStatic { get; set; } - public bool IsExtern { get; set; } - - private readonly List parameter = new List(); - private VariableType returnType = VariableType.Void; - - public FunctionDeclaration() - { - } - - public FunctionDeclaration(string name, bool isStatic = false, bool isExtern = false) - { - this.Name = name; - this.IsStatic = isStatic; - this.IsExtern = isExtern; - } - - public List Parameter - { - get { return this.parameter; } - } - - public VariableType ReturnType - { - get { return this.returnType; } - set - { - if (value == null) - { - throw new ArgumentNullException("ReturnValue"); - } - this.returnType = value; - } - } - - public override void GenerateCode(int level, CGenerator generator) - { - generator.IndentLine(level); - - if (this.IsExtern) - { - generator.OutputStream.Write("extern "); - } - - if (this.IsStatic) - { - generator.OutputStream.Write("static "); - } - - this.returnType.GenerateCode(generator); - generator.OutputStream.Write(" " + this.Name + "("); - - if (this.Parameter.Count > 0) - { - for (int i = 0; i < this.parameter.Count; i++) - { - this.parameter[i].GenerateCode(generator); - - if (i < (this.parameter.Count - 1)) - { - generator.OutputStream.Write(", "); - } - } - } - else - { - generator.OutputStream.Write("void"); - } - - generator.OutputStream.Write(");"); - generator.WriteNewLine(); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs deleted file mode 100644 index c471022..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/IfThenElse.cs +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; - -namespace CCodeGeneration -{ - public class ElseIf : CodeContainerBase - { - public string Condition { get; set; } - - public ElseIf() - { - } - - public ElseIf(string condition) - { - this.Condition = condition; - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Condition)) - { - generator.IndentLine(level); - generator.OutputStream.Write(String.Format("else if ({0})", this.Condition)); - generator.WriteNewLine(); - generator.IndentLine(level); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - base.GenerateCode(level, generator); - - generator.IndentLine(level); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - } - } - } - - public class IfThenElse: CodeContainerBase - { - public string Condition { get; set; } - - private List elseIf = new List(); - private CodeContainerBase else_ = new CodeContainerBase(); - - public IfThenElse() - { - } - - public IfThenElse(string condition) - { - this.Condition = condition; - } - - public List ElseIf - { - get { return this.elseIf; } - } - - public CodeContainerBase Else - { - get { return this.else_; } - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Condition)) - { - generator.IndentLine(level); - generator.OutputStream.Write(String.Format("if ({0})", this.Condition)); - generator.WriteNewLine(); - generator.IndentLine(level); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - base.GenerateCode(level, generator); - - generator.IndentLine(level); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - - foreach (ElseIf elif in this.elseIf) - { - elif.GenerateCode(level, generator); - } - - if (this.else_.InnerElements.Count > 0) - { - generator.IndentLine(level); - generator.OutputStream.Write("else"); - generator.WriteNewLine(); - generator.IndentLine(level); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - this.else_.GenerateCode(level, generator); - - generator.IndentLine(level); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - } - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs deleted file mode 100644 index 5568215..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_If.cs +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace CCodeGeneration -{ - public class PP_If: CodeContainerBase - { - public string Condition { get; set; } - - public PP_If() - { - base.IncreaseLevel = false; - } - - public PP_If(string condition) - : this() - { - this.Condition = condition; - } - - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Condition)) - { - generator.OutputStream.Write("#if " + this.Condition); - generator.WriteNewLine(); - - base.GenerateCode(level, generator); - - generator.OutputStream.Write("#endif /* " + this.Condition + " */"); - generator.WriteNewLine(); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs deleted file mode 100644 index fd4f45a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Ifdef.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace CCodeGeneration -{ - public class PP_Ifdef: CodeContainerBase - { - public string Macro { get; set; } - public bool Inverted { get; set; } - - public PP_Ifdef() - { - base.IncreaseLevel = false; - } - - public PP_Ifdef(string macro, bool inverted = false) - : this() - { - this.Macro = macro; - this.Inverted = inverted; - } - - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Macro)) - { - if (this.Inverted) - { - generator.OutputStream.Write("#ifndef " + this.Macro); - } - else - { - generator.OutputStream.Write("#ifdef " + this.Macro); - } - generator.WriteNewLine(); - - base.GenerateCode(level, generator); - - generator.OutputStream.Write("#endif /* " + this.Macro + " */"); - generator.WriteNewLine(); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs deleted file mode 100644 index 0393d27..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Include.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace CCodeGeneration -{ - public class PP_Include : CodeElement - { - public string File { get; set; } - public bool IsLocal { get; set; } - - public PP_Include() - { - this.IsLocal = true; - } - - public PP_Include(string file, bool isLocal = true) - { - this.File = file; - this.IsLocal = isLocal; - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.File)) - { - // includes are never indented - if (this.IsLocal) - { - generator.OutputStream.Write("#include \"" + this.File + "\""); - } - else - { - generator.OutputStream.Write("#include <" + this.File + ">"); - } - - generator.WriteNewLine(); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs deleted file mode 100644 index d5e076f..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PlainText.cs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -namespace CCodeGeneration -{ - public class PlainText : CodeElement - { - public string Value { get; set; } - - public PlainText(string value) - { - this.Value = value; - } - - public override void GenerateCode(int level, CGenerator generator) - { - generator.WriteMultilineString(this.Value); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs deleted file mode 100644 index 4c716ad..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("CCodeGeneration")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("CCodeGeneration")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("8f07a0fa-86f4-48a0-97c7-f94fc5c3f103")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs deleted file mode 100644 index 9166fb8..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/Switch.cs +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; - -namespace CCodeGeneration -{ - public class SwitchCase : CodeContainerBase - { - public string Value { get; set; } - - public SwitchCase() - { - } - - public SwitchCase(string value) - { - this.Value = value; - } - - public bool IsDefault - { - get { return (this.Value.ToLowerInvariant() == "default"); } - } - - public static SwitchCase GenerateDefault() - { - return new SwitchCase("default"); - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Value)) - { - generator.IndentLine(level); - if (this.IsDefault) - { - generator.OutputStream.Write("default:"); - } - else - { - generator.OutputStream.Write(String.Format("case {0}:", this.Value)); - } - generator.WriteNewLine(); - generator.IndentLine(level + 1); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - base.GenerateCode(level + 1, generator); - - generator.IndentLine(level + 1); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - - generator.IndentLine(level + 1); - generator.OutputStream.Write("break;"); - generator.WriteNewLine(); - } - } - } - - public class Switch: CodeElement - { - public string SwitchVar { get; set; } - - private List switches = new List(); - - public Switch() - { - } - - public Switch(string switchVar) - { - this.SwitchVar = switchVar; - } - - public List Switches - { - get { return this.switches; } - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.SwitchVar)) - { - generator.IndentLine(level); - generator.OutputStream.Write(String.Format("switch ({0})", this.SwitchVar)); - generator.WriteNewLine(); - generator.IndentLine(level); - generator.OutputStream.Write("{"); - generator.WriteNewLine(); - - SwitchCase defaultCase = null; // generate 'default' always as last case - foreach (SwitchCase switchCase in this.switches) - { - if (switchCase.IsDefault) - { - defaultCase = switchCase; - } - else - { - switchCase.GenerateCode(level + 1, generator); - } - } - if (defaultCase != null) - { - defaultCase.GenerateCode(level + 1, generator); - } - - generator.IndentLine(level); - generator.OutputStream.Write("}"); - generator.WriteNewLine(); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs deleted file mode 100644 index bf2c902..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableDeclaration.cs +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace CCodeGeneration -{ - public class VariableDeclaration : CodeElement - { - public VariableType Type { get; set; } - public string InitialValue { get; set; } - public bool IsStatic { get; set; } - - public VariableDeclaration() - : base() - { - } - - public VariableDeclaration(VariableType type, string initialValue = null, bool isStatic = false) : - base() - { - this.Type = type; - this.InitialValue = initialValue; - this.IsStatic = isStatic; - } - - public override void GenerateCode(int level, CGenerator generator) - { - if (this.Type != null) - { - generator.IndentLine(level); - - if (this.IsStatic) - { - generator.OutputStream.Write("static "); - } - - // declare the variable - this.Type.GenerateCode(generator); - - if (!String.IsNullOrWhiteSpace(this.InitialValue)) - { - // add initialization value - generator.OutputStream.Write(" = "); - generator.WriteMultilineString(this.InitialValue, level); - } - - generator.OutputStream.Write(";"); - generator.WriteNewLine(); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs deleted file mode 100644 index 313abbe..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariableType.cs +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; - -namespace CCodeGeneration -{ - public enum ConstType - { - None, - Value, - Indirection, - Both - } - - public class VariableType : ICloneable - { - public const string VoidString = "void"; - public static readonly VariableType Void = new VariableType(null, "void"); - - public string Name { get; set; } - public string Type { get; set; } - public string Indirection { get; set; } - public ConstType Const { get; set; } - public string ArraySpecifier { get; set; } - - public VariableType() - { - } - - public VariableType(string name, string type, string indirection = null, ConstType const_ = ConstType.None, string arraySpecifier = null) - { - this.Name = name; - this.Type = type; - this.Indirection = indirection; - this.Const = const_; - this.ArraySpecifier = arraySpecifier; - } - - public void GenerateCode(CGenerator generator) - { - if (!String.IsNullOrWhiteSpace(this.Type)) - { - generator.OutputStream.Write(this.ToString().Trim()); - } - } - - public override string ToString() - { - if (!String.IsNullOrWhiteSpace(this.Type)) - { - StringBuilder vt = new StringBuilder(); - - if ((this.Const == ConstType.Value) || (this.Const == ConstType.Both)) - { - vt.Append("const "); - } - - vt.Append(this.Type); - vt.Append(" "); - - if (!String.IsNullOrWhiteSpace(this.Indirection)) - { - vt.Append(this.Indirection); - } - - if ((this.Const == ConstType.Indirection) || (this.Const == ConstType.Both)) - { - vt.Append("const "); - } - - if (!String.IsNullOrWhiteSpace(this.Name)) - { - vt.Append(this.Name); - } - - if (this.ArraySpecifier != null) - { - vt.Append("["); - vt.Append(this.ArraySpecifier); - vt.Append("]"); - } - - return vt.ToString().Trim(); - } - - return base.ToString(); - } - - #region ICloneable Member - - public object Clone() - { - // we only have value types as members -> simply use .net base function - return this.MemberwiseClone(); - } - - #endregion - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln deleted file mode 100644 index 12ca54d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler.sln +++ /dev/null @@ -1,47 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LwipMibCompiler", "LwipMibCompiler\LwipMibCompiler.csproj", "{C25D5640-D999-49BD-82E0-A1975296A91E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LwipSnmpCodeGeneration", "LwipSnmpCodeGeneration\LwipSnmpCodeGeneration.csproj", "{AABCAB90-1540-45D4-A159-14831A54E9A3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CCodeGeneration", "CCodeGeneration\CCodeGeneration.csproj", "{7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpSnmpLib.Mib", "SharpSnmpLib\SharpSnmpLib.Mib.csproj", "{CBE20411-5DB7-487D-825D-7694267BB6F5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LwipMibViewer", "LwipMibViewer\LwipMibViewer.csproj", "{86CC0B65-7985-4017-A252-0A7A18DCAEF3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B}.Release|Any CPU.Build.0 = Release|Any CPU - {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86CC0B65-7985-4017-A252-0A7A18DCAEF3}.Release|Any CPU.Build.0 = Release|Any CPU - {AABCAB90-1540-45D4-A159-14831A54E9A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AABCAB90-1540-45D4-A159-14831A54E9A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AABCAB90-1540-45D4-A159-14831A54E9A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AABCAB90-1540-45D4-A159-14831A54E9A3}.Release|Any CPU.Build.0 = Release|Any CPU - {C25D5640-D999-49BD-82E0-A1975296A91E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C25D5640-D999-49BD-82E0-A1975296A91E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C25D5640-D999-49BD-82E0-A1975296A91E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C25D5640-D999-49BD-82E0-A1975296A91E}.Release|Any CPU.Build.0 = Release|Any CPU - {CBE20411-5DB7-487D-825D-7694267BB6F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CBE20411-5DB7-487D-825D-7694267BB6F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CBE20411-5DB7-487D-825D-7694267BB6F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CBE20411-5DB7-487D-825D-7694267BB6F5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = LwipMibViewer\LwipMibViewer.csproj - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj deleted file mode 100644 index 694263a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/LwipMibCompiler.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {C25D5640-D999-49BD-82E0-A1975296A91E} - Exe - Properties - LwipMibCompiler - LwipMibCompiler - v4.0 - 512 - - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - false - false - 4 - false - false - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - 4 - false - - - - - - - - - - - - - - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B} - CCodeGeneration - - - {AABCAB90-1540-45D4-A159-14831A54E9A3} - LwipSnmpCodeGeneration - - - {CBE20411-5DB7-487D-825D-7694267BB6F5} - SharpSnmpLib.Mib - - - - - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs deleted file mode 100644 index ebc07b6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Program.cs +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text.RegularExpressions; -using CCodeGeneration; -using Lextm.SharpSnmpLib.Mib; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using Lextm.SharpSnmpLib.Mib.Elements.Types; -using LwipSnmpCodeGeneration; - -namespace LwipMibCompiler -{ - class Program - { - private static readonly Regex _alphaNumericRegex = new Regex("[^a-zA-Z0-9]"); - - static void Main(string[] args) - { - Console.WriteLine("lwIP MIB Compiler"); - Console.WriteLine(""); - - // check args - if ((args.Length < 2) || String.IsNullOrWhiteSpace(args[0]) || String.IsNullOrWhiteSpace(args[1])) - { - PrintUsage(); - return; - } - - string mibFile = args[0]; - if (!File.Exists(mibFile)) - { - Console.WriteLine(String.Format("Unable to find file '{0}'!", mibFile)); - } - - string destFile = args[1]; - string destHeaderFile; - - if (Directory.Exists(destFile)) - { - // only directory passed -> create dest filename from mib filename - string mibFileName = Path.GetFileNameWithoutExtension(mibFile).ToLowerInvariant(); - destFile = Path.Combine(destFile, mibFileName + ".c"); - } - - string destFileExt = Path.GetExtension(destFile); - if (!String.IsNullOrEmpty(destFileExt)) - { - destHeaderFile = destFile.Substring(0, destFile.Length - destFileExt.Length); - } - else - { - destHeaderFile = destFile; - } - destHeaderFile += ".h"; - - for (int i=2; i [ ...]", appName)); - Console.WriteLine(""); - Console.WriteLine(" "); - Console.WriteLine(" Path and filename of MIB file to convert."); - Console.WriteLine(""); - Console.WriteLine(" "); - Console.WriteLine(" Destination path and file. If a path is passed only, filename is auto"); - Console.WriteLine(" generated from MIB file name."); - Console.WriteLine(""); - Console.WriteLine(" "); - Console.WriteLine(" It's important to provide all referred MIB's in order to correctly "); - Console.WriteLine(" resolve all used types."); - Console.WriteLine(""); - } - - - #region Generation of LWIP Object Tree - - private static void ProcessMibTreeNode(MibTreeNode mibTreeNode, SnmpTreeNode assignedSnmpNode) - { - foreach (MibTreeNode mtn in mibTreeNode.ChildNodes) - { - // in theory container nodes may also be scalars or tables at the same time (for now only process real containers) - if (mtn.NodeType == MibTreeNodeType.Container) - { - SnmpTreeNode snmpTreeNode = GenerateSnmpTreeNode(mtn, assignedSnmpNode); - assignedSnmpNode.ChildNodes.Add(snmpTreeNode); - - ProcessMibTreeNode(mtn, snmpTreeNode); - } - else if ((mtn.NodeType & MibTreeNodeType.Scalar) != 0) - { - SnmpScalarNode snmpScalarNode = GenerateSnmpScalarNode(mtn, assignedSnmpNode); - if (snmpScalarNode != null) - { - assignedSnmpNode.ChildNodes.Add(snmpScalarNode); - } - } - else if ((mtn.NodeType & MibTreeNodeType.Table) != 0) - { - SnmpTableNode snmpTableNode = GenerateSnmpTableNode(mtn, assignedSnmpNode); - if (snmpTableNode != null) - { - assignedSnmpNode.ChildNodes.Add(snmpTableNode); - } - } - } - } - - private static SnmpTreeNode GenerateSnmpTreeNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode) - { - SnmpTreeNode result = new SnmpTreeNode(parentNode); - result.Name = _alphaNumericRegex.Replace(mibTreeNode.Entity.Name, "").ToLowerInvariant(); - result.Oid = mibTreeNode.Entity.Value; - result.FullOid = MibTypesResolver.ResolveOid(mibTreeNode.Entity).GetOidString(); - - return result; - } - - private static SnmpScalarNode GenerateSnmpScalarNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode, bool ignoreAccessibleFlag = false) - { - ObjectType ote = mibTreeNode.Entity as ObjectType; - if (ote != null) - { - return GenerateSnmpScalarNode(ote, parentNode, ignoreAccessibleFlag); - } - - return null; - } - - private static SnmpScalarNode GenerateSnmpScalarNode(ObjectType ote, SnmpTreeNode parentNode, bool ignoreAccessibleFlag = false) - { - SnmpScalarNode result; - - ITypeAssignment mibType = ote.BaseType; - IntegerType it = (mibType as IntegerType); - if (it != null) - { - if (ote.ReferredType.Name == Symbol.TruthValue.ToString()) - { - result = new SnmpScalarNodeTruthValue(parentNode); - } - else if ((it.Type == IntegerType.Types.Integer) || (it.Type == IntegerType.Types.Integer32)) - { - result = new SnmpScalarNodeInt(parentNode); - } - else - { - Console.WriteLine(String.Format("Unsupported IntegerType '{0}'!", it.Type)); - return null; - } - if (it.IsEnumeration) - { - result.Restrictions.AddRange(CreateRestrictions(it.Enumeration)); - } - else - { - result.Restrictions.AddRange(CreateRestrictions(it.Ranges)); - } - } - else - { - UnsignedType ut = (mibType as UnsignedType); - if (ut != null) - { - if ((ut.Type == UnsignedType.Types.Unsigned32) || - (ut.Type == UnsignedType.Types.Gauge32)) - { - result = new SnmpScalarNodeUint(SnmpDataType.Gauge, parentNode); - } - else if (ut.Type == UnsignedType.Types.Counter32) - { - result = new SnmpScalarNodeUint(SnmpDataType.Counter, parentNode); - } - else if (ut.Type == UnsignedType.Types.TimeTicks) - { - result = new SnmpScalarNodeUint(SnmpDataType.TimeTicks, parentNode); - } - else if (ut.Type == UnsignedType.Types.Counter64) - { - result = new SnmpScalarNodeCounter64(parentNode); - if ((ut.Ranges != null) && (ut.Ranges.Count > 0)) - { - Console.WriteLine(String.Format("Generation of ranges is not supported for Counter64 type!")); - return null; - } - } - else - { - Console.WriteLine(String.Format("Unsupported UnsignedType '{0}'!", ut.Type)); - return null; - } - result.Restrictions.AddRange(CreateRestrictions(ut.Ranges)); - } - else if (mibType is IpAddressType) - { - result = new SnmpScalarNodeOctetString(SnmpDataType.IpAddress, parentNode); - result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size)); - } - else if (mibType is OpaqueType) - { - result = new SnmpScalarNodeOctetString(SnmpDataType.Opaque, parentNode); - result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size)); - } - else if (mibType is OctetStringType) - { - result = new SnmpScalarNodeOctetString(SnmpDataType.OctetString, parentNode); - result.Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size)); - } - else if (mibType is ObjectIdentifierType) - { - result = new SnmpScalarNodeObjectIdentifier(parentNode); - } - else if (mibType is BitsType) - { - result = new SnmpScalarNodeBits(parentNode, (uint)((mibType as BitsType).Map.GetHighestValue() + 1)); - result.Restrictions.AddRange(CreateRestrictions(mibType as BitsType)); - } - else - { - TypeAssignment ta = mibType as TypeAssignment; - if (ta != null) - { - Console.WriteLine(String.Format("Unsupported BaseType: Module='{0}', Name='{1}', Type='{2}'!", ta.Module.Name, ta.Name, ta.Type)); - } - else - { - Console.WriteLine(String.Format("Unsupported BaseType: Module='{0}', Name='{1}'!", mibType.Module, mibType.Name)); - } - - return null; - } - } - - result.Name = _alphaNumericRegex.Replace(ote.Name, "").ToLowerInvariant(); - result.Oid = ote.Value; - - if (ote.Access == MaxAccess.readWrite) - { - result.AccessMode = SnmpAccessMode.ReadWrite; - } - else if (ote.Access == MaxAccess.readOnly) - { - result.AccessMode = SnmpAccessMode.ReadOnly; - } - else if (ote.Access == MaxAccess.readCreate) - { - result.AccessMode = SnmpAccessMode.ReadOnly; - } - else if (ignoreAccessibleFlag && (ote.Access == MaxAccess.notAccessible)) - { - result.AccessMode = SnmpAccessMode.NotAccessible; - } - else - { - // not accessible or unsupported accress type - return null; - } - - return result; - } - - private static IEnumerable CreateRestrictions(ValueRanges ranges) - { - List result = new List(); - - if (ranges != null) - { - foreach (ValueRange range in ranges) - { - if (!range.End.HasValue) - { - result.Add(new IsEqualRestriction(range.Start)); - } - else - { - result.Add(new IsInRangeRestriction(range.Start, range.End.Value)); - } - } - } - - return result; - } - - private static IEnumerable CreateRestrictions(ValueMap map) - { - if ((map != null) && (map.Count > 0)) - { - return CreateRestrictions(map.GetContinousRanges()); - } - - return new List(); - } - - private static IEnumerable CreateRestrictions(BitsType bt) - { - List result = new List(); - - if ((bt != null) && (bt.Map != null)) - { - result.Add(new BitMaskRestriction(bt.Map.GetBitMask())); - } - - return result; - } - - private static SnmpTableNode GenerateSnmpTableNode(MibTreeNode mibTreeNode, SnmpTreeNode parentNode) - { - SnmpTableNode result = new SnmpTableNode(parentNode); - result.Name = mibTreeNode.Entity.Name; - result.Oid = mibTreeNode.Entity.Value; - - // expect exactly one row entry - if ((mibTreeNode.ChildNodes.Count != 1) || ((mibTreeNode.ChildNodes[0].NodeType & MibTreeNodeType.TableRow) == 0) || (mibTreeNode.ChildNodes[0].Entity.Value != 1)) - { - Console.WriteLine("Found table with unsupported properties! Table needs exactly one (fixed) TableRow with OID=1 ! (" + mibTreeNode.Entity.Name + ")"); - return null; - } - - MibTreeNode rowNode = mibTreeNode.ChildNodes[0]; - - ObjectType rot = rowNode.Entity as ObjectType; - if (rot != null) - { - if (!String.IsNullOrWhiteSpace(rot.Augments)) - { - result.AugmentedTableRow = rot.Augments; - - // the indeces from another table shall be used because this table is only an extension of it - rot = MibTypesResolver.ResolveDeclaration(rot.Module, rot.Augments) as ObjectType; - } - - if (rot.Indices != null) - { - foreach (string index in rot.Indices) - { - ObjectType indexEntity = MibTypesResolver.ResolveDeclaration(rot.Module, index) as ObjectType; - if (indexEntity == null) - { - Console.WriteLine(String.Format("Could not resolve index '{0}' for table '{1}'! Table omitted!", index, result.Name)); - return null; - } - - result.IndexNodes.Add(GenerateSnmpScalarNode(indexEntity, parentNode, ignoreAccessibleFlag: true)); - } - } - } - - if (result.IndexNodes.Count == 0) - { - // a table cannot be used without index - Console.WriteLine("Found table without any index column ! (" + mibTreeNode.Entity.Name + ")"); - return null; - } - - // add child nodes - foreach (MibTreeNode cellNode in rowNode.ChildNodes) - { - SnmpScalarNode ssn = GenerateSnmpScalarNode(cellNode, parentNode); - if (ssn != null) - { - result.CellNodes.Add(ssn); - } - } - - return result; - } - - #endregion - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs deleted file mode 100644 index d30b842..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("ConsoleApplication28")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ConsoleApplication28")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("0abf7541-6a96-43cd-9e24-462e074b2c96")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config deleted file mode 100644 index e365603..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibCompiler/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs deleted file mode 100644 index dcd19aa..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.Designer.cs +++ /dev/null @@ -1,166 +0,0 @@ -namespace LwipMibViewer -{ - partial class FormMain - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); - this.treeMib = new System.Windows.Forms.TreeView(); - this.imagelistTreeNodeImages = new System.Windows.Forms.ImageList(this.components); - this.splitContainerMain = new System.Windows.Forms.SplitContainer(); - this.listviewNodeDetails = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.toolStripMain = new System.Windows.Forms.ToolStrip(); - this.toolbuttonOpenMib = new System.Windows.Forms.ToolStripButton(); - this.dialogOpenMib = new System.Windows.Forms.OpenFileDialog(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).BeginInit(); - this.splitContainerMain.Panel1.SuspendLayout(); - this.splitContainerMain.Panel2.SuspendLayout(); - this.splitContainerMain.SuspendLayout(); - this.toolStripMain.SuspendLayout(); - this.SuspendLayout(); - // - // treeMib - // - this.treeMib.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeMib.ImageIndex = 0; - this.treeMib.ImageList = this.imagelistTreeNodeImages; - this.treeMib.Location = new System.Drawing.Point(0, 0); - this.treeMib.Name = "treeMib"; - this.treeMib.SelectedImageIndex = 0; - this.treeMib.Size = new System.Drawing.Size(1028, 418); - this.treeMib.TabIndex = 0; - this.treeMib.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMib_AfterSelect); - // - // imagelistTreeNodeImages - // - this.imagelistTreeNodeImages.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagelistTreeNodeImages.ImageStream"))); - this.imagelistTreeNodeImages.TransparentColor = System.Drawing.Color.Transparent; - this.imagelistTreeNodeImages.Images.SetKeyName(0, "ntimgContainer"); - this.imagelistTreeNodeImages.Images.SetKeyName(1, "ntimgTable"); - this.imagelistTreeNodeImages.Images.SetKeyName(2, "ntimgRow"); - this.imagelistTreeNodeImages.Images.SetKeyName(3, "ntimgColumn"); - this.imagelistTreeNodeImages.Images.SetKeyName(4, "ntimgScalar"); - this.imagelistTreeNodeImages.Images.SetKeyName(5, "ntimgUnknown"); - // - // splitContainerMain - // - this.splitContainerMain.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainerMain.Location = new System.Drawing.Point(0, 25); - this.splitContainerMain.Name = "splitContainerMain"; - this.splitContainerMain.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainerMain.Panel1 - // - this.splitContainerMain.Panel1.Controls.Add(this.treeMib); - // - // splitContainerMain.Panel2 - // - this.splitContainerMain.Panel2.Controls.Add(this.listviewNodeDetails); - this.splitContainerMain.Size = new System.Drawing.Size(1028, 625); - this.splitContainerMain.SplitterDistance = 418; - this.splitContainerMain.TabIndex = 1; - // - // listviewNodeDetails - // - this.listviewNodeDetails.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2}); - this.listviewNodeDetails.Dock = System.Windows.Forms.DockStyle.Fill; - this.listviewNodeDetails.FullRowSelect = true; - this.listviewNodeDetails.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; - this.listviewNodeDetails.Location = new System.Drawing.Point(0, 0); - this.listviewNodeDetails.Name = "listviewNodeDetails"; - this.listviewNodeDetails.Size = new System.Drawing.Size(1028, 203); - this.listviewNodeDetails.TabIndex = 0; - this.listviewNodeDetails.UseCompatibleStateImageBehavior = false; - this.listviewNodeDetails.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = ""; - this.columnHeader1.Width = 150; - // - // columnHeader2 - // - this.columnHeader2.Text = ""; - this.columnHeader2.Width = 777; - // - // toolStripMain - // - this.toolStripMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.toolbuttonOpenMib}); - this.toolStripMain.Location = new System.Drawing.Point(0, 0); - this.toolStripMain.Name = "toolStripMain"; - this.toolStripMain.Size = new System.Drawing.Size(1028, 25); - this.toolStripMain.TabIndex = 2; - // - // toolbuttonOpenMib - // - this.toolbuttonOpenMib.Image = ((System.Drawing.Image)(resources.GetObject("toolbuttonOpenMib.Image"))); - this.toolbuttonOpenMib.Name = "toolbuttonOpenMib"; - this.toolbuttonOpenMib.Size = new System.Drawing.Size(65, 22); - this.toolbuttonOpenMib.Text = "Open..."; - this.toolbuttonOpenMib.Click += new System.EventHandler(this.toolbuttonOpenMib_Click); - // - // FormMain - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1028, 650); - this.Controls.Add(this.splitContainerMain); - this.Controls.Add(this.toolStripMain); - this.Name = "FormMain"; - this.Text = "MIB Viewer"; - this.WindowState = System.Windows.Forms.FormWindowState.Maximized; - this.splitContainerMain.Panel1.ResumeLayout(false); - this.splitContainerMain.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainerMain)).EndInit(); - this.splitContainerMain.ResumeLayout(false); - this.toolStripMain.ResumeLayout(false); - this.toolStripMain.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TreeView treeMib; - private System.Windows.Forms.SplitContainer splitContainerMain; - private System.Windows.Forms.ListView listviewNodeDetails; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ImageList imagelistTreeNodeImages; - private System.Windows.Forms.ToolStrip toolStripMain; - private System.Windows.Forms.ToolStripButton toolbuttonOpenMib; - private System.Windows.Forms.OpenFileDialog dialogOpenMib; - } -} - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs deleted file mode 100644 index 7d2490d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.cs +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System.Windows.Forms; -using Lextm.SharpSnmpLib.Mib; -using Lextm.SharpSnmpLib.Mib.Elements; -using Lextm.SharpSnmpLib.Mib.Elements.Types; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using System.IO; - -namespace LwipMibViewer -{ - public partial class FormMain : Form - { - readonly ListViewGroup listviewgroupAbstract; - readonly ListViewGroup listviewgroupElement; - readonly ListViewGroup listviewgroupBaseType; - readonly ListViewGroup listviewgroupTypeChain; - - public FormMain() - { - this.Font = SystemInformation.MenuFont; - InitializeComponent(); - - this.listviewgroupAbstract = new ListViewGroup("Abstract", System.Windows.Forms.HorizontalAlignment.Left); - this.listviewgroupElement = new ListViewGroup("Element Properties", System.Windows.Forms.HorizontalAlignment.Left); - this.listviewgroupBaseType = new ListViewGroup("Element Base Type", System.Windows.Forms.HorizontalAlignment.Left); - this.listviewgroupTypeChain = new ListViewGroup("Element Type Chain", System.Windows.Forms.HorizontalAlignment.Left); - this.listviewNodeDetails.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] { - listviewgroupAbstract, - listviewgroupElement, - listviewgroupBaseType, - listviewgroupTypeChain}); - - try - { - DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(Application.ExecutablePath)); - if (dirInfo != null) - { - dirInfo = dirInfo.Parent; - if (dirInfo != null) - { - dirInfo = dirInfo.Parent; - if (dirInfo != null) - { - dirInfo = new DirectoryInfo(Path.Combine(dirInfo.FullName, "Mibs")); - if (dirInfo.Exists) - { - MibTypesResolver.RegisterResolver(new FileSystemMibResolver(dirInfo.FullName, true)); - } - } - } - } - } - catch - { } - } - - #region GUI Event Handler - - private void toolbuttonOpenMib_Click(object sender, System.EventArgs e) - { - if (this.dialogOpenMib.ShowDialog() == DialogResult.OK) - { - OpenMib(this.dialogOpenMib.FileName); - } - } - - private void treeMib_AfterSelect(object sender, TreeViewEventArgs e) - { - listviewNodeDetails.Items.Clear(); - - if (e.Node != null) - { - MibTreeNode mtn = e.Node.Tag as MibTreeNode; - if (mtn != null) - { - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Abstract", mtn.NodeType.ToString() }, this.listviewgroupAbstract)); - - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Module", (mtn.Entity.Module != null) ? mtn.Entity.Module.Name : "" }, this.listviewgroupElement)); - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Type", mtn.Entity.GetType().Name }, this.listviewgroupElement)); - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Name", mtn.Entity.Name }, this.listviewgroupElement)); - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Description", mtn.Entity.Description }, this.listviewgroupElement)); - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "OID", mtn.Entity.Value.ToString() }, this.listviewgroupElement)); - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Full OID", MibTypesResolver.ResolveOid(mtn.Entity).GetOidString() }, this.listviewgroupElement)); - if (mtn.Entity is ObjectType) - { - listviewNodeDetails.Items.Add(new ListViewItem(new string[] { "Access", (mtn.Entity as ObjectType).Access.ToString() }, this.listviewgroupElement)); - } - - ITypeReferrer tr = mtn.Entity as ITypeReferrer; - if (tr != null) - { - ShowTypeDetails(listviewNodeDetails, this.listviewgroupBaseType, tr.BaseType); - ShowTypeChain(listviewNodeDetails, tr.ReferredType); - } - } - } - } - - #endregion - - #region Methods - - private void OpenMib(string file) - { - try - { - MibDocument md = new MibDocument(file); - MibTypesResolver.ResolveTypes(md.Modules[0]); - - this.treeMib.Nodes.Clear(); - this.listviewNodeDetails.Items.Clear(); - - MibTree mt = new MibTree(md.Modules[0] as MibModule); - foreach (MibTreeNode mibTreeNode in mt.Root) - { - AddNode(mibTreeNode, this.treeMib.Nodes); - - foreach (TreeNode node in this.treeMib.Nodes) - { - node.Expand(); - } - } - } - catch - { - } - } - - private void AddNode(MibTreeNode mibNode, TreeNodeCollection parentNodes) - { - int imgIndex = 5; //unknown - if ((mibNode.NodeType & MibTreeNodeType.Table) != 0) - { - imgIndex = 1; - } - else if ((mibNode.NodeType & MibTreeNodeType.TableRow) != 0) - { - imgIndex = 2; - } - else if ((mibNode.NodeType & MibTreeNodeType.TableCell) != 0) - { - imgIndex = 3; - } - else if ((mibNode.NodeType & MibTreeNodeType.Scalar) != 0) - { - imgIndex = 4; - } - else if ((mibNode.NodeType & MibTreeNodeType.Container) != 0) - { - imgIndex = 0; - } - - TreeNode newNode = new TreeNode(mibNode.Entity.Name, imgIndex, imgIndex); - newNode.Tag = mibNode; - - parentNodes.Add(newNode); - - foreach (MibTreeNode child in mibNode.ChildNodes) - { - AddNode(child, newNode.Nodes); - } - } - - private void ShowTypeChain(ListView lv, ITypeAssignment type) - { - ShowTypeDetails(lv, this.listviewgroupTypeChain, type); - - ITypeReferrer tr = type as ITypeReferrer; - if ((tr != null) && (tr.ReferredType != null)) - { - lv.Items.Add(new ListViewItem(new string[] { " >>>", "" }, this.listviewgroupTypeChain)); - ShowTypeChain(listviewNodeDetails, tr.ReferredType); - } - } - - private void ShowTypeDetails(ListView lv, ListViewGroup lvg, ITypeAssignment type) - { - lv.Items.Add(new ListViewItem(new string[] { "Module", (type.Module != null) ? type.Module.Name : "" }, lvg)); - lv.Items.Add(new ListViewItem(new string[] { "Type", type.GetType().Name }, lvg)); - lv.Items.Add(new ListViewItem(new string[] { "Name", type.Name }, lvg)); - } - - #endregion - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx deleted file mode 100644 index 973f546..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/FormMain.resx +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo - IQAAAk1TRnQBSQFMAgEBBgEAARABAAEQAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAMAAQEBAAEgBgABIBIAAwQBBQMWAR4DIgEyAzEBTwJGAUQBhwMvAUsDHgErAxsBJgMYASIDFQEd - AxIBGAMNARIDCgENAwcBCQMEAQUDAQECAwQBBQMWAR4DIgEyAzEBTgJGAUQBhwMvAUsDHgErAxsBJgMb - ASYDIQExAyEBMAMdASoDGwEmAxgBIQMLAQ8DAQECgAADAgEDAwwBEAMrAUMCRgFEAYIC/wHwAf8CRgFE - AYIDKgFAAw8BFAMNAREDCwEPAwkBDAMHAQoDBQEHAwQBBQMCAQMDAAEBAwIBAwMLAQ8DKwFDAkYBRAGC - Av8B8AH/AkYBRAGCAyoBQAMOARMDEgEZAT0COwFpAVwBRQFCAawBZwE+AToBxAFaAUUBQwGqATwBOwE6 - AWYDEAEWAwABAYQAAx4BKwJEAUIBewL/AfAB/wLpAdoD/wHxAf8CRAFCAXsDHgErJAADHgErAkQBQgF7 - Av8B8AH/AukB2gP/AfEB/wJEAUIBewMeASsBLgItAUcBdwFHATwByQG7AVQBPQHxA+4B/wG7AVMBPAHx - AXcBRgE8AckBLgItAUeEAAMdASoCRAFCAXcC/wHwAf8B6wHdAbEB/wH3AcEBNwH/Ae0B3wGzA/8B8gH/ - AkQBQgF3Ax0BKhwAAx0BKgJEAUIBdwL/AfAB/wLpAdoB/wLqAdwB/wLrAd4D/wHyAf8CRAFCAXcBZAFJ - AUIBrwG2AVkBQQHxAc0BVAEyAf8BvQF5AWIB/wHFAVABLgH/AbEBUQE1AfEBXAFIAUQBn4QAAkMBQQF2 - Av8B8AH/AukB2gH/AecBqwEhAf8B5wGrASEB/wHnAasBIQH/AeoB2wGwA/8B9AH/AkMBQQF2Ax0BKhgA - AkMBQQF2Av8B8AH/AukB2gH/AuoB3AH/AusB3gH/AuwB3wH/Au0B4QP/AfQB/wGAAUQBMQHaAc4BcAFN - AfwBugFMASoB/wPSAf8BvgGLAXgB/wG7AVIBMgH8AW8BSQE/AbqEAAMdASkCQwFBAXQC/wHxAf8B5wHX - AasB/wHXAZYBDAH/AdcBlgEMAf8B1wGWAQwB/wHoAdgBrgP/AfUB/wJDAUEBdAMdASkUAAMdASkCQwFB - AXQC/wHxAf8C6wHeAf8C7AHfAf8C7QHhAf8C7gHjAf8C7wHlAf8BzQF5AV4B/wHOAXcBWAH3AbwBVAEy - Af8BtAFMASoB/wPmAf8BtwFlAUsB8AFdAUkBRAGdiAADHQEpAkIBQQFyAv8B8gH/AeUB1AGpAf8BzQGJ - AQAB/wHNAYkBAAH/Ac0BiQEAAf8B6AHXAa8D/wH3Af8CQgFBAXIDHAEoFAADHQEpAkIBQQFyAv8B8gH/ - Au0B4QH/Au4B4wH/Au8B5QH/AvAB5wH/AeABuwGqAf8BzgFpAUgB/wHjAcsBwQH5BP8B3gHHAb0B9QF+ - AU8BQgHEAi0BLAFFjAADHAEoAkEBQAFxAv8B9AH/AecB1gGsAf8B0QGOAQQB/wHRAY4BBAH/AdEBjgEE - Af8B7AHbAbMD/wH4Af8CQQFAAXEDHAEoFAADHAEoAkEBQAFxAv8B9AH/Au8B5QH/AvAB5wH/AvEB6QH/ - AvMB6gH/AeQBvgGsAf8B1AGBAWIB/wGGAUoBNAHXAWYBTQFEAaoCLQEsAUWUAAMcAScCQQFAAW8C/wH1 - Af8B7AHcAbMB/wHfAaEBFwH/Ad8BoQEXAf8B3wGhARcB/wHxAeIBuwP/AfoB/wJBAUABbwMcAScUAAMc - AScCQQFAAW8C/wH1Af8C8QHpAf8C8wHqAf8C9AHsAf8C9QHuAf8C9gHwA/8B+gH/AkEBQAFvAxwBJ5gA - AxwBJwJAAT8BbQL/AfcB/wHyAeMBuwH/AfABuAEuAf8B8AG4AS4B/wHwAbgBLgH/AvgB9AP/AfsB/wJA - AT8BbQMcAScUAAMcAScCQAE/AW0C/wH3Af8C9AHsAf8C9QHuAf8C9gHwAf8C9wHyAf8C+AH0A/8B+wH/ - AkABPwFtAxwBJ5gAAxsBJgJAAT8BbAL/AfgB/wH3AeoBwwH/Af0ByQE/Af8B+QHsAccB/wL7AfcB/wL8 - AfkD/wH8Af8CQAE/AWwDGwEmFAADGwEmAkABPwFsAv8B+AH/AvYB8AH/AvcB8gH/AvgB9AH/AvsB9wH/ - AvwB+QP/AfwB/wJAAT8BbAMbASaYAAMbASYCPwE+AWsC/wH6Af8C+AH0Af8C+wH3Af8C3wHVAf8CyQG5 - Af8C4AHWA/8B/gH/Aj8BPgFrGAADGwEmAj8BPgFrAv8B+gH/AvgB9AH/AvsB9wH/At8B1QH/AskBuQH/ - AuAB1gP/Af4B/wI/AT4Ba5wAAxoBJQI/AT0BaQL/AfsB/wL8AfkB/wK8AawB/wQAArwBrAP/Af4B/wI/ - AT0BaRwAAxoBJQI/AT0BaQL/AfsB/wL8AfkB/wK8AawB/wQAArwBrAP/Af4B/wI/AT0BaaAAAxoBJQI+ - AT0BaAL/AfwB/wLLAcEB/wKgAZAB/wLLAcED/wH+Af8CPgE9AWggAAMaASUCPgE9AWgC/wH8Af8CywHB - Af8CoAGQAf8CywHBA/8B/gH/Aj4BPQFopAADGgElAj4BPQFnAv8B/gP/Af4D/wH+Bf8CPgE9AWckAAMa - ASUCPgE9AWcC/wH+A/8B/gP/Af4F/wI+AT0BZ6gAAxoBJAI+AT0BZgI+AT0BZgI+AT0BZgI+AT0BZgMx - AU0oAAMaASQCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYDMQFNlAADIQEwAUABRgFIAXwBQwFOAVIBkgMF - AQccAAMHAQkDEAEWAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa - AxABFgMHAQkDBwEJAxABFgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa - AxMBGgMQARYDBwEJAwcBCQMQARYDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEaAxMBGgMTARoDEwEa - AxMBGgMTARoDEAEWAwcBCQwAAjIBMwFQAUMBUQFXAZkBRQFkAXQBwAFYAYsBogHgATwBWAFqAcEDEwEa - AwUBBxgAAjwBOwFpAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGH - AkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAjwBOwFpAjkBNAFpAkABNwGHAkABNwGH - AkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGHAkABNwGH - AkABNwGHAkABNwGHAjkBNAFpAjwBOwFpAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGH - AkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAkYBRAGHAjwBOwFpAw0BEQMa - ASQBRAFNAVEBmAE8AYkBrAHyAWcBrwHTAfoBggHLAewB/wGFAc4B7gH/ARUBWwGCAe8BOgFXAWYBxAE6 - AVcBZgHEAT4BWgFqAb4BPgFaAWoBvgE+AVoBagG+AUQBTQFRAZgDGgEkAw0BEQJGAUMBgQL5AekB/wLz - AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz - AeIB/wLzAeIB/wL5AekB/wJGAUMBgQJDAToBgQL5AekB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz - AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wL5AekB/wJDAToBgQJG - AUMBgQL5AekB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLzAeIB/wLz - AeIB/wLzAeIB/wLzAeIB/wLzAeIB/wL5AekB/wJGAUMBgQMHAQkDDQESAUIBWwFmAbIBiAHQAe8B/wF9 - AcoB6QH/AX0BygHpAf8BhwHQAe8B/wEkAXsBqQH/AX0BvAHbAf8BfQG8AdsB/wGNAdEB8wH/AY0B0QHz - Af8BkAHUAfUB/wFCAVsBZgGyATACMQFNAwcBCQJEAUMBegL0AeQC/wHMAUIB/wH+AcsBQQH/AewB0gGG - Af8C2gHJAf8C2AHHAf8C1gHFAf8C1AHDAf8C0wHCAf8C0QHAAf8CzwG+Af8CzgG9Af8CzQG8Af8C9AHk - Af8CRAFDAXoCRgE+AXoC9AHkAv8BzAFDAf8B/gHLAUIB/wHsAdIBhgH/AtoByQH/AtgBxwH/AtYBxQH/ - AtQBwwH/AtMBwgH/AtEBwAH/As8BvgH/As4BvQH/As0BvAH/AvQB5AH/AkYBPgF6AkQBQwF6AvQB5AL/ - AcwBQgH/Af4BywFBAf8B7AHSAYYB/wLaAckB/wLYAccB/wHnAWEBPwH/AecBYQE/Af8B5wFhAT8B/wHn - AWEBPwH/As8BvgH/As4BvQH/As0BvAH/AvQB5AH/AkQBQwF6CAABQwFXAWABpAGKAdMB8AH/AYIBzQHr - Af8BggHNAesB/wGKAdMB8AH/ASQBfAGrAf8BegG5AdgB/wF6AbkB2AH/AYoBzgHwAf8BigHOAfAB/wGP - AdMB9AH/AfQBtgEsAf8BQwFXAWABpAQAAkQBQgF3AvUB5gL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C9QHu - Af8C9QHuAf8C1gHFAf8C9QHuAf8C9QHuAf8C0QHAAf8C9QHuAf8C9QHuAf8CzQG8Af8C9QHmAf8CRAFC - AXcCRwE/AXcC9QHmAv8BzAFDAv8B7gGIAf8B7AHSAYYB/wL1Ae4B/wL1Ae4B/wLWAcUB/wL1Ae4B/wL1 - Ae4B/wLRAcAB/wL1Ae4B/wL1Ae4B/wLNAbwB/wL1AeYB/wJHAT8BdwJEAUIBdwL1AeYC/wHMAUIC/wHu - AYgB/wHsAdIBhgH/AvUB7gH/AvUB7gH/AdkBWAE2Af8B8gHJAbgB/wHyAckBuAH/AdkBWAE2Af8C9QHu - Af8C9QHuAf8CzQG8Af8C9QHmAf8CRAFCAXcIAAFDAVUBXgGeAY4B1gHyAf8BhwHQAe0B/wGHAdAB7QH/ - AY4B1gHyAf8BJgGCAa8B/wF7AboB2AH/AXsBugHYAf8BiwHPAfEB/wGLAc8B8QH/AZEB1QH1Af8B/gHJ - AT8B/wFDAVUBXgGeBAACQwFBAXUC9gHpAv8BzAFCAf8B/gHLAUEB/wHsAdIBhgH/AtoByQH/AtgBxwH/ - AtwBzAH/AtQBwwH/AtMBwgH/AtgByAH/As8BvgH/As4BvQH/As0BvAH/AvYB6QH/AkMBQQF1AkcBPwF1 - AvYB6QL/AcwBQwH/Af4BywFCAf8B7AHSAYYB/wLaAckB/wLYAccB/wLcAcwB/wLUAcMB/wLTAcIB/wLY - AcgB/wLPAb4B/wLOAb0B/wLNAbwB/wL2AekB/wJHAT8BdQJDAUEBdQL2AekC/wHMAUIB/wH+AcsBQQH/ - AewB0gGGAf8C2gHJAf8C2AHHAf8ByAFPAS0B/wHeAbYBngH/Ad4BtQGdAf8ByAFPAS0B/wLPAb4B/wLO - Ab0B/wLNAbwB/wL2AekB/wJDAUEBdQgAAUQBVQFdAZsBkgHaAfQB/wGLAdQB8AH/AYsB1AHwAf8BkgHa - AfQB/wEpAYUBswH/AX0BvAHaAf8BfQG8AdoB/wGNAdEB8wH/AY0B0QHzAf8BkwHXAfYB/wLrAd0B/wFE - AVUBXQGbBAACQgFBAXMC9wHrAv8BzAFCAv8B7gGIAf8B7AHSAYYB/wL3AfEB/wL3AfEB/wLWAcUB/wL3 - AfEB/wL3AfEB/wLRAcAB/wL3AfEB/wL3AfEB/wLNAbwB/wL3AesB/wJCAUEBcwJHAT8BcwL3AesC/wHM - AUMC/wHuAYgB/wHsAdIBhgH/AvcB8QH/AvcB8QH/AtYBxQH/AvcB8QH/AvcB8QH/AtEBwAH/AvcB8QH/ - AvcB8QH/As0BvAH/AvcB6wH/AkcBPwFzAkIBQQFzAvcB6wL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C9wHx - Af8C9wHxAf8BuAFHASUB/wHzAcsBuQH/AfMBywG5Af8BuAFHASUB/wL3AfEB/wL3AfEB/wLNAbwB/wL3 - AesB/wJCAUEBcwgAAUQBUwFbApcB3gH2Af8BkAHYAfIB/wGQAdgB8gH/AZcB3gH2Af8BKwGJAbcB/wGA - Ab0B3AH/AYABvQHcAf8BjwHTAfUB/wGPAdMB9QH/AZUB2QH4Af8C9QHuAf8BRAFTAVsBlwQAAkIBQQFy - AvgB7gL/AcwBQgH/Af4BywFBAf8B7AHSAYYB/wLaAckB/wLYAccB/wLdAc4B/wLUAcMB/wLTAcIB/wLZ - AcoB/wLPAb4B/wLOAb0B/wLNAbwB/wL4Ae4B/wJCAUEBcgJIAUABcgL4Ae4B/wHsAYYBYwH/AeIBewFZ - Af8B1AFuAUwB/wHEAWABPgH/AbYBUgEwAf8BrQFHASUB/wGrAUMBIQH/AbEBRAEiAf8BvQFKASgB/wHM - AVIBMAH/AdsBWgE4Af8B6AFiAUAB/wL4Ae4B/wJIAUABcgJCAUEBcgL4Ae4C/wHMAUIB/wH+AcsBQQH/ - AewB0gGGAf8C2gHJAf8C2AHHAf8BrQFCASAB/wHeAbYBngH/Ad4BtQGdAf8BrQFCASAB/wLPAb4B/wLO - Ab0B/wLNAbwB/wL4Ae4B/wJCAUEBcggAAUQBUwFaAZQBmwHhAfcB/wGUAdsB9AH/AZQB2wH0Af8BmwHh - AfcB/wEuAY0BvAH/AYEBvgHdAf8BgQG+Ad0B/wGQAdQB9gH/AZAB1AH2Af8BlwHbAfkB/wL+Af0B/wFE - AVMBWgGUBAACQQFAAXAC+QHxAv8BzAFCAv8B7gGIAf8B7AHSAYYB/wL5AfUB/wL5AfUB/wLWAcUB/wL5 - AfUB/wL5AfUB/wLRAcAB/wL5AfUB/wL5AfUB/wLNAbwB/wL5AfEB/wJBAUABcAJHAUABcAL5AfEB/wHs - AYYBYwH/AfgBxQF5Af8B7QG1AXgB/wH1AcwBvAH/AfUBzAG8Af8B4AG3AZ8B/wH1AcwBvAH/AfUBzAG8 - Af8B3QG0AZwB/wH1AcwBvAH/AfUBzAG8Af8B6AFiAUAB/wL5AfEB/wJHAUABcAJBAUABcAL5AfEC/wHM - AUIC/wHuAYgB/wHsAdIBhgH/AvkB9QH/AvkB9QH/AasBRAEiAf8B9QHMAbwB/wH1AcwBvAH/AasBRAEi - Af8C+QH1Af8C+QH1Af8CzQG8Af8C+QHxAf8CQQFAAXAIAAFEAVEBVwGQAZ4B5QH5Af8BmAHfAfYB/wGY - Ad8B9gH/AZ4B5QH5Af8BMAGQAcAB/wGDAcAB3wH/AYMBwAHfAf8BkgHWAfgB/wGSAdYB+AH/AZkB3QH6 - Af8BRAFRAVcBkAMjATMEAAJBAUABbgL7AfQC/wHMAUIB/wH+AcsBQQH/AewB0gGGAf8C2gHJAf8C2AHH - Af8C3gHQAf8C1AHDAf8C0wHCAf8C2gHMAf8CzwG+Af8CzgG9Af8CzQG8Af8C+wH0Af8CQQFAAW4CRwFA - AW4C+wH0Af8B7AGGAWMB/wHiAXsBWQH/AdQBbgFMAf8BxAFgAT4B/wG2AVIBMAH/Aa0BRwElAf8BqwFD - ASEB/wGxAUQBIgH/Ab0BSgEoAf8BzAFSATAB/wHbAVoBOAH/AegBYgFAAf8C+wH0Af8CRwFAAW4CQQFA - AW4C+wH0Av8BzAFCAf8B/gHLAUEB/wHsAdIBhgH/AtoByQH/AtgBxwH/AbIBTAEqAf8B3gG2AZ4B/wHe - AbUBnQH/AbIBTAEqAf8CzwG+Af8CzgG9Af8CzQG8Af8C+wH0Af8CQQFAAW4IAAFDAU8BVQGNAaMB6AH7 - Af8BnQHjAfkB/wGdAeMB+QH/AaMB6AH7Af8BMwGUAcUB/wGFAcIB4QH/AYUBwgHhAf8BlAHYAfoB/wGU - AdgB+gH/AZsB3wH8Af8BQwFPAVUBjQgAAkABPwFtAvwB9wL/AcwBQgL/Ae4BiAH/AewB0gGGAf8C/AH6 - Af8C/AH6Af8C1gHFAf8C/AH6Af8C/AH6Af8C0QHAAf8C/AH6Af8C/AH6Af8CzQG8Af8C/AH3Af8CQAE/ - AW0CRwFAAW0C/AH3Av8BzAFDAv8B7gGIAf8B7AHSAYYB/wL8AfoB/wL8AfoB/wLWAcUB/wL8AfoB/wL8 - AfoB/wLRAcAB/wL8AfoB/wL8AfoB/wLNAbwB/wL8AfcB/wJHAUABbQJAAT8BbQL8AfcC/wHMAUIC/wHu - AYgB/wHsAdIBhgH/AvwB+gH/AvwB+gH/AcABWgE4Af8B9gHOAb8B/wH2Ac4BvwH/AcABWgE4Af8C/AH6 - Af8C/AH6Af8CzQG8Af8C/AH3Af8CQAE/AW0IAAFDAU8BVAGKAaYB6wH8Af8BoQHmAfsB/wGhAeYB+wH/ - AaYB6wH8Af8BOgGdAc8B/wGHAcQB4gH/AYcBxAHiAf8BlgHaAfwB/wGWAdoB/AH/AZ4B4gH9Af8BQwFP - AVQBiggAAj8BPgFrAv0B+QL/AcwBQgH/Af4BywFBAf8B9QHOAWIB/wHrAdIBhQH/AekB0AGDAf8B5wHO - AYEB/wHlAcwBgAH/AeQBywF8Af8B4gHJAXoB/wHgAccBeAH/Ad8BxgF3Af8B3gHFAXYB/wL9AfkB/wI/ - AT4BawJHAUABawL9AfkC/wHMAUMB/wH+AcsBQgH/AfUBzgFjAf8B6wHSAYUB/wHpAdABgwH/AecBzgGB - Af8B5QHMAYAB/wHkAcsBfQH/AeIByQF7Af8B4AHHAXkB/wHfAcYBeAH/Ad4BxQF3Af8C/QH5Af8CRwFA - AWsCPwE+AWsC/QH5Av8BzAFCAf8B/gHLAUEB/wH1Ac4BYgH/AesB0gGFAf8B6QHQAYMB/wHRAWoBSAH/ - AekBsQF0Af8B6AGwAXMB/wHRAWoBSAH/AeABxwF4Af8B3wHGAXcB/wHeAcUBdgH/Av0B+QH/Aj8BPgFr - CAABQgFNAVIBhwGpAe4B/QH/AaQB6QH8Af8BpAHpAfwB/wGqAe8B/QH/AUABoQHRAf8BkAHRAfEB/wGW - AdoB+wH/AZcB2wH9Af8BlwHbAf0B/wGfAeMB/gH/AUIBTQFSAYcIAAI/AT4BagL+AfwC/wHMAUIC/wHu - AYgB/wH9AcoBQAH/AfwB6wGFAf8B+wHqAYQB/wH4AcUBOwH/AfYB5QF9Af8B9AHjAXsB/wHzAcABNgH/ - AfEB4AF4Af8B7wHeAXYB/wHvAbwBMgH/Av4B/AH/Aj8BPgFqAkcBQAFqAv4B/AL/AcwBQwL/Ae4BiAH/ - Af0BygFBAf8B/AHrAYUB/wH7AeoBhAH/AfgBxQE8Af8B9gHlAX4B/wH0AeMBfAH/AfMBwAE3Af8B8QHg - AXkB/wHvAd4BdwH/Ae8BvAEzAf8C/gH8Af8CRwFAAWoCPwE+AWoC/gH8Av8BzAFCAv8B7gGIAf8B/QHK - AUAB/wH8AesBhQH/AfsB6gGEAf8B4QF5AVcB/wHzAcABcwH/AfIBvwFyAf8B4QF5AVcB/wHxAeABeAH/ - Ae8B3gF2Af8B7wG8ATIB/wL+AfwB/wI/AT4BaggAAUMBTAFSAYUBrQHxAv8BqwHvAf4B/wGVAeIB+AH/ - AWwByQHtAf8BRgGpAdkB/wGYAdwB/gH/AZgB3AH+Af8BmAHcAf4B/wGYAdwB/gH/AaEB5QL/AUMBTAFS - AYUIAAI+AT0BaAL/Af4C/wHMAUIB/wH+AcsBQQH/Af0BygFAAf8B/AHJAT8B/wH6AccBPQH/AfgBxQE7 - Af8B9gHDAToB/wH1AcIBOAH/AfMBwAE2Af8B8QG+ATQB/wHwAb0BMwH/Ae8BvAEyA/8B/gH/Aj4BPQFo - AkcBQAFoAv8B/gL/AcwBQwH/Af4BywFCAf8B/QHKAUEB/wH8AckBQAH/AfoBxwE+Af8B+AHFATwB/wH2 - AcMBOwH/AfUBwgE5Af8B8wHAATcB/wHxAb4BNQH/AfABvQE0Af8B7wG8ATMD/wH+Af8CRwFAAWgCPgE9 - AWgC/wH+Av8BzAFCAf8B/gHLAUEB/wH9AcoBQAH/AfwByQE/Af8B+gHHAT0B/wHsAYYBYgH/AewBhgFi - Af8B7AGGAWIB/wHsAYYBYgH/AfEBvgE0Af8B8AG9ATMB/wHvAbwBMgP/Af4B/wI+AT0BaAgAAUMBTAFQ - AYMBiAHcAfQB/wFeAcAB6QH/AV0BvwHqAf8BgAHTAfQB/wGcAeMB/QH/AaIB5gL/AaIB5gL/AaIB5gL/ - AaIB5gL/AaYB6gL/AUMBTAFQAYMIAAI+AT0BZzj/Aj4BPQFnAkcBQAFnOP8CRwFAAWcCPgE9AWc4/wI+ - AT0BZwgAATkBOwE9AWEBQgFLAU8BgQFCAUsBTwGBAUIBSwFPAYEBQgFLAU8BgQFCAUsBTwGBAUIBSwFP - AYEBQgFLAU8BgQFCAUsBTwGBAUIBSwFPAYEBQgFLAU8BgQE5ATsBPQFhCAADMQFNAj4BPQFmAj4BPQFm - Aj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFmAj4BPQFm - Aj4BPQFmAj4BPQFmAzEBTQI3ATQBTQJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJH - AUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgJHAUABZgI3ATQBTQMxAU0CPgE9 - AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9AWYCPgE9 - AWYCPgE9AWYCPgE9AWYCPgE9AWYDMQFNAUIBTQE+BwABPgMAASgDAAFAAwABIAMAAQEBAAEBBgABARYA - A/8RAAGAAf8BgAEBBQABfwEAAQEFAAE/AQABAQUAAR8BAAEBBAABgAEPAYABAQQAAcABBwHAAQMEAAHg - AQMB4AEDBAAB8AEBAfABAQQAAfgBAAH4BQAB/AEAAfwFAAH+AQgB/gEIBAAB/wEAAf8FAAH/AYAB/wGA - BAAB/wHAAf8BwAQAAfgBfwYAAeABPxYAAcABAQYAAcABAQYAAcABAQYAAcABAQYAAcABAQYAAcABAQYA - AcABAwYAAcABAwYAAcABAwYAAcABAwYAAcABAwYAAcABAwYACw== - - - - 211, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAK6SURBVDhPjZNbSNNRHMfPU9DtwR71oZf5IgkF0YMEEYb2 - EGgG5YNgGQmGSUoYimbel5KKmlM0u3jJSpv3ad7WnGkzb2yO4bByF3WuuTnnnLv47Zw/9YclQQc+/L// - P+d8/r/f+Z8/Ib/HjJDcmhaS3P+Bzf2zjr8qiki+QyuE6dNNbIzFw6F8DJ++AVh97c9GK9jcA4LJAlKI - rQ7sW9/DpauGZSoFg6JwfJSU+TE0XIXOgqCaAwJ5ASn2bb6F19TM4bO+w4z4HgwWC9YcDugpK3Y7umQy - FOZEDMRkZQX7SWS5pMRrboVn9RUHy1/aEqDSajGn0WDZbIZ6bQ0t/f1gIzojI8lPMvaIPPWsN2FP/5yD - ZdmLWLwUi/FhZASSqSlOUtXczBMcGZnFVzGUTSr2jI1wfq/lYHms4Tqkc3MYnZ2F0mDAqs3GV8LaiUhN - TeYFA5mkenelHg5tNQfLw3UxaOrpQZdUiu7xca5/Mc0do6PQb28jPDk5hRf0PiQi5zcR7JoKDpYHaqIg - VyohW1jg+lcZjVwlCzod1p1OXEhMvM8LOtNJvWOpEjZVKQfL/ZVX0NrXh165HP2Tk5hQqzGuUmFQocCm - y4XzCQlpvKA9jTTa1WWwzBdzsNxdfhmfFxcxQRct0Q3UmEzY2t2FdWcHdrcb5+LiHvCC1hTSbFOWwDyT - x8GyuDQCbRIJ3tBPp6CfU0pbcdA3M4mDCs7ExqYzwWHKibo7pNs6T4+yIofDSqtof3IJBtqzTq+Hx+uF - y+OBky5kkh2aT0VFZTNBAEWQFEFqhyvO2pclSe6f03nYnC1EW9FFGOnGGSi+/X14KW6fD3tUtkdzYFiY - 0O801iWSaNFtUteWGST92nL1R/q1Q7ojAkHV0ZCQkuOhocV/c0wguHvgn2APyuPJ6dI4kpV/gzyjtycp - gf8g4Begs1B6Kbj3cQAAAABJRU5ErkJggg== - - - - 337, 17 - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj deleted file mode 100644 index 9a7fd00..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/LwipMibViewer.csproj +++ /dev/null @@ -1,94 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {86CC0B65-7985-4017-A252-0A7A18DCAEF3} - WinExe - Properties - LwipMibViewer - LwipMibViewer - v4.0 - 512 - - - - true - bin\Debug\ - DEBUG;TRACE - full - prompt - true - true - 4 - false - false - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - true - true - 4 - false - - - - - - - - - Form - - - FormMain.cs - - - - - FormMain.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {CBE20411-5DB7-487D-825D-7694267BB6F5} - SharpSnmpLib.Mib - - - - - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs deleted file mode 100644 index cd3ef31..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Program.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Windows.Forms; - -namespace LwipMibViewer -{ - static class Program - { - /// - /// Der Haupteinstiegspunkt für die Anwendung. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new FormMain()); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs deleted file mode 100644 index 06e7286..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("LwipMibViewer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("LwipMibViewer")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("7ffbd1c1-1c64-45bb-b243-2400446c649d")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs deleted file mode 100644 index bf15717..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.225 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace LwipMibViewer.Properties { - using System; - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LwipMibViewer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx deleted file mode 100644 index af7dbeb..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs deleted file mode 100644 index 9831b20..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.225 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace LwipMibViewer.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config deleted file mode 100644 index e365603..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipMibViewer/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs deleted file mode 100644 index ee2f453..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/IRestriction.cs +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace LwipSnmpCodeGeneration -{ - public interface IRestriction - { - string GetCheckCodeValid(string varNameToCheck); - string GetCheckCodeInvalid(string varNameToCheck); - } - - public class BitMaskRestriction : IRestriction - { - UInt32 mask; - - public BitMaskRestriction(UInt32 mask) - { - this.mask = mask; - } - - public string GetCheckCodeValid(string varNameToCheck) - { - return String.Format("(({0} & {1}) == {0})", varNameToCheck, this.mask); - } - - public string GetCheckCodeInvalid(string varNameToCheck) - { - return String.Format("(({0} & {1}) != {0})", varNameToCheck, this.mask); - } - } - - public class IsEqualRestriction : IRestriction - { - private Int64 value; - - public IsEqualRestriction(Int64 value) - { - this.value = value; - } - - public long Value - { - get { return value; } - } - - public string GetCheckCodeValid(string varNameToCheck) - { - return String.Format("({0} == {1})", varNameToCheck, this.value); - } - - public string GetCheckCodeInvalid(string varNameToCheck) - { - return String.Format("({0} != {1})", varNameToCheck, this.value); - } - } - - public class IsInRangeRestriction : IRestriction - { - private Int64 rangeStart; - private Int64 rangeEnd; - - public IsInRangeRestriction(Int64 rangeStart, Int64 rangeEnd) - { - this.rangeStart = rangeStart; - this.rangeEnd = rangeEnd; - } - - public long RangeStart - { - get { return this.rangeStart; } - } - - public long RangeEnd - { - get { return this.rangeEnd; } - } - - public string GetCheckCodeValid(string varNameToCheck) - { - return String.Format("(({0} >= {1}) && ({0} <= {2}))", varNameToCheck, this.rangeStart, this.rangeEnd); - } - - public string GetCheckCodeInvalid(string varNameToCheck) - { - return String.Format("(({0} < {1}) || ({0} > {2}))", varNameToCheck, this.rangeStart, this.rangeEnd); - } - } - -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs deleted file mode 100644 index edac59e..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmp.cs +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; - -namespace LwipSnmpCodeGeneration -{ - public static class LwipOpts - { - public static bool GenerateEmptyFolders = false; - /// - /// If a tree node only has scalar nodes as child nodes, it is replaced by - /// a single scalar array node in order to save memory and have only one single get/test/set method for all scalars. - /// - public static bool GenerateScalarArrays = true; - /// - /// If a tree node has multiple scalars as subnodes as well as other treenodes it - /// defines a single get/test/set method for all scalar child node. - /// (without other treenodes as child it would have been converted to scalar array node). - /// - public static bool GenerateSingleAccessMethodsForTreeNodeScalars = GenerateScalarArrays; - } - - public static class LwipDefs - { - public const string Null = "NULL"; - public const string Vt_U8 = "u8_t"; - public const string Vt_U16 = "u16_t"; - public const string Vt_U32 = "u32_t"; - public const string Vt_S8 = "s8_t"; - public const string Vt_S16 = "s16_t"; - public const string Vt_S32 = "s32_t"; - public const string Vt_Snmp_err = "snmp_err_t"; - - public const string Incl_SnmpOpts = "lwip/apps/snmp_opts.h"; - public const string Opt_SnmpEnabled = "LWIP_SNMP"; - - public const string Vt_StMib = "struct snmp_mib"; - public const string Vt_StObjectId = "struct snmp_obj_id"; - public const string Vt_StNode = "struct snmp_node"; - public const string Vt_StNodeInstance = "struct snmp_node_instance"; - public const string Vt_StTreeNode = "struct snmp_tree_node"; - public const string Vt_StScalarNode = "struct snmp_scalar_node"; - public const string Vt_StScalarArrayNode = "struct snmp_scalar_array_node"; - public const string Vt_StScalarArrayNodeDef = "struct snmp_scalar_array_node_def"; - public const string Vt_StTableNode = "struct snmp_table_node"; - public const string Vt_StTableColumnDef = "struct snmp_table_col_def"; - public const string Vt_StNextOidState = "struct snmp_next_oid_state"; - - public const string Def_NodeAccessReadOnly = "SNMP_NODE_INSTANCE_READ_ONLY"; - public const string Def_NodeAccessReadWrite = "SNMP_NODE_INSTANCE_READ_WRITE"; - public const string Def_NodeAccessWriteOnly = "SNMP_NODE_INSTANCE_WRITE_ONLY"; - public const string Def_NodeAccessNotAccessible = "SNMP_NODE_INSTANCE_NOT_ACCESSIBLE"; - - public const string Def_ErrorCode_Ok = "SNMP_ERR_NOERROR"; - public const string Def_ErrorCode_WrongValue = "SNMP_ERR_WRONGVALUE"; - public const string Def_ErrorCode_NoSuchInstance = "SNMP_ERR_NOSUCHINSTANCE"; - - public const string FnctSuffix_GetValue = "_get_value"; - public const string FnctSuffix_SetTest = "_set_test"; - public const string FnctSuffix_SetValue = "_set_value"; - public const string FnctSuffix_GetInstance = "_get_instance"; - public const string FnctSuffix_GetNextInstance = "_get_next_instance"; - - public const string FnctName_SetTest_Ok = "snmp_set_test_ok"; - - public static string GetLwipDefForSnmpAccessMode(SnmpAccessMode am) - { - switch (am) - { - case SnmpAccessMode.ReadOnly: return Def_NodeAccessReadOnly; - case SnmpAccessMode.ReadWrite: return Def_NodeAccessReadWrite; - case SnmpAccessMode.NotAccessible: return Def_NodeAccessNotAccessible; - case SnmpAccessMode.WriteOnly: return Def_NodeAccessWriteOnly; - default: throw new NotSupportedException("Unknown SnmpAccessMode!"); - } - } - - public static string GetAsn1DefForSnmpDataType(SnmpDataType dt) - { - switch (dt) - { - // primitive - case SnmpDataType.Null: - return "SNMP_ASN1_TYPE_NULL"; - case SnmpDataType.Bits: - case SnmpDataType.OctetString: - return "SNMP_ASN1_TYPE_OCTET_STRING"; - case SnmpDataType.ObjectIdentifier: - return "SNMP_ASN1_TYPE_OBJECT_ID"; - case SnmpDataType.Integer: - return "SNMP_ASN1_TYPE_INTEGER"; - - // application - case SnmpDataType.IpAddress: - return "SNMP_ASN1_TYPE_IPADDR"; - case SnmpDataType.Counter: - return "SNMP_ASN1_TYPE_COUNTER"; - case SnmpDataType.Gauge: - return "SNMP_ASN1_TYPE_GAUGE"; - case SnmpDataType.TimeTicks: - return "SNMP_ASN1_TYPE_TIMETICKS"; - case SnmpDataType.Opaque: - return "SNMP_ASN1_TYPE_OPAQUE"; - case SnmpDataType.Counter64: - return "SNMP_ASN1_TYPE_COUNTER64"; - default: - throw new NotSupportedException("Unknown SnmpDataType!"); - } - } - - public static string GetLengthForSnmpDataType(SnmpDataType dt) - { - switch (dt) - { - case SnmpDataType.Null: - return "0"; - - case SnmpDataType.Integer: - case SnmpDataType.Counter: - case SnmpDataType.IpAddress: - case SnmpDataType.Gauge: - case SnmpDataType.TimeTicks: - return "4"; - - case SnmpDataType.Counter64: - return "8"; - - case SnmpDataType.OctetString: - case SnmpDataType.ObjectIdentifier: - case SnmpDataType.Bits: - case SnmpDataType.Opaque: - return null; - - default: - throw new NotSupportedException("Unknown SnmpDataType!"); - } - } - } - - public enum SnmpDataType - { - Null, - - Integer, // INTEGER, Integer32 - - Counter, // Counter, Counter32 - Gauge, // Gauge, Gauge32, Unsigned32 - TimeTicks, - - Counter64, - - OctetString, - Opaque, - Bits, - - ObjectIdentifier, - - IpAddress, - } - - public enum SnmpAccessMode - { - ReadOnly, - ReadWrite, - WriteOnly, - NotAccessible - } - -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj deleted file mode 100644 index f4541c0..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/LwipSnmpCodeGeneration.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {AABCAB90-1540-45D4-A159-14831A54E9A3} - Library - Properties - LwipSnmpCodeGeneration - LwipSnmpCodeGeneration - v4.0 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - {7DA7C0AB-0982-4BF5-9324-F59A7A08D65B} - CCodeGeneration - - - - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs deleted file mode 100644 index c48ec29..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibCFile.cs +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System.Collections.Generic; -using CCodeGeneration; -using System; -using System.IO; - -namespace LwipSnmpCodeGeneration -{ - public class MibCFile - { - #region Fields - - private const string PreservedSectionMarker = "LWIP MIB generator - preserved section begin"; - private const string PreservedSectionHeader = - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" + - PreservedSectionMarker + "\n" + - "Code below is preserved on regeneration. Remove these comment lines to regenerate code.\n" + - "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"; - - private readonly List includes = new List(); - private readonly List defines = new List(); - private readonly List declarations = new List(); - private readonly List implementation = new List(); - private readonly List preservedCode = new List(); - - #endregion - - public MibCFile() - { - } - - #region Accessors - - public List Includes - { - get { return this.includes; } - } - - public List Defines - { - get { return this.defines; } - } - - public List Declarations - { - get { return this.declarations; } - } - - public List Implementation - { - get { return this.implementation; } - } - - public List PreservedCode - { - get { return this.preservedCode; } - } - - #endregion - - #region Methods - - public void Save(CGenerator cGenerator) - { - CFile cFile = new CFile(); - - cFile.AddElement(new Comment("Generated by LwipMibCompiler")); - cFile.AddElement(EmptyLine.SingleLine); - - cFile.AddElement(new PP_Include(LwipDefs.Incl_SnmpOpts)); - CodeContainerBase e = cFile.AddElement(new PP_If(LwipDefs.Opt_SnmpEnabled)) as CodeContainerBase; - e.AddElement(EmptyLine.SingleLine); - - // include header file - string file = cGenerator.FileName; - if (!String.IsNullOrWhiteSpace(file)) - { - string ext = System.IO.Path.GetExtension(file); - - string headerFile = !String.IsNullOrEmpty(ext) ? file.Substring(0, file.Length - ext.Length) : file; - headerFile += ".h"; - - e.AddElement(new PP_Include(headerFile)); - } - - // include common snmp files - e.AddElement(new PP_Include("lwip/apps/snmp.h")); - e.AddElement(new PP_Include("lwip/apps/snmp_core.h")); - e.AddElement(new PP_Include("lwip/apps/snmp_scalar.h")); - e.AddElement(new PP_Include("lwip/apps/snmp_table.h")); - - if (this.includes.Count > 0) - { - e.AddElement(EmptyLine.SingleLine); - e.AddElements(this.includes); - } - - if (this.defines.Count > 0) - { - e.AddElement(EmptyLine.SingleLine); - e.AddElements(this.defines); - } - - if (this.declarations.Count > 0) - { - e.AddElement(EmptyLine.TwoLines); - e.AddElements(this.declarations); - } - - if (this.implementation.Count > 0) - { - e.AddElement(EmptyLine.TwoLines); - e.AddElements(this.implementation); - } - - if (this.preservedCode.Count > 0) - { - e.AddElement(EmptyLine.TwoLines); - e.AddElement(new Comment(PreservedSectionHeader)); - e.AddElement(EmptyLine.SingleLine); - e.AddElements(this.preservedCode); - } - - cFile.Save(cGenerator); - } - - public static string GetPreservedCode(string file) - { - if (File.Exists(file)) - { - using (StreamReader fileStream = new StreamReader(file)) - { - while (!fileStream.EndOfStream) - { - string line = fileStream.ReadLine(); - if (line == PreservedSectionMarker) - { - break; - } - } - - if (!fileStream.EndOfStream) - { - // skip the rest of the comment + spacer line - fileStream.ReadLine(); // "Code below is preserved... - fileStream.ReadLine(); // "+++++++++++++++++++++++... - fileStream.ReadLine(); // */ - fileStream.ReadLine(); // - - string preservedCode = fileStream.ReadToEnd(); - - int lastEndif = preservedCode.LastIndexOf("#endif", StringComparison.Ordinal); - preservedCode = preservedCode.Remove(lastEndif); - - return preservedCode; - } - } - } - - return null; - } - - #endregion - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs deleted file mode 100644 index 95f2a06..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/MibHeaderFile.cs +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System.Collections.Generic; -using System.Text.RegularExpressions; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class MibHeaderFile - { - - #region Fields - - private readonly List defines = new List(); - private readonly List includes = new List(); - private readonly List functionDeclarations = new List(); - private readonly List variableDeclarations = new List(); - - #endregion - - public MibHeaderFile() - { - } - - #region Accessors - - public List Defines - { - get { return this.defines; } - } - - public List Includes - { - get { return this.includes; } - } - - public List FunctionDeclarations - { - get { return this.functionDeclarations; } - } - - public List VariableDeclarations - { - get { return this.variableDeclarations; } - } - - #endregion - - #region Methods - - public void Save(CGenerator cGenerator) - { - CFile cFile = new CFile(); - - cFile.AddElement(new Comment("Generated by LwipMibCompiler")); - cFile.AddElement(EmptyLine.SingleLine); - - string headerDefine = cGenerator.FileName; - headerDefine = new Regex("[^a-zA-Z0-9]").Replace(headerDefine, "_"); - headerDefine = headerDefine.ToUpperInvariant(); - - CodeContainerBase e = cFile.AddElement(new PP_Ifdef(headerDefine, inverted: true)) as CodeContainerBase; - e.AddElement(new PP_Macro(headerDefine, headerDefine)); - e.AddElement(EmptyLine.SingleLine); - - e.AddElement(new PP_Include(LwipDefs.Incl_SnmpOpts)); - e = e.AddElement(new PP_If(LwipDefs.Opt_SnmpEnabled)) as CodeContainerBase; - e.AddElement(EmptyLine.SingleLine); - - CodeContainerBase cplusplusopen = e.AddElement(new PP_Ifdef("__cplusplus")) as CodeContainerBase; - cplusplusopen.AddElement(new Code("extern \"C\" {")); - e.AddElement(EmptyLine.SingleLine); - - if (this.includes.Count > 0) - { - e.AddElements(this.includes); - e.AddElement(EmptyLine.SingleLine); - } - - if (this.defines.Count > 0) - { - e.AddElements(this.defines); - e.AddElement(EmptyLine.SingleLine); - } - - e.AddElements(this.functionDeclarations, EmptyLine.SingleLine); - e.AddElements(this.variableDeclarations, EmptyLine.SingleLine); - - e.AddElement(EmptyLine.SingleLine); - CodeContainerBase cplusplusclose = e.AddElement(new PP_Ifdef("__cplusplus")) as CodeContainerBase; - cplusplusclose.AddElement(new Code("}")); - - e.AddElement(EmptyLine.SingleLine); - cFile.Save(cGenerator); - } - - #endregion - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs deleted file mode 100644 index e68b43d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("LwipSnmpCodeGeneration")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("LwipSnmpCodeGeneration")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar -// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von -// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("8cfbbb8b-dfbb-4dd5-80c9-e07845dd58c9")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs deleted file mode 100644 index e54aa34..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpMib.cs +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpMib : SnmpTreeNode - { - public uint[] BaseOid { get; set; } - - public SnmpMib() - : base(null) - { - } - - public SnmpMib(uint[] baseOid) - : base(null) - { - this.BaseOid = baseOid; - } - - public override string FullNodeName - { - get { return this.Name + "_root"; } - } - - public override void GenerateCode(MibCFile mibFile) - { - base.GenerateCode(mibFile); - - System.Diagnostics.Debug.Assert((this.BaseOid != null) && (this.BaseOid.Length > 0)); - - // create and add BaseOID declarations - StringBuilder boidInitialization = new StringBuilder("{"); - foreach (uint t in this.BaseOid) - { - boidInitialization.Append(t); - boidInitialization.Append(","); - } - boidInitialization.Length -= 1; - boidInitialization.Append("}"); - - VariableDeclaration boidDecl = new VariableDeclaration( - new VariableType(this.Name + "_base_oid", LwipDefs.Vt_U32, null, ConstType.Value, String.Empty), - boidInitialization.ToString(), true); - - mibFile.Declarations.Add(boidDecl); - mibFile.Declarations.Add(GetExportDeclaration()); - } - - public override void GenerateHeaderCode(MibHeaderFile mibHeaderFile) - { - mibHeaderFile.Includes.Add(new PP_Include("lwip/apps/snmp_core.h")); - - mibHeaderFile.VariableDeclarations.Add(VariablePrototype.FromVariableDeclaration(GetExportDeclaration())); - } - - VariableDeclaration GetExportDeclaration() - { - return new VariableDeclaration( - new VariableType(this.Name, LwipDefs.Vt_StMib, null, ConstType.Value), - String.Format("{{{0}_base_oid, LWIP_ARRAYSIZE({0}_base_oid), &{1}.node}}", this.Name, this.FullNodeName)); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs deleted file mode 100644 index fceb4d5..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpNode.cs +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text.RegularExpressions; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public abstract class SnmpNode - { - public static readonly Regex NameValidationRegex = new Regex(@"^\w+$"); - - private string name; - private readonly SnmpTreeNode parentNode; - - protected SnmpNode(SnmpTreeNode parentNode) - { - this.parentNode = parentNode; - } - - public SnmpTreeNode ParentNode - { - get { return this.parentNode; } - } - - public virtual uint Oid { get; set; } - - public abstract string FullNodeName - { - get; - } - - public virtual string Name - { - get { return this.name; } - set - { - if (value != this.name) - { - // check for valid name - if (!NameValidationRegex.IsMatch(value)) - { - throw new ArgumentOutOfRangeException("Name"); - } - - this.name = value; - } - } - } - - public virtual void Generate(MibCFile generatedFile, MibHeaderFile generatedHeaderFile) - { - int declCount = generatedFile.Declarations.Count; - int implCount = generatedFile.Implementation.Count; - - this.GenerateHeaderCode(generatedHeaderFile); - this.GenerateCode(generatedFile); - - if (generatedFile.Declarations.Count != declCount) - { - generatedFile.Declarations.Add(EmptyLine.SingleLine); - } - if (generatedFile.Implementation.Count != implCount) - { - generatedFile.Implementation.Add(EmptyLine.SingleLine); - } - } - - public abstract void GenerateCode(MibCFile mibFile); - - public virtual void GenerateHeaderCode(MibHeaderFile mibHeaderFile) - { - } - - /// - /// Called after node structure creation is completed and before code is created. - /// Offers the possibility to perform operations depending on properties/subnodes. - /// If the node shall be transformed to another node(-type) than the own instance - /// may be replaced on parent node by the transformed instance. - /// Calling sequence is always from leafs up to root. So a tree node can assume - /// that the analyze method was already called on all child nodes. - /// E.g. a tree node only has scalar sub nodes -> it transforms itself to a scalar array node - /// - /// The transformed node or null if nothing shall be changed in parent structure. - public virtual void Analyze() - { - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs deleted file mode 100644 index 659acd2..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarAggregationNode.cs +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System.Collections.Generic; -using System.Globalization; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public abstract class SnmpScalarAggregationNode: SnmpNode - { - private bool getMethodRequired = false; - private bool testMethodRequired = false; - private bool setMethodRequired = false; - - protected SnmpScalarAggregationNode(SnmpTreeNode parentNode) - : base(parentNode) - { - } - - protected virtual string GetMethodName - { - get { return this.FullNodeName + LwipDefs.FnctSuffix_GetValue; } - } - - protected bool GetMethodRequired - { - get { return this.getMethodRequired; } - } - - protected virtual string TestMethodName - { - get { return this.FullNodeName + LwipDefs.FnctSuffix_SetTest; } - } - - protected bool TestMethodRequired - { - get { return this.testMethodRequired; } - } - - protected virtual string SetMethodName - { - get { return this.FullNodeName + LwipDefs.FnctSuffix_SetValue; } - } - - protected bool SetMethodRequired - { - get { return this.setMethodRequired; } - } - - protected abstract IEnumerable AggregatedScalarNodes - { - get; - } - - public override void Analyze() - { - base.Analyze(); - - this.getMethodRequired = false; - this.testMethodRequired = false; - this.setMethodRequired = false; - - foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes) - { - if ((scalarNode.AccessMode == SnmpAccessMode.ReadOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) - { - this.getMethodRequired = true; - } - if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) - { - this.testMethodRequired = true; - this.setMethodRequired = true; - } - - if (this.getMethodRequired && this.setMethodRequired) - { - break; - } - } - } - - protected void GenerateAggregatedCode(MibCFile mibFile, VariableType instanceType, string switchSelector, bool generateDeclarations = true, bool generateImplementations = true) - { - if (this.getMethodRequired) - { - FunctionDeclaration getMethodDecl = new FunctionDeclaration(this.GetMethodName, isStatic: true); - getMethodDecl.Parameter.Add(instanceType); - getMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - getMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_U16); - - if (generateDeclarations) - { - mibFile.Declarations.Add(getMethodDecl); - } - if (generateImplementations) - { - Function getMethod = Function.FromDeclaration(getMethodDecl); - GenerateGetMethodCode(getMethod, switchSelector); - mibFile.Implementation.Add(getMethod); - } - } - - if (this.testMethodRequired) - { - FunctionDeclaration testMethodDecl = new FunctionDeclaration(this.TestMethodName, isStatic: true); - testMethodDecl.Parameter.Add(instanceType); - testMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16)); - testMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - testMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - - if (generateDeclarations) - { - mibFile.Declarations.Add(testMethodDecl); - } - if (generateImplementations) - { - Function testMethod = Function.FromDeclaration(testMethodDecl); - GenerateTestMethodCode(testMethod, switchSelector); - mibFile.Implementation.Add(testMethod); - } - } - - if (this.setMethodRequired) - { - FunctionDeclaration setMethodDecl = new FunctionDeclaration(this.SetMethodName, isStatic: true); - setMethodDecl.Parameter.Add(instanceType); - setMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16)); - setMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - setMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - - if (generateDeclarations) - { - mibFile.Declarations.Add(setMethodDecl); - } - if (generateImplementations) - { - Function setMethod = Function.FromDeclaration(setMethodDecl); - GenerateSetMethodCode(setMethod, switchSelector); - mibFile.Implementation.Add(setMethod); - } - } - } - - protected virtual void GenerateGetMethodCode(Function getMethod, string switchSelector) - { - VariableDeclaration returnValue = new VariableDeclaration((VariableType)getMethod.ReturnType.Clone()); - returnValue.Type.Name = "value_len"; - getMethod.Declarations.Add(returnValue); - Switch sw = new Switch(switchSelector); - - bool valueVarUsed = false; - - foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes) - { - if ((scalarNode.AccessMode == SnmpAccessMode.ReadOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) - { - SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture)); - sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true)); - - scalarNode.GenerateGetMethodCode(sc, getMethod.Parameter[1].Name, ref valueVarUsed, returnValue.Type.Name); - - sw.Switches.Add(sc); - } - } - - SwitchCase scd = SwitchCase.GenerateDefault(); - scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", getMethod.Name, switchSelector); - scd.AddCodeFormat("{0} = 0;", returnValue.Type.Name); - sw.Switches.Add(scd); - - if (!valueVarUsed) - { - getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[1].Name); - } - - getMethod.AddElement(sw); - - getMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - } - - protected virtual void GenerateTestMethodCode(Function testMethod, string switchSelector) - { - VariableDeclaration returnValue = new VariableDeclaration((VariableType)testMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_WrongValue); - returnValue.Type.Name = "err"; - testMethod.Declarations.Add(returnValue); - Switch sw = new Switch(switchSelector); - - bool valueVarUsed = false; - bool lenVarUsed = false; - - foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes) - { - if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) - { - SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture)); - sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true)); - - scalarNode.GenerateTestMethodCode(sc, testMethod.Parameter[2].Name, ref valueVarUsed, testMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name); - - sw.Switches.Add(sc); - } - } - - SwitchCase scd = SwitchCase.GenerateDefault(); - scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", testMethod.Name, switchSelector); - sw.Switches.Add(scd); - - if (!valueVarUsed) - { - testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[2].Name); - } - if (!lenVarUsed) - { - testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[1].Name); - } - - testMethod.AddElement(sw); - - testMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - } - - protected virtual void GenerateSetMethodCode(Function setMethod, string switchSelector) - { - VariableDeclaration returnValue = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok); - returnValue.Type.Name = "err"; - setMethod.Declarations.Add(returnValue); - Switch sw = new Switch(switchSelector); - - bool valueVarUsed = false; - bool lenVarUsed = false; - - foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes) - { - if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) - { - SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture)); - sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true)); - - scalarNode.GenerateSetMethodCode(sc, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name); - - sw.Switches.Add(sc); - } - } - - SwitchCase scd = SwitchCase.GenerateDefault(); - scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", setMethod.Name, switchSelector); - sw.Switches.Add(scd); - - if (!valueVarUsed) - { - setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[2].Name); - } - if (!lenVarUsed) - { - setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[1].Name); - } - - setMethod.AddElement(sw); - - setMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs deleted file mode 100644 index 3d66492..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarArrayNode.cs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarArrayNode : SnmpScalarAggregationNode - { - private readonly List scalarNodes; - - public SnmpScalarArrayNode(List scalarNodes, SnmpTreeNode parentNode) - : base(parentNode) - { - this.scalarNodes = scalarNodes; - } - - public override string FullNodeName - { - get { return this.Name + "_scalars"; } - } - - protected override IEnumerable AggregatedScalarNodes - { - get { return this.scalarNodes; } - } - - public override void GenerateCode(MibCFile mibFile) - { - VariableType instanceType = new VariableType("node", LwipDefs.Vt_StScalarArrayNodeDef, "*", ConstType.Value); - GenerateAggregatedCode( - mibFile, - instanceType, - instanceType.Name + "->oid"); - - - // create and add node definitions - StringBuilder nodeDefs = new StringBuilder(); - foreach (SnmpScalarNode scalarNode in this.scalarNodes) - { - nodeDefs.AppendFormat(" {{{0}, {1}, {2}}}, /* {3} */ \n", - scalarNode.Oid, - LwipDefs.GetAsn1DefForSnmpDataType(scalarNode.DataType), - LwipDefs.GetLwipDefForSnmpAccessMode(scalarNode.AccessMode), - scalarNode.Name); - } - if (nodeDefs.Length > 0) - nodeDefs.Length--; - - VariableDeclaration nodeDefsDecl = new VariableDeclaration( - new VariableType(this.FullNodeName + "_nodes", LwipDefs.Vt_StScalarArrayNodeDef, null, ConstType.Value, String.Empty), - "{\n" + nodeDefs + "\n}" , - isStatic: true); - - mibFile.Declarations.Add(nodeDefsDecl); - - - // create and add node declaration - string nodeInitialization = String.Format("SNMP_SCALAR_CREATE_ARRAY_NODE({0}, {1}, {2}, {3}, {4})", - this.Oid, - nodeDefsDecl.Type.Name, - (this.GetMethodRequired) ? this.GetMethodName : LwipDefs.Null, - (this.TestMethodRequired) ? this.TestMethodName : LwipDefs.Null, - (this.SetMethodRequired) ? this.SetMethodName : LwipDefs.Null - ); - - mibFile.Declarations.Add(new VariableDeclaration( - new VariableType(this.FullNodeName, LwipDefs.Vt_StScalarArrayNode, null, ConstType.Value), - nodeInitialization, - isStatic: true)); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs deleted file mode 100644 index c37af46..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNode.cs +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNode: SnmpNode - { - protected const string LocalValueName = "v"; // name of (casted) local value variable - - private SnmpDataType dataType; - private SnmpAccessMode accessMode; - private readonly List restrictions = new List(); - - private bool useExternalMethods = false; - private string externalGetMethod; - private string externalTestMethod; - private string externalSetMethod; - - - public SnmpScalarNode(SnmpTreeNode parentNode) - : base(parentNode) - { - } - - public override string FullNodeName - { - get { return this.Name + "_scalar"; } - } - - public SnmpDataType DataType - { - get { return this.dataType; } - set { this.dataType = value; } - } - - public List Restrictions - { - get { return this.restrictions; } - } - - public SnmpAccessMode AccessMode - { - get { return this.accessMode; } - set { this.accessMode = value; } - } - - public virtual string FixedValueLength - { - get { return null; } - } - - /// - /// If scalar is used as a table index its value becomes part of the OID. This value returns how many OID parts are required to represent this value. - /// - public virtual int OidRepresentationLen - { - get { return -1; } - } - - public bool UseExternalMethods - { - get { return this.useExternalMethods; } - set { this.useExternalMethods = value; } - } - - public string ExternalGetMethod - { - get { return this.externalGetMethod; } - set { this.externalGetMethod = value; } - } - public string ExternalTestMethod - { - get { return this.externalTestMethod; } - set { this.externalTestMethod = value; } - } - public string ExternalSetMethod - { - get { return this.externalSetMethod; } - set { this.externalSetMethod = value; } - } - - public override void GenerateCode(MibCFile mibFile) - { - string getMethodName; - string testMethodName; - string setMethodName; - - if (this.useExternalMethods) - { - getMethodName = this.externalGetMethod; - testMethodName = this.externalTestMethod; - setMethodName = this.externalSetMethod; - } - else - { - getMethodName = LwipDefs.Null; - testMethodName = LwipDefs.Null; - setMethodName = LwipDefs.Null; - - if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.ReadOnly)) - { - FunctionDeclaration getMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_GetValue, isStatic: true); - getMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*")); - getMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - getMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_U16); - mibFile.Declarations.Add(getMethodDecl); - - Function getMethod = Function.FromDeclaration(getMethodDecl); - getMethodName = getMethod.Name; - - VariableDeclaration returnValue = new VariableDeclaration((VariableType)getMethod.ReturnType.Clone()); - returnValue.Type.Name = "value_len"; - getMethod.Declarations.Add(returnValue); - getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[0].Name); - - bool valueVarUsed = false; - GenerateGetMethodCode(getMethod, getMethod.Parameter[1].Name, ref valueVarUsed, returnValue.Type.Name); - if (!valueVarUsed) - { - getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[1].Name); - } - - getMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - - mibFile.Implementation.Add(getMethod); - } - - if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.WriteOnly)) - { - bool valueVarUsed; - bool lenVarUsed; - VariableDeclaration returnValue; - - if (this.restrictions.Count > 0) - { - FunctionDeclaration testMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetTest, isStatic: true); - testMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*")); - testMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16)); - testMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - testMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - mibFile.Declarations.Add(testMethodDecl); - - Function testMethod = Function.FromDeclaration(testMethodDecl); - testMethodName = testMethod.Name; - - returnValue = new VariableDeclaration((VariableType)testMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_WrongValue); - returnValue.Type.Name = "err"; - testMethod.Declarations.Add(returnValue); - testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[0].Name); - - valueVarUsed = false; - lenVarUsed = false; - - GenerateTestMethodCode(testMethod, testMethod.Parameter[2].Name, ref valueVarUsed, testMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name); - - if (!valueVarUsed) - { - testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[2].Name); - } - if (!lenVarUsed) - { - testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[1].Name); - } - - testMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - - mibFile.Implementation.Add(testMethod); - - } - else - { - testMethodName = LwipDefs.FnctName_SetTest_Ok; - } - - FunctionDeclaration setMethodDecl = null; - setMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetValue, isStatic: true); - setMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*")); - setMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16)); - setMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*")); - setMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - mibFile.Declarations.Add(setMethodDecl); - - Function setMethod = Function.FromDeclaration(setMethodDecl); - setMethodName = setMethod.Name; - - returnValue = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok); - returnValue.Type.Name = "err"; - setMethod.Declarations.Add(returnValue); - setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[0].Name); - - valueVarUsed = false; - lenVarUsed = false; - - GenerateSetMethodCode(setMethod, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name); - - if (!valueVarUsed) - { - setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[2].Name); - } - if (!lenVarUsed) - { - setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[1].Name); - } - - setMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - - mibFile.Implementation.Add(setMethod); - } - } - - // create and add node declaration - string nodeInitialization; - if (this.accessMode == SnmpAccessMode.ReadOnly) - { - nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE_READONLY({0}, {1}, {2})", - this.Oid, - LwipDefs.GetAsn1DefForSnmpDataType(this.dataType), - getMethodName); - } - else - { - nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE({0}, {1}, {2}, {3}, {4}, {5})", - this.Oid, - LwipDefs.GetLwipDefForSnmpAccessMode(this.accessMode), - LwipDefs.GetAsn1DefForSnmpDataType(this.dataType), - getMethodName, - testMethodName, - setMethodName); - } - - mibFile.Declarations.Add(new VariableDeclaration( - new VariableType(this.FullNodeName, LwipDefs.Vt_StScalarNode, null, ConstType.Value), - nodeInitialization, isStatic: true)); - } - - public virtual void GenerateGetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string retLenVarName) - { - bool localValueVarUsed; - if (GenerateValueDeclaration(container, LocalValueName, valueVarName)) - { - valueVarUsed = true; - localValueVarUsed = false; - } - else - { - localValueVarUsed = true; // do not generate UNUSED_ARG code - } - - if (this.FixedValueLength == null) - { - // check that value with variable length fits into buffer - container.AddElement(new Comment(String.Format("TODO: take care that value with variable length fits into buffer: ({0} <= SNMP_MAX_VALUE_SIZE)", retLenVarName), singleLine: true)); - } - - GenerateGetMethodCodeCore(container, LocalValueName, ref localValueVarUsed, retLenVarName); - if (!localValueVarUsed) - { - container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName)); - } - } - - protected virtual void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName) - { - container.AddElement(new Comment(String.Format("TODO: put requested value to '*{0}' here", localValueVarName), singleLine: true)); - container.AddCodeFormat("{0} = {1};", - retLenVarName, - (!String.IsNullOrWhiteSpace(this.FixedValueLength)) ? this.FixedValueLength : "0"); - } - - public virtual void GenerateTestMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - if (this.Restrictions.Count > 0) - { - bool localVarUsed; - if (GenerateValueDeclaration(container, LocalValueName, valueVarName)) - { - valueVarUsed = true; - localVarUsed = false; - } - else - { - localVarUsed = true; // do not generate UNUSED_ARG code - } - - if (!String.IsNullOrWhiteSpace(this.FixedValueLength)) - { - // check for fixed value - container.AddCodeFormat("LWIP_ASSERT(\"Invalid length for datatype\", ({0} == {1}));", lenVarName, this.FixedValueLength); - lenVarUsed = true; - } - - GenerateTestMethodCodeCore(container, LocalValueName, ref localVarUsed, lenVarName, ref lenVarUsed, retErrVarName); - - if (!localVarUsed) - { - container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName)); - } - } - else - { - container.AddCodeFormat("{0} == {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok); - } - } - - protected virtual void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - container.AddElement(new Comment(String.Format("TODO: test new value here:\nif (*{0} == ) {1} = {2};", localValueVarName, retErrVarName, LwipDefs.Def_ErrorCode_Ok))); - } - - public virtual void GenerateSetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - bool localVarUsed; - if (GenerateValueDeclaration(container, LocalValueName, valueVarName)) - { - valueVarUsed = true; - localVarUsed = false; - } - else - { - localVarUsed = true; // do not generate UNUSED_ARG code - } - - GenerateSetMethodCodeCore(container, LocalValueName, ref localVarUsed, lenVarName, ref lenVarUsed, retErrVarName); - - if (!localVarUsed) - { - container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", LocalValueName)); - } - } - - protected virtual void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - container.AddElement(new Comment(String.Format("TODO: store new value contained in '*{0}' here", localValueVarName), singleLine: true)); - } - - - protected virtual bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName) - { - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName, LwipDefs.Vt_U8, "*"), - "(" + new VariableType(null, LwipDefs.Vt_U8, "*") + ")" + sourceName)); - - return true; - } - - public static SnmpScalarNode CreateFromDatatype(SnmpDataType dataType, SnmpTreeNode parentNode) - { - switch (dataType) - { - case SnmpDataType.Integer: - return new SnmpScalarNodeInt(parentNode); - - case SnmpDataType.Gauge: - case SnmpDataType.Counter: - case SnmpDataType.TimeTicks: - return new SnmpScalarNodeUint(dataType, parentNode); - } - - return new SnmpScalarNode(parentNode); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs deleted file mode 100644 index 906a5a6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeBits.cs +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeBits : SnmpScalarNode - { - private readonly uint bitCount; - - public SnmpScalarNodeBits(SnmpTreeNode parentNode, uint bitCount) - : base(parentNode) - { - this.DataType = SnmpDataType.Bits; - this.bitCount = bitCount; - } - - public override void GenerateGetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string retLenVarName) - { - container.AddCode(String.Format( - "{0} = snmp_encode_bits(({1} *){2}, SNMP_MAX_VALUE_SIZE, 0 /* TODO: pass real value here */, {3});", - retLenVarName, - LwipDefs.Vt_U8, - valueVarName, - this.bitCount)); - - valueVarUsed = true; - } - - public override void GenerateTestMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - if (this.Restrictions.Count > 0) - { - const string bitVarName = "bits"; - - container.Declarations.Add(new VariableDeclaration(new VariableType(bitVarName, LwipDefs.Vt_U32))); - - IfThenElse ite = new IfThenElse(String.Format( - "snmp_decode_bits(({0} *){1}, {2}, &{3}) == ERR_OK", - LwipDefs.Vt_U8, - valueVarName, - lenVarName, - bitVarName)); - - valueVarUsed = true; - lenVarUsed = true; - - StringBuilder innerIfCond = new StringBuilder(); - foreach (IRestriction restriction in this.Restrictions) - { - innerIfCond.Append(restriction.GetCheckCodeValid(bitVarName)); - innerIfCond.Append(" || "); - } - - innerIfCond.Length -= 4; - - IfThenElse innerIte = new IfThenElse(innerIfCond.ToString()); - innerIte.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok)); - ite.AddElement(innerIte); - container.AddElement(ite); - } - else - { - base.GenerateTestMethodCode(container, valueVarName, ref valueVarUsed, lenVarName, ref lenVarUsed, retErrVarName); - } - } - - public override void GenerateSetMethodCode(CodeContainerBase container, string valueVarName, ref bool valueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - const string bitVarName = "bits"; - - container.Declarations.Add(new VariableDeclaration(new VariableType(bitVarName, LwipDefs.Vt_U32))); - - IfThenElse ite = new IfThenElse(String.Format( - "snmp_decode_bits(({0} *){1}, {2}, &{3}) == ERR_OK", - LwipDefs.Vt_U8, - valueVarName, - lenVarName, - bitVarName)); - - valueVarUsed = true; - lenVarUsed = true; - - ite.AddElement(new Comment(String.Format("TODO: store new value contained in '{0}' here", bitVarName), singleLine: true)); - - container.AddElement(ite); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs deleted file mode 100644 index 8f450c8..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeCounter64.cs +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeCounter64 : SnmpScalarNode - { - public SnmpScalarNodeCounter64(SnmpTreeNode parentNode) - : base(parentNode) - { - this.DataType = SnmpDataType.Counter64; - } - - protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName) - { - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName + "_high", LwipDefs.Vt_U32, "*"), - "(" + new VariableType(null, LwipDefs.Vt_U32, "*").ToString() + ")" + sourceName)); - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName + "_low", LwipDefs.Vt_U32, "*"), - variableName + "_high + 1")); - - container.AddCode(String.Format("LWIP_UNUSED_ARG({0}_high);", variableName)); - container.AddCode(String.Format("LWIP_UNUSED_ARG({0}_low);", variableName)); - - return false; - } - - public override string FixedValueLength - { - get { return String.Format("(2 * sizeof({0}))", LwipDefs.Vt_U32); } - } - - public override int OidRepresentationLen - { - get { return 1; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs deleted file mode 100644 index a381234..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeInt.cs +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeInt : SnmpScalarNode - { - public SnmpScalarNodeInt(SnmpTreeNode parentNode) - : base(parentNode) - { - this.DataType = SnmpDataType.Integer; - } - - protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0); - - StringBuilder ifCond = new StringBuilder(); - foreach (IRestriction restriction in this.Restrictions) - { - ifCond.Append(restriction.GetCheckCodeValid("*" + localValueVarName)); - ifCond.Append(" || "); - - localValueVarUsed = true; - } - - ifCond.Length -= 4; - - IfThenElse ite = new IfThenElse(ifCond.ToString()); - ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok)); - container.AddElement(ite); - } - - protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName) - { - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName, LwipDefs.Vt_S32, "*"), - "(" + new VariableType(null, LwipDefs.Vt_S32, "*") + ")" + sourceName)); - - return true; - } - - public override string FixedValueLength - { - get { return String.Format("sizeof({0})", LwipDefs.Vt_S32); } - } - - public override int OidRepresentationLen - { - get { return 1; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs deleted file mode 100644 index 5ce8d14..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeObjectIdentifier.cs +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeObjectIdentifier: SnmpScalarNode - { - public SnmpScalarNodeObjectIdentifier(SnmpTreeNode parentNode) - : base(parentNode) - { - this.DataType = SnmpDataType.ObjectIdentifier; - } - - protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName) - { - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName, LwipDefs.Vt_U32, "*"), - "(" + new VariableType(null, LwipDefs.Vt_U32, "*") + ")" + sourceName)); - - return true; - } - - protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName) - { - container.AddElement(new Comment(String.Format("TODO: put requested value to '*{0}' here. '{0}' has to be interpreted as {1}[]", localValueVarName, LwipDefs.Vt_U32), singleLine: true)); - container.AddElement(EmptyLine.SingleLine); - container.AddCode(String.Format("{0} = 0; // TODO: return real value length here (should be 'numOfElements * sizeof({1})')", retLenVarName, LwipDefs.Vt_U32)); - } - - protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - VariableDeclaration objIdLenVar = new VariableDeclaration( - new VariableType(localValueVarName + "_len", LwipDefs.Vt_U8), - String.Format("{0} / sizeof({1})", lenVarName, LwipDefs.Vt_U32)); - lenVarUsed = true; - - container.Declarations.Add(objIdLenVar); - - base.GenerateTestMethodCodeCore(container, localValueVarName, ref localValueVarUsed, lenVarName, ref lenVarUsed, retErrVarName); - - container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", objIdLenVar.Type.Name)); - } - - protected override void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - VariableDeclaration objIdLenVar = new VariableDeclaration( - new VariableType(localValueVarName + "_len", LwipDefs.Vt_U8), - String.Format("{0} / sizeof({1})", lenVarName, LwipDefs.Vt_U32)); - lenVarUsed = true; - - container.Declarations.Add(objIdLenVar); - - base.GenerateSetMethodCodeCore(container, localValueVarName, ref localValueVarUsed, lenVarName, ref lenVarUsed, retErrVarName); - - container.AddCode(String.Format("LWIP_UNUSED_ARG({0});", objIdLenVar.Type.Name)); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs deleted file mode 100644 index bf10f9a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeOctetString.cs +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeOctetString : SnmpScalarNode - { - public SnmpScalarNodeOctetString(SnmpDataType dataType, SnmpTreeNode parentNode) - : base(parentNode) - { - System.Diagnostics.Debug.Assert( - (dataType == SnmpDataType.OctetString) || - (dataType == SnmpDataType.Opaque) || - (dataType == SnmpDataType.IpAddress)); - - this.DataType = dataType; - } - - protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName) - { - if (this.Restrictions.Count > 0) - { - StringBuilder ifCond = new StringBuilder(); - foreach (IRestriction restriction in this.Restrictions) - { - ifCond.Append(restriction.GetCheckCodeValid(retLenVarName)); - ifCond.Append(" || "); - } - - ifCond.Length -= 4; - container.AddElement(new Comment("TODO: take care of len restrictions defined in MIB: " + ifCond, singleLine: true)); - } - base.GenerateGetMethodCodeCore(container, localValueVarName, ref localValueVarUsed, retLenVarName); - } - - protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0); - - // checks refer to length of octet string - StringBuilder ifCond = new StringBuilder(); - foreach (IRestriction restriction in this.Restrictions) - { - ifCond.Append(restriction.GetCheckCodeValid(lenVarName)); - ifCond.Append(" || "); - - lenVarUsed = true; - } - - ifCond.Length -= 4; - - IfThenElse ite = new IfThenElse(ifCond.ToString()); - ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok)); - container.AddElement(ite); - } - - public override int OidRepresentationLen - { - get - { - // check restrictions if we are set to one fixed length - if ((this.Restrictions != null) && (this.Restrictions.Count > 0)) - { - foreach (IRestriction restriction in this.Restrictions) - { - if (restriction is IsInRangeRestriction) - { - if ((restriction as IsInRangeRestriction).RangeStart == (restriction as IsInRangeRestriction).RangeEnd) - { - return (int)(restriction as IsInRangeRestriction).RangeStart; - } - } - else if (restriction is IsEqualRestriction) - { - return (int)(restriction as IsEqualRestriction).Value; - } - } - } - - return -1; // variable length - } - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs deleted file mode 100644 index 0f55752..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeTruthValue.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeTruthValue : SnmpScalarNodeInt - { - public SnmpScalarNodeTruthValue(SnmpTreeNode parentNode) - : base(parentNode) - { - } - - protected override void GenerateGetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string retLenVarName) - { - container.AddCodeFormat("snmp_encode_truthvalue({0}, /* TODO: put requested bool value here */ 0);", localValueVarName); - localValueVarUsed = true; - - container.AddCode(String.Format("{0} = {1};", - retLenVarName, - (!String.IsNullOrWhiteSpace(this.FixedValueLength)) ? this.FixedValueLength : "0")); - } - - protected override void GenerateSetMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - VariableType truthVar = new VariableType("bool_value", LwipDefs.Vt_U8); - container.Declarations.Add(new VariableDeclaration(truthVar)); - - container.AddCodeFormat("snmp_decode_truthvalue({0}, &{1});", localValueVarName, truthVar.Name); - localValueVarUsed = true; - - container.AddElement(new Comment(String.Format("TODO: store new value contained in '{0}' here", truthVar.Name), singleLine: true)); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs deleted file mode 100644 index edc161a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpScalarNodeUint.cs +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpScalarNodeUint : SnmpScalarNode - { - public SnmpScalarNodeUint(SnmpDataType dataType, SnmpTreeNode parentNode) - : base(parentNode) - { - System.Diagnostics.Debug.Assert( - (dataType == SnmpDataType.Counter) || - (dataType == SnmpDataType.Gauge) || - (dataType == SnmpDataType.TimeTicks)); - - this.DataType = dataType; - } - - protected override void GenerateTestMethodCodeCore(CodeContainerBase container, string localValueVarName, ref bool localValueVarUsed, string lenVarName, ref bool lenVarUsed, string retErrVarName) - { - System.Diagnostics.Trace.Assert(this.Restrictions.Count > 0); - - StringBuilder ifCond = new StringBuilder(); - foreach (IRestriction restriction in this.Restrictions) - { - ifCond.Append(restriction.GetCheckCodeValid("*" + localValueVarName)); - ifCond.Append(" || "); - - localValueVarUsed = true; - } - - ifCond.Length -= 4; - - IfThenElse ite = new IfThenElse(ifCond.ToString()); - ite.AddCode(String.Format("{0} = {1};", retErrVarName, LwipDefs.Def_ErrorCode_Ok)); - container.AddElement(ite); - } - - protected override bool GenerateValueDeclaration(CodeContainerBase container, string variableName, string sourceName) - { - container.AddDeclaration(new VariableDeclaration( - new VariableType(variableName, LwipDefs.Vt_U32, "*"), - "(" + new VariableType(null, LwipDefs.Vt_U32, "*") + ")" + sourceName)); - - return true; - } - - public override string FixedValueLength - { - get { return String.Format("sizeof({0})", LwipDefs.Vt_U32); } - } - - public override int OidRepresentationLen - { - get { return 1; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs deleted file mode 100644 index 8799b01..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTableNode.cs +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpTableNode: SnmpScalarAggregationNode - { - private readonly List cellNodes = new List(); - private readonly List indexNodes = new List(); - private string augmentedTableRow = null; - - - public SnmpTableNode(SnmpTreeNode parentNode) - : base(parentNode) - { - } - - public List CellNodes - { - get { return cellNodes; } - } - - public List IndexNodes - { - get { return indexNodes; } - } - - public string AugmentedTableRow - { - get { return this.augmentedTableRow; } - set { this.augmentedTableRow = value; } - } - - public override string FullNodeName - { - get - { - string result = this.Name.ToLowerInvariant(); - if (!result.Contains("table")) - { - result += "_table"; - } - - return result; - } - } - - protected override IEnumerable AggregatedScalarNodes - { - get { return this.cellNodes; } - } - - public override void GenerateCode(MibCFile mibFile) - { - FunctionDeclaration getInstanceMethodDecl = new FunctionDeclaration(this.FullNodeName + LwipDefs.FnctSuffix_GetInstance, isStatic: true); - getInstanceMethodDecl.Parameter.Add(new VariableType("column", LwipDefs.Vt_U32, "*", ConstType.Value)); - getInstanceMethodDecl.Parameter.Add(new VariableType("row_oid", LwipDefs.Vt_U32, "*", ConstType.Value)); - getInstanceMethodDecl.Parameter.Add(new VariableType("row_oid_len", LwipDefs.Vt_U8, "")); - getInstanceMethodDecl.Parameter.Add(new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*")); - getInstanceMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - mibFile.Declarations.Add(getInstanceMethodDecl); - - Function getInstanceMethod = Function.FromDeclaration(getInstanceMethodDecl); - GenerateGetInstanceMethodCode(getInstanceMethod); - mibFile.Implementation.Add(getInstanceMethod); - - - FunctionDeclaration getNextInstanceMethodDecl = new FunctionDeclaration(this.FullNodeName + LwipDefs.FnctSuffix_GetNextInstance, isStatic: true); - getNextInstanceMethodDecl.Parameter.Add(new VariableType("column", LwipDefs.Vt_U32, "*", ConstType.Value)); - getNextInstanceMethodDecl.Parameter.Add(new VariableType("row_oid", LwipDefs.Vt_StObjectId, "*")); - getNextInstanceMethodDecl.Parameter.Add(new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*")); - getNextInstanceMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err); - mibFile.Declarations.Add(getNextInstanceMethodDecl); - - Function getNextInstanceMethod = Function.FromDeclaration(getNextInstanceMethodDecl); - GenerateGetNextInstanceMethodCode(getNextInstanceMethod); - mibFile.Implementation.Add(getNextInstanceMethod); - - - VariableType instanceType = new VariableType("cell_instance", LwipDefs.Vt_StNodeInstance, "*"); - GenerateAggregatedCode( - mibFile, - instanceType, - String.Format("SNMP_TABLE_GET_COLUMN_FROM_OID({0}->instance_oid.id)", instanceType.Name)); - - - #region create and add column/table definitions - - StringBuilder colDefs = new StringBuilder(); - foreach (SnmpScalarNode colNode in this.cellNodes) - { - colDefs.AppendFormat(" {{{0}, {1}, {2}}}, /* {3} */ \n", - colNode.Oid, - LwipDefs.GetAsn1DefForSnmpDataType(colNode.DataType), - LwipDefs.GetLwipDefForSnmpAccessMode(colNode.AccessMode), - colNode.Name); - } - if (colDefs.Length > 0) - { - colDefs.Length--; - } - - VariableDeclaration colDefsDecl = new VariableDeclaration( - new VariableType(this.FullNodeName + "_columns", LwipDefs.Vt_StTableColumnDef, null, ConstType.Value, String.Empty), - "{\n" + colDefs + "\n}", - isStatic: true); - - mibFile.Declarations.Add(colDefsDecl); - - string nodeInitialization = String.Format("SNMP_TABLE_CREATE({0}, {1}, {2}, {3}, {4}, {5}, {6})", - this.Oid, - colDefsDecl.Type.Name, - getInstanceMethodDecl.Name, getNextInstanceMethodDecl.Name, - (this.GetMethodRequired) ? this.GetMethodName : LwipDefs.Null, - (this.TestMethodRequired) ? this.TestMethodName : LwipDefs.Null, - (this.SetMethodRequired) ? this.SetMethodName : LwipDefs.Null - ); - - mibFile.Declarations.Add(new VariableDeclaration( - new VariableType(this.FullNodeName, LwipDefs.Vt_StTableNode, null, ConstType.Value), - nodeInitialization, - isStatic: true)); - - #endregion - } - - protected virtual void GenerateGetInstanceMethodCode(Function getInstanceMethod) - { - VariableDeclaration returnValue = new VariableDeclaration((VariableType)getInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); - returnValue.Type.Name = "err"; - getInstanceMethod.Declarations.Add(returnValue); - - int instanceOidLength = 0; - StringBuilder indexColumns = new StringBuilder(); - foreach (SnmpScalarNode indexNode in this.indexNodes) - { - if (instanceOidLength >= 0) - { - if (indexNode.OidRepresentationLen >= 0) - { - instanceOidLength += indexNode.OidRepresentationLen; - } - else - { - // at least one index column has a variable length -> we cannot perform a static check - instanceOidLength = -1; - } - } - - indexColumns.AppendFormat( - " {0} ({1}, OID length = {2})\n", - indexNode.Name, - indexNode.DataType, - (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); - } - if (indexColumns.Length > 0) - { - indexColumns.Length--; - - getInstanceMethod.Declarations.Insert(0, new Comment(String.Format( - "The instance OID of this table consists of following (index) column(s):\n{0}", - indexColumns))); - } - - string augmentsHint = ""; - if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) - { - augmentsHint = String.Format( - "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + - "You may simply call the '*{1}' method of this table.\n\n", - (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow, - LwipDefs.FnctSuffix_GetInstance); - } - - CodeContainerBase ccb = getInstanceMethod; - if (instanceOidLength > 0) - { - IfThenElse ite = new IfThenElse(String.Format("{0} == {1}", getInstanceMethod.Parameter[2].Name, instanceOidLength)); - getInstanceMethod.AddElement(ite); - ccb = ite; - } - - ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[0].Name); - ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[1].Name); - if (instanceOidLength <= 0) - { - ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[2].Name); - } - ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[3].Name); - - ccb.AddElement(new Comment(String.Format( - "TODO: check if '{0}'/'{1}' params contain a valid instance oid for a row\n" + - "If so, set '{2} = {3};'\n\n" + - "snmp_oid_* methods may be used for easier processing of oid\n\n" + - "{4}" + - "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + - "you may store an arbitrary value (like a pointer to target value object) in '{5}->reference'/'{5}->reference_len'.\n" + - "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + - "You also may replace function pointers in '{5}' param for get/test/set methods which contain the default values from table definition,\n" + - "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", - getInstanceMethod.Parameter[1].Name, - getInstanceMethod.Parameter[2].Name, - returnValue.Type.Name, - LwipDefs.Def_ErrorCode_Ok, - augmentsHint, - getInstanceMethod.Parameter[3].Name - ))); - - getInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - } - - protected virtual void GenerateGetNextInstanceMethodCode(Function getNextInstanceMethod) - { - getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[0].Name); - getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[1].Name); - getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[2].Name); - - VariableDeclaration returnValue = new VariableDeclaration((VariableType)getNextInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); - returnValue.Type.Name = "err"; - getNextInstanceMethod.Declarations.Add(returnValue); - - StringBuilder indexColumns = new StringBuilder(); - foreach (SnmpScalarNode indexNode in this.indexNodes) - { - indexColumns.AppendFormat( - " {0} ({1}, OID length = {2})\n", - indexNode.Name, - indexNode.DataType, - (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); - } - if (indexColumns.Length > 0) - { - indexColumns.Length--; - - getNextInstanceMethod.Declarations.Insert(0, new Comment(String.Format( - "The instance OID of this table consists of following (index) column(s):\n{0}", - indexColumns))); - } - - string augmentsHint = ""; - if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) - { - augmentsHint = String.Format( - "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + - "You may simply call the '*{1}' method of this table.\n\n", - (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow, - LwipDefs.FnctSuffix_GetNextInstance); - } - - getNextInstanceMethod.AddElement(new Comment(String.Format( - "TODO: analyze '{0}->id'/'{0}->len' and return the subsequent row instance\n" + - "Be aware that '{0}->id'/'{0}->len' must not point to a valid instance or have correct instance length.\n" + - "If '{0}->len' is 0, return the first instance. If '{0}->len' is longer than expected, cut superfluous OID parts.\n" + - "If a valid next instance is found, store it in '{0}->id'/'{0}->len' and set '{1} = {2};'\n\n" + - "snmp_oid_* methods may be used for easier processing of oid\n\n" + - "{3}" + - "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + - "you may store an arbitrary value (like a pointer to target value object) in '{4}->reference'/'{4}->reference_len'.\n" + - "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + - "You also may replace function pointers in '{4}' param for get/test/set methods which contain the default values from table definition,\n" + - "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", - getNextInstanceMethod.Parameter[1].Name, - returnValue.Type.Name, - LwipDefs.Def_ErrorCode_Ok, - augmentsHint, - getNextInstanceMethod.Parameter[2].Name - ))); - - getNextInstanceMethod.AddElement(new Comment(String.Format( - "For easier processing and getting the next instance, you may use the 'snmp_next_oid_*' enumerator.\n" + - "Simply pass all known instance OID's to it and it returns the next valid one:\n\n" + - "{0} state;\n" + - "{1} result_buf;\n" + - "snmp_next_oid_init(&state, {2}->id, {2}->len, result_buf, LWIP_SNMP_OBJ_ID_LEN);\n" + - "while ({{not all instances passed}}) {{\n" + - " {1} test_oid;\n" + - " {{fill test_oid to create instance oid for next instance}}\n" + - " snmp_next_oid_check(&state, test_oid->id, test_oid->len, {{target_data_ptr}});\n" + - "}}\n" + - "if(state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {{\n" + - " snmp_oid_assign(row_oid, result_buf->oid, result_buf->len);\n" + - " {3}->reference.ptr = state.reference; //==target_data_ptr, for usage in subsequent get/test/set\n" + - " {4} = {5};\n" + - "}}" - , - LwipDefs.Vt_StNextOidState, - LwipDefs.Vt_StObjectId, - getNextInstanceMethod.Parameter[1].Name, - getNextInstanceMethod.Parameter[2].Name, - returnValue.Type.Name, - LwipDefs.Def_ErrorCode_Ok - ))); - - getNextInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs deleted file mode 100644 index 52046b6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/LwipSnmpCodeGeneration/SnmpTreeNode.cs +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Martin Hentschel - * - */ - -using System; -using System.Collections.Generic; -using System.Text; -using CCodeGeneration; - -namespace LwipSnmpCodeGeneration -{ - public class SnmpTreeNode: SnmpScalarAggregationNode - { - private readonly List childNodes = new List(); - private readonly List childScalarNodes = new List(); - private string fullOid = ""; - - public SnmpTreeNode(SnmpTreeNode parentNode) - : base(parentNode) - { - } - - public override string FullNodeName - { - get { return this.Name + "_treenode"; } - } - - public string FullOid - { - get { return this.fullOid; } - set { this.fullOid = value; } - } - - public List ChildNodes - { - get { return this.childNodes; } - } - - protected override IEnumerable AggregatedScalarNodes - { - get { return this.childScalarNodes; } - } - - private void GenerateAggregatedCode(MibCFile mibFile, bool generateDeclarations, bool generateImplementations) - { - VariableType instanceType = new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"); - base.GenerateAggregatedCode( - mibFile, - instanceType, - String.Format("{0}->node->oid", instanceType.Name), - generateDeclarations, - generateImplementations); - } - - private void GenerateAggregateMethodDeclarations(MibCFile mibFile) - { - if (LwipOpts.GenerateSingleAccessMethodsForTreeNodeScalars && (this.childScalarNodes.Count > 1)) - { - GenerateAggregatedCode(mibFile, true, false); - } - } - - public override void GenerateCode(MibCFile mibFile) - { - string nodeInitialization; - - if (LwipOpts.GenerateSingleAccessMethodsForTreeNodeScalars && (this.childScalarNodes.Count > 1)) - { - GenerateAggregatedCode(mibFile, false, true); - } - - // create and add node declaration - if (this.childNodes.Count > 0) - { - StringBuilder subnodeArrayInitialization = new StringBuilder(); - - for (int i=0; i=0; i--) - { - this.ChildNodes[i].Analyze(); - } - - // collect scalar nodes - foreach (SnmpNode childNode in this.childNodes) - { - SnmpScalarNode scalarNode = childNode as SnmpScalarNode; - if (scalarNode != null) - { - this.childScalarNodes.Add(scalarNode); - } - } - - base.Analyze(); - - // check if we can merge this node to a scalar array node (all childs need to be scalars) - if (this.childNodes.Count > 0) - { - if (LwipOpts.GenerateScalarArrays && (this.childScalarNodes.Count == this.childNodes.Count) && (this.ParentNode != null)) - { - SnmpScalarArrayNode scalarArrayNode = new SnmpScalarArrayNode(this.childScalarNodes, this.ParentNode); - scalarArrayNode.Oid = this.Oid; - scalarArrayNode.Name = this.Name; - - for (int i=0; i 1)) - { - foreach (SnmpScalarNode scalarNode in this.childScalarNodes) - { - scalarNode.UseExternalMethods = true; - scalarNode.ExternalGetMethod = this.GetMethodName; - scalarNode.ExternalTestMethod = this.TestMethodName; - scalarNode.ExternalSetMethod = this.SetMethodName; - } - } - } - else // if (this.childNodes.Count == 0) - { - if (!LwipOpts.GenerateEmptyFolders && (this.ParentNode != null)) - { - // do not generate this empty folder because it only waste (static) memory - for (int i=0; i - prtAlertTime the value of sysUpTime at - the time of the removal of the - binary change event from the - alert table. - - Optionally, the agent may generate a trap coincident with - - removing the binary change event and placing the unary change - event alertRemovalOfBinaryChangeEntry(1801) in the alert - table. For such a trap, the prtAlertIndex sent with the above - trap parameters shall be the index of the - alertRemovalOfBinaryChangeEvent row that was added to the - prtAlertTable; not the index of the row that was removed from - the prtAlertTable." - SYNTAX INTEGER { - other(1), - -- an event that is not represented - -- by one of the alert codes - -- specified below. - unknown(2), - -- The following generic codes are common to - -- multiple groups. The NMS may examine the - -- prtAlertGroup object to determine what group - -- to query for further information. - coverOpen(3), - coverClosed(4), - interlockOpen(5), - interlockClosed(6), - configurationChange(7), - jam(8), - subunitMissing(9), -- Not in RFC 1759 - -- The subunit tray, bin, etc. - -- has been removed. - subunitLifeAlmostOver(10), -- Not in RFC 1759 - subunitLifeOver(11), -- Not in RFC 1759 - subunitAlmostEmpty(12), -- Not in RFC 1759 - subunitEmpty(13), -- Not in RFC 1759 - subunitAlmostFull(14), -- Not in RFC 1759 - subunitFull(15), -- Not in RFC 1759 - subunitNearLimit(16), -- Not in RFC 1759 - subunitAtLimit(17), -- Not in RFC 1759 - subunitOpened(18), -- Not in RFC 1759 - subunitClosed(19), -- Not in RFC 1759 - subunitTurnedOn(20), -- Not in RFC 1759 - subunitTurnedOff(21), -- Not in RFC 1759 - subunitOffline(22), -- Not in RFC 1759 - subunitPowerSaver(23), -- Not in RFC 1759 - subunitWarmingUp(24), -- Not in RFC 1759 - subunitAdded(25), -- Not in RFC 1759 - subunitRemoved(26), -- Not in RFC 1759 - subunitResourceAdded(27), -- Not in RFC 1759 - subunitResourceRemoved(28), -- Not in RFC 1759 - subunitRecoverableFailure(29), - -- Not in RFC 1759 - subunitUnrecoverableFailure(30), - - -- Not in RFC 1759 - subunitRecoverableStorageError(31), - -- Not in RFC 1759 - subunitUnrecoverableStorageError(32), - -- Not in RFC 1759 - subunitMotorFailure(33), -- Not in RFC 1759 - subunitMemoryExhausted(34), -- Not in RFC 1759 - subunitUnderTemperature(35), -- Not in RFC 1759 - subunitOverTemperature(36), -- Not in RFC 1759 - subunitTimingFailure(37), -- Not in RFC 1759 - subunitThermistorFailure(38), -- Not in RFC 1759 - - -- General Printer group - doorOpen(501), -- DEPRECATED - -- Use coverOpened(3) - doorClosed(502), -- DEPRECATED - -- Use coverClosed(4) - powerUp(503), - powerDown(504), - printerNMSReset(505), -- Not in RFC 1759 - -- The printer has been reset by some - -- network management station(NMS) - -- writing into 'prtGeneralReset'. - printerManualReset(506), -- Not in RFC 1759 - -- The printer has been reset manually. - printerReadyToPrint(507), -- Not in RFC 1759 - -- The printer is ready to print. (i.e., - -- not warming up, not in power save - -- state, not adjusting print quality, - -- etc.). - - -- Input Group - inputMediaTrayMissing(801), - inputMediaSizeChange(802), - inputMediaWeightChange(803), - inputMediaTypeChange(804), - inputMediaColorChange(805), - inputMediaFormPartsChange(806), - inputMediaSupplyLow(807), - inputMediaSupplyEmpty(808), - inputMediaChangeRequest(809), -- Not in RFC 1759 - -- An interpreter has detected that a - -- different medium is need in this input - -- tray subunit. The prtAlertDescription may - -- be used to convey a human readable - -- description of the medium required to - -- satisfy the request. - inputManualInputRequest(810), -- Not in RFC 1759 - - -- An interpreter has detected that manual - -- input is required in this subunit. The - -- prtAlertDescription may be used to convey - -- a human readable description of the medium - -- required to satisfy the request. - inputTrayPositionFailure(811), -- Not in RFC 1759 - -- The input tray failed to position correctly. - inputTrayElevationFailure(812), - -- Not in RFC 1759 - inputCannotFeedSizeSelected(813), - -- Not in RFC 1759 - -- Output Group - outputMediaTrayMissing(901), - outputMediaTrayAlmostFull(902), - outputMediaTrayFull(903), - outputMailboxSelectFailure(904), - -- Not in RFC 1759 - -- Marker group - markerFuserUnderTemperature(1001), - markerFuserOverTemperature(1002), - markerFuserTimingFailure(1003), - -- Not in RFC 1759 - markerFuserThermistorFailure(1004), - -- Not in RFC 1759 - markerAdjustingPrintQuality(1005), - -- Not in RFC 1759 - -- Marker Supplies group - markerTonerEmpty(1101), - markerInkEmpty(1102), - markerPrintRibbonEmpty(1103), - markerTonerAlmostEmpty(1104), - markerInkAlmostEmpty(1105), - markerPrintRibbonAlmostEmpty(1106), - markerWasteTonerReceptacleAlmostFull(1107), - markerWasteInkReceptacleAlmostFull(1108), - markerWasteTonerReceptacleFull(1109), - markerWasteInkReceptacleFull(1110), - markerOpcLifeAlmostOver(1111), - markerOpcLifeOver(1112), - markerDeveloperAlmostEmpty(1113), - markerDeveloperEmpty(1114), - markerTonerCartridgeMissing(1115), - -- Not in RFC 1759 - -- Media Path Device Group - mediaPathMediaTrayMissing(1301), - mediaPathMediaTrayAlmostFull(1302), - mediaPathMediaTrayFull(1303), - mediaPathCannotDuplexMediaSelected(1304), - - -- Not in RFC 1759 - -- Interpreter Group - interpreterMemoryIncrease(1501), - interpreterMemoryDecrease(1502), - interpreterCartridgeAdded(1503), - interpreterCartridgeDeleted(1504), - interpreterResourceAdded(1505), - interpreterResourceDeleted(1506), - interpreterResourceUnavailable(1507), - interpreterComplexPageEncountered(1509), - -- Not in RFC 1759 - -- The interpreter has encountered a page - -- that is too complex for the resources that - -- are available. - -- Alert Group - alertRemovalOfBinaryChangeEntry(1801) - -- Not in RFC 1759 - -- A binary change event entry has been - -- removed from the alert table. This unary - -- change alert table entry is added to the - -- end of the alert table. - } -END - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB deleted file mode 100644 index 952c84e..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANA-RTPROTO-MIB +++ /dev/null @@ -1,92 +0,0 @@ - -IANA-RTPROTO-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI - TEXTUAL-CONVENTION FROM SNMPv2-TC; - -ianaRtProtoMIB MODULE-IDENTITY - LAST-UPDATED "200009260000Z" -- September 26, 2000 - ORGANIZATION "IANA" - CONTACT-INFO - " Internet Assigned Numbers Authority - Internet Corporation for Assigned Names and Numbers - 4676 Admiralty Way, Suite 330 - Marina del Rey, CA 90292-6601 - - Phone: +1 310 823 9358 - EMail: iana&iana.org" - DESCRIPTION - "This MIB module defines the IANAipRouteProtocol and - IANAipMRouteProtocol textual conventions for use in MIBs - which need to identify unicast or multicast routing - mechanisms. - - Any additions or changes to the contents of this MIB module - require either publication of an RFC, or Designated Expert - Review as defined in RFC 2434, Guidelines for Writing an - IANA Considerations Section in RFCs. The Designated Expert - will be selected by the IESG Area Director(s) of the Routing - Area." - - REVISION "200009260000Z" -- September 26, 2000 - DESCRIPTION "Original version, published in coordination - with RFC 2932." - - ::= { mib-2 84 } - -IANAipRouteProtocol ::= TEXTUAL-CONVENTION - STATUS current - - DESCRIPTION - "A mechanism for learning routes. Inclusion of values for - routing protocols is not intended to imply that those - protocols need be supported." - SYNTAX INTEGER { - other (1), -- not specified - local (2), -- local interface - netmgmt (3), -- static route - icmp (4), -- result of ICMP Redirect - - -- the following are all dynamic - -- routing protocols - - egp (5), -- Exterior Gateway Protocol - ggp (6), -- Gateway-Gateway Protocol - hello (7), -- FuzzBall HelloSpeak - rip (8), -- Berkeley RIP or RIP-II - isIs (9), -- Dual IS-IS - esIs (10), -- ISO 9542 - ciscoIgrp (11), -- Cisco IGRP - bbnSpfIgp (12), -- BBN SPF IGP - ospf (13), -- Open Shortest Path First - bgp (14), -- Border Gateway Protocol - idpr (15), -- InterDomain Policy Routing - ciscoEigrp (16), -- Cisco EIGRP - dvmrp (17) -- DVMRP - } - -IANAipMRouteProtocol ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The multicast routing protocol. Inclusion of values for - multicast routing protocols is not intended to imply that - those protocols need be supported." - SYNTAX INTEGER { - other(1), -- none of the following - local(2), -- e.g., manually configured - netmgmt(3), -- set via net.mgmt protocol - dvmrp(4), - mospf(5), - pimSparseDense(6), -- PIMv1, both DM and SM - cbt(7), - pimSparseMode(8), -- PIM-SM - pimDenseMode(9), -- PIM-DM - igmpOnly(10), - bgmp(11), - msdp(12) - } - -END - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB deleted file mode 100644 index e774ac0..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANATn3270eTC-MIB +++ /dev/null @@ -1,306 +0,0 @@ - - IANATn3270eTC-MIB DEFINITIONS ::= BEGIN - - IMPORTS - MODULE-IDENTITY, mib-2 - FROM SNMPv2-SMI - TEXTUAL-CONVENTION - FROM SNMPv2-TC; - - ianaTn3270eTcMib MODULE-IDENTITY - LAST-UPDATED "200005100000Z" -- May 10, 2000 - ORGANIZATION "IANA" - CONTACT-INFO - "Internet Assigned Numbers Authority - - Postal: ICANN - 4676 Admiralty Way, Suite 330 - Marina del Rey, CA 90292 - - Tel: +1 310 823 9358 x20 - E-Mail: iana&iana.org" - DESCRIPTION - "This module defines a set of textual conventions - for use by the TN3270E-MIB and the TN3270E-RT-MIB. - - Any additions or changes to the contents of this - MIB module must first be discussed on the tn3270e - working group list at: tn3270e&list.nih.gov - and approved by one of the following TN3270E - working group contacts: - - Ed Bailey (co-chair) - elbailey&us.ibm.com - Michael Boe (co-chair) - mboe&cisco.com - Ken White - kennethw&vnet.ibm.com - Robert Moore - remoore&us.ibm.com - - The above list of contacts can be altered with - the approval of the two co-chairs. - - The Textual Conventions defined within this MIB have - no security issues associated with them unless - explicitly stated in their corresponding - DESCRIPTION clause." - - -- revision log, in reverse chronological order - - REVISION "200005100000Z" -- May 10, 2000 - DESCRIPTION "Fix to import mib-2 instead of experimental." - - REVISION "199909011000Z" -- September 1, 1999 - DESCRIPTION - "Initial version transferred from the TN3270E - working group to IANA." - - ::= { mib-2 61 } - - - -- Textual Conventions - - IANATn3270eAddrType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The textual convention for defining the type of a - client address. The enumeration value unknown(0) is - also used to indicate that no actual address is present." - SYNTAX INTEGER { - unknown(0), - ipv4(1), - ipv6(2) - } - - IANATn3270eAddress ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Denotes a client address. The type of client address is - determined by use of the IANATn3270eAddrType textual -convention. - The length in octets of a IANATn3270eAddress object is: - - IANATn3270eAddrType Address Length - +++++++++++++++++++ ++++++++++++++ - unknown(0) not specified or unknown; the - actual length of the - IANATn3270eAddress octet string - indicates if an address - is present - ipv4(1) 4 OCTETS - ipv6(2) 16 OCTETS - - This textual convention is similar to the TAddress - TC defined by RFC1903 except that it allows a - zero-length octet string and is not a full transport - layer address." - SYNTAX OCTET STRING (SIZE (0..255)) - - IANATn3270eClientType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The textual convention for defining the set of - enumerations used by tn3270eTcpConnClientIdFormat - in the TN3270E-MIB: - - ENUMERATION OCTETs DESCRIPTION - - none(1) 0 Not specified - other(2) 1..512 Implementation specific - ipv4(3) 6 4-octet IP Address plus - 2-octet TCP Port - ipv6(4) 18 16-octet IPv6 Address - plus 2-octet TCP Port - domainName(5) 1..512 The DNS name of a - client. - truncDomainName(6) 1..512 The (truncated) DNS name - of a client. - string(7) 1..512 Unknown Utf8String - certificate(8) 1..512 certificate - userId(9) 1..8 Client's userid - x509dn(10) 1..512 X.509 Distinguished Name - - Representation of a certificate(8) may be lead to - a security exposure and is NOT RECOMMENDED without - adequate security." - SYNTAX INTEGER { - none(1), - other(2), - ipv4(3), - ipv6(4), - domainName(5), - truncDomainName(6), - string(7), - certificate(8), - userId(9), - x509dn(10) - } - - IANATn3270Functions ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "This textual convention reflects the current set of - TN3270 and TN3270E functions that can be negotiated - between a server and its client: - - RFC856 - transmitBinary The sender of this command REQUESTS - permission to begin transmitting, or - confirms that it will now begin - transmitting characters which are to - be interpreted as 8 bits of binary - data by the receiver of the data. - RFC860 - timingMark The sender of this command REQUESTS - that the receiver of this command - return a WILL TIMING-MARK in the data - stream at the 'appropriate place'. - RFC885 - endOfRecord The sender of this command requests - permission to begin transmission of - the Telnet END-OF-RECORD (EOR) code - when transmitting data characters, or - the sender of this command confirms it - will now begin transmission of EORs - with transmitted data characters. - RFC1091 - terminalType Sender is willing to send terminal - type information in a subsequent - sub-negotiation. - - RFC1041 - tn3270Regime Sender is willing to send list of - supported 3270 Regimes in a - subsequent sub-negotiation. - RFC2355 - scsCtlCodes (Printer sessions only). Allows the - use of the SNA Character Stream (SCS) - and SCS control codes on the session. - SCS is used with LU type 1 SNA sessions. - dataStreamCtl (Printer sessions only). Allows the use - of the standard 3270 data stream. This - corresponds to LU type 3 SNA sessions. - responses Provides support for positive and - negative response handling. Allows the - server to reflect to the client any and - all definite, exception, and no response - requests sent by the host application. - bindImage Allows the server to send the SNA Bind - image and Unbind notification to the - client. - sysreq Allows the client and server to emulate - some (or all, depending on the server) of - the functions of the SYSREQ key in an SNA - environment." - SYNTAX BITS { - transmitBinary(0),-- rfc856 - timemark(1), -- rfc860 - endOfRecord(2), -- rfc885 - terminalType(3), -- rfc1091 - tn3270Regime(4), -- rfc1041 - scsCtlCodes(5), -- rfc2355 - dataStreamCtl(6), -- rfc2355 - responses(7), -- rfc2355 - bindImage(8), -- rfc2355 - sysreq(9) -- rfc2355 - } - - IANATn3270ResourceType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The type of resource defined by a resource pool. Refer - to tn3270eResPoolTable." - SYNTAX INTEGER { - other(1), - terminal(2), - printer(3), - terminalOrPrinter(4) - } - - IANATn3270DeviceType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "This textual convention defines the list of device - types that can be set, as defined by RFC 2355." - SYNTAX INTEGER { - -- terminals - ibm3278d2(1), -- (24 row x 80 col display) - ibm3278d2E(2), -- (24 row x 80 col display) - ibm3278d3(3), -- (32 row x 80 col display) - ibm3278d3E(4), -- (32 row x 80 col display) - ibm3278d4(5), -- (43 row x 80 col display) - ibm3278d4E(6), -- (43 row x 80 col display) - ibm3278d5(7), -- (27 row x 132 col display) - ibm3278d5E(8), -- (27 row x 132 col display) - ibmDynamic(9), -- (no pre-defined display size) - - -- printers - ibm3287d1(10), - - unknown(100) - } - - IANATn3270eLogData ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "An octet string representing log data as pertaining to - either a TN3270 or TN3270E Session as reported from a - TN3270E Server. Log data is stored in an octet string - in time order (from earliest to latest). - - Each log element has the following form: - - +------+----+---------+------------+ - !length!type!TimeStamp! data ! - +------+----+---------+------------+ - - where - - length = one-octet length of the data portion of the - trace element, not including the length, - type, and TimeStamp fields - type = one-octet code point characterizing the data. - TimeStamp = A 4-octet field representing the number of - TimeTicks since the TN3270E server was last - activated. The server's last activation time - is available in the tn3270eSrvrConfLastActTime - object in the TN3270E MIB, which has the - syntax DateAndTime. - data = initial part of a PDU. - - length type - - 0-255 x'00' - unknown - 0 x'01' - inactivity timer expired - 0 x'02' - dynamic timer expired - 0 x'03' - actlu req - 0 x'04' - bind req - 0 x'05' - clear req - 0 x'06' - dactlu req - 0 x'07' - warm actpu req - 0 x'08' - sdt req - 0 x'09' - unbind req - 0 x'0A' - notify resp - 0 x'0B' - reply PSID neg rsp - 0 x'0C' - reply PSID pos rsp - 0 x'0D' - unbind rsp - 0 x'0E' - hierarchical reset - 0 x'0F' - client connect req - 0 x'10' - client disconnect req - 0 x'11' - timingmark received - 0 x'12' - flowControl timer expired - 0 x'13' - neg rsp to host - 0 x'14' - neg rsp from host - 0 x'15' - data contention - 0 x'16' - no buffer to send SNA data - 0 x'17' - receive response while inbound - 0 x'18' - client protocol error - 0 x'19' - badClientSequenceReceived - 1-255 x'1A' - utf8String - 2 x'1B' - hexCode, implementation dependent - - Log element entries have a minimum length of 6 octets. - The zero-length string indicates that no log data is - available." - SYNTAX OCTET STRING (SIZE (0 | 6..2048)) - - END - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB deleted file mode 100644 index 39dddf9..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IANA/IANAifType-MIB +++ /dev/null @@ -1,572 +0,0 @@ - IANAifType-MIB DEFINITIONS ::= BEGIN - - IMPORTS - MODULE-IDENTITY, mib-2 FROM SNMPv2-SMI - TEXTUAL-CONVENTION FROM SNMPv2-TC; - - ianaifType MODULE-IDENTITY - LAST-UPDATED "200709130000Z" -- September 13, 2007 - ORGANIZATION "IANA" - CONTACT-INFO " Internet Assigned Numbers Authority - - Postal: ICANN - 4676 Admiralty Way, Suite 330 - Marina del Rey, CA 90292 - - Tel: +1 310 823 9358 - E-Mail: iana&iana.org" - - DESCRIPTION "This MIB module defines the IANAifType Textual - Convention, and thus the enumerated values of - the ifType object defined in MIB-II's ifTable." - - REVISION "200709130000Z" -- September 13, 2007 - DESCRIPTION "Registration of new IANAifTypes 243 and 244." - - REVISION "200705290000Z" -- May 29, 2007 - DESCRIPTION "Changed the description for IANAifType 228." - - REVISION "200703080000Z" -- March 08, 2007 - DESCRIPTION "Registration of new IANAifType 242." - - REVISION "200701230000Z" -- January 23, 2007 - DESCRIPTION "Registration of new IANAifTypes 239, 240, and 241." - - REVISION "200610170000Z" -- October 17, 2006 - DESCRIPTION "Deprecated/Obsoleted IANAifType 230. Registration of - IANAifType 238." - - REVISION "200609250000Z" -- September 25, 2006 - DESCRIPTION "Changed the description for IANA ifType - 184 and added new IANA ifType 237." - - REVISION "200608170000Z" -- August 17, 2006 - DESCRIPTION "Changed the descriptions for IANAifTypes - 20 and 21." - - REVISION "200608110000Z" -- August 11, 2006 - DESCRIPTION "Changed the descriptions for IANAifTypes - 7, 11, 62, 69, and 117." - - REVISION "200607250000Z" -- July 25, 2006 - DESCRIPTION "Registration of new IANA ifType 236." - - REVISION "200606140000Z" -- June 14, 2006 - DESCRIPTION "Registration of new IANA ifType 235." - - REVISION "200603310000Z" -- March 31, 2006 - DESCRIPTION "Registration of new IANA ifType 234." - - REVISION "200603300000Z" -- March 30, 2006 - DESCRIPTION "Registration of new IANA ifType 233." - - REVISION "200512220000Z" -- December 22, 2005 - DESCRIPTION "Registration of new IANA ifTypes 231 and 232." - - REVISION "200510100000Z" -- October 10, 2005 - DESCRIPTION "Registration of new IANA ifType 230." - - REVISION "200509090000Z" -- September 09, 2005 - DESCRIPTION "Registration of new IANA ifType 229." - - REVISION "200505270000Z" -- May 27, 2005 - DESCRIPTION "Registration of new IANA ifType 228." - - REVISION "200503030000Z" -- March 3, 2005 - DESCRIPTION "Added the IANAtunnelType TC and deprecated - IANAifType sixToFour (215) per RFC4087." - - REVISION "200411220000Z" -- November 22, 2004 - DESCRIPTION "Registration of new IANA ifType 227 per RFC4631." - - REVISION "200406170000Z" -- June 17, 2004 - DESCRIPTION "Registration of new IANA ifType 226." - - REVISION "200405120000Z" -- May 12, 2004 - DESCRIPTION "Added description for IANAifType 6, and - changed the descriptions for IANAifTypes - 180, 181, and 182." - - REVISION "200405070000Z" -- May 7, 2004 - DESCRIPTION "Registration of new IANAifType 225." - - REVISION "200308250000Z" -- Aug 25, 2003 - DESCRIPTION "Deprecated IANAifTypes 7 and 11. Obsoleted - IANAifTypes 62, 69, and 117. ethernetCsmacd (6) - should be used instead of these values" - - REVISION "200308180000Z" -- Aug 18, 2003 - DESCRIPTION "Registration of new IANAifType - 224." - - REVISION "200308070000Z" -- Aug 7, 2003 - DESCRIPTION "Registration of new IANAifTypes - 222 and 223." - - REVISION "200303180000Z" -- Mar 18, 2003 - DESCRIPTION "Registration of new IANAifType - 221." - - REVISION "200301130000Z" -- Jan 13, 2003 - DESCRIPTION "Registration of new IANAifType - 220." - - REVISION "200210170000Z" -- Oct 17, 2002 - DESCRIPTION "Registration of new IANAifType - 219." - - REVISION "200207160000Z" -- Jul 16, 2002 - DESCRIPTION "Registration of new IANAifTypes - 217 and 218." - - REVISION "200207100000Z" -- Jul 10, 2002 - DESCRIPTION "Registration of new IANAifTypes - 215 and 216." - - REVISION "200206190000Z" -- Jun 19, 2002 - DESCRIPTION "Registration of new IANAifType - 214." - - REVISION "200201040000Z" -- Jan 4, 2002 - DESCRIPTION "Registration of new IANAifTypes - 211, 212 and 213." - - REVISION "200112200000Z" -- Dec 20, 2001 - DESCRIPTION "Registration of new IANAifTypes - 209 and 210." - - REVISION "200111150000Z" -- Nov 15, 2001 - DESCRIPTION "Registration of new IANAifTypes - 207 and 208." - - - REVISION "200111060000Z" -- Nov 6, 2001 - DESCRIPTION "Registration of new IANAifType - 206." - - - REVISION "200111020000Z" -- Nov 2, 2001 - DESCRIPTION "Registration of new IANAifType - 205." - - - REVISION "200110160000Z" -- Oct 16, 2001 - DESCRIPTION "Registration of new IANAifTypes - 199, 200, 201, 202, 203, and 204." - - - REVISION "200109190000Z" -- Sept 19, 2001 - DESCRIPTION "Registration of new IANAifType - 198." - - REVISION "200105110000Z" -- May 11, 2001 - DESCRIPTION "Registration of new IANAifType - 197." - - - REVISION "200101120000Z" -- Jan 12, 2001 - DESCRIPTION "Registration of new IANAifTypes - 195 and 196." - - REVISION "200012190000Z" -- Dec 19, 2000 - DESCRIPTION "Registration of new IANAifTypes - 193 and 194." - - REVISION "200012070000Z" -- Dec 07, 2000 - DESCRIPTION "Registration of new IANAifTypes - 191 and 192." - - REVISION "200012040000Z" -- Dec 04, 2000 - DESCRIPTION "Registration of new IANAifType - 190." - - REVISION "200010170000Z" -- Oct 17, 2000 - DESCRIPTION "Registration of new IANAifTypes - 188 and 189." - - REVISION "200010020000Z" -- Oct 02, 2000 - DESCRIPTION "Registration of new IANAifType 187." - - REVISION "200009010000Z" -- Sept 01, 2000 - DESCRIPTION "Registration of new IANAifTypes - 184, 185, and 186." - - REVISION "200008240000Z" -- Aug 24, 2000 - DESCRIPTION "Registration of new IANAifType 183." - - REVISION "200008230000Z" -- Aug 23, 2000 - DESCRIPTION "Registration of new IANAifTypes - 174-182." - - REVISION "200008220000Z" -- Aug 22, 2000 - DESCRIPTION "Registration of new IANAifTypes 170, - 171, 172 and 173." - - REVISION "200004250000Z" -- Apr 25, 2000 - DESCRIPTION "Registration of new IANAifTypes 168 and 169." - - REVISION "200003060000Z" -- Mar 6, 2000 - DESCRIPTION "Fixed a missing semi-colon in the IMPORT. - Also cleaned up the REVISION log a bit. - It is not complete, but from now on it will - be maintained and kept up to date with each - change to this MIB module." - - REVISION "199910081430Z" -- Oct 08, 1999 - DESCRIPTION "Include new name assignments up to cnr(85). - This is the first version available via the WWW - at: ftp://ftp.isi.edu/mib/ianaiftype.mib" - - REVISION "199401310000Z" -- Jan 31, 1994 - DESCRIPTION "Initial version of this MIB as published in - RFC 1573." - - ::= { mib-2 30 } - - - IANAifType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "This data type is used as the syntax of the ifType - object in the (updated) definition of MIB-II's - ifTable. - - The definition of this textual convention with the - addition of newly assigned values is published - periodically by the IANA, in either the Assigned - Numbers RFC, or some derivative of it specific to - Internet Network Management number assignments. (The - latest arrangements can be obtained by contacting the - IANA.) - - Requests for new values should be made to IANA via - email (iana&iana.org). - - The relationship between the assignment of ifType - values and of OIDs to particular media-specific MIBs - is solely the purview of IANA and is subject to change - without notice. Quite often, a media-specific MIB's - OID-subtree assignment within MIB-II's 'transmission' - subtree will be the same as its ifType value. - However, in some circumstances this will not be the - case, and implementors must not pre-assume any - specific relationship between ifType values and - transmission subtree OIDs." - SYNTAX INTEGER { - other(1), -- none of the following - regular1822(2), - hdh1822(3), - ddnX25(4), - rfc877x25(5), - ethernetCsmacd(6), -- for all ethernet-like interfaces, - -- regardless of speed, as per RFC3635 - iso88023Csmacd(7), -- Deprecated via RFC3635 - -- ethernetCsmacd (6) should be used instead - iso88024TokenBus(8), - iso88025TokenRing(9), - iso88026Man(10), - starLan(11), -- Deprecated via RFC3635 - -- ethernetCsmacd (6) should be used instead - proteon10Mbit(12), - proteon80Mbit(13), - hyperchannel(14), - fddi(15), - lapb(16), - sdlc(17), - ds1(18), -- DS1-MIB - e1(19), -- Obsolete see DS1-MIB - basicISDN(20), -- no longer used - -- see also RFC2127 - primaryISDN(21), -- no longer used - -- see also RFC2127 - propPointToPointSerial(22), -- proprietary serial - ppp(23), - softwareLoopback(24), - eon(25), -- CLNP over IP - ethernet3Mbit(26), - nsip(27), -- XNS over IP - slip(28), -- generic SLIP - ultra(29), -- ULTRA technologies - ds3(30), -- DS3-MIB - sip(31), -- SMDS, coffee - frameRelay(32), -- DTE only. - rs232(33), - para(34), -- parallel-port - arcnet(35), -- arcnet - arcnetPlus(36), -- arcnet plus - atm(37), -- ATM cells - miox25(38), - sonet(39), -- SONET or SDH - x25ple(40), - iso88022llc(41), - localTalk(42), - smdsDxi(43), - frameRelayService(44), -- FRNETSERV-MIB - v35(45), - hssi(46), - hippi(47), - modem(48), -- Generic modem - aal5(49), -- AAL5 over ATM - sonetPath(50), - sonetVT(51), - smdsIcip(52), -- SMDS InterCarrier Interface - propVirtual(53), -- proprietary virtual/internal - propMultiplexor(54),-- proprietary multiplexing - ieee80212(55), -- 100BaseVG - fibreChannel(56), -- Fibre Channel - hippiInterface(57), -- HIPPI interfaces - frameRelayInterconnect(58), -- Obsolete use either - -- frameRelay(32) or - -- frameRelayService(44). - aflane8023(59), -- ATM Emulated LAN for 802.3 - aflane8025(60), -- ATM Emulated LAN for 802.5 - cctEmul(61), -- ATM Emulated circuit - fastEther(62), -- Obsoleted via RFC3635 - -- ethernetCsmacd (6) should be used instead - isdn(63), -- ISDN and X.25 - v11(64), -- CCITT V.11/X.21 - v36(65), -- CCITT V.36 - g703at64k(66), -- CCITT G703 at 64Kbps - g703at2mb(67), -- Obsolete see DS1-MIB - qllc(68), -- SNA QLLC - fastEtherFX(69), -- Obsoleted via RFC3635 - -- ethernetCsmacd (6) should be used instead - channel(70), -- channel - ieee80211(71), -- radio spread spectrum - ibm370parChan(72), -- IBM System 360/370 OEMI Channel - escon(73), -- IBM Enterprise Systems Connection - dlsw(74), -- Data Link Switching - isdns(75), -- ISDN S/T interface - isdnu(76), -- ISDN U interface - lapd(77), -- Link Access Protocol D - ipSwitch(78), -- IP Switching Objects - rsrb(79), -- Remote Source Route Bridging - atmLogical(80), -- ATM Logical Port - ds0(81), -- Digital Signal Level 0 - ds0Bundle(82), -- group of ds0s on the same ds1 - bsc(83), -- Bisynchronous Protocol - async(84), -- Asynchronous Protocol - cnr(85), -- Combat Net Radio - iso88025Dtr(86), -- ISO 802.5r DTR - eplrs(87), -- Ext Pos Loc Report Sys - arap(88), -- Appletalk Remote Access Protocol - propCnls(89), -- Proprietary Connectionless Protocol - hostPad(90), -- CCITT-ITU X.29 PAD Protocol - termPad(91), -- CCITT-ITU X.3 PAD Facility - frameRelayMPI(92), -- Multiproto Interconnect over FR - x213(93), -- CCITT-ITU X213 - adsl(94), -- Asymmetric Digital Subscriber Loop - radsl(95), -- Rate-Adapt. Digital Subscriber Loop - sdsl(96), -- Symmetric Digital Subscriber Loop - vdsl(97), -- Very H-Speed Digital Subscrib. Loop - iso88025CRFPInt(98), -- ISO 802.5 CRFP - myrinet(99), -- Myricom Myrinet - voiceEM(100), -- voice recEive and transMit - voiceFXO(101), -- voice Foreign Exchange Office - voiceFXS(102), -- voice Foreign Exchange Station - voiceEncap(103), -- voice encapsulation - voiceOverIp(104), -- voice over IP encapsulation - atmDxi(105), -- ATM DXI - atmFuni(106), -- ATM FUNI - atmIma (107), -- ATM IMA - pppMultilinkBundle(108), -- PPP Multilink Bundle - ipOverCdlc (109), -- IBM ipOverCdlc - ipOverClaw (110), -- IBM Common Link Access to Workstn - stackToStack (111), -- IBM stackToStack - virtualIpAddress (112), -- IBM VIPA - mpc (113), -- IBM multi-protocol channel support - ipOverAtm (114), -- IBM ipOverAtm - iso88025Fiber (115), -- ISO 802.5j Fiber Token Ring - tdlc (116), -- IBM twinaxial data link control - gigabitEthernet (117), -- Obsoleted via RFC3635 - -- ethernetCsmacd (6) should be used instead - hdlc (118), -- HDLC - lapf (119), -- LAP F - v37 (120), -- V.37 - x25mlp (121), -- Multi-Link Protocol - x25huntGroup (122), -- X25 Hunt Group - trasnpHdlc (123), -- Transp HDLC - interleave (124), -- Interleave channel - fast (125), -- Fast channel - ip (126), -- IP (for APPN HPR in IP networks) - docsCableMaclayer (127), -- CATV Mac Layer - docsCableDownstream (128), -- CATV Downstream interface - docsCableUpstream (129), -- CATV Upstream interface - a12MppSwitch (130), -- Avalon Parallel Processor - tunnel (131), -- Encapsulation interface - coffee (132), -- coffee pot - ces (133), -- Circuit Emulation Service - atmSubInterface (134), -- ATM Sub Interface - l2vlan (135), -- Layer 2 Virtual LAN using 802.1Q - l3ipvlan (136), -- Layer 3 Virtual LAN using IP - l3ipxvlan (137), -- Layer 3 Virtual LAN using IPX - digitalPowerline (138), -- IP over Power Lines - mediaMailOverIp (139), -- Multimedia Mail over IP - dtm (140), -- Dynamic syncronous Transfer Mode - dcn (141), -- Data Communications Network - ipForward (142), -- IP Forwarding Interface - msdsl (143), -- Multi-rate Symmetric DSL - ieee1394 (144), -- IEEE1394 High Performance Serial Bus - if-gsn (145), -- HIPPI-6400 - dvbRccMacLayer (146), -- DVB-RCC MAC Layer - dvbRccDownstream (147), -- DVB-RCC Downstream Channel - dvbRccUpstream (148), -- DVB-RCC Upstream Channel - atmVirtual (149), -- ATM Virtual Interface - mplsTunnel (150), -- MPLS Tunnel Virtual Interface - srp (151), -- Spatial Reuse Protocol - voiceOverAtm (152), -- Voice Over ATM - voiceOverFrameRelay (153), -- Voice Over Frame Relay - idsl (154), -- Digital Subscriber Loop over ISDN - compositeLink (155), -- Avici Composite Link Interface - ss7SigLink (156), -- SS7 Signaling Link - propWirelessP2P (157), -- Prop. P2P wireless interface - frForward (158), -- Frame Forward Interface - rfc1483 (159), -- Multiprotocol over ATM AAL5 - usb (160), -- USB Interface - ieee8023adLag (161), -- IEEE 802.3ad Link Aggregate - bgppolicyaccounting (162), -- BGP Policy Accounting - frf16MfrBundle (163), -- FRF .16 Multilink Frame Relay - h323Gatekeeper (164), -- H323 Gatekeeper - h323Proxy (165), -- H323 Voice and Video Proxy - mpls (166), -- MPLS - mfSigLink (167), -- Multi-frequency signaling link - hdsl2 (168), -- High Bit-Rate DSL - 2nd generation - shdsl (169), -- Multirate HDSL2 - ds1FDL (170), -- Facility Data Link 4Kbps on a DS1 - pos (171), -- Packet over SONET/SDH Interface - dvbAsiIn (172), -- DVB-ASI Input - dvbAsiOut (173), -- DVB-ASI Output - plc (174), -- Power Line Communtications - nfas (175), -- Non Facility Associated Signaling - tr008 (176), -- TR008 - gr303RDT (177), -- Remote Digital Terminal - gr303IDT (178), -- Integrated Digital Terminal - isup (179), -- ISUP - propDocsWirelessMaclayer (180), -- Cisco proprietary Maclayer - propDocsWirelessDownstream (181), -- Cisco proprietary Downstream - propDocsWirelessUpstream (182), -- Cisco proprietary Upstream - hiperlan2 (183), -- HIPERLAN Type 2 Radio Interface - propBWAp2Mp (184), -- PropBroadbandWirelessAccesspt2multipt - -- use of this iftype for IEEE 802.16 WMAN - -- interfaces as per IEEE Std 802.16f is - -- deprecated and ifType 237 should be used instead. - sonetOverheadChannel (185), -- SONET Overhead Channel - digitalWrapperOverheadChannel (186), -- Digital Wrapper - aal2 (187), -- ATM adaptation layer 2 - radioMAC (188), -- MAC layer over radio links - atmRadio (189), -- ATM over radio links - imt (190), -- Inter Machine Trunks - mvl (191), -- Multiple Virtual Lines DSL - reachDSL (192), -- Long Reach DSL - frDlciEndPt (193), -- Frame Relay DLCI End Point - atmVciEndPt (194), -- ATM VCI End Point - opticalChannel (195), -- Optical Channel - opticalTransport (196), -- Optical Transport - propAtm (197), -- Proprietary ATM - voiceOverCable (198), -- Voice Over Cable Interface - infiniband (199), -- Infiniband - teLink (200), -- TE Link - q2931 (201), -- Q.2931 - virtualTg (202), -- Virtual Trunk Group - sipTg (203), -- SIP Trunk Group - sipSig (204), -- SIP Signaling - docsCableUpstreamChannel (205), -- CATV Upstream Channel - econet (206), -- Acorn Econet - pon155 (207), -- FSAN 155Mb Symetrical PON interface - pon622 (208), -- FSAN622Mb Symetrical PON interface - bridge (209), -- Transparent bridge interface - linegroup (210), -- Interface common to multiple lines - voiceEMFGD (211), -- voice E&M Feature Group D - voiceFGDEANA (212), -- voice FGD Exchange Access North American - voiceDID (213), -- voice Direct Inward Dialing - mpegTransport (214), -- MPEG transport interface - sixToFour (215), -- 6to4 interface (DEPRECATED) - gtp (216), -- GTP (GPRS Tunneling Protocol) - pdnEtherLoop1 (217), -- Paradyne EtherLoop 1 - pdnEtherLoop2 (218), -- Paradyne EtherLoop 2 - opticalChannelGroup (219), -- Optical Channel Group - homepna (220), -- HomePNA ITU-T G.989 - gfp (221), -- Generic Framing Procedure (GFP) - ciscoISLvlan (222), -- Layer 2 Virtual LAN using Cisco ISL - actelisMetaLOOP (223), -- Acteleis proprietary MetaLOOP High Speed Link - fcipLink (224), -- FCIP Link - rpr (225), -- Resilient Packet Ring Interface Type - qam (226), -- RF Qam Interface - lmp (227), -- Link Management Protocol - cblVectaStar (228), -- Cambridge Broadband Networks Limited VectaStar - docsCableMCmtsDownstream (229), -- CATV Modular CMTS Downstream Interface - adsl2 (230), -- Asymmetric Digital Subscriber Loop Version 2 - -- (DEPRECATED/OBSOLETED - please use adsl2plus 238 instead) - macSecControlledIF (231), -- MACSecControlled - macSecUncontrolledIF (232), -- MACSecUncontrolled - aviciOpticalEther (233), -- Avici Optical Ethernet Aggregate - atmbond (234), -- atmbond - voiceFGDOS (235), -- voice FGD Operator Services - mocaVersion1 (236), -- MultiMedia over Coax Alliance (MoCA) Interface - -- as documented in information provided privately to IANA - ieee80216WMAN (237), -- IEEE 802.16 WMAN interface - adsl2plus (238), -- Asymmetric Digital Subscriber Loop Version 2, - -- Version 2 Plus and all variants - dvbRcsMacLayer (239), -- DVB-RCS MAC Layer - dvbTdm (240), -- DVB Satellite TDM - dvbRcsTdma (241), -- DVB-RCS TDMA - x86Laps (242), -- LAPS based on ITU-T X.86/Y.1323 - wwanPP (243), -- 3GPP WWAN - wwanPP2 (244) -- 3GPP2 WWAN - } - -IANAtunnelType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The encapsulation method used by a tunnel. The value - direct indicates that a packet is encapsulated - directly within a normal IP header, with no - intermediate header, and unicast to the remote tunnel - endpoint (e.g., an RFC 2003 IP-in-IP tunnel, or an RFC - 1933 IPv6-in-IPv4 tunnel). The value minimal indicates - that a Minimal Forwarding Header (RFC 2004) is - inserted between the outer header and the payload - packet. The value UDP indicates that the payload - packet is encapsulated within a normal UDP packet - (e.g., RFC 1234). - - The values sixToFour, sixOverFour, and isatap - indicates that an IPv6 packet is encapsulated directly - within an IPv4 header, with no intermediate header, - and unicast to the destination determined by the 6to4, - 6over4, or ISATAP protocol. - - The remaining protocol-specific values indicate that a - header of the protocol of that name is inserted - between the outer header and the payload header. - - The assignment policy for IANAtunnelType values is - identical to the policy for assigning IANAifType - values." - SYNTAX INTEGER { - other(1), -- none of the following - direct(2), -- no intermediate header - gre(3), -- GRE encapsulation - minimal(4), -- Minimal encapsulation - l2tp(5), -- L2TP encapsulation - pptp(6), -- PPTP encapsulation - l2f(7), -- L2F encapsulation - udp(8), -- UDP encapsulation - atmp(9), -- ATMP encapsulation - msdp(10), -- MSDP encapsulation - sixToFour(11), -- 6to4 encapsulation - sixOverFour(12), -- 6over4 encapsulation - isatap(13), -- ISATAP encapsulation - teredo(14) -- Teredo encapsulation - } - - END - - - - - - - - - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB deleted file mode 100644 index 8713894..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IF-MIB +++ /dev/null @@ -1,1899 +0,0 @@ -IF-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Counter64, - Integer32, TimeTicks, mib-2, - NOTIFICATION-TYPE FROM SNMPv2-SMI - TEXTUAL-CONVENTION, DisplayString, - PhysAddress, TruthValue, RowStatus, - TimeStamp, AutonomousType, TestAndIncr FROM SNMPv2-TC - MODULE-COMPLIANCE, OBJECT-GROUP, - NOTIFICATION-GROUP FROM SNMPv2-CONF - snmpTraps FROM SNMPv2-MIB - IANAifType FROM IANAifType-MIB; - - -ifMIB MODULE-IDENTITY - LAST-UPDATED "200006140000Z" - ORGANIZATION "IETF Interfaces MIB Working Group" - CONTACT-INFO - " Keith McCloghrie - Cisco Systems, Inc. - 170 West Tasman Drive - San Jose, CA 95134-1706 - US - - 408-526-5260 - kzm@cisco.com" - DESCRIPTION - "The MIB module to describe generic objects for network - interface sub-layers. This MIB is an updated version of - MIB-II's ifTable, and incorporates the extensions defined in - RFC 1229." - - - REVISION "200006140000Z" - DESCRIPTION - "Clarifications agreed upon by the Interfaces MIB WG, and - published as RFC 2863." - REVISION "199602282155Z" - DESCRIPTION - "Revisions made by the Interfaces MIB WG, and published in - RFC 2233." - REVISION "199311082155Z" - DESCRIPTION - "Initial revision, published as part of RFC 1573." - ::= { mib-2 31 } - - -ifMIBObjects OBJECT IDENTIFIER ::= { ifMIB 1 } - -interfaces OBJECT IDENTIFIER ::= { mib-2 2 } - --- --- Textual Conventions --- - - --- OwnerString has the same semantics as used in RFC 1271 - -OwnerString ::= TEXTUAL-CONVENTION - DISPLAY-HINT "255a" - STATUS deprecated - DESCRIPTION - "This data type is used to model an administratively - assigned name of the owner of a resource. This information - is taken from the NVT ASCII character set. It is suggested - that this name contain one or more of the following: ASCII - form of the manager station's transport address, management - station name (e.g., domain name), network management - personnel's name, location, or phone number. In some cases - the agent itself will be the owner of an entry. In these - cases, this string shall be set to a string starting with - 'agent'." - SYNTAX OCTET STRING (SIZE(0..255)) - --- InterfaceIndex contains the semantics of ifIndex and should be used --- for any objects defined in other MIB modules that need these semantics. - -InterfaceIndex ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - - - "A unique value, greater than zero, for each interface or - interface sub-layer in the managed system. It is - recommended that values are assigned contiguously starting - from 1. The value for each interface sub-layer must remain - constant at least from one re-initialization of the entity's - network management system to the next re-initialization." - SYNTAX Integer32 (1..2147483647) - -InterfaceIndexOrZero ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - "This textual convention is an extension of the - InterfaceIndex convention. The latter defines a greater - than zero value used to identify an interface or interface - sub-layer in the managed system. This extension permits the - additional value of zero. the value zero is object-specific - and must therefore be defined as part of the description of - any object which uses this syntax. Examples of the usage of - zero might include situations where interface was unknown, - or when none or all interfaces need to be referenced." - SYNTAX Integer32 (0..2147483647) - -ifNumber OBJECT-TYPE - SYNTAX Integer32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of network interfaces (regardless of their - current state) present on this system." - ::= { interfaces 1 } - -ifTableLastChange OBJECT-TYPE - SYNTAX TimeTicks - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time of the last creation or - deletion of an entry in the ifTable. If the number of - entries has been unchanged since the last re-initialization - of the local network management subsystem, then this object - contains a zero value." - ::= { ifMIBObjects 5 } - - --- the Interfaces table - --- The Interfaces table contains information on the entity's - - --- interfaces. Each sub-layer below the internetwork-layer --- of a network interface is considered to be an interface. - -ifTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A list of interface entries. The number of entries is - given by the value of ifNumber." - ::= { interfaces 2 } - -ifEntry OBJECT-TYPE - SYNTAX IfEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry containing management information applicable to a - particular interface." - INDEX { ifIndex } - ::= { ifTable 1 } - -IfEntry ::= - SEQUENCE { - ifIndex InterfaceIndex, - ifDescr DisplayString, - ifType IANAifType, - ifMtu Integer32, - ifSpeed Gauge32, - ifPhysAddress PhysAddress, - ifAdminStatus INTEGER, - ifOperStatus INTEGER, - ifLastChange TimeTicks, - ifInOctets Counter32, - ifInUcastPkts Counter32, - ifInNUcastPkts Counter32, -- deprecated - ifInDiscards Counter32, - ifInErrors Counter32, - ifInUnknownProtos Counter32, - ifOutOctets Counter32, - ifOutUcastPkts Counter32, - ifOutNUcastPkts Counter32, -- deprecated - ifOutDiscards Counter32, - ifOutErrors Counter32, - ifOutQLen Gauge32, -- deprecated - ifSpecific OBJECT IDENTIFIER -- deprecated - } - - - -ifIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A unique value, greater than zero, for each interface. It - is recommended that values are assigned contiguously - starting from 1. The value for each interface sub-layer - must remain constant at least from one re-initialization of - the entity's network management system to the next re- - initialization." - ::= { ifEntry 1 } - -ifDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A textual string containing information about the - interface. This string should include the name of the - manufacturer, the product name and the version of the - interface hardware/software." - ::= { ifEntry 2 } - -ifType OBJECT-TYPE - SYNTAX IANAifType - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The type of interface. Additional values for ifType are - assigned by the Internet Assigned Numbers Authority (IANA), - through updating the syntax of the IANAifType textual - convention." - ::= { ifEntry 3 } - -ifMtu OBJECT-TYPE - SYNTAX Integer32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The size of the largest packet which can be sent/received - on the interface, specified in octets. For interfaces that - are used for transmitting network datagrams, this is the - size of the largest network datagram that can be sent on the - interface." - ::= { ifEntry 4 } - -ifSpeed OBJECT-TYPE - - - SYNTAX Gauge32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "An estimate of the interface's current bandwidth in bits - per second. For interfaces which do not vary in bandwidth - or for those where no accurate estimation can be made, this - object should contain the nominal bandwidth. If the - bandwidth of the interface is greater than the maximum value - reportable by this object then this object should report its - maximum value (4,294,967,295) and ifHighSpeed must be used - to report the interace's speed. For a sub-layer which has - no concept of bandwidth, this object should be zero." - ::= { ifEntry 5 } - -ifPhysAddress OBJECT-TYPE - SYNTAX PhysAddress - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The interface's address at its protocol sub-layer. For - example, for an 802.x interface, this object normally - contains a MAC address. The interface's media-specific MIB - must define the bit and byte ordering and the format of the - value of this object. For interfaces which do not have such - an address (e.g., a serial line), this object should contain - an octet string of zero length." - ::= { ifEntry 6 } - -ifAdminStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3) -- in some test mode - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The desired state of the interface. The testing(3) state - indicates that no operational packets can be passed. When a - managed system initializes, all interfaces start with - ifAdminStatus in the down(2) state. As a result of either - explicit management action or per configuration information - retained by the managed system, ifAdminStatus is then - changed to either the up(1) or testing(3) states (or remains - in the down(2) state)." - ::= { ifEntry 7 } - - - -ifOperStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3), -- in some test mode - unknown(4), -- status can not be determined - -- for some reason. - dormant(5), - notPresent(6), -- some component is missing - lowerLayerDown(7) -- down due to state of - -- lower-layer interface(s) - } - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The current operational state of the interface. The - testing(3) state indicates that no operational packets can - be passed. If ifAdminStatus is down(2) then ifOperStatus - should be down(2). If ifAdminStatus is changed to up(1) - then ifOperStatus should change to up(1) if the interface is - ready to transmit and receive network traffic; it should - change to dormant(5) if the interface is waiting for - external actions (such as a serial line waiting for an - incoming connection); it should remain in the down(2) state - if and only if there is a fault that prevents it from going - to the up(1) state; it should remain in the notPresent(6) - state if the interface has missing (typically, hardware) - components." - ::= { ifEntry 8 } - -ifLastChange OBJECT-TYPE - SYNTAX TimeTicks - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time the interface entered - its current operational state. If the current state was - entered prior to the last re-initialization of the local - network management subsystem, then this object contains a - zero value." - ::= { ifEntry 9 } - -ifInOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received on the interface, - - - including framing characters. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 10 } - -ifInUcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were not addressed to a multicast - or broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 11 } - -ifInNUcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were addressed to a multicast or - broadcast address at this sub-layer. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime. - - This object is deprecated in favour of ifInMulticastPkts and - ifInBroadcastPkts." - ::= { ifEntry 12 } - -ifInDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of inbound packets which were chosen to be - discarded even though no errors had been detected to prevent - - - their being deliverable to a higher-layer protocol. One - possible reason for discarding such a packet could be to - free up buffer space. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 13 } - -ifInErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "For packet-oriented interfaces, the number of inbound - packets that contained errors preventing them from being - deliverable to a higher-layer protocol. For character- - oriented or fixed-length interfaces, the number of inbound - transmission units that contained errors preventing them - from being deliverable to a higher-layer protocol. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 14 } - -ifInUnknownProtos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "For packet-oriented interfaces, the number of packets - received via the interface which were discarded because of - an unknown or unsupported protocol. For character-oriented - or fixed-length interfaces that support protocol - multiplexing the number of transmission units received via - the interface which were discarded because of an unknown or - unsupported protocol. For any interface that does not - support protocol multiplexing, this counter will always be - 0. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 15 } - - -ifOutOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted out of the - interface, including framing characters. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 16 } - -ifOutUcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were not addressed to a - multicast or broadcast address at this sub-layer, including - those that were discarded or not sent. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 17 } - -ifOutNUcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were addressed to a - multicast or broadcast address at this sub-layer, including - those that were discarded or not sent. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime. - - This object is deprecated in favour of ifOutMulticastPkts - and ifOutBroadcastPkts." - ::= { ifEntry 18 } - - -ifOutDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of outbound packets which were chosen to be - discarded even though no errors had been detected to prevent - their being transmitted. One possible reason for discarding - such a packet could be to free up buffer space. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 19 } - -ifOutErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "For packet-oriented interfaces, the number of outbound - packets that could not be transmitted because of errors. - For character-oriented or fixed-length interfaces, the - number of outbound transmission units that could not be - transmitted because of errors. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifEntry 20 } - -ifOutQLen OBJECT-TYPE - SYNTAX Gauge32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The length of the output packet queue (in packets)." - ::= { ifEntry 21 } - -ifSpecific OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "A reference to MIB definitions specific to the particular - media being used to realize the interface. It is - - - recommended that this value point to an instance of a MIB - object in the media-specific MIB, i.e., that this object - have the semantics associated with the InstancePointer - textual convention defined in RFC 2579. In fact, it is - recommended that the media-specific MIB specify what value - ifSpecific should/can take for values of ifType. If no MIB - definitions specific to the particular media are available, - the value should be set to the OBJECT IDENTIFIER { 0 0 }." - ::= { ifEntry 22 } - - - --- --- Extension to the interface table --- --- This table replaces the ifExtnsTable table. --- - -ifXTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfXEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A list of interface entries. The number of entries is - given by the value of ifNumber. This table contains - additional objects for the interface table." - ::= { ifMIBObjects 1 } - -ifXEntry OBJECT-TYPE - SYNTAX IfXEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry containing additional management information - applicable to a particular interface." - AUGMENTS { ifEntry } - ::= { ifXTable 1 } - -IfXEntry ::= - SEQUENCE { - ifName DisplayString, - ifInMulticastPkts Counter32, - ifInBroadcastPkts Counter32, - ifOutMulticastPkts Counter32, - ifOutBroadcastPkts Counter32, - ifHCInOctets Counter64, - ifHCInUcastPkts Counter64, - ifHCInMulticastPkts Counter64, - - - ifHCInBroadcastPkts Counter64, - ifHCOutOctets Counter64, - ifHCOutUcastPkts Counter64, - ifHCOutMulticastPkts Counter64, - ifHCOutBroadcastPkts Counter64, - ifLinkUpDownTrapEnable INTEGER, - ifHighSpeed Gauge32, - ifPromiscuousMode TruthValue, - ifConnectorPresent TruthValue, - ifAlias DisplayString, - ifCounterDiscontinuityTime TimeStamp - } - - -ifName OBJECT-TYPE - SYNTAX DisplayString - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The textual name of the interface. The value of this - object should be the name of the interface as assigned by - the local device and should be suitable for use in commands - entered at the device's `console'. This might be a text - name, such as `le0' or a simple port number, such as `1', - depending on the interface naming syntax of the device. If - several entries in the ifTable together represent a single - interface as named by the device, then each will have the - same value of ifName. Note that for an agent which responds - to SNMP queries concerning an interface on some other - (proxied) device, then the value of ifName for such an - interface is the proxied device's local name for it. - - If there is no local name, or this object is otherwise not - applicable, then this object contains a zero-length string." - ::= { ifXEntry 1 } - -ifInMulticastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were addressed to a multicast - address at this sub-layer. For a MAC layer protocol, this - includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - - - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 2 } - -ifInBroadcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were addressed to a broadcast - address at this sub-layer. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 3 } - -ifOutMulticastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were addressed to a - multicast address at this sub-layer, including those that - were discarded or not sent. For a MAC layer protocol, this - includes both Group and Functional addresses. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 4 } - -ifOutBroadcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were addressed to a - broadcast address at this sub-layer, including those that - were discarded or not sent. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - - - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 5 } - --- --- High Capacity Counter objects. These objects are all --- 64 bit versions of the "basic" ifTable counters. These --- objects all have the same basic semantics as their 32-bit --- counterparts, however, their syntax has been extended --- to 64 bits. --- - -ifHCInOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received on the interface, - including framing characters. This object is a 64-bit - version of ifInOctets. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 6 } - -ifHCInUcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were not addressed to a multicast - or broadcast address at this sub-layer. This object is a - 64-bit version of ifInUcastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 7 } - -ifHCInMulticastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were addressed to a multicast - address at this sub-layer. For a MAC layer protocol, this - includes both Group and Functional addresses. This object - is a 64-bit version of ifInMulticastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 8 } - -ifHCInBroadcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of packets, delivered by this sub-layer to a - higher (sub-)layer, which were addressed to a broadcast - address at this sub-layer. This object is a 64-bit version - of ifInBroadcastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 9 } - -ifHCOutOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted out of the - interface, including framing characters. This object is a - 64-bit version of ifOutOctets. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 10 } - -ifHCOutUcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - "The total number of packets that higher-level protocols - requested be transmitted, and which were not addressed to a - multicast or broadcast address at this sub-layer, including - those that were discarded or not sent. This object is a - 64-bit version of ifOutUcastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 11 } - -ifHCOutMulticastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were addressed to a - multicast address at this sub-layer, including those that - were discarded or not sent. For a MAC layer protocol, this - includes both Group and Functional addresses. This object - is a 64-bit version of ifOutMulticastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 12 } - -ifHCOutBroadcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of packets that higher-level protocols - requested be transmitted, and which were addressed to a - broadcast address at this sub-layer, including those that - were discarded or not sent. This object is a 64-bit version - of ifOutBroadcastPkts. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ifCounterDiscontinuityTime." - ::= { ifXEntry 13 } - -ifLinkUpDownTrapEnable OBJECT-TYPE - - - SYNTAX INTEGER { enabled(1), disabled(2) } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Indicates whether linkUp/linkDown traps should be generated - for this interface. - - By default, this object should have the value enabled(1) for - interfaces which do not operate on 'top' of any other - interface (as defined in the ifStackTable), and disabled(2) - otherwise." - ::= { ifXEntry 14 } - -ifHighSpeed OBJECT-TYPE - SYNTAX Gauge32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "An estimate of the interface's current bandwidth in units - of 1,000,000 bits per second. If this object reports a - value of `n' then the speed of the interface is somewhere in - the range of `n-500,000' to `n+499,999'. For interfaces - which do not vary in bandwidth or for those where no - accurate estimation can be made, this object should contain - the nominal bandwidth. For a sub-layer which has no concept - of bandwidth, this object should be zero." - ::= { ifXEntry 15 } - -ifPromiscuousMode OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "This object has a value of false(2) if this interface only - accepts packets/frames that are addressed to this station. - This object has a value of true(1) when the station accepts - all packets/frames transmitted on the media. The value - true(1) is only legal on certain types of media. If legal, - setting this object to a value of true(1) may require the - interface to be reset before becoming effective. - - The value of ifPromiscuousMode does not affect the reception - of broadcast and multicast packets/frames by the interface." - ::= { ifXEntry 16 } - -ifConnectorPresent OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-only - - - STATUS current - DESCRIPTION - "This object has the value 'true(1)' if the interface - sublayer has a physical connector and the value 'false(2)' - otherwise." - ::= { ifXEntry 17 } - -ifAlias OBJECT-TYPE - SYNTAX DisplayString (SIZE(0..64)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "This object is an 'alias' name for the interface as - specified by a network manager, and provides a non-volatile - 'handle' for the interface. - - On the first instantiation of an interface, the value of - ifAlias associated with that interface is the zero-length - string. As and when a value is written into an instance of - ifAlias through a network management set operation, then the - agent must retain the supplied value in the ifAlias instance - associated with the same interface for as long as that - interface remains instantiated, including across all re- - initializations/reboots of the network management system, - including those which result in a change of the interface's - ifIndex value. - - An example of the value which a network manager might store - in this object for a WAN interface is the (Telco's) circuit - number/identifier of the interface. - - Some agents may support write-access only for interfaces - having particular values of ifType. An agent which supports - write access to this object is required to keep the value in - non-volatile storage, but it may limit the length of new - values depending on how much storage is already occupied by - the current values for other interfaces." - ::= { ifXEntry 18 } - -ifCounterDiscontinuityTime OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - any one or more of this interface's counters suffered a - discontinuity. The relevant counters are the specific - instances associated with this interface of any Counter32 or - - - Counter64 object contained in the ifTable or ifXTable. If - no such discontinuities have occurred since the last re- - initialization of the local management subsystem, then this - object contains a zero value." - ::= { ifXEntry 19 } - --- The Interface Stack Group --- --- Implementation of this group is optional, but strongly recommended --- for all systems --- - -ifStackTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfStackEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing information on the relationships - between the multiple sub-layers of network interfaces. In - particular, it contains information on which sub-layers run - 'on top of' which other sub-layers, where each sub-layer - corresponds to a conceptual row in the ifTable. For - example, when the sub-layer with ifIndex value x runs over - the sub-layer with ifIndex value y, then this table - contains: - - ifStackStatus.x.y=active - - For each ifIndex value, I, which identifies an active - interface, there are always at least two instantiated rows - in this table associated with I. For one of these rows, I - is the value of ifStackHigherLayer; for the other, I is the - value of ifStackLowerLayer. (If I is not involved in - multiplexing, then these are the only two rows associated - with I.) - - For example, two rows exist even for an interface which has - no others stacked on top or below it: - - ifStackStatus.0.x=active - ifStackStatus.x.0=active " - ::= { ifMIBObjects 2 } - - -ifStackEntry OBJECT-TYPE - SYNTAX IfStackEntry - MAX-ACCESS not-accessible - STATUS current - - - DESCRIPTION - "Information on a particular relationship between two sub- - layers, specifying that one sub-layer runs on 'top' of the - other sub-layer. Each sub-layer corresponds to a conceptual - row in the ifTable." - INDEX { ifStackHigherLayer, ifStackLowerLayer } - ::= { ifStackTable 1 } - - -IfStackEntry ::= - SEQUENCE { - ifStackHigherLayer InterfaceIndexOrZero, - ifStackLowerLayer InterfaceIndexOrZero, - ifStackStatus RowStatus - } - - -ifStackHigherLayer OBJECT-TYPE - SYNTAX InterfaceIndexOrZero - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The value of ifIndex corresponding to the higher sub-layer - of the relationship, i.e., the sub-layer which runs on 'top' - of the sub-layer identified by the corresponding instance of - ifStackLowerLayer. If there is no higher sub-layer (below - the internetwork layer), then this object has the value 0." - ::= { ifStackEntry 1 } - - -ifStackLowerLayer OBJECT-TYPE - SYNTAX InterfaceIndexOrZero - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The value of ifIndex corresponding to the lower sub-layer - of the relationship, i.e., the sub-layer which runs 'below' - the sub-layer identified by the corresponding instance of - ifStackHigherLayer. If there is no lower sub-layer, then - this object has the value 0." - ::= { ifStackEntry 2 } - - -ifStackStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-create - STATUS current - DESCRIPTION - - - "The status of the relationship between two sub-layers. - - Changing the value of this object from 'active' to - 'notInService' or 'destroy' will likely have consequences up - and down the interface stack. Thus, write access to this - object is likely to be inappropriate for some types of - interfaces, and many implementations will choose not to - support write-access for any type of interface." - ::= { ifStackEntry 3 } - -ifStackLastChange OBJECT-TYPE - SYNTAX TimeTicks - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time of the last change of - the (whole) interface stack. A change of the interface - stack is defined to be any creation, deletion, or change in - value of any instance of ifStackStatus. If the interface - stack has been unchanged since the last re-initialization of - the local network management subsystem, then this object - contains a zero value." - ::= { ifMIBObjects 6 } - - --- Generic Receive Address Table --- --- This group of objects is mandatory for all types of --- interfaces which can receive packets/frames addressed to --- more than one address. --- --- This table replaces the ifExtnsRcvAddr table. The main --- difference is that this table makes use of the RowStatus --- textual convention, while ifExtnsRcvAddr did not. - -ifRcvAddressTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfRcvAddressEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "This table contains an entry for each address (broadcast, - multicast, or uni-cast) for which the system will receive - packets/frames on a particular interface, except as follows: - - - for an interface operating in promiscuous mode, entries - are only required for those addresses for which the system - would receive frames were it not operating in promiscuous - mode. - - - - for 802.5 functional addresses, only one entry is - required, for the address which has the functional address - bit ANDed with the bit mask of all functional addresses for - which the interface will accept frames. - - A system is normally able to use any unicast address which - corresponds to an entry in this table as a source address." - ::= { ifMIBObjects 4 } - -ifRcvAddressEntry OBJECT-TYPE - SYNTAX IfRcvAddressEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A list of objects identifying an address for which the - system will accept packets/frames on the particular - interface identified by the index value ifIndex." - INDEX { ifIndex, ifRcvAddressAddress } - ::= { ifRcvAddressTable 1 } - -IfRcvAddressEntry ::= - SEQUENCE { - ifRcvAddressAddress PhysAddress, - ifRcvAddressStatus RowStatus, - ifRcvAddressType INTEGER - } - -ifRcvAddressAddress OBJECT-TYPE - SYNTAX PhysAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An address for which the system will accept packets/frames - on this entry's interface." - ::= { ifRcvAddressEntry 1 } - -ifRcvAddressStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "This object is used to create and delete rows in the - ifRcvAddressTable." - - ::= { ifRcvAddressEntry 2 } - -ifRcvAddressType OBJECT-TYPE - SYNTAX INTEGER { - - - other(1), - volatile(2), - nonVolatile(3) - } - - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "This object has the value nonVolatile(3) for those entries - in the table which are valid and will not be deleted by the - next restart of the managed system. Entries having the - value volatile(2) are valid and exist, but have not been - saved, so that will not exist after the next restart of the - managed system. Entries having the value other(1) are valid - and exist but are not classified as to whether they will - continue to exist after the next restart." - - DEFVAL { volatile } - ::= { ifRcvAddressEntry 3 } - --- definition of interface-related traps. - -linkDown NOTIFICATION-TYPE - OBJECTS { ifIndex, ifAdminStatus, ifOperStatus } - STATUS current - DESCRIPTION - "A linkDown trap signifies that the SNMP entity, acting in - an agent role, has detected that the ifOperStatus object for - one of its communication links is about to enter the down - state from some other state (but not from the notPresent - state). This other state is indicated by the included value - of ifOperStatus." - ::= { snmpTraps 3 } - -linkUp NOTIFICATION-TYPE - OBJECTS { ifIndex, ifAdminStatus, ifOperStatus } - STATUS current - DESCRIPTION - "A linkUp trap signifies that the SNMP entity, acting in an - agent role, has detected that the ifOperStatus object for - one of its communication links left the down state and - transitioned into some other state (but not into the - notPresent state). This other state is indicated by the - included value of ifOperStatus." - ::= { snmpTraps 4 } - --- conformance information - - - -ifConformance OBJECT IDENTIFIER ::= { ifMIB 2 } - -ifGroups OBJECT IDENTIFIER ::= { ifConformance 1 } -ifCompliances OBJECT IDENTIFIER ::= { ifConformance 2 } - - --- compliance statements - -ifCompliance3 MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for SNMP entities which have - network interfaces." - - MODULE -- this module - MANDATORY-GROUPS { ifGeneralInformationGroup, - linkUpDownNotificationsGroup } - --- The groups: --- ifFixedLengthGroup --- ifHCFixedLengthGroup --- ifPacketGroup --- ifHCPacketGroup --- ifVHCPacketGroup --- are mutually exclusive; at most one of these groups is implemented --- for a particular interface. When any of these groups is implemented --- for a particular interface, then ifCounterDiscontinuityGroup must --- also be implemented for that interface. - - - GROUP ifFixedLengthGroup - DESCRIPTION - "This group is mandatory for those network interfaces which - are character-oriented or transmit data in fixed-length - transmission units, and for which the value of the - corresponding instance of ifSpeed is less than or equal to - 20,000,000 bits/second." - - GROUP ifHCFixedLengthGroup - DESCRIPTION - "This group is mandatory for those network interfaces which - are character-oriented or transmit data in fixed-length - transmission units, and for which the value of the - corresponding instance of ifSpeed is greater than 20,000,000 - bits/second." - - GROUP ifPacketGroup - DESCRIPTION - - - "This group is mandatory for those network interfaces which - are packet-oriented, and for which the value of the - corresponding instance of ifSpeed is less than or equal to - 20,000,000 bits/second." - - GROUP ifHCPacketGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are packet-oriented and for which the value of the - corresponding instance of ifSpeed is greater than 20,000,000 - bits/second but less than or equal to 650,000,000 - bits/second." - - GROUP ifVHCPacketGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are packet-oriented and for which the value of the - corresponding instance of ifSpeed is greater than - 650,000,000 bits/second." - - - GROUP ifCounterDiscontinuityGroup - DESCRIPTION - "This group is mandatory for those network interfaces that - are required to maintain counters (i.e., those for which one - of the ifFixedLengthGroup, ifHCFixedLengthGroup, - ifPacketGroup, ifHCPacketGroup, or ifVHCPacketGroup is - mandatory)." - - - GROUP ifRcvAddressGroup - DESCRIPTION - "The applicability of this group MUST be defined by the - media-specific MIBs. Media-specific MIBs must define the - exact meaning, use, and semantics of the addresses in this - group." - - OBJECT ifLinkUpDownTrapEnable - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifPromiscuousMode - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifAdminStatus - - - SYNTAX INTEGER { up(1), down(2) } - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, nor is support for the value - testing(3)." - - OBJECT ifAlias - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - ::= { ifCompliances 3 } - --- units of conformance - -ifGeneralInformationGroup OBJECT-GROUP - OBJECTS { ifIndex, ifDescr, ifType, ifSpeed, ifPhysAddress, - ifAdminStatus, ifOperStatus, ifLastChange, - ifLinkUpDownTrapEnable, ifConnectorPresent, - ifHighSpeed, ifName, ifNumber, ifAlias, - ifTableLastChange } - STATUS current - DESCRIPTION - "A collection of objects providing information applicable to - all network interfaces." - ::= { ifGroups 10 } - --- the following five groups are mutually exclusive; at most --- one of these groups is implemented for any interface - -ifFixedLengthGroup OBJECT-GROUP - OBJECTS { ifInOctets, ifOutOctets, ifInUnknownProtos, - ifInErrors, ifOutErrors } - STATUS current - DESCRIPTION - "A collection of objects providing information specific to - non-high speed (non-high speed interfaces transmit and - receive at speeds less than or equal to 20,000,000 - bits/second) character-oriented or fixed-length-transmission - network interfaces." - ::= { ifGroups 2 } - -ifHCFixedLengthGroup OBJECT-GROUP - OBJECTS { ifHCInOctets, ifHCOutOctets, - ifInOctets, ifOutOctets, ifInUnknownProtos, - ifInErrors, ifOutErrors } - STATUS current - DESCRIPTION - - - "A collection of objects providing information specific to - high speed (greater than 20,000,000 bits/second) character- - oriented or fixed-length-transmission network interfaces." - ::= { ifGroups 3 } - -ifPacketGroup OBJECT-GROUP - OBJECTS { ifInOctets, ifOutOctets, ifInUnknownProtos, - ifInErrors, ifOutErrors, - ifMtu, ifInUcastPkts, ifInMulticastPkts, - ifInBroadcastPkts, ifInDiscards, - ifOutUcastPkts, ifOutMulticastPkts, - ifOutBroadcastPkts, ifOutDiscards, - ifPromiscuousMode } - STATUS current - DESCRIPTION - "A collection of objects providing information specific to - non-high speed (non-high speed interfaces transmit and - receive at speeds less than or equal to 20,000,000 - bits/second) packet-oriented network interfaces." - ::= { ifGroups 4 } - -ifHCPacketGroup OBJECT-GROUP - OBJECTS { ifHCInOctets, ifHCOutOctets, - ifInOctets, ifOutOctets, ifInUnknownProtos, - ifInErrors, ifOutErrors, - ifMtu, ifInUcastPkts, ifInMulticastPkts, - ifInBroadcastPkts, ifInDiscards, - ifOutUcastPkts, ifOutMulticastPkts, - ifOutBroadcastPkts, ifOutDiscards, - ifPromiscuousMode } - STATUS current - DESCRIPTION - "A collection of objects providing information specific to - high speed (greater than 20,000,000 bits/second but less - than or equal to 650,000,000 bits/second) packet-oriented - network interfaces." - ::= { ifGroups 5 } - -ifVHCPacketGroup OBJECT-GROUP - OBJECTS { ifHCInUcastPkts, ifHCInMulticastPkts, - ifHCInBroadcastPkts, ifHCOutUcastPkts, - ifHCOutMulticastPkts, ifHCOutBroadcastPkts, - ifHCInOctets, ifHCOutOctets, - ifInOctets, ifOutOctets, ifInUnknownProtos, - ifInErrors, ifOutErrors, - ifMtu, ifInUcastPkts, ifInMulticastPkts, - ifInBroadcastPkts, ifInDiscards, - ifOutUcastPkts, ifOutMulticastPkts, - - - ifOutBroadcastPkts, ifOutDiscards, - ifPromiscuousMode } - STATUS current - DESCRIPTION - "A collection of objects providing information specific to - higher speed (greater than 650,000,000 bits/second) packet- - oriented network interfaces." - ::= { ifGroups 6 } - -ifRcvAddressGroup OBJECT-GROUP - OBJECTS { ifRcvAddressStatus, ifRcvAddressType } - STATUS current - DESCRIPTION - "A collection of objects providing information on the - multiple addresses which an interface receives." - ::= { ifGroups 7 } - -ifStackGroup2 OBJECT-GROUP - OBJECTS { ifStackStatus, ifStackLastChange } - STATUS current - DESCRIPTION - "A collection of objects providing information on the - layering of MIB-II interfaces." - ::= { ifGroups 11 } - -ifCounterDiscontinuityGroup OBJECT-GROUP - OBJECTS { ifCounterDiscontinuityTime } - STATUS current - DESCRIPTION - "A collection of objects providing information specific to - interface counter discontinuities." - ::= { ifGroups 13 } - -linkUpDownNotificationsGroup NOTIFICATION-GROUP - NOTIFICATIONS { linkUp, linkDown } - STATUS current - DESCRIPTION - "The notifications which indicate specific changes in the - value of ifOperStatus." - ::= { ifGroups 14 } - --- Deprecated Definitions - Objects - - --- --- The Interface Test Table --- --- This group of objects is optional. However, a media-specific - - --- MIB may make implementation of this group mandatory. --- --- This table replaces the ifExtnsTestTable --- - -ifTestTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfTestEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "This table contains one entry per interface. It defines - objects which allow a network manager to instruct an agent - to test an interface for various faults. Tests for an - interface are defined in the media-specific MIB for that - interface. After invoking a test, the object ifTestResult - can be read to determine the outcome. If an agent can not - perform the test, ifTestResult is set to so indicate. The - object ifTestCode can be used to provide further test- - specific or interface-specific (or even enterprise-specific) - information concerning the outcome of the test. Only one - test can be in progress on each interface at any one time. - If one test is in progress when another test is invoked, the - second test is rejected. Some agents may reject a test when - a prior test is active on another interface. - - Before starting a test, a manager-station must first obtain - 'ownership' of the entry in the ifTestTable for the - interface to be tested. This is accomplished with the - ifTestId and ifTestStatus objects as follows: - - try_again: - get (ifTestId, ifTestStatus) - while (ifTestStatus != notInUse) - /* - * Loop while a test is running or some other - * manager is configuring a test. - */ - short delay - get (ifTestId, ifTestStatus) - } - - /* - * Is not being used right now -- let's compete - * to see who gets it. - */ - lock_value = ifTestId - - if ( set(ifTestId = lock_value, ifTestStatus = inUse, - - - ifTestOwner = 'my-IP-address') == FAILURE) - /* - * Another manager got the ifTestEntry -- go - * try again - */ - goto try_again; - - /* - * I have the lock - */ - set up any test parameters. - - /* - * This starts the test - */ - set(ifTestType = test_to_run); - - wait for test completion by polling ifTestResult - - when test completes, agent sets ifTestResult - agent also sets ifTestStatus = 'notInUse' - - retrieve any additional test results, and ifTestId - - if (ifTestId == lock_value+1) results are valid - - A manager station first retrieves the value of the - appropriate ifTestId and ifTestStatus objects, periodically - repeating the retrieval if necessary, until the value of - ifTestStatus is 'notInUse'. The manager station then tries - to set the same ifTestId object to the value it just - retrieved, the same ifTestStatus object to 'inUse', and the - corresponding ifTestOwner object to a value indicating - itself. If the set operation succeeds then the manager has - obtained ownership of the ifTestEntry, and the value of the - ifTestId object is incremented by the agent (per the - semantics of TestAndIncr). Failure of the set operation - indicates that some other manager has obtained ownership of - the ifTestEntry. - - Once ownership is obtained, any test parameters can be - setup, and then the test is initiated by setting ifTestType. - On completion of the test, the agent sets ifTestStatus to - 'notInUse'. Once this occurs, the manager can retrieve the - results. In the (rare) event that the invocation of tests - by two network managers were to overlap, then there would be - a possibility that the first test's results might be - overwritten by the second test's results prior to the first - - - results being read. This unlikely circumstance can be - detected by a network manager retrieving ifTestId at the - same time as retrieving the test results, and ensuring that - the results are for the desired request. - - If ifTestType is not set within an abnormally long period of - time after ownership is obtained, the agent should time-out - the manager, and reset the value of the ifTestStatus object - back to 'notInUse'. It is suggested that this time-out - period be 5 minutes. - - In general, a management station must not retransmit a - request to invoke a test for which it does not receive a - response; instead, it properly inspects an agent's MIB to - determine if the invocation was successful. Only if the - invocation was unsuccessful, is the invocation request - retransmitted. - - Some tests may require the interface to be taken off-line in - order to execute them, or may even require the agent to - reboot after completion of the test. In these - circumstances, communication with the management station - invoking the test may be lost until after completion of the - test. An agent is not required to support such tests. - However, if such tests are supported, then the agent should - make every effort to transmit a response to the request - which invoked the test prior to losing communication. When - the agent is restored to normal service, the results of the - test are properly made available in the appropriate objects. - Note that this requires that the ifIndex value assigned to - an interface must be unchanged even if the test causes a - reboot. An agent must reject any test for which it cannot, - perhaps due to resource constraints, make available at least - the minimum amount of information after that test - completes." - ::= { ifMIBObjects 3 } - -ifTestEntry OBJECT-TYPE - SYNTAX IfTestEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "An entry containing objects for invoking tests on an - interface." - AUGMENTS { ifEntry } - ::= { ifTestTable 1 } - -IfTestEntry ::= - - - SEQUENCE { - ifTestId TestAndIncr, - ifTestStatus INTEGER, - ifTestType AutonomousType, - ifTestResult INTEGER, - ifTestCode OBJECT IDENTIFIER, - ifTestOwner OwnerString - } - -ifTestId OBJECT-TYPE - SYNTAX TestAndIncr - MAX-ACCESS read-write - STATUS deprecated - DESCRIPTION - "This object identifies the current invocation of the - interface's test." - ::= { ifTestEntry 1 } - -ifTestStatus OBJECT-TYPE - SYNTAX INTEGER { notInUse(1), inUse(2) } - MAX-ACCESS read-write - STATUS deprecated - DESCRIPTION - "This object indicates whether or not some manager currently - has the necessary 'ownership' required to invoke a test on - this interface. A write to this object is only successful - when it changes its value from 'notInUse(1)' to 'inUse(2)'. - After completion of a test, the agent resets the value back - to 'notInUse(1)'." - ::= { ifTestEntry 2 } - -ifTestType OBJECT-TYPE - SYNTAX AutonomousType - MAX-ACCESS read-write - STATUS deprecated - DESCRIPTION - "A control variable used to start and stop operator- - initiated interface tests. Most OBJECT IDENTIFIER values - assigned to tests are defined elsewhere, in association with - specific types of interface. However, this document assigns - a value for a full-duplex loopback test, and defines the - special meanings of the subject identifier: - - noTest OBJECT IDENTIFIER ::= { 0 0 } - - When the value noTest is written to this object, no action - is taken unless a test is in progress, in which case the - test is aborted. Writing any other value to this object is - - - only valid when no test is currently in progress, in which - case the indicated test is initiated. - - When read, this object always returns the most recent value - that ifTestType was set to. If it has not been set since - the last initialization of the network management subsystem - on the agent, a value of noTest is returned." - ::= { ifTestEntry 3 } - -ifTestResult OBJECT-TYPE - SYNTAX INTEGER { - none(1), -- no test yet requested - success(2), - inProgress(3), - notSupported(4), - unAbleToRun(5), -- due to state of system - aborted(6), - failed(7) - } - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "This object contains the result of the most recently - requested test, or the value none(1) if no tests have been - requested since the last reset. Note that this facility - provides no provision for saving the results of one test - when starting another, as could be required if used by - multiple managers concurrently." - ::= { ifTestEntry 4 } - -ifTestCode OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "This object contains a code which contains more specific - information on the test result, for example an error-code - after a failed test. Error codes and other values this - object may take are specific to the type of interface and/or - test. The value may have the semantics of either the - AutonomousType or InstancePointer textual conventions as - defined in RFC 2579. The identifier: - - testCodeUnknown OBJECT IDENTIFIER ::= { 0 0 } - - is defined for use if no additional result code is - available." - ::= { ifTestEntry 5 } - - -ifTestOwner OBJECT-TYPE - SYNTAX OwnerString - MAX-ACCESS read-write - STATUS deprecated - DESCRIPTION - "The entity which currently has the 'ownership' required to - invoke a test on this interface." - ::= { ifTestEntry 6 } - --- Deprecated Definitions - Groups - - -ifGeneralGroup OBJECT-GROUP - OBJECTS { ifDescr, ifType, ifSpeed, ifPhysAddress, - ifAdminStatus, ifOperStatus, ifLastChange, - ifLinkUpDownTrapEnable, ifConnectorPresent, - ifHighSpeed, ifName } - STATUS deprecated - DESCRIPTION - "A collection of objects deprecated in favour of - ifGeneralInformationGroup." - ::= { ifGroups 1 } - - -ifTestGroup OBJECT-GROUP - OBJECTS { ifTestId, ifTestStatus, ifTestType, - ifTestResult, ifTestCode, ifTestOwner } - STATUS deprecated - DESCRIPTION - "A collection of objects providing the ability to invoke - tests on an interface." - ::= { ifGroups 8 } - - -ifStackGroup OBJECT-GROUP - OBJECTS { ifStackStatus } - STATUS deprecated - DESCRIPTION - "The previous collection of objects providing information on - the layering of MIB-II interfaces." - ::= { ifGroups 9 } - - -ifOldObjectsGroup OBJECT-GROUP - OBJECTS { ifInNUcastPkts, ifOutNUcastPkts, - ifOutQLen, ifSpecific } - STATUS deprecated - DESCRIPTION - - - "The collection of objects deprecated from the original MIB- - II interfaces group." - ::= { ifGroups 12 } - --- Deprecated Definitions - Compliance - -ifCompliance MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "A compliance statement defined in a previous version of - this MIB module, for SNMP entities which have network - interfaces." - - MODULE -- this module - MANDATORY-GROUPS { ifGeneralGroup, ifStackGroup } - - GROUP ifFixedLengthGroup - DESCRIPTION - "This group is mandatory for all network interfaces which - are character-oriented or transmit data in fixed-length - transmission units." - - GROUP ifHCFixedLengthGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are character-oriented or transmit data in fixed- - length transmission units, and for which the value of the - corresponding instance of ifSpeed is greater than 20,000,000 - bits/second." - - GROUP ifPacketGroup - DESCRIPTION - "This group is mandatory for all network interfaces which - are packet-oriented." - - GROUP ifHCPacketGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are packet-oriented and for which the value of the - corresponding instance of ifSpeed is greater than - 650,000,000 bits/second." - - GROUP ifTestGroup - DESCRIPTION - "This group is optional. Media-specific MIBs which require - interface tests are strongly encouraged to use this group - for invoking tests and reporting results. A medium specific - MIB which has mandatory tests may make implementation of - - - this group mandatory." - - GROUP ifRcvAddressGroup - DESCRIPTION - "The applicability of this group MUST be defined by the - media-specific MIBs. Media-specific MIBs must define the - exact meaning, use, and semantics of the addresses in this - group." - - OBJECT ifLinkUpDownTrapEnable - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifPromiscuousMode - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifStackStatus - SYNTAX INTEGER { active(1) } -- subset of RowStatus - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, and only one of the six - enumerated values for the RowStatus textual convention need - be supported, specifically: active(1)." - - OBJECT ifAdminStatus - SYNTAX INTEGER { up(1), down(2) } - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, nor is support for the value - testing(3)." - ::= { ifCompliances 1 } - -ifCompliance2 MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "A compliance statement defined in a previous version of - this MIB module, for SNMP entities which have network - interfaces." - - MODULE -- this module - MANDATORY-GROUPS { ifGeneralInformationGroup, ifStackGroup2, - ifCounterDiscontinuityGroup } - - GROUP ifFixedLengthGroup - DESCRIPTION - - - "This group is mandatory for all network interfaces which - are character-oriented or transmit data in fixed-length - transmission units." - - GROUP ifHCFixedLengthGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are character-oriented or transmit data in fixed- - length transmission units, and for which the value of the - corresponding instance of ifSpeed is greater than 20,000,000 - bits/second." - - GROUP ifPacketGroup - DESCRIPTION - "This group is mandatory for all network interfaces which - are packet-oriented." - - GROUP ifHCPacketGroup - DESCRIPTION - "This group is mandatory only for those network interfaces - which are packet-oriented and for which the value of the - corresponding instance of ifSpeed is greater than - 650,000,000 bits/second." - - GROUP ifRcvAddressGroup - DESCRIPTION - "The applicability of this group MUST be defined by the - media-specific MIBs. Media-specific MIBs must define the - exact meaning, use, and semantics of the addresses in this - group." - - OBJECT ifLinkUpDownTrapEnable - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifPromiscuousMode - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - OBJECT ifStackStatus - SYNTAX INTEGER { active(1) } -- subset of RowStatus - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, and only one of the six - enumerated values for the RowStatus textual convention need - be supported, specifically: active(1)." - - - OBJECT ifAdminStatus - SYNTAX INTEGER { up(1), down(2) } - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, nor is support for the value - testing(3)." - - OBJECT ifAlias - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - - ::= { ifCompliances 2 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB deleted file mode 100644 index a19b8d2..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/INET-ADDRESS-MIB +++ /dev/null @@ -1,421 +0,0 @@ -INET-ADDRESS-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, mib-2, Unsigned32 FROM SNMPv2-SMI - TEXTUAL-CONVENTION FROM SNMPv2-TC; - -inetAddressMIB MODULE-IDENTITY - LAST-UPDATED "200502040000Z" - ORGANIZATION - "IETF Operations and Management Area" - CONTACT-INFO - "Juergen Schoenwaelder (Editor) - International University Bremen - P.O. Box 750 561 - 28725 Bremen, Germany - - Phone: +49 421 200-3587 - EMail: j.schoenwaelder@iu-bremen.de - - Send comments to ." - DESCRIPTION - "This MIB module defines textual conventions for - representing Internet addresses. An Internet - address can be an IPv4 address, an IPv6 address, - or a DNS domain name. This module also defines - textual conventions for Internet port numbers, - autonomous system numbers, and the length of an - Internet address prefix. - - Copyright (C) The Internet Society (2005). This version - of this MIB module is part of RFC 4001, see the RFC - itself for full legal notices." - REVISION "200502040000Z" - DESCRIPTION - "Third version, published as RFC 4001. This revision - introduces the InetZoneIndex, InetScopeType, and - InetVersion textual conventions." - REVISION "200205090000Z" - DESCRIPTION - "Second version, published as RFC 3291. This - revision contains several clarifications and - introduces several new textual conventions: - InetAddressPrefixLength, InetPortNumber, - InetAutonomousSystemNumber, InetAddressIPv4z, - and InetAddressIPv6z." - REVISION "200006080000Z" - - - - DESCRIPTION - "Initial version, published as RFC 2851." - ::= { mib-2 76 } - -InetAddressType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "A value that represents a type of Internet address. - - unknown(0) An unknown address type. This value MUST - be used if the value of the corresponding - InetAddress object is a zero-length string. - It may also be used to indicate an IP address - that is not in one of the formats defined - below. - - ipv4(1) An IPv4 address as defined by the - InetAddressIPv4 textual convention. - - ipv6(2) An IPv6 address as defined by the - InetAddressIPv6 textual convention. - - ipv4z(3) A non-global IPv4 address including a zone - index as defined by the InetAddressIPv4z - textual convention. - - ipv6z(4) A non-global IPv6 address including a zone - index as defined by the InetAddressIPv6z - textual convention. - - dns(16) A DNS domain name as defined by the - InetAddressDNS textual convention. - - Each definition of a concrete InetAddressType value must be - accompanied by a definition of a textual convention for use - with that InetAddressType. - - To support future extensions, the InetAddressType textual - convention SHOULD NOT be sub-typed in object type definitions. - It MAY be sub-typed in compliance statements in order to - require only a subset of these address types for a compliant - implementation. - - Implementations must ensure that InetAddressType objects - and any dependent objects (e.g., InetAddress objects) are - consistent. An inconsistentValue error must be generated - if an attempt to change an InetAddressType object would, - for example, lead to an undefined InetAddress value. In - - - - particular, InetAddressType/InetAddress pairs must be - changed together if the address type changes (e.g., from - ipv6(2) to ipv4(1))." - SYNTAX INTEGER { - unknown(0), - ipv4(1), - ipv6(2), - ipv4z(3), - ipv6z(4), - dns(16) - } - -InetAddress ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Denotes a generic Internet address. - - An InetAddress value is always interpreted within the context - of an InetAddressType value. Every usage of the InetAddress - textual convention is required to specify the InetAddressType - object that provides the context. It is suggested that the - InetAddressType object be logically registered before the - object(s) that use the InetAddress textual convention, if - they appear in the same logical row. - - The value of an InetAddress object must always be - consistent with the value of the associated InetAddressType - object. Attempts to set an InetAddress object to a value - inconsistent with the associated InetAddressType - must fail with an inconsistentValue error. - - When this textual convention is used as the syntax of an - index object, there may be issues with the limit of 128 - sub-identifiers specified in SMIv2, STD 58. In this case, - the object definition MUST include a 'SIZE' clause to - limit the number of potential instance sub-identifiers; - otherwise the applicable constraints MUST be stated in - the appropriate conceptual row DESCRIPTION clauses, or - in the surrounding documentation if there is no single - DESCRIPTION clause that is appropriate." - SYNTAX OCTET STRING (SIZE (0..255)) - -InetAddressIPv4 ::= TEXTUAL-CONVENTION - DISPLAY-HINT "1d.1d.1d.1d" - STATUS current - DESCRIPTION - "Represents an IPv4 network address: - - - - - Octets Contents Encoding - 1-4 IPv4 address network-byte order - - The corresponding InetAddressType value is ipv4(1). - - This textual convention SHOULD NOT be used directly in object - definitions, as it restricts addresses to a specific format. - However, if it is used, it MAY be used either on its own or in - conjunction with InetAddressType, as a pair." - SYNTAX OCTET STRING (SIZE (4)) - -InetAddressIPv6 ::= TEXTUAL-CONVENTION - DISPLAY-HINT "2x:2x:2x:2x:2x:2x:2x:2x" - STATUS current - DESCRIPTION - "Represents an IPv6 network address: - - Octets Contents Encoding - 1-16 IPv6 address network-byte order - - The corresponding InetAddressType value is ipv6(2). - - This textual convention SHOULD NOT be used directly in object - definitions, as it restricts addresses to a specific format. - However, if it is used, it MAY be used either on its own or in - conjunction with InetAddressType, as a pair." - SYNTAX OCTET STRING (SIZE (16)) - -InetAddressIPv4z ::= TEXTUAL-CONVENTION - DISPLAY-HINT "1d.1d.1d.1d%4d" - STATUS current - DESCRIPTION - "Represents a non-global IPv4 network address, together - with its zone index: - - Octets Contents Encoding - 1-4 IPv4 address network-byte order - 5-8 zone index network-byte order - - The corresponding InetAddressType value is ipv4z(3). - - The zone index (bytes 5-8) is used to disambiguate identical - address values on nodes that have interfaces attached to - different zones of the same scope. The zone index may contain - the special value 0, which refers to the default zone for each - scope. - - This textual convention SHOULD NOT be used directly in object - - - - definitions, as it restricts addresses to a specific format. - However, if it is used, it MAY be used either on its own or in - conjunction with InetAddressType, as a pair." - SYNTAX OCTET STRING (SIZE (8)) - -InetAddressIPv6z ::= TEXTUAL-CONVENTION - DISPLAY-HINT "2x:2x:2x:2x:2x:2x:2x:2x%4d" - STATUS current - DESCRIPTION - "Represents a non-global IPv6 network address, together - with its zone index: - - Octets Contents Encoding - 1-16 IPv6 address network-byte order - 17-20 zone index network-byte order - - The corresponding InetAddressType value is ipv6z(4). - - The zone index (bytes 17-20) is used to disambiguate - identical address values on nodes that have interfaces - attached to different zones of the same scope. The zone index - may contain the special value 0, which refers to the default - zone for each scope. - - This textual convention SHOULD NOT be used directly in object - definitions, as it restricts addresses to a specific format. - However, if it is used, it MAY be used either on its own or in - conjunction with InetAddressType, as a pair." - SYNTAX OCTET STRING (SIZE (20)) - -InetAddressDNS ::= TEXTUAL-CONVENTION - DISPLAY-HINT "255a" - STATUS current - DESCRIPTION - "Represents a DNS domain name. The name SHOULD be fully - qualified whenever possible. - - The corresponding InetAddressType is dns(16). - - The DESCRIPTION clause of InetAddress objects that may have - InetAddressDNS values MUST fully describe how (and when) - these names are to be resolved to IP addresses. - - The resolution of an InetAddressDNS value may require to - query multiple DNS records (e.g., A for IPv4 and AAAA for - IPv6). The order of the resolution process and which DNS - record takes precedence depends on the configuration of the - resolver. - - - - This textual convention SHOULD NOT be used directly in object - definitions, as it restricts addresses to a specific format. - However, if it is used, it MAY be used either on its own or in - conjunction with InetAddressType, as a pair." - SYNTAX OCTET STRING (SIZE (1..255)) - -InetAddressPrefixLength ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - "Denotes the length of a generic Internet network address - prefix. A value of n corresponds to an IP address mask - that has n contiguous 1-bits from the most significant - bit (MSB), with all other bits set to 0. - - An InetAddressPrefixLength value is always interpreted within - the context of an InetAddressType value. Every usage of the - InetAddressPrefixLength textual convention is required to - specify the InetAddressType object that provides the - context. It is suggested that the InetAddressType object be - logically registered before the object(s) that use the - InetAddressPrefixLength textual convention, if they appear - in the same logical row. - - InetAddressPrefixLength values larger than - the maximum length of an IP address for a specific - InetAddressType are treated as the maximum significant - value applicable for the InetAddressType. The maximum - significant value is 32 for the InetAddressType - 'ipv4(1)' and 'ipv4z(3)' and 128 for the InetAddressType - 'ipv6(2)' and 'ipv6z(4)'. The maximum significant value - for the InetAddressType 'dns(16)' is 0. - - The value zero is object-specific and must be defined as - part of the description of any object that uses this - syntax. Examples of the usage of zero might include - situations where the Internet network address prefix - is unknown or does not apply. - - The upper bound of the prefix length has been chosen to - be consistent with the maximum size of an InetAddress." - SYNTAX Unsigned32 (0..2040) - -InetPortNumber ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - "Represents a 16 bit port number of an Internet transport - - - - layer protocol. Port numbers are assigned by IANA. A - current list of all assignments is available from - . - - The value zero is object-specific and must be defined as - part of the description of any object that uses this - syntax. Examples of the usage of zero might include - situations where a port number is unknown, or when the - value zero is used as a wildcard in a filter." - REFERENCE "STD 6 (RFC 768), STD 7 (RFC 793) and RFC 2960" - SYNTAX Unsigned32 (0..65535) - -InetAutonomousSystemNumber ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - "Represents an autonomous system number that identifies an - Autonomous System (AS). An AS is a set of routers under a - single technical administration, using an interior gateway - protocol and common metrics to route packets within the AS, - and using an exterior gateway protocol to route packets to - other ASes'. IANA maintains the AS number space and has - delegated large parts to the regional registries. - - Autonomous system numbers are currently limited to 16 bits - (0..65535). There is, however, work in progress to enlarge the - autonomous system number space to 32 bits. Therefore, this - textual convention uses an Unsigned32 value without a - range restriction in order to support a larger autonomous - system number space." - REFERENCE "RFC 1771, RFC 1930" - SYNTAX Unsigned32 - -InetScopeType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents a scope type. This textual convention can be used - in cases where a MIB has to represent different scope types - and there is no context information, such as an InetAddress - object, that implicitly defines the scope type. - - Note that not all possible values have been assigned yet, but - they may be assigned in future revisions of this specification. - Applications should therefore be able to deal with values - not yet assigned." - REFERENCE "RFC 3513" - SYNTAX INTEGER { - -- reserved(0), - - - - interfaceLocal(1), - linkLocal(2), - subnetLocal(3), - adminLocal(4), - siteLocal(5), -- site-local unicast addresses - -- have been deprecated by RFC 3879 - -- unassigned(6), - -- unassigned(7), - organizationLocal(8), - -- unassigned(9), - -- unassigned(10), - -- unassigned(11), - -- unassigned(12), - -- unassigned(13), - global(14) - -- reserved(15) - } - -InetZoneIndex ::= TEXTUAL-CONVENTION - DISPLAY-HINT "d" - STATUS current - DESCRIPTION - "A zone index identifies an instance of a zone of a - specific scope. - - The zone index MUST disambiguate identical address - values. For link-local addresses, the zone index will - typically be the interface index (ifIndex as defined in the - IF-MIB) of the interface on which the address is configured. - - The zone index may contain the special value 0, which refers - to the default zone. The default zone may be used in cases - where the valid zone index is not known (e.g., when a - management application has to write a link-local IPv6 - address without knowing the interface index value). The - default zone SHOULD NOT be used as an easy way out in - cases where the zone index for a non-global IPv6 address - is known." - REFERENCE "RFC4007" - SYNTAX Unsigned32 - -InetVersion ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "A value representing a version of the IP protocol. - - unknown(0) An unknown or unspecified version of the IP - protocol. - - - - ipv4(1) The IPv4 protocol as defined in RFC 791 (STD 5). - - ipv6(2) The IPv6 protocol as defined in RFC 2460. - - Note that this textual convention SHOULD NOT be used to - distinguish different address types associated with IP - protocols. The InetAddressType has been designed for this - purpose." - REFERENCE "RFC 791, RFC 2460" - SYNTAX INTEGER { - unknown(0), - ipv4(1), - ipv6(2) - } -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB deleted file mode 100644 index 0a93501..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/IP-MIB +++ /dev/null @@ -1,5254 +0,0 @@ -IP-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-TYPE, - Integer32, Counter32, IpAddress, - mib-2, Unsigned32, Counter64, - zeroDotZero FROM SNMPv2-SMI - PhysAddress, TruthValue, - TimeStamp, RowPointer, - TEXTUAL-CONVENTION, TestAndIncr, - RowStatus, StorageType FROM SNMPv2-TC - MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF - InetAddress, InetAddressType, - InetAddressPrefixLength, - InetVersion, InetZoneIndex FROM INET-ADDRESS-MIB - InterfaceIndex FROM IF-MIB; - -ipMIB MODULE-IDENTITY - LAST-UPDATED "200602020000Z" - ORGANIZATION "IETF IPv6 MIB Revision Team" - CONTACT-INFO - "Editor: - - - - Shawn A. Routhier - Interworking Labs - 108 Whispering Pines Dr. Suite 235 - Scotts Valley, CA 95066 - USA - EMail: " - DESCRIPTION - "The MIB module for managing IP and ICMP implementations, but - excluding their management of IP routes. - - Copyright (C) The Internet Society (2006). This version of - this MIB module is part of RFC 4293; see the RFC itself for - full legal notices." - - REVISION "200602020000Z" - DESCRIPTION - "The IP version neutral revision with added IPv6 objects for - ND, default routers, and router advertisements. As well as - being the successor to RFC 2011, this MIB is also the - successor to RFCs 2465 and 2466. Published as RFC 4293." - - REVISION "199411010000Z" - DESCRIPTION - "A separate MIB module (IP-MIB) for IP and ICMP management - objects. Published as RFC 2011." - - REVISION "199103310000Z" - DESCRIPTION - "The initial revision of this MIB module was part of MIB-II, - which was published as RFC 1213." - ::= { mib-2 48} - --- --- The textual conventions we define and use in this MIB. --- - -IpAddressOriginTC ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The origin of the address. - - manual(2) indicates that the address was manually configured - to a specified address, e.g., by user configuration. - - dhcp(4) indicates an address that was assigned to this - system by a DHCP server. - - linklayer(5) indicates an address created by IPv6 stateless - - - - auto-configuration. - - random(6) indicates an address chosen by the system at - random, e.g., an IPv4 address within 169.254/16, or an RFC - 3041 privacy address." - SYNTAX INTEGER { - other(1), - manual(2), - dhcp(4), - linklayer(5), - random(6) - } - -IpAddressStatusTC ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The status of an address. Most of the states correspond to - states from the IPv6 Stateless Address Autoconfiguration - protocol. - - The preferred(1) state indicates that this is a valid - address that can appear as the destination or source address - of a packet. - - The deprecated(2) state indicates that this is a valid but - deprecated address that should no longer be used as a source - address in new communications, but packets addressed to such - an address are processed as expected. - - The invalid(3) state indicates that this isn't a valid - address and it shouldn't appear as the destination or source - address of a packet. - - The inaccessible(4) state indicates that the address is not - accessible because the interface to which this address is - assigned is not operational. - - The unknown(5) state indicates that the status cannot be - determined for some reason. - - The tentative(6) state indicates that the uniqueness of the - address on the link is being verified. Addresses in this - state should not be used for general communication and - should only be used to determine the uniqueness of the - address. - - The duplicate(7) state indicates the address has been - determined to be non-unique on the link and so must not be - - - - used. - - The optimistic(8) state indicates the address is available - for use, subject to restrictions, while its uniqueness on - a link is being verified. - - In the absence of other information, an IPv4 address is - always preferred(1)." - REFERENCE "RFC 2462" - SYNTAX INTEGER { - preferred(1), - deprecated(2), - invalid(3), - inaccessible(4), - unknown(5), - tentative(6), - duplicate(7), - optimistic(8) - } - -IpAddressPrefixOriginTC ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The origin of this prefix. - - manual(2) indicates a prefix that was manually configured. - - wellknown(3) indicates a well-known prefix, e.g., 169.254/16 - for IPv4 auto-configuration or fe80::/10 for IPv6 link-local - addresses. Well known prefixes may be assigned by IANA, - the address registries, or by specification in a standards - track RFC. - - dhcp(4) indicates a prefix that was assigned by a DHCP - server. - - routeradv(5) indicates a prefix learned from a router - advertisement. - - Note: while IpAddressOriginTC and IpAddressPrefixOriginTC - are similar, they are not identical. The first defines how - an address was created, while the second defines how a - prefix was found." - SYNTAX INTEGER { - other(1), - manual(2), - wellknown(3), - dhcp(4), - - - - routeradv(5) - } - -Ipv6AddressIfIdentifierTC ::= TEXTUAL-CONVENTION - DISPLAY-HINT "2x:" - STATUS current - DESCRIPTION - "This data type is used to model IPv6 address - interface identifiers. This is a binary string - of up to 8 octets in network byte-order." - SYNTAX OCTET STRING (SIZE (0..8)) - --- --- the IP general group --- some objects that affect all of IPv4 --- - -ip OBJECT IDENTIFIER ::= { mib-2 4 } - -ipForwarding OBJECT-TYPE - SYNTAX INTEGER { - forwarding(1), -- acting as a router - notForwarding(2) -- NOT acting as a router - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The indication of whether this entity is acting as an IPv4 - router in respect to the forwarding of datagrams received - by, but not addressed to, this entity. IPv4 routers forward - datagrams. IPv4 hosts do not (except those source-routed - via the host). - - When this object is written, the entity should save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system. - Note: a stronger requirement is not used because this object - was previously defined." - ::= { ip 1 } - -ipDefaultTTL OBJECT-TYPE - SYNTAX Integer32 (1..255) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The default value inserted into the Time-To-Live field of - the IPv4 header of datagrams originated at this entity, - whenever a TTL value is not supplied by the transport layer - - - - protocol. - - When this object is written, the entity should save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system. - Note: a stronger requirement is not used because this object - was previously defined." - ::= { ip 2 } - -ipReasmTimeout OBJECT-TYPE - SYNTAX Integer32 - UNITS "seconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The maximum number of seconds that received fragments are - held while they are awaiting reassembly at this entity." - ::= { ip 13 } - --- --- the IPv6 general group --- Some objects that affect all of IPv6 --- - -ipv6IpForwarding OBJECT-TYPE - SYNTAX INTEGER { - forwarding(1), -- acting as a router - notForwarding(2) -- NOT acting as a router - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The indication of whether this entity is acting as an IPv6 - router on any interface in respect to the forwarding of - datagrams received by, but not addressed to, this entity. - IPv6 routers forward datagrams. IPv6 hosts do not (except - those source-routed via the host). - - When this object is written, the entity SHOULD save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system." - ::= { ip 25 } - -ipv6IpDefaultHopLimit OBJECT-TYPE - SYNTAX Integer32 (0..255) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - - - - "The default value inserted into the Hop Limit field of the - IPv6 header of datagrams originated at this entity whenever - a Hop Limit value is not supplied by the transport layer - protocol. - - When this object is written, the entity SHOULD save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system." - REFERENCE "RFC 2461 Section 6.3.2" - ::= { ip 26 } - --- --- IPv4 Interface Table --- - -ipv4InterfaceTableLastChange OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - a row in the ipv4InterfaceTable was added or deleted, or - when an ipv4InterfaceReasmMaxSize or an - ipv4InterfaceEnableStatus object was modified. - - If new objects are added to the ipv4InterfaceTable that - require the ipv4InterfaceTableLastChange to be updated when - they are modified, they must specify that requirement in - their description clause." - ::= { ip 27 } - -ipv4InterfaceTable OBJECT-TYPE - SYNTAX SEQUENCE OF Ipv4InterfaceEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing per-interface IPv4-specific - information." - ::= { ip 28 } - -ipv4InterfaceEntry OBJECT-TYPE - SYNTAX Ipv4InterfaceEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry containing IPv4-specific information for a specific - interface." - INDEX { ipv4InterfaceIfIndex } - - - - ::= { ipv4InterfaceTable 1 } - -Ipv4InterfaceEntry ::= SEQUENCE { - ipv4InterfaceIfIndex InterfaceIndex, - ipv4InterfaceReasmMaxSize Integer32, - ipv4InterfaceEnableStatus INTEGER, - ipv4InterfaceRetransmitTime Unsigned32 - } - -ipv4InterfaceIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipv4InterfaceEntry 1 } - -ipv4InterfaceReasmMaxSize OBJECT-TYPE - SYNTAX Integer32 (0..65535) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The size of the largest IPv4 datagram that this entity can - re-assemble from incoming IPv4 fragmented datagrams received - on this interface." - ::= { ipv4InterfaceEntry 2 } - -ipv4InterfaceEnableStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), - down(2) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The indication of whether IPv4 is enabled (up) or disabled - (down) on this interface. This object does not affect the - state of the interface itself, only its connection to an - IPv4 stack. The IF-MIB should be used to control the state - of the interface." - ::= { ipv4InterfaceEntry 3 } - -ipv4InterfaceRetransmitTime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milliseconds" - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The time between retransmissions of ARP requests to a - neighbor when resolving the address or when probing the - reachability of a neighbor." - REFERENCE "RFC 1122" - DEFVAL { 1000 } - ::= { ipv4InterfaceEntry 4 } - --- --- v6 interface table --- - -ipv6InterfaceTableLastChange OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - a row in the ipv6InterfaceTable was added or deleted or when - an ipv6InterfaceReasmMaxSize, ipv6InterfaceIdentifier, - ipv6InterfaceEnableStatus, ipv6InterfaceReachableTime, - ipv6InterfaceRetransmitTime, or ipv6InterfaceForwarding - object was modified. - - If new objects are added to the ipv6InterfaceTable that - require the ipv6InterfaceTableLastChange to be updated when - they are modified, they must specify that requirement in - their description clause." - ::= { ip 29 } - -ipv6InterfaceTable OBJECT-TYPE - SYNTAX SEQUENCE OF Ipv6InterfaceEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing per-interface IPv6-specific - information." - ::= { ip 30 } - -ipv6InterfaceEntry OBJECT-TYPE - SYNTAX Ipv6InterfaceEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry containing IPv6-specific information for a given - interface." - - - - INDEX { ipv6InterfaceIfIndex } - ::= { ipv6InterfaceTable 1 } - -Ipv6InterfaceEntry ::= SEQUENCE { - ipv6InterfaceIfIndex InterfaceIndex, - ipv6InterfaceReasmMaxSize Unsigned32, - ipv6InterfaceIdentifier Ipv6AddressIfIdentifierTC, - ipv6InterfaceEnableStatus INTEGER, - ipv6InterfaceReachableTime Unsigned32, - ipv6InterfaceRetransmitTime Unsigned32, - ipv6InterfaceForwarding INTEGER - } - -ipv6InterfaceIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipv6InterfaceEntry 1 } - -ipv6InterfaceReasmMaxSize OBJECT-TYPE - SYNTAX Unsigned32 (1500..65535) - UNITS "octets" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The size of the largest IPv6 datagram that this entity can - re-assemble from incoming IPv6 fragmented datagrams received - on this interface." - ::= { ipv6InterfaceEntry 2 } - -ipv6InterfaceIdentifier OBJECT-TYPE - SYNTAX Ipv6AddressIfIdentifierTC - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The Interface Identifier for this interface. The Interface - Identifier is combined with an address prefix to form an - interface address. - - By default, the Interface Identifier is auto-configured - according to the rules of the link type to which this - interface is attached. - - - - - A zero length identifier may be used where appropriate. One - possible example is a loopback interface." - ::= { ipv6InterfaceEntry 3 } - --- This object ID is reserved as it was used in earlier versions of --- the MIB module. In theory, OIDs are not assigned until the --- specification is released as an RFC; however, as some companies --- may have shipped code based on earlier versions of the MIB, it --- seems best to reserve this OID. This OID had been --- ipv6InterfacePhysicalAddress. --- ::= { ipv6InterfaceEntry 4} - -ipv6InterfaceEnableStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), - down(2) - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The indication of whether IPv6 is enabled (up) or disabled - (down) on this interface. This object does not affect the - state of the interface itself, only its connection to an - IPv6 stack. The IF-MIB should be used to control the state - of the interface. - - When this object is written, the entity SHOULD save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system." - ::= { ipv6InterfaceEntry 5 } - -ipv6InterfaceReachableTime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milliseconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The time a neighbor is considered reachable after receiving - a reachability confirmation." - REFERENCE "RFC 2461, Section 6.3.2" - ::= { ipv6InterfaceEntry 6 } - -ipv6InterfaceRetransmitTime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milliseconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - - "The time between retransmissions of Neighbor Solicitation - messages to a neighbor when resolving the address or when - probing the reachability of a neighbor." - REFERENCE "RFC 2461, Section 6.3.2" - ::= { ipv6InterfaceEntry 7 } - -ipv6InterfaceForwarding OBJECT-TYPE - SYNTAX INTEGER { - forwarding(1), -- acting as a router - notForwarding(2) -- NOT acting as a router - } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The indication of whether this entity is acting as an IPv6 - router on this interface with respect to the forwarding of - datagrams received by, but not addressed to, this entity. - IPv6 routers forward datagrams. IPv6 hosts do not (except - those source-routed via the host). - - This object is constrained by ipv6IpForwarding and is - ignored if ipv6IpForwarding is set to notForwarding. Those - systems that do not provide per-interface control of the - forwarding function should set this object to forwarding for - all interfaces and allow the ipv6IpForwarding object to - control the forwarding capability. - - When this object is written, the entity SHOULD save the - change to non-volatile storage and restore the object from - non-volatile storage upon re-initialization of the system." - ::= { ipv6InterfaceEntry 8 } - --- --- Per-Interface or System-Wide IP statistics. --- --- The following two tables, ipSystemStatsTable and ipIfStatsTable, --- are intended to provide the same counters at different granularities. --- The ipSystemStatsTable provides system wide counters aggregating --- the traffic counters for all interfaces for a given address type. --- The ipIfStatsTable provides the same counters but for specific --- interfaces rather than as an aggregate. --- --- Note well: If a system provides both system-wide and interface- --- specific values, the system-wide value may not be equal to the sum --- of the interface-specific values across all interfaces due to e.g., --- dynamic interface creation/deletion. --- --- Note well: Both of these tables contain some items that are - - - --- represented by two objects, representing the value in either 32 --- or 64 bits. For those objects, the 32-bit value MUST be the low --- order 32 bits of the 64-bit value. Also note that the 32-bit --- counters must be included when the 64-bit counters are included. - -ipTrafficStats OBJECT IDENTIFIER ::= { ip 31 } - -ipSystemStatsTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpSystemStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing system wide, IP version specific - traffic statistics. This table and the ipIfStatsTable - contain similar objects whose difference is in their - granularity. Where this table contains system wide traffic - statistics, the ipIfStatsTable contains the same statistics - but counted on a per-interface basis." - ::= { ipTrafficStats 1 } - -ipSystemStatsEntry OBJECT-TYPE - SYNTAX IpSystemStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A statistics entry containing system-wide objects for a - particular IP version." - INDEX { ipSystemStatsIPVersion } - ::= { ipSystemStatsTable 1 } - -IpSystemStatsEntry ::= SEQUENCE { - ipSystemStatsIPVersion InetVersion, - ipSystemStatsInReceives Counter32, - ipSystemStatsHCInReceives Counter64, - ipSystemStatsInOctets Counter32, - ipSystemStatsHCInOctets Counter64, - ipSystemStatsInHdrErrors Counter32, - ipSystemStatsInNoRoutes Counter32, - ipSystemStatsInAddrErrors Counter32, - ipSystemStatsInUnknownProtos Counter32, - ipSystemStatsInTruncatedPkts Counter32, - ipSystemStatsInForwDatagrams Counter32, - ipSystemStatsHCInForwDatagrams Counter64, - ipSystemStatsReasmReqds Counter32, - ipSystemStatsReasmOKs Counter32, - ipSystemStatsReasmFails Counter32, - ipSystemStatsInDiscards Counter32, - ipSystemStatsInDelivers Counter32, - - - - ipSystemStatsHCInDelivers Counter64, - ipSystemStatsOutRequests Counter32, - ipSystemStatsHCOutRequests Counter64, - ipSystemStatsOutNoRoutes Counter32, - ipSystemStatsOutForwDatagrams Counter32, - ipSystemStatsHCOutForwDatagrams Counter64, - ipSystemStatsOutDiscards Counter32, - ipSystemStatsOutFragReqds Counter32, - ipSystemStatsOutFragOKs Counter32, - ipSystemStatsOutFragFails Counter32, - ipSystemStatsOutFragCreates Counter32, - ipSystemStatsOutTransmits Counter32, - ipSystemStatsHCOutTransmits Counter64, - ipSystemStatsOutOctets Counter32, - ipSystemStatsHCOutOctets Counter64, - ipSystemStatsInMcastPkts Counter32, - ipSystemStatsHCInMcastPkts Counter64, - ipSystemStatsInMcastOctets Counter32, - ipSystemStatsHCInMcastOctets Counter64, - ipSystemStatsOutMcastPkts Counter32, - ipSystemStatsHCOutMcastPkts Counter64, - ipSystemStatsOutMcastOctets Counter32, - ipSystemStatsHCOutMcastOctets Counter64, - ipSystemStatsInBcastPkts Counter32, - ipSystemStatsHCInBcastPkts Counter64, - ipSystemStatsOutBcastPkts Counter32, - ipSystemStatsHCOutBcastPkts Counter64, - ipSystemStatsDiscontinuityTime TimeStamp, - ipSystemStatsRefreshRate Unsigned32 - } - -ipSystemStatsIPVersion OBJECT-TYPE - SYNTAX InetVersion - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP version of this row." - ::= { ipSystemStatsEntry 1 } - --- This object ID is reserved to allow the IDs for this table's objects --- to align with the objects in the ipIfStatsTable. --- ::= { ipSystemStatsEntry 2 } - -ipSystemStatsInReceives OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - - "The total number of input IP datagrams received, including - those received in error. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 3 } - -ipSystemStatsHCInReceives OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of input IP datagrams received, including - those received in error. This object counts the same - datagrams as ipSystemStatsInReceives, but allows for larger - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 4 } - -ipSystemStatsInOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in input IP datagrams, - including those received in error. Octets from datagrams - counted in ipSystemStatsInReceives MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 5 } - -ipSystemStatsHCInOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in input IP datagrams, - including those received in error. This object counts the - same octets as ipSystemStatsInOctets, but allows for larger - - - - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 6 } - -ipSystemStatsInHdrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded due to errors in - their IP headers, including version number mismatch, other - format errors, hop count exceeded, errors discovered in - processing their IP options, etc. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 7 } - -ipSystemStatsInNoRoutes OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because no route - could be found to transmit them to their destination. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 8 } - -ipSystemStatsInAddrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because the IP - address in their IP header's destination field was not a - valid address to be received at this entity. This count - includes invalid addresses (e.g., ::0). For entities - that are not IP routers and therefore do not forward - - - - datagrams, this counter includes datagrams discarded - because the destination address was not a local address. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 9 } - -ipSystemStatsInUnknownProtos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of locally-addressed IP datagrams received - successfully but discarded because of an unknown or - unsupported protocol. - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 10 } - -ipSystemStatsInTruncatedPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because the - datagram frame didn't carry enough data. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 11 } - -ipSystemStatsInForwDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - - "The number of input datagrams for which this entity was not - their final IP destination and for which this entity - attempted to find a route to forward them to that final - destination. In entities that do not act as IP routers, - this counter will include only those datagrams that were - Source-Routed via this entity, and the Source-Route - processing was successful. - - When tracking interface statistics, the counter of the - incoming interface is incremented for each datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 12 } - -ipSystemStatsHCInForwDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input datagrams for which this entity was not - their final IP destination and for which this entity - attempted to find a route to forward them to that final - destination. This object counts the same packets as - ipSystemStatsInForwDatagrams, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 13 } - -ipSystemStatsReasmReqds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP fragments received that needed to be - reassembled at this interface. - - When tracking interface statistics, the counter of the - interface to which these fragments were addressed is - incremented. This interface might not be the same as the - input interface for some of the fragments. - - Discontinuities in the value of this counter can occur at - - - - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 14 } - -ipSystemStatsReasmOKs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams successfully reassembled. - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 15 } - -ipSystemStatsReasmFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of failures detected by the IP re-assembly - algorithm (for whatever reason: timed out, errors, etc.). - Note that this is not necessarily a count of discarded IP - fragments since some algorithms (notably the algorithm in - RFC 815) can lose track of the number of fragments by - combining them as they are received. - - When tracking interface statistics, the counter of the - interface to which these fragments were addressed is - incremented. This interface might not be the same as the - input interface for some of the fragments. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 16 } - -ipSystemStatsInDiscards OBJECT-TYPE - SYNTAX Counter32 - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams for which no problems were - encountered to prevent their continued processing, but - were discarded (e.g., for lack of buffer space). Note that - this counter does not include any datagrams discarded while - awaiting re-assembly. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 17 } - -ipSystemStatsInDelivers OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of datagrams successfully delivered to IP - user-protocols (including ICMP). - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 18 } - -ipSystemStatsHCInDelivers OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of datagrams successfully delivered to IP - user-protocols (including ICMP). This object counts the - same packets as ipSystemStatsInDelivers, but allows for - larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - - - - ::= { ipSystemStatsEntry 19 } - -ipSystemStatsOutRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that local IP user- - protocols (including ICMP) supplied to IP in requests for - transmission. Note that this counter does not include any - datagrams counted in ipSystemStatsOutForwDatagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 20 } - -ipSystemStatsHCOutRequests OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that local IP user- - protocols (including ICMP) supplied to IP in requests for - transmission. This object counts the same packets as - ipSystemStatsOutRequests, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 21 } - -ipSystemStatsOutNoRoutes OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of locally generated IP datagrams discarded - because no route could be found to transmit them to their - destination. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 22 } - - - -ipSystemStatsOutForwDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of datagrams for which this entity was not their - final IP destination and for which it was successful in - finding a path to their final destination. In entities - that do not act as IP routers, this counter will include - only those datagrams that were Source-Routed via this - entity, and the Source-Route processing was successful. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - forwarded datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 23 } - -ipSystemStatsHCOutForwDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of datagrams for which this entity was not their - final IP destination and for which it was successful in - finding a path to their final destination. This object - counts the same packets as ipSystemStatsOutForwDatagrams, - but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 24 } - -ipSystemStatsOutDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of output IP datagrams for which no problem was - encountered to prevent their transmission to their - destination, but were discarded (e.g., for lack of - buffer space). Note that this counter would include - - - - datagrams counted in ipSystemStatsOutForwDatagrams if any - such datagrams met this (discretionary) discard criterion. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 25 } - -ipSystemStatsOutFragReqds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams that would require fragmentation - in order to be transmitted. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 26 } - -ipSystemStatsOutFragOKs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams that have been successfully - fragmented. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 27 } - -ipSystemStatsOutFragFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - - - - STATUS current - DESCRIPTION - "The number of IP datagrams that have been discarded because - they needed to be fragmented but could not be. This - includes IPv4 packets that have the DF bit set and IPv6 - packets that are being forwarded and exceed the outgoing - link MTU. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for an unsuccessfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 28 } - -ipSystemStatsOutFragCreates OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of output datagram fragments that have been - generated as a result of IP fragmentation. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 29 } - -ipSystemStatsOutTransmits OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that this entity supplied - to the lower layers for transmission. This includes - datagrams generated locally and those forwarded by this - entity. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - - - - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 30 } - -ipSystemStatsHCOutTransmits OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that this entity supplied - to the lower layers for transmission. This object counts - the same datagrams as ipSystemStatsOutTransmits, but allows - for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 31 } - -ipSystemStatsOutOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets in IP datagrams delivered to the - lower layers for transmission. Octets from datagrams - counted in ipSystemStatsOutTransmits MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 32 } - -ipSystemStatsHCOutOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets in IP datagrams delivered to the - lower layers for transmission. This objects counts the same - octets as ipSystemStatsOutOctets, but allows for larger - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - - - - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 33 } - -ipSystemStatsInMcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams received. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 34 } - -ipSystemStatsHCInMcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams received. This object - counts the same datagrams as ipSystemStatsInMcastPkts but - allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 35 } - -ipSystemStatsInMcastOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in IP multicast - datagrams. Octets from datagrams counted in - ipSystemStatsInMcastPkts MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 36 } - -ipSystemStatsHCInMcastOctets OBJECT-TYPE - SYNTAX Counter64 - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in IP multicast - datagrams. This object counts the same octets as - ipSystemStatsInMcastOctets, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 37 } - -ipSystemStatsOutMcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams transmitted. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 38 } - -ipSystemStatsHCOutMcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams transmitted. This - object counts the same datagrams as - ipSystemStatsOutMcastPkts, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 39 } - -ipSystemStatsOutMcastOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted in IP multicast - datagrams. Octets from datagrams counted in - - - - ipSystemStatsOutMcastPkts MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 40 } - -ipSystemStatsHCOutMcastOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted in IP multicast - datagrams. This object counts the same octets as - ipSystemStatsOutMcastOctets, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 41 } - -ipSystemStatsInBcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams received. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 42 } - -ipSystemStatsHCInBcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams received. This object - counts the same datagrams as ipSystemStatsInBcastPkts but - allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - - - - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 43 } - -ipSystemStatsOutBcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams transmitted. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 44 } - -ipSystemStatsHCOutBcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams transmitted. This - object counts the same datagrams as - ipSystemStatsOutBcastPkts, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipSystemStatsDiscontinuityTime." - ::= { ipSystemStatsEntry 45 } - -ipSystemStatsDiscontinuityTime OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - any one or more of this entry's counters suffered a - discontinuity. - - If no such discontinuities have occurred since the last re- - initialization of the local management subsystem, then this - object contains a zero value." - ::= { ipSystemStatsEntry 46 } - -ipSystemStatsRefreshRate OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milli-seconds" - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The minimum reasonable polling interval for this entry. - This object provides an indication of the minimum amount of - time required to update the counters in this entry." - ::= { ipSystemStatsEntry 47 } - -ipIfStatsTableLastChange OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - a row in the ipIfStatsTable was added or deleted. - - If new objects are added to the ipIfStatsTable that require - the ipIfStatsTableLastChange to be updated when they are - modified, they must specify that requirement in their - description clause." - ::= { ipTrafficStats 2 } - -ipIfStatsTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpIfStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing per-interface traffic statistics. This - table and the ipSystemStatsTable contain similar objects - whose difference is in their granularity. Where this table - contains per-interface statistics, the ipSystemStatsTable - contains the same statistics, but counted on a system wide - basis." - ::= { ipTrafficStats 3 } - -ipIfStatsEntry OBJECT-TYPE - SYNTAX IpIfStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An interface statistics entry containing objects for a - particular interface and version of IP." - INDEX { ipIfStatsIPVersion, ipIfStatsIfIndex } - ::= { ipIfStatsTable 1 } - -IpIfStatsEntry ::= SEQUENCE { - ipIfStatsIPVersion InetVersion, - ipIfStatsIfIndex InterfaceIndex, - - - - ipIfStatsInReceives Counter32, - ipIfStatsHCInReceives Counter64, - ipIfStatsInOctets Counter32, - ipIfStatsHCInOctets Counter64, - ipIfStatsInHdrErrors Counter32, - ipIfStatsInNoRoutes Counter32, - ipIfStatsInAddrErrors Counter32, - ipIfStatsInUnknownProtos Counter32, - ipIfStatsInTruncatedPkts Counter32, - ipIfStatsInForwDatagrams Counter32, - ipIfStatsHCInForwDatagrams Counter64, - ipIfStatsReasmReqds Counter32, - ipIfStatsReasmOKs Counter32, - ipIfStatsReasmFails Counter32, - ipIfStatsInDiscards Counter32, - ipIfStatsInDelivers Counter32, - ipIfStatsHCInDelivers Counter64, - ipIfStatsOutRequests Counter32, - ipIfStatsHCOutRequests Counter64, - ipIfStatsOutForwDatagrams Counter32, - ipIfStatsHCOutForwDatagrams Counter64, - ipIfStatsOutDiscards Counter32, - ipIfStatsOutFragReqds Counter32, - ipIfStatsOutFragOKs Counter32, - ipIfStatsOutFragFails Counter32, - ipIfStatsOutFragCreates Counter32, - ipIfStatsOutTransmits Counter32, - ipIfStatsHCOutTransmits Counter64, - ipIfStatsOutOctets Counter32, - ipIfStatsHCOutOctets Counter64, - ipIfStatsInMcastPkts Counter32, - ipIfStatsHCInMcastPkts Counter64, - ipIfStatsInMcastOctets Counter32, - ipIfStatsHCInMcastOctets Counter64, - ipIfStatsOutMcastPkts Counter32, - ipIfStatsHCOutMcastPkts Counter64, - ipIfStatsOutMcastOctets Counter32, - ipIfStatsHCOutMcastOctets Counter64, - ipIfStatsInBcastPkts Counter32, - ipIfStatsHCInBcastPkts Counter64, - ipIfStatsOutBcastPkts Counter32, - ipIfStatsHCOutBcastPkts Counter64, - ipIfStatsDiscontinuityTime TimeStamp, - ipIfStatsRefreshRate Unsigned32 - } - -ipIfStatsIPVersion OBJECT-TYPE - SYNTAX InetVersion - - - - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP version of this row." - ::= { ipIfStatsEntry 1 } - -ipIfStatsIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipIfStatsEntry 2 } - -ipIfStatsInReceives OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of input IP datagrams received, including - those received in error. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 3 } - -ipIfStatsHCInReceives OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of input IP datagrams received, including - those received in error. This object counts the same - datagrams as ipIfStatsInReceives, but allows for larger - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 4 } - -ipIfStatsInOctets OBJECT-TYPE - - - - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in input IP datagrams, - including those received in error. Octets from datagrams - counted in ipIfStatsInReceives MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 5 } - -ipIfStatsHCInOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in input IP datagrams, - including those received in error. This object counts the - same octets as ipIfStatsInOctets, but allows for larger - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 6 } - -ipIfStatsInHdrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded due to errors in - their IP headers, including version number mismatch, other - format errors, hop count exceeded, errors discovered in - processing their IP options, etc. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 7 } - -ipIfStatsInNoRoutes OBJECT-TYPE - SYNTAX Counter32 - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because no route - could be found to transmit them to their destination. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 8 } - -ipIfStatsInAddrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because the IP - address in their IP header's destination field was not a - valid address to be received at this entity. This count - includes invalid addresses (e.g., ::0). For entities that - are not IP routers and therefore do not forward datagrams, - this counter includes datagrams discarded because the - destination address was not a local address. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 9 } - -ipIfStatsInUnknownProtos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of locally-addressed IP datagrams received - successfully but discarded because of an unknown or - unsupported protocol. - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - - - - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 10 } - -ipIfStatsInTruncatedPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams discarded because the - datagram frame didn't carry enough data. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 11 } - -ipIfStatsInForwDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input datagrams for which this entity was not - their final IP destination and for which this entity - attempted to find a route to forward them to that final - destination. In entities that do not act as IP routers, - this counter will include only those datagrams that were - Source-Routed via this entity, and the Source-Route - processing was successful. - - When tracking interface statistics, the counter of the - incoming interface is incremented for each datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 12 } - -ipIfStatsHCInForwDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input datagrams for which this entity was not - their final IP destination and for which this entity - attempted to find a route to forward them to that final - destination. This object counts the same packets as - - - - ipIfStatsInForwDatagrams, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 13 } - -ipIfStatsReasmReqds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP fragments received that needed to be - reassembled at this interface. - - When tracking interface statistics, the counter of the - interface to which these fragments were addressed is - incremented. This interface might not be the same as the - input interface for some of the fragments. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 14 } - -ipIfStatsReasmOKs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams successfully reassembled. - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 15 } - -ipIfStatsReasmFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - - - - STATUS current - DESCRIPTION - "The number of failures detected by the IP re-assembly - algorithm (for whatever reason: timed out, errors, etc.). - Note that this is not necessarily a count of discarded IP - fragments since some algorithms (notably the algorithm in - RFC 815) can lose track of the number of fragments by - combining them as they are received. - - When tracking interface statistics, the counter of the - interface to which these fragments were addressed is - incremented. This interface might not be the same as the - input interface for some of the fragments. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 16 } - -ipIfStatsInDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input IP datagrams for which no problems were - encountered to prevent their continued processing, but - were discarded (e.g., for lack of buffer space). Note that - this counter does not include any datagrams discarded while - awaiting re-assembly. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 17 } - -ipIfStatsInDelivers OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of datagrams successfully delivered to IP - user-protocols (including ICMP). - - When tracking interface statistics, the counter of the - interface to which these datagrams were addressed is - incremented. This interface might not be the same as the - - - - input interface for some of the datagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 18 } - -ipIfStatsHCInDelivers OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of datagrams successfully delivered to IP - user-protocols (including ICMP). This object counts the - same packets as ipIfStatsInDelivers, but allows for larger - values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 19 } - -ipIfStatsOutRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that local IP user- - protocols (including ICMP) supplied to IP in requests for - transmission. Note that this counter does not include any - datagrams counted in ipIfStatsOutForwDatagrams. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 20 } - -ipIfStatsHCOutRequests OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that local IP user- - protocols (including ICMP) supplied to IP in requests for - transmission. This object counts the same packets as - - - - ipIfStatsOutRequests, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 21 } - --- This object ID is reserved to allow the IDs for this table's objects --- to align with the objects in the ipSystemStatsTable. --- ::= {ipIfStatsEntry 22} - -ipIfStatsOutForwDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of datagrams for which this entity was not their - final IP destination and for which it was successful in - finding a path to their final destination. In entities - that do not act as IP routers, this counter will include - only those datagrams that were Source-Routed via this - entity, and the Source-Route processing was successful. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - forwarded datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 23 } - -ipIfStatsHCOutForwDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of datagrams for which this entity was not their - final IP destination and for which it was successful in - finding a path to their final destination. This object - counts the same packets as ipIfStatsOutForwDatagrams, but - allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - - - - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 24 } - -ipIfStatsOutDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of output IP datagrams for which no problem was - encountered to prevent their transmission to their - destination, but were discarded (e.g., for lack of - buffer space). Note that this counter would include - datagrams counted in ipIfStatsOutForwDatagrams if any such - datagrams met this (discretionary) discard criterion. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 25 } - -ipIfStatsOutFragReqds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams that would require fragmentation - in order to be transmitted. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 26 } - -ipIfStatsOutFragOKs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams that have been successfully - fragmented. - - When tracking interface statistics, the counter of the - - - - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 27 } - -ipIfStatsOutFragFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP datagrams that have been discarded because - they needed to be fragmented but could not be. This - includes IPv4 packets that have the DF bit set and IPv6 - packets that are being forwarded and exceed the outgoing - link MTU. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for an unsuccessfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 28 } - -ipIfStatsOutFragCreates OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of output datagram fragments that have been - generated as a result of IP fragmentation. - - When tracking interface statistics, the counter of the - outgoing interface is incremented for a successfully - fragmented datagram. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 29 } - - - - -ipIfStatsOutTransmits OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that this entity supplied - to the lower layers for transmission. This includes - datagrams generated locally and those forwarded by this - entity. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 30 } - -ipIfStatsHCOutTransmits OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of IP datagrams that this entity supplied - to the lower layers for transmission. This object counts - the same datagrams as ipIfStatsOutTransmits, but allows for - larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 31 } - -ipIfStatsOutOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets in IP datagrams delivered to the - lower layers for transmission. Octets from datagrams - counted in ipIfStatsOutTransmits MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 32 } - -ipIfStatsHCOutOctets OBJECT-TYPE - - - - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets in IP datagrams delivered to the - lower layers for transmission. This objects counts the same - octets as ipIfStatsOutOctets, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 33 } - -ipIfStatsInMcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams received. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 34 } - -ipIfStatsHCInMcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams received. This object - counts the same datagrams as ipIfStatsInMcastPkts, but - allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 35 } - -ipIfStatsInMcastOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in IP multicast - - - - datagrams. Octets from datagrams counted in - ipIfStatsInMcastPkts MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 36 } - -ipIfStatsHCInMcastOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets received in IP multicast - datagrams. This object counts the same octets as - ipIfStatsInMcastOctets, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 37 } - -ipIfStatsOutMcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams transmitted. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 38 } - -ipIfStatsHCOutMcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP multicast datagrams transmitted. This - object counts the same datagrams as ipIfStatsOutMcastPkts, - but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - - - - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 39 } - -ipIfStatsOutMcastOctets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted in IP multicast - datagrams. Octets from datagrams counted in - ipIfStatsOutMcastPkts MUST be counted here. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 40 } - -ipIfStatsHCOutMcastOctets OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of octets transmitted in IP multicast - datagrams. This object counts the same octets as - ipIfStatsOutMcastOctets, but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 41 } - -ipIfStatsInBcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams received. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 42 } - -ipIfStatsHCInBcastPkts OBJECT-TYPE - - - - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams received. This object - counts the same datagrams as ipIfStatsInBcastPkts, but - allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 43 } - -ipIfStatsOutBcastPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams transmitted. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 44 } - -ipIfStatsHCOutBcastPkts OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of IP broadcast datagrams transmitted. This - object counts the same datagrams as ipIfStatsOutBcastPkts, - but allows for larger values. - - Discontinuities in the value of this counter can occur at - re-initialization of the management system, and at other - times as indicated by the value of - ipIfStatsDiscontinuityTime." - ::= { ipIfStatsEntry 45 } - -ipIfStatsDiscontinuityTime OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime on the most recent occasion at which - - - - any one or more of this entry's counters suffered a - discontinuity. - - If no such discontinuities have occurred since the last re- - initialization of the local management subsystem, then this - object contains a zero value." - ::= { ipIfStatsEntry 46 } - -ipIfStatsRefreshRate OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milli-seconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The minimum reasonable polling interval for this entry. - This object provides an indication of the minimum amount of - time required to update the counters in this entry." - ::= { ipIfStatsEntry 47 } - --- --- Internet Address Prefix table --- - -ipAddressPrefixTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpAddressPrefixEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "This table allows the user to determine the source of an IP - address or set of IP addresses, and allows other tables to - share the information via pointer rather than by copying. - - For example, when the node configures both a unicast and - anycast address for a prefix, the ipAddressPrefix objects - for those addresses will point to a single row in this - table. - - This table primarily provides support for IPv6 prefixes, and - several of the objects are less meaningful for IPv4. The - table continues to allow IPv4 addresses to allow future - flexibility. In order to promote a common configuration, - this document includes suggestions for default values for - IPv4 prefixes. Each of these values may be overridden if an - object is meaningful to the node. - - All prefixes used by this entity should be included in this - table independent of how the entity learned the prefix. - (This table isn't limited to prefixes learned from router - - - - advertisements.)" - ::= { ip 32 } - -ipAddressPrefixEntry OBJECT-TYPE - SYNTAX IpAddressPrefixEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry in the ipAddressPrefixTable." - INDEX { ipAddressPrefixIfIndex, ipAddressPrefixType, - ipAddressPrefixPrefix, ipAddressPrefixLength } - ::= { ipAddressPrefixTable 1 } - -IpAddressPrefixEntry ::= SEQUENCE { - ipAddressPrefixIfIndex InterfaceIndex, - ipAddressPrefixType InetAddressType, - ipAddressPrefixPrefix InetAddress, - ipAddressPrefixLength InetAddressPrefixLength, - ipAddressPrefixOrigin IpAddressPrefixOriginTC, - ipAddressPrefixOnLinkFlag TruthValue, - ipAddressPrefixAutonomousFlag TruthValue, - ipAddressPrefixAdvPreferredLifetime Unsigned32, - ipAddressPrefixAdvValidLifetime Unsigned32 - } - -ipAddressPrefixIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface on - which this prefix is configured. The interface identified - by a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipAddressPrefixEntry 1 } - -ipAddressPrefixType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of ipAddressPrefix." - ::= { ipAddressPrefixEntry 2 } - -ipAddressPrefixPrefix OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - - - - DESCRIPTION - "The address prefix. The address type of this object is - specified in ipAddressPrefixType. The length of this object - is the standard length for objects of that type (4 or 16 - bytes). Any bits after ipAddressPrefixLength must be zero. - - Implementors need to be aware that, if the size of - ipAddressPrefixPrefix exceeds 114 octets, then OIDS of - instances of columns in this row will have more than 128 - sub-identifiers and cannot be accessed using SNMPv1, - SNMPv2c, or SNMPv3." - ::= { ipAddressPrefixEntry 3 } - -ipAddressPrefixLength OBJECT-TYPE - SYNTAX InetAddressPrefixLength - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The prefix length associated with this prefix. - - The value 0 has no special meaning for this object. It - simply refers to address '::/0'." - ::= { ipAddressPrefixEntry 4 } - -ipAddressPrefixOrigin OBJECT-TYPE - SYNTAX IpAddressPrefixOriginTC - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The origin of this prefix." - ::= { ipAddressPrefixEntry 5 } - -ipAddressPrefixOnLinkFlag OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "This object has the value 'true(1)', if this prefix can be - used for on-link determination; otherwise, the value is - 'false(2)'. - - The default for IPv4 prefixes is 'true(1)'." - REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and - RFC 2462" - ::= { ipAddressPrefixEntry 6 } - -ipAddressPrefixAutonomousFlag OBJECT-TYPE - SYNTAX TruthValue - - - - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "Autonomous address configuration flag. When true(1), - indicates that this prefix can be used for autonomous - address configuration (i.e., can be used to form a local - interface address). If false(2), it is not used to auto- - configure a local interface address. - - The default for IPv4 prefixes is 'false(2)'." - REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and - RFC 2462" - ::= { ipAddressPrefixEntry 7 } - -ipAddressPrefixAdvPreferredLifetime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "seconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The remaining length of time, in seconds, that this prefix - will continue to be preferred, i.e., time until deprecation. - - A value of 4,294,967,295 represents infinity. - - The address generated from a deprecated prefix should no - longer be used as a source address in new communications, - but packets received on such an interface are processed as - expected. - - The default for IPv4 prefixes is 4,294,967,295 (infinity)." - REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and - RFC 2462" - ::= { ipAddressPrefixEntry 8 } - -ipAddressPrefixAdvValidLifetime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "seconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The remaining length of time, in seconds, that this prefix - will continue to be valid, i.e., time until invalidation. A - value of 4,294,967,295 represents infinity. - - The address generated from an invalidated prefix should not - appear as the destination or source address of a packet. - - - - - The default for IPv4 prefixes is 4,294,967,295 (infinity)." - REFERENCE "For IPv6 RFC 2461, especially sections 2 and 4.6.2 and - RFC 2462" - ::= { ipAddressPrefixEntry 9 } - --- --- Internet Address Table --- - -ipAddressSpinLock OBJECT-TYPE - SYNTAX TestAndIncr - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "An advisory lock used to allow cooperating SNMP managers to - coordinate their use of the set operation in creating or - modifying rows within this table. - - In order to use this lock to coordinate the use of set - operations, managers should first retrieve - ipAddressTableSpinLock. They should then determine the - appropriate row to create or modify. Finally, they should - issue the appropriate set command, including the retrieved - value of ipAddressSpinLock. If another manager has altered - the table in the meantime, then the value of - ipAddressSpinLock will have changed, and the creation will - fail as it will be specifying an incorrect value for - ipAddressSpinLock. It is suggested, but not required, that - the ipAddressSpinLock be the first var bind for each set of - objects representing a 'row' in a PDU." - ::= { ip 33 } - -ipAddressTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpAddressEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "This table contains addressing information relevant to the - entity's interfaces. - - This table does not contain multicast address information. - Tables for such information should be contained in multicast - specific MIBs, such as RFC 3019. - - While this table is writable, the user will note that - several objects, such as ipAddressOrigin, are not. The - intention in allowing a user to write to this table is to - allow them to add or remove any entry that isn't - - - - permanent. The user should be allowed to modify objects - and entries when that would not cause inconsistencies - within the table. Allowing write access to objects, such - as ipAddressOrigin, could allow a user to insert an entry - and then label it incorrectly. - - Note well: When including IPv6 link-local addresses in this - table, the entry must use an InetAddressType of 'ipv6z' in - order to differentiate between the possible interfaces." - ::= { ip 34 } - -ipAddressEntry OBJECT-TYPE - SYNTAX IpAddressEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An address mapping for a particular interface." - INDEX { ipAddressAddrType, ipAddressAddr } - ::= { ipAddressTable 1 } - -IpAddressEntry ::= SEQUENCE { - ipAddressAddrType InetAddressType, - ipAddressAddr InetAddress, - ipAddressIfIndex InterfaceIndex, - ipAddressType INTEGER, - ipAddressPrefix RowPointer, - ipAddressOrigin IpAddressOriginTC, - ipAddressStatus IpAddressStatusTC, - ipAddressCreated TimeStamp, - ipAddressLastChanged TimeStamp, - ipAddressRowStatus RowStatus, - ipAddressStorageType StorageType - } - -ipAddressAddrType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of ipAddressAddr." - ::= { ipAddressEntry 1 } - -ipAddressAddr OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP address to which this entry's addressing information - - - - pertains. The address type of this object is specified in - ipAddressAddrType. - - Implementors need to be aware that if the size of - ipAddressAddr exceeds 116 octets, then OIDS of instances of - columns in this row will have more than 128 sub-identifiers - and cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3." - ::= { ipAddressEntry 2 } - -ipAddressIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipAddressEntry 3 } - -ipAddressType OBJECT-TYPE - SYNTAX INTEGER { - unicast(1), - anycast(2), - broadcast(3) - } - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The type of address. broadcast(3) is not a valid value for - IPv6 addresses (RFC 3513)." - DEFVAL { unicast } - ::= { ipAddressEntry 4 } - -ipAddressPrefix OBJECT-TYPE - SYNTAX RowPointer - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A pointer to the row in the prefix table to which this - address belongs. May be { 0 0 } if there is no such row." - DEFVAL { zeroDotZero } - ::= { ipAddressEntry 5 } - -ipAddressOrigin OBJECT-TYPE - SYNTAX IpAddressOriginTC - MAX-ACCESS read-only - STATUS current - - - - DESCRIPTION - "The origin of the address." - ::= { ipAddressEntry 6 } - -ipAddressStatus OBJECT-TYPE - SYNTAX IpAddressStatusTC - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The status of the address, describing if the address can be - used for communication. - - In the absence of other information, an IPv4 address is - always preferred(1)." - DEFVAL { preferred } - ::= { ipAddressEntry 7 } - -ipAddressCreated OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time this entry was created. - If this entry was created prior to the last re- - initialization of the local network management subsystem, - then this object contains a zero value." - ::= { ipAddressEntry 8 } - -ipAddressLastChanged OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time this entry was last - updated. If this entry was updated prior to the last re- - initialization of the local network management subsystem, - then this object contains a zero value." - ::= { ipAddressEntry 9 } - -ipAddressRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The status of this conceptual row. - - The RowStatus TC requires that this DESCRIPTION clause - states under which circumstances other objects in this row - - - - can be modified. The value of this object has no effect on - whether other objects in this conceptual row can be - modified. - - A conceptual row can not be made active until the - ipAddressIfIndex has been set to a valid index." - ::= { ipAddressEntry 10 } - -ipAddressStorageType OBJECT-TYPE - SYNTAX StorageType - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The storage type for this conceptual row. If this object - has a value of 'permanent', then no other objects are - required to be able to be modified." - DEFVAL { volatile } - ::= { ipAddressEntry 11 } - --- --- the Internet Address Translation table --- - -ipNetToPhysicalTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpNetToPhysicalEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP Address Translation table used for mapping from IP - addresses to physical addresses. - - The Address Translation tables contain the IP address to - 'physical' address equivalences. Some interfaces do not use - translation tables for determining address equivalences - (e.g., DDN-X.25 has an algorithmic method); if all - interfaces are of this type, then the Address Translation - table is empty, i.e., has zero entries. - - While many protocols may be used to populate this table, ARP - and Neighbor Discovery are the most likely - options." - REFERENCE "RFC 826 and RFC 2461" - ::= { ip 35 } - -ipNetToPhysicalEntry OBJECT-TYPE - SYNTAX IpNetToPhysicalEntry - MAX-ACCESS not-accessible - STATUS current - - - - DESCRIPTION - "Each entry contains one IP address to `physical' address - equivalence." - INDEX { ipNetToPhysicalIfIndex, - ipNetToPhysicalNetAddressType, - ipNetToPhysicalNetAddress } - ::= { ipNetToPhysicalTable 1 } - -IpNetToPhysicalEntry ::= SEQUENCE { - ipNetToPhysicalIfIndex InterfaceIndex, - ipNetToPhysicalNetAddressType InetAddressType, - ipNetToPhysicalNetAddress InetAddress, - ipNetToPhysicalPhysAddress PhysAddress, - ipNetToPhysicalLastUpdated TimeStamp, - ipNetToPhysicalType INTEGER, - ipNetToPhysicalState INTEGER, - ipNetToPhysicalRowStatus RowStatus - } - -ipNetToPhysicalIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipNetToPhysicalEntry 1 } - -ipNetToPhysicalNetAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The type of ipNetToPhysicalNetAddress." - ::= { ipNetToPhysicalEntry 2 } - -ipNetToPhysicalNetAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP Address corresponding to the media-dependent - `physical' address. The address type of this object is - specified in ipNetToPhysicalAddressType. - - Implementors need to be aware that if the size of - - - - ipNetToPhysicalNetAddress exceeds 115 octets, then OIDS of - instances of columns in this row will have more than 128 - sub-identifiers and cannot be accessed using SNMPv1, - SNMPv2c, or SNMPv3." - ::= { ipNetToPhysicalEntry 3 } - -ipNetToPhysicalPhysAddress OBJECT-TYPE - SYNTAX PhysAddress (SIZE(0..65535)) - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The media-dependent `physical' address. - - As the entries in this table are typically not persistent - when this object is written the entity SHOULD NOT save the - change to non-volatile storage." - ::= { ipNetToPhysicalEntry 4 } - -ipNetToPhysicalLastUpdated OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time this entry was last - updated. If this entry was updated prior to the last re- - initialization of the local network management subsystem, - then this object contains a zero value." - ::= { ipNetToPhysicalEntry 5 } - -ipNetToPhysicalType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - invalid(2), -- an invalidated mapping - dynamic(3), - static(4), - local(5) -- local interface - } - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The type of mapping. - - Setting this object to the value invalid(2) has the effect - of invalidating the corresponding entry in the - ipNetToPhysicalTable. That is, it effectively dis- - associates the interface identified with said entry from the - mapping identified with said entry. It is an - implementation-specific matter as to whether the agent - - - - removes an invalidated entry from the table. Accordingly, - management stations must be prepared to receive tabular - information from agents that corresponds to entries not - currently in use. Proper interpretation of such entries - requires examination of the relevant ipNetToPhysicalType - object. - - The 'dynamic(3)' type indicates that the IP address to - physical addresses mapping has been dynamically resolved - using e.g., IPv4 ARP or the IPv6 Neighbor Discovery - protocol. - - The 'static(4)' type indicates that the mapping has been - statically configured. Both of these refer to entries that - provide mappings for other entities addresses. - - The 'local(5)' type indicates that the mapping is provided - for an entity's own interface address. - - As the entries in this table are typically not persistent - when this object is written the entity SHOULD NOT save the - change to non-volatile storage." - DEFVAL { static } - ::= { ipNetToPhysicalEntry 6 } - -ipNetToPhysicalState OBJECT-TYPE - SYNTAX INTEGER { - reachable(1), -- confirmed reachability - - stale(2), -- unconfirmed reachability - - delay(3), -- waiting for reachability - -- confirmation before entering - -- the probe state - - probe(4), -- actively probing - - invalid(5), -- an invalidated mapping - - unknown(6), -- state can not be determined - -- for some reason. - - incomplete(7) -- address resolution is being - -- performed. - } - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - - "The Neighbor Unreachability Detection state for the - interface when the address mapping in this entry is used. - If Neighbor Unreachability Detection is not in use (e.g. for - IPv4), this object is always unknown(6)." - REFERENCE "RFC 2461" - ::= { ipNetToPhysicalEntry 7 } - -ipNetToPhysicalRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The status of this conceptual row. - - The RowStatus TC requires that this DESCRIPTION clause - states under which circumstances other objects in this row - can be modified. The value of this object has no effect on - whether other objects in this conceptual row can be - modified. - - A conceptual row can not be made active until the - ipNetToPhysicalPhysAddress object has been set. - - Note that if the ipNetToPhysicalType is set to 'invalid', - the managed node may delete the entry independent of the - state of this object." - ::= { ipNetToPhysicalEntry 8 } - --- --- The IPv6 Scope Zone Index Table. --- - -ipv6ScopeZoneIndexTable OBJECT-TYPE - SYNTAX SEQUENCE OF Ipv6ScopeZoneIndexEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table used to describe IPv6 unicast and multicast scope - zones. - - For those objects that have names rather than numbers, the - names were chosen to coincide with the names used in the - IPv6 address architecture document. " - REFERENCE "Section 2.7 of RFC 4291" - ::= { ip 36 } - -ipv6ScopeZoneIndexEntry OBJECT-TYPE - SYNTAX Ipv6ScopeZoneIndexEntry - - - - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Each entry contains the list of scope identifiers on a given - interface." - INDEX { ipv6ScopeZoneIndexIfIndex } - ::= { ipv6ScopeZoneIndexTable 1 } - -Ipv6ScopeZoneIndexEntry ::= SEQUENCE { - ipv6ScopeZoneIndexIfIndex InterfaceIndex, - ipv6ScopeZoneIndexLinkLocal InetZoneIndex, - ipv6ScopeZoneIndex3 InetZoneIndex, - ipv6ScopeZoneIndexAdminLocal InetZoneIndex, - ipv6ScopeZoneIndexSiteLocal InetZoneIndex, - ipv6ScopeZoneIndex6 InetZoneIndex, - ipv6ScopeZoneIndex7 InetZoneIndex, - ipv6ScopeZoneIndexOrganizationLocal InetZoneIndex, - ipv6ScopeZoneIndex9 InetZoneIndex, - ipv6ScopeZoneIndexA InetZoneIndex, - ipv6ScopeZoneIndexB InetZoneIndex, - ipv6ScopeZoneIndexC InetZoneIndex, - ipv6ScopeZoneIndexD InetZoneIndex - } - -ipv6ScopeZoneIndexIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface to - which these scopes belong. The interface identified by a - particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipv6ScopeZoneIndexEntry 1 } - -ipv6ScopeZoneIndexLinkLocal OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for the link-local scope on this interface." - ::= { ipv6ScopeZoneIndexEntry 2 } - -ipv6ScopeZoneIndex3 OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - - - - "The zone index for scope 3 on this interface." - ::= { ipv6ScopeZoneIndexEntry 3 } - -ipv6ScopeZoneIndexAdminLocal OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for the admin-local scope on this interface." - ::= { ipv6ScopeZoneIndexEntry 4 } - -ipv6ScopeZoneIndexSiteLocal OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for the site-local scope on this interface." - ::= { ipv6ScopeZoneIndexEntry 5 } - -ipv6ScopeZoneIndex6 OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope 6 on this interface." - ::= { ipv6ScopeZoneIndexEntry 6 } - -ipv6ScopeZoneIndex7 OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope 7 on this interface." - ::= { ipv6ScopeZoneIndexEntry 7 } - -ipv6ScopeZoneIndexOrganizationLocal OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for the organization-local scope on this - interface." - ::= { ipv6ScopeZoneIndexEntry 8 } - -ipv6ScopeZoneIndex9 OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - - - - DESCRIPTION - "The zone index for scope 9 on this interface." - ::= { ipv6ScopeZoneIndexEntry 9 } - -ipv6ScopeZoneIndexA OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope A on this interface." - ::= { ipv6ScopeZoneIndexEntry 10 } - -ipv6ScopeZoneIndexB OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope B on this interface." - ::= { ipv6ScopeZoneIndexEntry 11 } - -ipv6ScopeZoneIndexC OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope C on this interface." - ::= { ipv6ScopeZoneIndexEntry 12 } - -ipv6ScopeZoneIndexD OBJECT-TYPE - SYNTAX InetZoneIndex - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The zone index for scope D on this interface." - ::= { ipv6ScopeZoneIndexEntry 13 } - --- --- The Default Router Table --- This table simply lists the default routers; for more information --- about routing tables, see the routing MIBs --- - -ipDefaultRouterTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpDefaultRouterEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table used to describe the default routers known to this - - - - entity." - ::= { ip 37 } - -ipDefaultRouterEntry OBJECT-TYPE - SYNTAX IpDefaultRouterEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "Each entry contains information about a default router known - to this entity." - INDEX {ipDefaultRouterAddressType, ipDefaultRouterAddress, - ipDefaultRouterIfIndex} - ::= { ipDefaultRouterTable 1 } - -IpDefaultRouterEntry ::= SEQUENCE { - ipDefaultRouterAddressType InetAddressType, - ipDefaultRouterAddress InetAddress, - ipDefaultRouterIfIndex InterfaceIndex, - ipDefaultRouterLifetime Unsigned32, - ipDefaultRouterPreference INTEGER - } - -ipDefaultRouterAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type for this row." - ::= { ipDefaultRouterEntry 1 } - -ipDefaultRouterAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP address of the default router represented by this - row. The address type of this object is specified in - ipDefaultRouterAddressType. - - Implementers need to be aware that if the size of - ipDefaultRouterAddress exceeds 115 octets, then OIDS of - instances of columns in this row will have more than 128 - sub-identifiers and cannot be accessed using SNMPv1, - SNMPv2c, or SNMPv3." - ::= { ipDefaultRouterEntry 2 } - -ipDefaultRouterIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - - - - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface by - which the router can be reached. The interface identified - by a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipDefaultRouterEntry 3 } - -ipDefaultRouterLifetime OBJECT-TYPE - SYNTAX Unsigned32 (0..65535) - UNITS "seconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The remaining length of time, in seconds, that this router - will continue to be useful as a default router. A value of - zero indicates that it is no longer useful as a default - router. It is left to the implementer of the MIB as to - whether a router with a lifetime of zero is removed from the - list. - - For IPv6, this value should be extracted from the router - advertisement messages." - REFERENCE "For IPv6 RFC 2462 sections 4.2 and 6.3.4" - ::= { ipDefaultRouterEntry 4 } - -ipDefaultRouterPreference OBJECT-TYPE - SYNTAX INTEGER { - reserved (-2), - low (-1), - medium (0), - high (1) - } - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "An indication of preference given to this router as a - default router as described in he Default Router - Preferences document. Treating the value as a - 2 bit signed integer allows for simple arithmetic - comparisons. - - For IPv4 routers or IPv6 routers that are not using the - updated router advertisement format, this object is set to - medium (0)." - REFERENCE "RFC 4291, section 2.1" - ::= { ipDefaultRouterEntry 5 } - - - --- --- Configuration information for constructing router advertisements --- - -ipv6RouterAdvertSpinLock OBJECT-TYPE - SYNTAX TestAndIncr - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "An advisory lock used to allow cooperating SNMP managers to - coordinate their use of the set operation in creating or - modifying rows within this table. - - In order to use this lock to coordinate the use of set - operations, managers should first retrieve - ipv6RouterAdvertSpinLock. They should then determine the - appropriate row to create or modify. Finally, they should - issue the appropriate set command including the retrieved - value of ipv6RouterAdvertSpinLock. If another manager has - altered the table in the meantime, then the value of - ipv6RouterAdvertSpinLock will have changed and the creation - will fail as it will be specifying an incorrect value for - ipv6RouterAdvertSpinLock. It is suggested, but not - required, that the ipv6RouterAdvertSpinLock be the first var - bind for each set of objects representing a 'row' in a PDU." - ::= { ip 38 } - -ipv6RouterAdvertTable OBJECT-TYPE - SYNTAX SEQUENCE OF Ipv6RouterAdvertEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table containing information used to construct router - advertisements." - ::= { ip 39 } - -ipv6RouterAdvertEntry OBJECT-TYPE - SYNTAX Ipv6RouterAdvertEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry containing information used to construct router - advertisements. - - Information in this table is persistent, and when this - object is written, the entity SHOULD save the change to - non-volatile storage." - INDEX { ipv6RouterAdvertIfIndex } - - - - ::= { ipv6RouterAdvertTable 1 } - -Ipv6RouterAdvertEntry ::= SEQUENCE { - ipv6RouterAdvertIfIndex InterfaceIndex, - ipv6RouterAdvertSendAdverts TruthValue, - ipv6RouterAdvertMaxInterval Unsigned32, - ipv6RouterAdvertMinInterval Unsigned32, - ipv6RouterAdvertManagedFlag TruthValue, - ipv6RouterAdvertOtherConfigFlag TruthValue, - ipv6RouterAdvertLinkMTU Unsigned32, - ipv6RouterAdvertReachableTime Unsigned32, - ipv6RouterAdvertRetransmitTime Unsigned32, - ipv6RouterAdvertCurHopLimit Unsigned32, - ipv6RouterAdvertDefaultLifetime Unsigned32, - ipv6RouterAdvertRowStatus RowStatus - } - -ipv6RouterAdvertIfIndex OBJECT-TYPE - SYNTAX InterfaceIndex - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The index value that uniquely identifies the interface on - which router advertisements constructed with this - information will be transmitted. The interface identified - by a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipv6RouterAdvertEntry 1 } - -ipv6RouterAdvertSendAdverts OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "A flag indicating whether the router sends periodic - router advertisements and responds to router solicitations - on this interface." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { false } - ::= { ipv6RouterAdvertEntry 2 } - -ipv6RouterAdvertMaxInterval OBJECT-TYPE - SYNTAX Unsigned32 (4..1800) - UNITS "seconds" - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The maximum time allowed between sending unsolicited router - - - - advertisements from this interface." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { 600 } - ::= { ipv6RouterAdvertEntry 3 } - -ipv6RouterAdvertMinInterval OBJECT-TYPE - SYNTAX Unsigned32 (3..1350) - UNITS "seconds" - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The minimum time allowed between sending unsolicited router - advertisements from this interface. - - The default is 0.33 * ipv6RouterAdvertMaxInterval, however, - in the case of a low value for ipv6RouterAdvertMaxInterval, - the minimum value for this object is restricted to 3." - REFERENCE "RFC 2461 Section 6.2.1" - ::= { ipv6RouterAdvertEntry 4 } - -ipv6RouterAdvertManagedFlag OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The true/false value to be placed into the 'managed address - configuration' flag field in router advertisements sent from - this interface." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { false } - ::= { ipv6RouterAdvertEntry 5 } - -ipv6RouterAdvertOtherConfigFlag OBJECT-TYPE - SYNTAX TruthValue - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The true/false value to be placed into the 'other stateful - configuration' flag field in router advertisements sent from - this interface." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { false } - ::= { ipv6RouterAdvertEntry 6 } - -ipv6RouterAdvertLinkMTU OBJECT-TYPE - SYNTAX Unsigned32 - MAX-ACCESS read-create - STATUS current - - - - DESCRIPTION - "The value to be placed in MTU options sent by the router on - this interface. - - A value of zero indicates that no MTU options are sent." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { 0 } - ::= { ipv6RouterAdvertEntry 7 } - -ipv6RouterAdvertReachableTime OBJECT-TYPE - SYNTAX Unsigned32 (0..3600000) - UNITS "milliseconds" - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The value to be placed in the reachable time field in router - advertisement messages sent from this interface. - - A value of zero in the router advertisement indicates that - the advertisement isn't specifying a value for reachable - time." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { 0 } - ::= { ipv6RouterAdvertEntry 8 } - -ipv6RouterAdvertRetransmitTime OBJECT-TYPE - SYNTAX Unsigned32 - UNITS "milliseconds" - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The value to be placed in the retransmit timer field in - router advertisements sent from this interface. - - A value of zero in the router advertisement indicates that - the advertisement isn't specifying a value for retrans - time." - REFERENCE "RFC 2461 Section 6.2.1" - DEFVAL { 0 } - ::= { ipv6RouterAdvertEntry 9 } - -ipv6RouterAdvertCurHopLimit OBJECT-TYPE - SYNTAX Unsigned32 (0..255) - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The default value to be placed in the current hop limit - field in router advertisements sent from this interface. - - - - The value should be set to the current diameter of the - Internet. - - A value of zero in the router advertisement indicates that - the advertisement isn't specifying a value for curHopLimit. - - The default should be set to the value specified in the IANA - web pages (www.iana.org) at the time of implementation." - REFERENCE "RFC 2461 Section 6.2.1" - ::= { ipv6RouterAdvertEntry 10 } - -ipv6RouterAdvertDefaultLifetime OBJECT-TYPE - SYNTAX Unsigned32 (0|4..9000) - UNITS "seconds" - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The value to be placed in the router lifetime field of - router advertisements sent from this interface. This value - MUST be either 0 or between ipv6RouterAdvertMaxInterval and - 9000 seconds. - - A value of zero indicates that the router is not to be used - as a default router. - - The default is 3 * ipv6RouterAdvertMaxInterval." - REFERENCE "RFC 2461 Section 6.2.1" - ::= { ipv6RouterAdvertEntry 11 } - -ipv6RouterAdvertRowStatus OBJECT-TYPE - SYNTAX RowStatus - MAX-ACCESS read-create - STATUS current - DESCRIPTION - "The status of this conceptual row. - - As all objects in this conceptual row have default values, a - row can be created and made active by setting this object - appropriately. - - The RowStatus TC requires that this DESCRIPTION clause - states under which circumstances other objects in this row - can be modified. The value of this object has no effect on - whether other objects in this conceptual row can be - modified." - ::= { ipv6RouterAdvertEntry 12 } - --- - - - --- ICMP section --- - -icmp OBJECT IDENTIFIER ::= { mib-2 5 } - --- --- ICMP non-message-specific counters --- - --- These object IDs are reserved, as they were used in earlier --- versions of the MIB module. In theory, OIDs are not assigned --- until the specification is released as an RFC; however, as some --- companies may have shipped code based on earlier versions of --- the MIB, it seems best to reserve these OIDs. --- ::= { icmp 27 } --- ::= { icmp 28 } - -icmpStatsTable OBJECT-TYPE - SYNTAX SEQUENCE OF IcmpStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table of generic system-wide ICMP counters." - ::= { icmp 29 } - -icmpStatsEntry OBJECT-TYPE - SYNTAX IcmpStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row in the icmpStatsTable." - INDEX { icmpStatsIPVersion } - ::= { icmpStatsTable 1 } - -IcmpStatsEntry ::= SEQUENCE { - icmpStatsIPVersion InetVersion, - icmpStatsInMsgs Counter32, - icmpStatsInErrors Counter32, - icmpStatsOutMsgs Counter32, - icmpStatsOutErrors Counter32 - } - -icmpStatsIPVersion OBJECT-TYPE - SYNTAX InetVersion - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP version of the statistics." - - - - ::= { icmpStatsEntry 1 } - -icmpStatsInMsgs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of ICMP messages that the entity received. - Note that this counter includes all those counted by - icmpStatsInErrors." - ::= { icmpStatsEntry 2 } - -icmpStatsInErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of ICMP messages that the entity received but - determined as having ICMP-specific errors (bad ICMP - checksums, bad length, etc.)." - ::= { icmpStatsEntry 3 } - -icmpStatsOutMsgs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of ICMP messages that the entity attempted - to send. Note that this counter includes all those counted - by icmpStatsOutErrors." - ::= { icmpStatsEntry 4 } - -icmpStatsOutErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of ICMP messages that this entity did not send - due to problems discovered within ICMP, such as a lack of - buffers. This value should not include errors discovered - outside the ICMP layer, such as the inability of IP to route - the resultant datagram. In some implementations, there may - be no types of error that contribute to this counter's - value." - ::= { icmpStatsEntry 5 } - --- --- per-version, per-message type ICMP counters - - - --- - -icmpMsgStatsTable OBJECT-TYPE - SYNTAX SEQUENCE OF IcmpMsgStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The table of system-wide per-version, per-message type ICMP - counters." - ::= { icmp 30 } - -icmpMsgStatsEntry OBJECT-TYPE - SYNTAX IcmpMsgStatsEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row in the icmpMsgStatsTable. - - The system should track each ICMP type value, even if that - ICMP type is not supported by the system. However, a - given row need not be instantiated unless a message of that - type has been processed, i.e., the row for - icmpMsgStatsType=X MAY be instantiated before but MUST be - instantiated after the first message with Type=X is - received or transmitted. After receiving or transmitting - any succeeding messages with Type=X, the relevant counter - must be incremented." - INDEX { icmpMsgStatsIPVersion, icmpMsgStatsType } - ::= { icmpMsgStatsTable 1 } - -IcmpMsgStatsEntry ::= SEQUENCE { - icmpMsgStatsIPVersion InetVersion, - icmpMsgStatsType Integer32, - icmpMsgStatsInPkts Counter32, - icmpMsgStatsOutPkts Counter32 - } - -icmpMsgStatsIPVersion OBJECT-TYPE - SYNTAX InetVersion - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The IP version of the statistics." - ::= { icmpMsgStatsEntry 1 } - -icmpMsgStatsType OBJECT-TYPE - SYNTAX Integer32 (0..255) - MAX-ACCESS not-accessible - - - - STATUS current - DESCRIPTION - "The ICMP type field of the message type being counted by - this row. - - Note that ICMP message types are scoped by the address type - in use." - REFERENCE "http://www.iana.org/assignments/icmp-parameters and - http://www.iana.org/assignments/icmpv6-parameters" - ::= { icmpMsgStatsEntry 2 } - -icmpMsgStatsInPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of input packets for this AF and type." - ::= { icmpMsgStatsEntry 3 } - -icmpMsgStatsOutPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of output packets for this AF and type." - ::= { icmpMsgStatsEntry 4 } --- --- conformance information --- - -ipMIBConformance OBJECT IDENTIFIER ::= { ipMIB 2 } - -ipMIBCompliances OBJECT IDENTIFIER ::= { ipMIBConformance 1 } -ipMIBGroups OBJECT IDENTIFIER ::= { ipMIBConformance 2 } - --- compliance statements -ipMIBCompliance2 MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for systems that implement IP - - either IPv4 or IPv6. - - There are a number of INDEX objects that cannot be - represented in the form of OBJECT clauses in SMIv2, but - for which we have the following compliance requirements, - expressed in OBJECT clause form in this description - clause: - - - - - -- OBJECT ipSystemStatsIPVersion - -- SYNTAX InetVersion {ipv4(1), ipv6(2)} - -- DESCRIPTION - -- This MIB requires support for only IPv4 and IPv6 - -- versions. - -- - -- OBJECT ipIfStatsIPVersion - -- SYNTAX InetVersion {ipv4(1), ipv6(2)} - -- DESCRIPTION - -- This MIB requires support for only IPv4 and IPv6 - -- versions. - -- - -- OBJECT icmpStatsIPVersion - -- SYNTAX InetVersion {ipv4(1), ipv6(2)} - -- DESCRIPTION - -- This MIB requires support for only IPv4 and IPv6 - -- versions. - -- - -- OBJECT icmpMsgStatsIPVersion - -- SYNTAX InetVersion {ipv4(1), ipv6(2)} - -- DESCRIPTION - -- This MIB requires support for only IPv4 and IPv6 - -- versions. - -- - -- OBJECT ipAddressPrefixType - -- SYNTAX InetAddressType {ipv4(1), ipv6(2)} - -- DESCRIPTION - -- This MIB requires support for only global IPv4 and - -- IPv6 address types. - -- - -- OBJECT ipAddressPrefixPrefix - -- SYNTAX InetAddress (Size(4 | 16)) - -- DESCRIPTION - -- This MIB requires support for only global IPv4 and - -- IPv6 addresses and so the size can be either 4 or - -- 16 bytes. - -- - -- OBJECT ipAddressAddrType - -- SYNTAX InetAddressType {ipv4(1), ipv6(2), - -- ipv4z(3), ipv6z(4)} - -- DESCRIPTION - -- This MIB requires support for only global and - -- non-global IPv4 and IPv6 address types. - -- - -- OBJECT ipAddressAddr - -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20)) - -- DESCRIPTION - -- This MIB requires support for only global and - - - - -- non-global IPv4 and IPv6 addresses and so the size - -- can be 4, 8, 16, or 20 bytes. - -- - -- OBJECT ipNetToPhysicalNetAddressType - -- SYNTAX InetAddressType {ipv4(1), ipv6(2), - -- ipv4z(3), ipv6z(4)} - -- DESCRIPTION - -- This MIB requires support for only global and - -- non-global IPv4 and IPv6 address types. - -- - -- OBJECT ipNetToPhysicalNetAddress - -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20)) - -- DESCRIPTION - -- This MIB requires support for only global and - -- non-global IPv4 and IPv6 addresses and so the size - -- can be 4, 8, 16, or 20 bytes. - -- - -- OBJECT ipDefaultRouterAddressType - -- SYNTAX InetAddressType {ipv4(1), ipv6(2), - -- ipv4z(3), ipv6z(4)} - -- DESCRIPTION - -- This MIB requires support for only global and - -- non-global IPv4 and IPv6 address types. - -- - -- OBJECT ipDefaultRouterAddress - -- SYNTAX InetAddress (Size(4 | 8 | 16 | 20)) - -- DESCRIPTION - -- This MIB requires support for only global and - -- non-global IPv4 and IPv6 addresses and so the size - -- can be 4, 8, 16, or 20 bytes." - - MODULE -- this module - - MANDATORY-GROUPS { ipSystemStatsGroup, ipAddressGroup, - ipNetToPhysicalGroup, ipDefaultRouterGroup, - icmpStatsGroup } - - GROUP ipSystemStatsHCOctetGroup - DESCRIPTION - "This group is mandatory for systems that have an aggregate - bandwidth of greater than 20MB. Including this group does - not allow an entity to neglect the 32 bit versions of these - objects." - - GROUP ipSystemStatsHCPacketGroup - DESCRIPTION - "This group is mandatory for systems that have an aggregate - bandwidth of greater than 650MB. Including this group - - - - does not allow an entity to neglect the 32 bit versions of - these objects." - - GROUP ipIfStatsGroup - DESCRIPTION - "This group is optional for all systems." - - GROUP ipIfStatsHCOctetGroup - DESCRIPTION - "This group is mandatory for systems that include the - ipIfStatsGroup and include links with bandwidths of greater - than 20MB. Including this group does not allow an entity to - neglect the 32 bit versions of these objects." - - GROUP ipIfStatsHCPacketGroup - DESCRIPTION - "This group is mandatory for systems that include the - ipIfStatsGroup and include links with bandwidths of greater - than 650MB. Including this group does not allow an entity - to neglect the 32 bit versions of these objects." - - GROUP ipv4GeneralGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4." - - GROUP ipv4IfGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4." - - GROUP ipv4SystemStatsGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4." - - GROUP ipv4SystemStatsHCPacketGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4 and - that have an aggregate bandwidth of greater than 650MB. - Including this group does not allow an entity to neglect the - 32 bit versions of these objects." - - GROUP ipv4IfStatsGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4 and - including the ipIfStatsGroup." - - GROUP ipv4IfStatsHCPacketGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv4 and - - - - including the ipIfStatsHCPacketGroup. Including this group - does not allow an entity to neglect the 32 bit versions of - these objects." - - GROUP ipv6GeneralGroup2 - DESCRIPTION - "This group is mandatory for all systems supporting IPv6." - - GROUP ipv6IfGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv6." - - GROUP ipAddressPrefixGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv6." - - GROUP ipv6ScopeGroup - DESCRIPTION - "This group is mandatory for all systems supporting IPv6." - - GROUP ipv6RouterAdvertGroup - DESCRIPTION - "This group is mandatory for all IPv6 routers." - - GROUP ipLastChangeGroup - DESCRIPTION - "This group is optional for all agents." - - OBJECT ipv6IpForwarding - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6IpDefaultHopLimit - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv4InterfaceEnableStatus - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6InterfaceEnableStatus - MIN-ACCESS read-only - - - - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6InterfaceForwarding - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipAddressSpinLock - MIN-ACCESS not-accessible - DESCRIPTION - "An agent is not required to provide write access to this - object. However, if an agent provides write access to any - of the other objects in the ipAddressGroup, it SHOULD - provide write access to this object as well." - - OBJECT ipAddressIfIndex - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipAddressType - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipAddressStatus - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipAddressRowStatus - SYNTAX RowStatus { active(1) } - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipAddressStorageType - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object. - - - - If an agent allows this object to be written or created, it - is not required to allow this object to be set to readOnly, - permanent, or nonVolatile." - - OBJECT ipNetToPhysicalPhysAddress - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipNetToPhysicalType - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - OBJECT ipv6RouterAdvertSpinLock - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object. However, if an agent provides write access to - any of the other objects in the ipv6RouterAdvertGroup, it - SHOULD provide write access to this object as well." - - OBJECT ipv6RouterAdvertSendAdverts - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertMaxInterval - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertMinInterval - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertManagedFlag - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - - - - OBJECT ipv6RouterAdvertOtherConfigFlag - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertLinkMTU - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertReachableTime - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertRetransmitTime - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertCurHopLimit - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertDefaultLifetime - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write access to this - object." - - OBJECT ipv6RouterAdvertRowStatus - MIN-ACCESS read-only - DESCRIPTION - "An agent is not required to provide write or create access - to this object." - - ::= { ipMIBCompliances 2 } - --- units of conformance - -ipv4GeneralGroup OBJECT-GROUP - OBJECTS { ipForwarding, ipDefaultTTL, ipReasmTimeout } - - - - STATUS current - DESCRIPTION - "The group of IPv4-specific objects for basic management of - IPv4 entities." - ::= { ipMIBGroups 3 } - -ipv4IfGroup OBJECT-GROUP - OBJECTS { ipv4InterfaceReasmMaxSize, ipv4InterfaceEnableStatus, - ipv4InterfaceRetransmitTime } - STATUS current - DESCRIPTION - "The group of IPv4-specific objects for basic management of - IPv4 interfaces." - ::= { ipMIBGroups 4 } - -ipv6GeneralGroup2 OBJECT-GROUP - OBJECTS { ipv6IpForwarding, ipv6IpDefaultHopLimit } - STATUS current - DESCRIPTION - "The IPv6 group of objects providing for basic management of - IPv6 entities." - ::= { ipMIBGroups 5 } - -ipv6IfGroup OBJECT-GROUP - OBJECTS { ipv6InterfaceReasmMaxSize, ipv6InterfaceIdentifier, - ipv6InterfaceEnableStatus, ipv6InterfaceReachableTime, - ipv6InterfaceRetransmitTime, ipv6InterfaceForwarding } - STATUS current - DESCRIPTION - "The group of IPv6-specific objects for basic management of - IPv6 interfaces." - ::= { ipMIBGroups 6 } - -ipLastChangeGroup OBJECT-GROUP - OBJECTS { ipv4InterfaceTableLastChange, - ipv6InterfaceTableLastChange, - ipIfStatsTableLastChange } - STATUS current - DESCRIPTION - "The last change objects associated with this MIB. These - objects are optional for all agents. They SHOULD be - implemented on agents where it is possible to determine the - proper values. Where it is not possible to determine the - proper values, for example when the tables are split amongst - several sub-agents using AgentX, the agent MUST NOT - implement these objects to return an incorrect or static - value." - ::= { ipMIBGroups 7 } - - - -ipSystemStatsGroup OBJECT-GROUP - OBJECTS { ipSystemStatsInReceives, - ipSystemStatsInOctets, - ipSystemStatsInHdrErrors, - ipSystemStatsInNoRoutes, - ipSystemStatsInAddrErrors, - ipSystemStatsInUnknownProtos, - ipSystemStatsInTruncatedPkts, - ipSystemStatsInForwDatagrams, - ipSystemStatsReasmReqds, - ipSystemStatsReasmOKs, - ipSystemStatsReasmFails, - ipSystemStatsInDiscards, - ipSystemStatsInDelivers, - ipSystemStatsOutRequests, - ipSystemStatsOutNoRoutes, - ipSystemStatsOutForwDatagrams, - ipSystemStatsOutDiscards, - ipSystemStatsOutFragReqds, - ipSystemStatsOutFragOKs, - ipSystemStatsOutFragFails, - ipSystemStatsOutFragCreates, - ipSystemStatsOutTransmits, - ipSystemStatsOutOctets, - ipSystemStatsInMcastPkts, - ipSystemStatsInMcastOctets, - ipSystemStatsOutMcastPkts, - ipSystemStatsOutMcastOctets, - ipSystemStatsDiscontinuityTime, - ipSystemStatsRefreshRate } - STATUS current - DESCRIPTION - "IP system wide statistics." - ::= { ipMIBGroups 8 } - -ipv4SystemStatsGroup OBJECT-GROUP - OBJECTS { ipSystemStatsInBcastPkts, ipSystemStatsOutBcastPkts } - STATUS current - DESCRIPTION - "IPv4 only system wide statistics." - ::= { ipMIBGroups 9 } - -ipSystemStatsHCOctetGroup OBJECT-GROUP - OBJECTS { ipSystemStatsHCInOctets, - ipSystemStatsHCOutOctets, - ipSystemStatsHCInMcastOctets, - ipSystemStatsHCOutMcastOctets -} - - - - STATUS current - DESCRIPTION - "IP system wide statistics for systems that may overflow the - standard octet counters within 1 hour." - ::= { ipMIBGroups 10 } - -ipSystemStatsHCPacketGroup OBJECT-GROUP - OBJECTS { ipSystemStatsHCInReceives, - ipSystemStatsHCInForwDatagrams, - ipSystemStatsHCInDelivers, - ipSystemStatsHCOutRequests, - ipSystemStatsHCOutForwDatagrams, - ipSystemStatsHCOutTransmits, - ipSystemStatsHCInMcastPkts, - ipSystemStatsHCOutMcastPkts -} - STATUS current - DESCRIPTION - "IP system wide statistics for systems that may overflow the - standard packet counters within 1 hour." - ::= { ipMIBGroups 11 } - -ipv4SystemStatsHCPacketGroup OBJECT-GROUP - OBJECTS { ipSystemStatsHCInBcastPkts, - ipSystemStatsHCOutBcastPkts } - STATUS current - DESCRIPTION - "IPv4 only system wide statistics for systems that may - overflow the standard packet counters within 1 hour." - ::= { ipMIBGroups 12 } - -ipIfStatsGroup OBJECT-GROUP - OBJECTS { ipIfStatsInReceives, ipIfStatsInOctets, - ipIfStatsInHdrErrors, ipIfStatsInNoRoutes, - ipIfStatsInAddrErrors, ipIfStatsInUnknownProtos, - ipIfStatsInTruncatedPkts, ipIfStatsInForwDatagrams, - ipIfStatsReasmReqds, ipIfStatsReasmOKs, - ipIfStatsReasmFails, ipIfStatsInDiscards, - ipIfStatsInDelivers, ipIfStatsOutRequests, - ipIfStatsOutForwDatagrams, ipIfStatsOutDiscards, - ipIfStatsOutFragReqds, ipIfStatsOutFragOKs, - ipIfStatsOutFragFails, ipIfStatsOutFragCreates, - ipIfStatsOutTransmits, ipIfStatsOutOctets, - ipIfStatsInMcastPkts, ipIfStatsInMcastOctets, - ipIfStatsOutMcastPkts, ipIfStatsOutMcastOctets, - ipIfStatsDiscontinuityTime, ipIfStatsRefreshRate } - STATUS current - DESCRIPTION - - - - "IP per-interface statistics." - ::= { ipMIBGroups 13 } - -ipv4IfStatsGroup OBJECT-GROUP - OBJECTS { ipIfStatsInBcastPkts, ipIfStatsOutBcastPkts } - STATUS current - DESCRIPTION - "IPv4 only per-interface statistics." - ::= { ipMIBGroups 14 } - -ipIfStatsHCOctetGroup OBJECT-GROUP - OBJECTS { ipIfStatsHCInOctets, ipIfStatsHCOutOctets, - ipIfStatsHCInMcastOctets, ipIfStatsHCOutMcastOctets } - STATUS current - DESCRIPTION - "IP per-interfaces statistics for systems that include - interfaces that may overflow the standard octet - counters within 1 hour." - ::= { ipMIBGroups 15 } - -ipIfStatsHCPacketGroup OBJECT-GROUP - OBJECTS { ipIfStatsHCInReceives, ipIfStatsHCInForwDatagrams, - ipIfStatsHCInDelivers, ipIfStatsHCOutRequests, - ipIfStatsHCOutForwDatagrams, ipIfStatsHCOutTransmits, - ipIfStatsHCInMcastPkts, ipIfStatsHCOutMcastPkts } - STATUS current - DESCRIPTION - "IP per-interfaces statistics for systems that include - interfaces that may overflow the standard packet counters - within 1 hour." - ::= { ipMIBGroups 16 } - -ipv4IfStatsHCPacketGroup OBJECT-GROUP - OBJECTS { ipIfStatsHCInBcastPkts, ipIfStatsHCOutBcastPkts } - STATUS current - DESCRIPTION - "IPv4 only per-interface statistics for systems that include - interfaces that may overflow the standard packet counters - within 1 hour." - ::= { ipMIBGroups 17 } - -ipAddressPrefixGroup OBJECT-GROUP - OBJECTS { ipAddressPrefixOrigin, - ipAddressPrefixOnLinkFlag, - ipAddressPrefixAutonomousFlag, - ipAddressPrefixAdvPreferredLifetime, - ipAddressPrefixAdvValidLifetime } - STATUS current - - - - DESCRIPTION - "The group of objects for providing information about address - prefixes used by this node." - ::= { ipMIBGroups 18 } - -ipAddressGroup OBJECT-GROUP - OBJECTS { ipAddressSpinLock, ipAddressIfIndex, - ipAddressType, ipAddressPrefix, - ipAddressOrigin, ipAddressStatus, - ipAddressCreated, ipAddressLastChanged, - ipAddressRowStatus, ipAddressStorageType } - STATUS current - DESCRIPTION - "The group of objects for providing information about the - addresses relevant to this entity's interfaces." - ::= { ipMIBGroups 19 } - -ipNetToPhysicalGroup OBJECT-GROUP - OBJECTS { ipNetToPhysicalPhysAddress, ipNetToPhysicalLastUpdated, - ipNetToPhysicalType, ipNetToPhysicalState, - ipNetToPhysicalRowStatus } - STATUS current - DESCRIPTION - "The group of objects for providing information about the - mappings of network address to physical address known to - this node." - ::= { ipMIBGroups 20 } - -ipv6ScopeGroup OBJECT-GROUP - OBJECTS { ipv6ScopeZoneIndexLinkLocal, - ipv6ScopeZoneIndex3, - ipv6ScopeZoneIndexAdminLocal, - ipv6ScopeZoneIndexSiteLocal, - ipv6ScopeZoneIndex6, - ipv6ScopeZoneIndex7, - ipv6ScopeZoneIndexOrganizationLocal, - ipv6ScopeZoneIndex9, - ipv6ScopeZoneIndexA, - ipv6ScopeZoneIndexB, - ipv6ScopeZoneIndexC, - ipv6ScopeZoneIndexD } - STATUS current - DESCRIPTION - "The group of objects for managing IPv6 scope zones." - ::= { ipMIBGroups 21 } - -ipDefaultRouterGroup OBJECT-GROUP - OBJECTS { ipDefaultRouterLifetime, ipDefaultRouterPreference } - - - - STATUS current - DESCRIPTION - "The group of objects for providing information about default - routers known to this node." - ::= { ipMIBGroups 22 } - -ipv6RouterAdvertGroup OBJECT-GROUP - OBJECTS { ipv6RouterAdvertSpinLock, - ipv6RouterAdvertSendAdverts, - ipv6RouterAdvertMaxInterval, - ipv6RouterAdvertMinInterval, - ipv6RouterAdvertManagedFlag, - ipv6RouterAdvertOtherConfigFlag, - ipv6RouterAdvertLinkMTU, - ipv6RouterAdvertReachableTime, - ipv6RouterAdvertRetransmitTime, - ipv6RouterAdvertCurHopLimit, - ipv6RouterAdvertDefaultLifetime, - ipv6RouterAdvertRowStatus -} - STATUS current - DESCRIPTION - "The group of objects for controlling information advertised - by IPv6 routers." - ::= { ipMIBGroups 23 } - -icmpStatsGroup OBJECT-GROUP - OBJECTS {icmpStatsInMsgs, icmpStatsInErrors, - icmpStatsOutMsgs, icmpStatsOutErrors, - icmpMsgStatsInPkts, icmpMsgStatsOutPkts } - STATUS current - DESCRIPTION - "The group of objects providing ICMP statistics." - ::= { ipMIBGroups 24 } - --- --- Deprecated objects --- - -ipInReceives OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of input datagrams received from - interfaces, including those received in error. - - This object has been deprecated, as a new IP version-neutral - - - - table has been added. It is loosely replaced by - ipSystemStatsInRecieves." - ::= { ip 3 } - -ipInHdrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of input datagrams discarded due to errors in - their IPv4 headers, including bad checksums, version number - mismatch, other format errors, time-to-live exceeded, errors - discovered in processing their IPv4 options, etc. - - This object has been deprecated as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsInHdrErrors." - ::= { ip 4 } - -ipInAddrErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of input datagrams discarded because the IPv4 - address in their IPv4 header's destination field was not a - valid address to be received at this entity. This count - includes invalid addresses (e.g., 0.0.0.0) and addresses of - unsupported Classes (e.g., Class E). For entities which are - not IPv4 routers, and therefore do not forward datagrams, - this counter includes datagrams discarded because the - destination address was not a local address. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsInAddrErrors." - ::= { ip 5 } - -ipForwDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of input datagrams for which this entity was not - their final IPv4 destination, as a result of which an - attempt was made to find a route to forward them to that - final destination. In entities which do not act as IPv4 - routers, this counter will include only those packets which - - - - were Source-Routed via this entity, and the Source-Route - option processing was successful. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsInForwDatagrams." - ::= { ip 6 } - -ipInUnknownProtos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of locally-addressed datagrams received - successfully but discarded because of an unknown or - unsupported protocol. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsInUnknownProtos." - ::= { ip 7 } - -ipInDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of input IPv4 datagrams for which no problems - were encountered to prevent their continued processing, but - which were discarded (e.g., for lack of buffer space). Note - that this counter does not include any datagrams discarded - while awaiting re-assembly. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsInDiscards." - ::= { ip 8 } - -ipInDelivers OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of input datagrams successfully delivered - to IPv4 user-protocols (including ICMP). - - This object has been deprecated as a new IP version neutral - table has been added. It is loosely replaced by - - - - ipSystemStatsIndelivers." - ::= { ip 9 } - -ipOutRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of IPv4 datagrams which local IPv4 user - protocols (including ICMP) supplied to IPv4 in requests for - transmission. Note that this counter does not include any - datagrams counted in ipForwDatagrams. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsOutRequests." - ::= { ip 10 } - -ipOutDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of output IPv4 datagrams for which no problem was - encountered to prevent their transmission to their - destination, but which were discarded (e.g., for lack of - buffer space). Note that this counter would include - datagrams counted in ipForwDatagrams if any such packets met - this (discretionary) discard criterion. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsOutDiscards." - ::= { ip 11 } - -ipOutNoRoutes OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 datagrams discarded because no route - could be found to transmit them to their destination. Note - that this counter includes any packets counted in - ipForwDatagrams which meet this `no-route' criterion. Note - that this includes any datagrams which a host cannot route - because all of its default routers are down. - - This object has been deprecated, as a new IP version-neutral - - - - table has been added. It is loosely replaced by - ipSystemStatsOutNoRoutes." - ::= { ip 12 } - -ipReasmReqds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 fragments received which needed to be - reassembled at this entity. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsReasmReqds." - ::= { ip 14 } - -ipReasmOKs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 datagrams successfully re-assembled. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsReasmOKs." - ::= { ip 15 } - -ipReasmFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of failures detected by the IPv4 re-assembly - algorithm (for whatever reason: timed out, errors, etc). - Note that this is not necessarily a count of discarded IPv4 - fragments since some algorithms (notably the algorithm in - RFC 815) can lose track of the number of fragments by - combining them as they are received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsReasmFails." - ::= { ip 16 } - -ipFragOKs OBJECT-TYPE - SYNTAX Counter32 - - - - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 datagrams that have been successfully - fragmented at this entity. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsOutFragOKs." - ::= { ip 17 } - -ipFragFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 datagrams that have been discarded - because they needed to be fragmented at this entity but - could not be, e.g., because their Don't Fragment flag was - set. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - ipSystemStatsOutFragFails." - ::= { ip 18 } - -ipFragCreates OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of IPv4 datagram fragments that have been - generated as a result of fragmentation at this entity. - - This object has been deprecated as a new IP version neutral - table has been added. It is loosely replaced by - ipSystemStatsOutFragCreates." - ::= { ip 19 } - -ipRoutingDiscards OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of routing entries which were chosen to be - discarded even though they are valid. One possible reason - for discarding such an entry could be to free-up buffer - space for other routing entries. - - - - This object was defined in pre-IPv6 versions of the IP MIB. - It was implicitly IPv4 only, but the original specifications - did not indicate this protocol restriction. In order to - clarify the specifications, this object has been deprecated - and a similar, but more thoroughly clarified, object has - been added to the IP-FORWARD-MIB." - ::= { ip 23 } - --- the deprecated IPv4 address table - -ipAddrTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpAddrEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "The table of addressing information relevant to this - entity's IPv4 addresses. - - This table has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by the - ipAddressTable although several objects that weren't deemed - useful weren't carried forward while another - (ipAdEntReasmMaxSize) was moved to the ipv4InterfaceTable." - ::= { ip 20 } - -ipAddrEntry OBJECT-TYPE - SYNTAX IpAddrEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "The addressing information for one of this entity's IPv4 - addresses." - INDEX { ipAdEntAddr } - ::= { ipAddrTable 1 } - -IpAddrEntry ::= SEQUENCE { - ipAdEntAddr IpAddress, - ipAdEntIfIndex INTEGER, - ipAdEntNetMask IpAddress, - ipAdEntBcastAddr INTEGER, - ipAdEntReasmMaxSize INTEGER - } - -ipAdEntAddr OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - - - - "The IPv4 address to which this entry's addressing - information pertains." - ::= { ipAddrEntry 1 } - -ipAdEntIfIndex OBJECT-TYPE - SYNTAX INTEGER (1..2147483647) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The index value which uniquely identifies the interface to - which this entry is applicable. The interface identified by - a particular value of this index is the same interface as - identified by the same value of the IF-MIB's ifIndex." - ::= { ipAddrEntry 2 } - -ipAdEntNetMask OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The subnet mask associated with the IPv4 address of this - entry. The value of the mask is an IPv4 address with all - the network bits set to 1 and all the hosts bits set to 0." - ::= { ipAddrEntry 3 } - -ipAdEntBcastAddr OBJECT-TYPE - SYNTAX INTEGER (0..1) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The value of the least-significant bit in the IPv4 broadcast - address used for sending datagrams on the (logical) - interface associated with the IPv4 address of this entry. - For example, when the Internet standard all-ones broadcast - address is used, the value will be 1. This value applies to - both the subnet and network broadcast addresses used by the - entity on this (logical) interface." - ::= { ipAddrEntry 4 } - -ipAdEntReasmMaxSize OBJECT-TYPE - SYNTAX INTEGER (0..65535) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The size of the largest IPv4 datagram which this entity can - re-assemble from incoming IPv4 fragmented datagrams received - on this interface." - ::= { ipAddrEntry 5 } - - - --- the deprecated IPv4 Address Translation table - --- The Address Translation tables contain the IpAddress to --- "physical" address equivalences. Some interfaces do not --- use translation tables for determining address --- equivalences (e.g., DDN-X.25 has an algorithmic method); --- if all interfaces are of this type, then the Address --- Translation table is empty, i.e., has zero entries. - -ipNetToMediaTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpNetToMediaEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "The IPv4 Address Translation table used for mapping from - IPv4 addresses to physical addresses. - - This table has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by the - ipNetToPhysicalTable." - ::= { ip 22 } - -ipNetToMediaEntry OBJECT-TYPE - SYNTAX IpNetToMediaEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "Each entry contains one IpAddress to `physical' address - equivalence." - INDEX { ipNetToMediaIfIndex, - ipNetToMediaNetAddress } - ::= { ipNetToMediaTable 1 } - -IpNetToMediaEntry ::= SEQUENCE { - ipNetToMediaIfIndex INTEGER, - ipNetToMediaPhysAddress PhysAddress, - ipNetToMediaNetAddress IpAddress, - ipNetToMediaType INTEGER - } - -ipNetToMediaIfIndex OBJECT-TYPE - SYNTAX INTEGER (1..2147483647) - MAX-ACCESS read-create - STATUS deprecated - DESCRIPTION - "The interface on which this entry's equivalence is - effective. The interface identified by a particular value - of this index is the same interface as identified by the - - - - same value of the IF-MIB's ifIndex. - - This object predates the rule limiting index objects to a - max access value of 'not-accessible' and so continues to use - a value of 'read-create'." - ::= { ipNetToMediaEntry 1 } - -ipNetToMediaPhysAddress OBJECT-TYPE - SYNTAX PhysAddress (SIZE(0..65535)) - MAX-ACCESS read-create - STATUS deprecated - DESCRIPTION - "The media-dependent `physical' address. This object should - return 0 when this entry is in the 'incomplete' state. - - As the entries in this table are typically not persistent - when this object is written the entity should not save the - change to non-volatile storage. Note: a stronger - requirement is not used because this object was previously - defined." - ::= { ipNetToMediaEntry 2 } - -ipNetToMediaNetAddress OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-create - STATUS deprecated - DESCRIPTION - "The IpAddress corresponding to the media-dependent - `physical' address. - - This object predates the rule limiting index objects to a - max access value of 'not-accessible' and so continues to use - a value of 'read-create'." - ::= { ipNetToMediaEntry 3 } - -ipNetToMediaType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - invalid(2), -- an invalidated mapping - dynamic(3), - static(4) - } - MAX-ACCESS read-create - STATUS deprecated - DESCRIPTION - "The type of mapping. - - Setting this object to the value invalid(2) has the effect - - - - of invalidating the corresponding entry in the - ipNetToMediaTable. That is, it effectively dis-associates - the interface identified with said entry from the mapping - identified with said entry. It is an implementation- - specific matter as to whether the agent removes an - invalidated entry from the table. Accordingly, management - stations must be prepared to receive tabular information - from agents that corresponds to entries not currently in - use. Proper interpretation of such entries requires - examination of the relevant ipNetToMediaType object. - - As the entries in this table are typically not persistent - when this object is written the entity should not save the - change to non-volatile storage. Note: a stronger - requirement is not used because this object was previously - defined." - ::= { ipNetToMediaEntry 4 } - --- the deprecated ICMP group - -icmpInMsgs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of ICMP messages which the entity received. - Note that this counter includes all those counted by - icmpInErrors. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - icmpStatsInMsgs." - ::= { icmp 1 } - -icmpInErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP messages which the entity received but - determined as having ICMP-specific errors (bad ICMP - checksums, bad length, etc.). - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - icmpStatsInErrors." - ::= { icmp 2 } - - - - -icmpInDestUnreachs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Destination Unreachable messages - received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 3 } - -icmpInTimeExcds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Time Exceeded messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 4 } - -icmpInParmProbs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Parameter Problem messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 5 } - -icmpInSrcQuenchs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Source Quench messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 6 } - - - -icmpInRedirects OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Redirect messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 7 } - -icmpInEchos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Echo (request) messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 8 } - -icmpInEchoReps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Echo Reply messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 9 } - -icmpInTimestamps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Timestamp (request) messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 10 } - - - - -icmpInTimestampReps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Timestamp Reply messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 11 } - -icmpInAddrMasks OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Address Mask Request messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 12 } - -icmpInAddrMaskReps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Address Mask Reply messages received. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 13 } - -icmpOutMsgs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The total number of ICMP messages which this entity - attempted to send. Note that this counter includes all - those counted by icmpOutErrors. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - icmpStatsOutMsgs." - - - - ::= { icmp 14 } - -icmpOutErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP messages which this entity did not send - due to problems discovered within ICMP, such as a lack of - buffers. This value should not include errors discovered - outside the ICMP layer, such as the inability of IP to route - the resultant datagram. In some implementations, there may - be no types of error which contribute to this counter's - value. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by - icmpStatsOutErrors." - ::= { icmp 15 } - -icmpOutDestUnreachs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Destination Unreachable messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 16 } - -icmpOutTimeExcds OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Time Exceeded messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 17 } - -icmpOutParmProbs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - - - - DESCRIPTION - "The number of ICMP Parameter Problem messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 18 } - -icmpOutSrcQuenchs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Source Quench messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 19 } - -icmpOutRedirects OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Redirect messages sent. For a host, this - object will always be zero, since hosts do not send - redirects. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 20 } - -icmpOutEchos OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Echo (request) messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 21 } - -icmpOutEchoReps OBJECT-TYPE - SYNTAX Counter32 - - - - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Echo Reply messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 22 } - -icmpOutTimestamps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Timestamp (request) messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 23 } - -icmpOutTimestampReps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Timestamp Reply messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 24 } - -icmpOutAddrMasks OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Address Mask Request messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 25 } - -icmpOutAddrMaskReps OBJECT-TYPE - SYNTAX Counter32 - - - - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The number of ICMP Address Mask Reply messages sent. - - This object has been deprecated, as a new IP version-neutral - table has been added. It is loosely replaced by a column in - the icmpMsgStatsTable." - ::= { icmp 26 } - --- deprecated conformance information --- deprecated compliance statements - -ipMIBCompliance MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "The compliance statement for systems that implement only - IPv4. For version-independence, this compliance statement - is deprecated in favor of ipMIBCompliance2." - MODULE -- this module - MANDATORY-GROUPS { ipGroup, - icmpGroup } - ::= { ipMIBCompliances 1 } - --- deprecated units of conformance - -ipGroup OBJECT-GROUP - OBJECTS { ipForwarding, ipDefaultTTL, - ipInReceives, ipInHdrErrors, - ipInAddrErrors, ipForwDatagrams, - ipInUnknownProtos, ipInDiscards, - ipInDelivers, ipOutRequests, - ipOutDiscards, ipOutNoRoutes, - ipReasmTimeout, ipReasmReqds, - ipReasmOKs, ipReasmFails, - ipFragOKs, ipFragFails, - ipFragCreates, ipAdEntAddr, - ipAdEntIfIndex, ipAdEntNetMask, - ipAdEntBcastAddr, ipAdEntReasmMaxSize, - ipNetToMediaIfIndex, ipNetToMediaPhysAddress, - ipNetToMediaNetAddress, ipNetToMediaType, - ipRoutingDiscards -} - STATUS deprecated - DESCRIPTION - "The ip group of objects providing for basic management of IP - entities, exclusive of the management of IP routes. - - - - - As part of the version independence, this group has been - deprecated. " - ::= { ipMIBGroups 1 } - -icmpGroup OBJECT-GROUP - OBJECTS { icmpInMsgs, icmpInErrors, - icmpInDestUnreachs, icmpInTimeExcds, - icmpInParmProbs, icmpInSrcQuenchs, - icmpInRedirects, icmpInEchos, - icmpInEchoReps, icmpInTimestamps, - icmpInTimestampReps, icmpInAddrMasks, - icmpInAddrMaskReps, icmpOutMsgs, - icmpOutErrors, icmpOutDestUnreachs, - icmpOutTimeExcds, icmpOutParmProbs, - icmpOutSrcQuenchs, icmpOutRedirects, - icmpOutEchos, icmpOutEchoReps, - icmpOutTimestamps, icmpOutTimestampReps, - icmpOutAddrMasks, icmpOutAddrMaskReps } - STATUS deprecated - DESCRIPTION - "The icmp group of objects providing ICMP statistics. - - As part of the version independence, this group has been - deprecated. " - ::= { ipMIBGroups 2 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 deleted file mode 100644 index 4b1bdcf..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1212 +++ /dev/null @@ -1,75 +0,0 @@ -RFC-1212 DEFINITIONS ::= BEGIN - - IMPORTS - ObjectName - FROM RFC1155-SMI; --- DisplayString --- FROM RFC1158-MIB; - - OBJECT-TYPE MACRO ::= - BEGIN - TYPE NOTATION ::= - -- must conform to - -- RFC1155's ObjectSyntax - "SYNTAX" type(ObjectSyntax) - "ACCESS" Access - "STATUS" Status - DescrPart - ReferPart - IndexPart - DefValPart - VALUE NOTATION ::= value (VALUE ObjectName) - - Access ::= "read-only" - | "read-write" - | "write-only" - | "not-accessible" - Status ::= "mandatory" - | "optional" - | "obsolete" - | "deprecated" - - DescrPart ::= - "DESCRIPTION" value (description DisplayString) - | empty - - ReferPart ::= - "REFERENCE" value (reference DisplayString) - | empty - - IndexPart ::= - "INDEX" "{" IndexTypes "}" - | empty - IndexTypes ::= - IndexType | IndexTypes "," IndexType - IndexType ::= - -- if indexobject, use the SYNTAX - -- value of the correspondent - -- OBJECT-TYPE invocation - value (indexobject ObjectName) - -- otherwise use named SMI type - -- must conform to IndexSyntax below - | type (indextype) - - DefValPart ::= - "DEFVAL" "{" value (defvalue ObjectSyntax) "}" - | empty - - END - - IndexSyntax ::= - CHOICE { - number - INTEGER (0..MAX), - string - OCTET STRING, - object - OBJECT IDENTIFIER, - address - NetworkAddress, - ipAddress - IpAddress - } - -END - diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 deleted file mode 100644 index 3cdcfdf..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC-1215 +++ /dev/null @@ -1,34 +0,0 @@ -RFC-1215 DEFINITIONS ::= BEGIN - - IMPORTS - ObjectName - FROM RFC1155-SMI; - - TRAP-TYPE MACRO ::= - BEGIN - TYPE NOTATION ::= "ENTERPRISE" value - (enterprise OBJECT IDENTIFIER) - VarPart - DescrPart - ReferPart - VALUE NOTATION ::= value (VALUE INTEGER) - - VarPart ::= - "VARIABLES" "{" VarTypes "}" - | empty - VarTypes ::= - VarType | VarTypes "," VarType - VarType ::= - value (vartype ObjectName) - - DescrPart ::= - "DESCRIPTION" value (description DisplayString) - | empty - - ReferPart ::= - "REFERENCE" value (reference DisplayString) - | empty - - END - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI deleted file mode 100644 index 40e55d7..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1065-SMI +++ /dev/null @@ -1,132 +0,0 @@ -RFC1065-SMI DEFINITIONS ::= BEGIN - -EXPORTS -- EVERYTHING - internet, directory, mgmt, - experimental, private, enterprises, - OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax, - ApplicationSyntax, NetworkAddress, IpAddress, - Counter, Gauge, TimeTicks, Opaque; - - -- the path to the root - - internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 } - - directory OBJECT IDENTIFIER ::= { internet 1 } - - mgmt OBJECT IDENTIFIER ::= { internet 2 } - - experimental OBJECT IDENTIFIER ::= { internet 3 } - - private OBJECT IDENTIFIER ::= { internet 4 } - enterprises OBJECT IDENTIFIER ::= { private 1 } - - - -- definition of object types - - OBJECT-TYPE MACRO ::= - BEGIN - TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax) - "ACCESS" Access - "STATUS" Status - VALUE NOTATION ::= value (VALUE ObjectName) - - Access ::= "read-only" - | "read-write" - | "write-only" - | "not-accessible" - Status ::= "mandatory" - | "optional" - | "obsolete" - END - - -- names of objects in the MIB - - ObjectName ::= - OBJECT IDENTIFIER - - - - -- syntax of objects in the MIB - - ObjectSyntax ::= - CHOICE { - simple - SimpleSyntax, - - -- note that simple SEQUENCEs are not directly - -- mentioned here to keep things simple (i.e., - -- prevent mis-use). However, application-wide - -- types which are IMPLICITly encoded simple - -- SEQUENCEs may appear in the following CHOICE - - application-wide - ApplicationSyntax - } - - SimpleSyntax ::= - CHOICE { - number - INTEGER, - - string - OCTET STRING, - - object - OBJECT IDENTIFIER, - - empty - NULL - } - - ApplicationSyntax ::= - CHOICE { - address - NetworkAddress, - - counter - Counter, - - gauge - Gauge, - - ticks - TimeTicks, - - arbitrary - Opaque - - - -- other application-wide types, as they are - -- defined, will be added here - } - - - -- application-wide types - - NetworkAddress ::= - CHOICE { - internet - IpAddress - } - - IpAddress ::= - [APPLICATION 0] -- in network-byte order - IMPLICIT OCTET STRING (SIZE (4)) - - Counter ::= - [APPLICATION 1] - IMPLICIT INTEGER (0..4294967295) - - Gauge ::= - [APPLICATION 2] - IMPLICIT INTEGER (0..4294967295) - - TimeTicks ::= - [APPLICATION 3] - IMPLICIT INTEGER - - Opaque ::= - [APPLICATION 4] -- arbitrary ASN.1 value, - IMPLICIT OCTET STRING -- "double-wrapped" - - END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI deleted file mode 100644 index a6c3bf6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1155-SMI +++ /dev/null @@ -1,129 +0,0 @@ -RFC1155-SMI DEFINITIONS ::= BEGIN - -EXPORTS -- EVERYTHING - internet, directory, mgmt, - experimental, private, enterprises, - OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax, - ApplicationSyntax, NetworkAddress, IpAddress, - Counter, Gauge, TimeTicks, Opaque; - - -- the path to the root - - internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 } - - directory OBJECT IDENTIFIER ::= { internet 1 } - - mgmt OBJECT IDENTIFIER ::= { internet 2 } - - experimental OBJECT IDENTIFIER ::= { internet 3 } - - private OBJECT IDENTIFIER ::= { internet 4 } - enterprises OBJECT IDENTIFIER ::= { private 1 } - - - -- definition of object types - - OBJECT-TYPE MACRO ::= - BEGIN - TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax) - "ACCESS" Access - "STATUS" Status - VALUE NOTATION ::= value (VALUE ObjectName) - - Access ::= "read-only" - | "read-write" - | "write-only" - | "not-accessible" - Status ::= "mandatory" - | "optional" - | "obsolete" - END - - -- names of objects in the MIB - - ObjectName ::= - OBJECT IDENTIFIER - - -- syntax of objects in the MIB - - ObjectSyntax ::= - CHOICE { - simple - SimpleSyntax, - - -- note that simple SEQUENCEs are not directly - -- mentioned here to keep things simple (i.e., - -- prevent mis-use). However, application-wide - -- types which are IMPLICITly encoded simple - -- SEQUENCEs may appear in the following CHOICE - - application-wide - ApplicationSyntax - } - - SimpleSyntax ::= - CHOICE { - number - INTEGER, - - string - OCTET STRING, - - object - OBJECT IDENTIFIER, - - empty - NULL - } - - ApplicationSyntax ::= - CHOICE { - address - NetworkAddress, - - counter - Counter, - - gauge - Gauge, - - ticks - TimeTicks, - - arbitrary - Opaque - - -- other application-wide types, as they are - -- defined, will be added here - } - - - -- application-wide types - - NetworkAddress ::= - CHOICE { - internet - IpAddress - } - - IpAddress ::= - [APPLICATION 0] -- in network-byte order - IMPLICIT OCTET STRING (SIZE (4)) - - Counter ::= - [APPLICATION 1] - IMPLICIT INTEGER (0..4294967295) - - Gauge ::= - [APPLICATION 2] - IMPLICIT INTEGER (0..4294967295) - - TimeTicks ::= - [APPLICATION 3] - IMPLICIT INTEGER (0..4294967295) - - Opaque ::= - [APPLICATION 4] -- arbitrary ASN.1 value, - IMPLICIT OCTET STRING -- "double-wrapped" - - END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB deleted file mode 100644 index 4acf34a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1158-MIB +++ /dev/null @@ -1,1493 +0,0 @@ -RFC1158-MIB DEFINITIONS ::= BEGIN - -IMPORTS - mgmt, OBJECT-TYPE, NetworkAddress, IpAddress, - Counter, Gauge, TimeTicks - FROM RFC1155-SMI; - -DisplayString ::= - OCTET STRING - -mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } -- MIB-II - -- (same prefix as MIB-I) - -system OBJECT IDENTIFIER ::= { mib-2 1 } -interfaces OBJECT IDENTIFIER ::= { mib-2 2 } -at OBJECT IDENTIFIER ::= { mib-2 3 } -ip OBJECT IDENTIFIER ::= { mib-2 4 } -icmp OBJECT IDENTIFIER ::= { mib-2 5 } -tcp OBJECT IDENTIFIER ::= { mib-2 6 } -udp OBJECT IDENTIFIER ::= { mib-2 7 } -egp OBJECT IDENTIFIER ::= { mib-2 8 } --- cmot OBJECT IDENTIFIER ::= { mib-2 9 } -transmission OBJECT IDENTIFIER ::= { mib-2 10 } -snmp OBJECT IDENTIFIER ::= { mib-2 11 } - - --- object types - --- the System group - -sysDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-only - STATUS mandatory - ::= { system 1 } - -sysObjectID OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - ACCESS read-only - STATUS mandatory - ::= { system 2 } - -sysUpTime OBJECT-TYPE - SYNTAX TimeTicks - ACCESS read-only - STATUS mandatory - ::= { system 3 } - -sysContact OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-write - STATUS mandatory - ::= { system 4 } - -sysName OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-write - STATUS mandatory - ::= { system 5 } - -sysLocation OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-only - STATUS mandatory - ::= { system 6 } - -sysServices OBJECT-TYPE - SYNTAX INTEGER (0..127) - ACCESS read-only - STATUS mandatory - ::= { system 7 } - - --- the Interfaces group - -ifNumber OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { interfaces 1 } - --- the Interfaces table - -ifTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfEntry - ACCESS read-only - STATUS mandatory - ::= { interfaces 2 } - -ifEntry OBJECT-TYPE - SYNTAX IfEntry - ACCESS read-only - STATUS mandatory - ::= { ifTable 1 } - -IfEntry ::= SEQUENCE { - ifIndex - INTEGER, - ifDescr - DisplayString, - ifType - INTEGER, - ifMtu - INTEGER, - ifSpeed - Gauge, - ifPhysAddress - OCTET STRING, - ifAdminStatus - INTEGER, - ifOperStatus - INTEGER, - ifLastChange - TimeTicks, - ifInOctets - Counter, - ifInUcastPkts - Counter, - ifInNUcastPkts - Counter, - ifInDiscards - Counter, - ifInErrors - Counter, - ifInUnknownProtos - Counter, - ifOutOctets - Counter, - ifOutUcastPkts - Counter, - ifOutNUcastPkts - Counter, - ifOutDiscards - Counter, - ifOutErrors - Counter, - ifOutQLen - Gauge, - ifSpecific - OBJECT IDENTIFIER -} - -ifIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { ifEntry 1 } - -ifDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-only - STATUS mandatory - ::= { ifEntry 2 } - -ifType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the - -- following - regular1822(2), - hdh1822(3), - ddn-x25(4), - rfc877-x25(5), - ethernet-csmacd(6), - iso88023-csmacd(7), - iso88024-tokenBus(8), - iso88025-tokenRing(9), - iso88026-man(10), - starLan(11), - proteon-10Mbit(12), - proteon-80Mbit(13), - hyperchannel(14), - fddi(15), - lapb(16), - sdlc(17), - t1-carrier(18), - cept(19), -- european - --equivalent of T-1 - basicISDN(20), - primaryISDN(21), - -- proprietary - -- serial - propPointToPointSerial(22), - terminalServer-asyncPort(23), - softwareLoopback(24), - eon(25), -- CLNP over IP - ethernet-3Mbit(26), - nsip(27), -- XNS over IP - slip(28) -- generic SLIP - } - ACCESS read-only - STATUS mandatory - ::= { ifEntry 3 } - -ifMtu OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { ifEntry 4 } - -ifSpeed OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - ::= { ifEntry 5 } - -ifPhysAddress OBJECT-TYPE - SYNTAX OCTET STRING - ACCESS read-only - STATUS mandatory - ::= { ifEntry 6 } - -ifAdminStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3) -- in some test mode - } - ACCESS read-write - STATUS mandatory - ::= { ifEntry 7 } - -ifOperStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3) -- in some test mode - } - ACCESS read-only - STATUS mandatory - ::= { ifEntry 8 } - -ifLastChange OBJECT-TYPE - SYNTAX TimeTicks - ACCESS read-only - STATUS mandatory - ::= { ifEntry 9 } - -ifInOctets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 10 } - -ifInUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 11 } - -ifInNUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 12 } - -ifInDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 13 } - -ifInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 14 } - -ifInUnknownProtos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 15 } - -ifOutOctets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 16 } - -ifOutUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 17 } - -ifOutNUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 18 } - -ifOutDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 19 } - -ifOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ifEntry 20 } - -ifOutQLen OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - ::= { ifEntry 21 } - -ifSpecific OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - ACCESS read-only - STATUS mandatory - ::= { ifEntry 22 } - -nullSpecific OBJECT IDENTIFIER ::= { 0 0 } - --- the Address Translation group (deprecated) - -atTable OBJECT-TYPE - SYNTAX SEQUENCE OF AtEntry - ACCESS read-write - STATUS deprecated - ::= { at 1 } - -atEntry OBJECT-TYPE - SYNTAX AtEntry - ACCESS read-write - STATUS deprecated - ::= { atTable 1 } - -AtEntry ::= SEQUENCE { - atIfIndex - INTEGER, - atPhysAddress - OCTET STRING, - atNetAddress - NetworkAddress -} - -atIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS deprecated - ::= { atEntry 1 } - -atPhysAddress OBJECT-TYPE - SYNTAX OCTET STRING - ACCESS read-write - STATUS deprecated - ::= { atEntry 2 } - -atNetAddress OBJECT-TYPE - SYNTAX NetworkAddress - ACCESS read-write - STATUS deprecated - ::= { atEntry 3 } - - --- the IP group - -ipForwarding OBJECT-TYPE - SYNTAX INTEGER { - gateway(1), -- entity forwards - -- datagrams - host(2) -- entity does NOT - -- forward datagrams - } - ACCESS read-write - STATUS mandatory - ::= { ip 1 } - -ipDefaultTTL OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ip 2 } - -ipInReceives OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 3 } - -ipInHdrErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 4 } - -ipInAddrErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 5 } - -ipForwDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 6 } - -ipInUnknownProtos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 7 } - -ipInDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 8 } - -ipInDelivers OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 9 } - -ipOutRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 10 } - -ipOutDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 11 } - -ipOutNoRoutes OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 12 } - -ipReasmTimeout OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { ip 13 } - -ipReasmReqds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 14 } - -ipReasmOKs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 15 } - -ipReasmFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 16 } - -ipFragOKs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 17 } - -ipFragFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 18 } - -ipFragCreates OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { ip 19 } - --- the IP Interface table - -ipAddrTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpAddrEntry - ACCESS read-only - STATUS mandatory - ::= { ip 20 } - -ipAddrEntry OBJECT-TYPE - SYNTAX IpAddrEntry - ACCESS read-only - STATUS mandatory - ::= { ipAddrTable 1 } - -IpAddrEntry ::= SEQUENCE { - ipAdEntAddr - IpAddress, - ipAdEntIfIndex - INTEGER, - ipAdEntNetMask - IpAddress, - ipAdEntBcastAddr - INTEGER, - ipAdEntReasmMaxSize - INTEGER (0..65535) -} - -ipAdEntAddr OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { ipAddrEntry 1 } - -ipAdEntIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { ipAddrEntry 2 } - -ipAdEntNetMask OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { ipAddrEntry 3 } - -ipAdEntBcastAddr OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { ipAddrEntry 4 } - -ipAdEntReasmMaxSize OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - ::= { ipAddrEntry 5 } - --- the IP Routing table - -ipRoutingTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpRouteEntry - ACCESS read-write - STATUS mandatory - ::= { ip 21 } - -ipRouteEntry OBJECT-TYPE - SYNTAX IpRouteEntry - ACCESS read-write - STATUS mandatory - ::= { ipRoutingTable 1 } - -IpRouteEntry ::= SEQUENCE { - ipRouteDest - IpAddress, - ipRouteIfIndex - INTEGER, - ipRouteMetric1 - INTEGER, - ipRouteMetric2 - INTEGER, - ipRouteMetric3 - INTEGER, - ipRouteMetric4 - INTEGER, - ipRouteNextHop - IpAddress, - ipRouteType - INTEGER, - ipRouteProto - INTEGER, - ipRouteAge - INTEGER, - ipRouteMask - IpAddress -} - -ipRouteDest OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 1 } - -ipRouteIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 2 } - -ipRouteMetric1 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 3 } - -ipRouteMetric2 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 4 } - -ipRouteMetric3 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 5 } - -ipRouteMetric4 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 6 } - -ipRouteNextHop OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 7 } - -ipRouteType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - invalid(2), -- an invalidated route - - -- route to directly - direct(3), -- connected - -- (sub-)network - - -- route to a non-local - remote(4) -- host/network/ - -- sub-network - } - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 8 } - -ipRouteProto OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - -- non-protocol - -- information - - -- e.g., manually - local(2), -- configured entries - - -- set via a network - netmgmt(3), -- management protocol - - -- obtained via ICMP, - icmp(4), -- e.g., Redirect - - -- the following are - -- gateway routing - -- protocols - egp(5), - ggp(6), - hello(7), - rip(8), - is-is(9), - es-is(10), - ciscoIgrp(11), - bbnSpfIgp(12), - ospf(13), - bgp(14) - } - ACCESS read-only - STATUS mandatory - ::= { ipRouteEntry 9 } - -ipRouteAge OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 10 } - -ipRouteMask OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - ::= { ipRouteEntry 11 } - --- the IP Address Translation tables - -ipNetToMediaTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpNetToMediaEntry - ACCESS read-write - STATUS mandatory - ::= { ip 22 } - -ipNetToMediaEntry OBJECT-TYPE - SYNTAX IpNetToMediaEntry - ACCESS read-write - STATUS mandatory - ::= { ipNetToMediaTable 1 } - -IpNetToMediaEntry ::= SEQUENCE { - ipNetToMediaIfIndex - INTEGER, - ipNetToMediaPhysAddress - OCTET STRING, - ipNetToMediaNetAddress - IpAddress, - ipNetToMediaType - INTEGER -} - -ipNetToMediaIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - ::= { ipNetToMediaEntry 1 } - -ipNetToMediaPhysAddress OBJECT-TYPE - SYNTAX OCTET STRING - ACCESS read-write - STATUS mandatory - ::= { ipNetToMediaEntry 2 } - -ipNetToMediaNetAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - ::= { ipNetToMediaEntry 3 } - -ipNetToMediaType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - invalid(2), -- an invalidated mapping - dynamic(3), -- connected (sub-)network - - static(4) - } - ACCESS read-write - STATUS mandatory - ::= { ipNetToMediaEntry 4 } - --- the ICMP group - -icmpInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 1 } - -icmpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 2 } - -icmpInDestUnreachs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 3 } - -icmpInTimeExcds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 4 } - -icmpInParmProbs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 5 } - -icmpInSrcQuenchs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 6 } - -icmpInRedirects OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 7 } - -icmpInEchos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 8 } - -icmpInEchoReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 9 } - -icmpInTimestamps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 10 } - -icmpInTimestampReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 11 } - -icmpInAddrMasks OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 12 } - -icmpInAddrMaskReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 13 } - -icmpOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 14 } - -icmpOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 15 } - -icmpOutDestUnreachs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 16 } - -icmpOutTimeExcds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 17 } - -icmpOutParmProbs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 18 } - -icmpOutSrcQuenchs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 19 } - -icmpOutRedirects OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 20 } - -icmpOutEchos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 21 } - -icmpOutEchoReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 22 } - -icmpOutTimestamps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 23 } - -icmpOutTimestampReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 24 } - -icmpOutAddrMasks OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 25 } - -icmpOutAddrMaskReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { icmp 26 } - - --- the TCP group - -tcpRtoAlgorithm OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - constant(2), -- a constant rto - rsre(3), -- MIL-STD-1778, - -- Appendix B - vanj(4) -- Van Jacobson's - -- algorithm - } - ACCESS read-only - STATUS mandatory - ::= { tcp 1 } - -tcpRtoMin OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { tcp 2 } - -tcpRtoMax OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { tcp 3 } - -tcpMaxConn OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { tcp 4 } - -tcpActiveOpens OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 5 } - -tcpPassiveOpens OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 6 } - -tcpAttemptFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 7 } - -tcpEstabResets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 8 } - -tcpCurrEstab OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - ::= { tcp 9 } - -tcpInSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 10 } - -tcpOutSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 11 } - -tcpRetransSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 12 } - --- the TCP connections table - -tcpConnTable OBJECT-TYPE - SYNTAX SEQUENCE OF TcpConnEntry - ACCESS read-only - STATUS mandatory - ::= { tcp 13 } - -tcpConnEntry OBJECT-TYPE - SYNTAX TcpConnEntry - ACCESS read-only - STATUS mandatory - ::= { tcpConnTable 1 } - -TcpConnEntry ::= SEQUENCE { - tcpConnState - INTEGER, - tcpConnLocalAddress - IpAddress, - tcpConnLocalPort - INTEGER (0..65535), - tcpConnRemAddress - IpAddress, - tcpConnRemPort - INTEGER (0..65535) -} - -tcpConnState OBJECT-TYPE - SYNTAX INTEGER { - closed(1), - listen(2), - synSent(3), - synReceived(4), - established(5), - finWait1(6), - finWait2(7), - closeWait(8), - lastAck(9), - closing(10), - timeWait(11) - } - ACCESS read-only - STATUS mandatory - ::= { tcpConnEntry 1 } - -tcpConnLocalAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { tcpConnEntry 2 } - -tcpConnLocalPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - ::= { tcpConnEntry 3 } - -tcpConnRemAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { tcpConnEntry 4 } - -tcpConnRemPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - ::= { tcpConnEntry 5 } - --- additional TCP variables - -tcpInErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 14 } - -tcpOutRsts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { tcp 15 } - - --- the UDP group - -udpInDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { udp 1 } - -udpNoPorts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { udp 2 } - -udpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { udp 3 } - -udpOutDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { udp 4 } - --- the UDP listener table - -udpTable OBJECT-TYPE - SYNTAX SEQUENCE OF UdpEntry - ACCESS read-only - STATUS mandatory - ::= { udp 5 } - -udpEntry OBJECT-TYPE - SYNTAX UdpEntry - ACCESS read-only - STATUS mandatory - ::= { udpTable 1 } - -UdpEntry ::= SEQUENCE { - udpLocalAddress - IpAddress, - udpLocalPort - INTEGER (0..65535) -} - -udpLocalAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { udpEntry 1 } - -udpLocalPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - ::= { udpEntry 2 } - --- the EGP group - -egpInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egp 1 } - -egpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egp 2 } - -egpOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egp 3 } - -egpOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egp 4 } - --- the EGP Neighbor table - -egpNeighTable OBJECT-TYPE - SYNTAX SEQUENCE OF EgpNeighEntry - ACCESS read-only - STATUS mandatory - ::= { egp 5 } - -egpNeighEntry OBJECT-TYPE - SYNTAX EgpNeighEntry - ACCESS read-only - STATUS mandatory - ::= { egpNeighTable 1 } - -EgpNeighEntry ::= SEQUENCE { - egpNeighState - INTEGER, - egpNeighAddr - IpAddress, - egpNeighAs - INTEGER, - egpNeighInMsgs - Counter, - egpNeighInErrs - Counter, - egpNeighOutMsgs - Counter, - egpNeighOutErrs - Counter, - egpNeighInErrMsgs - Counter, - egpNeighOutErrMsgs - Counter, - egpNeighStateUps - Counter, - egpNeighStateDowns - Counter, - egpNeighIntervalHello - INTEGER, - egpNeighIntervalPoll - INTEGER, - egpNeighMode - INTEGER, - egpNeighEventTrigger - INTEGER -} - -egpNeighState OBJECT-TYPE - SYNTAX INTEGER { - idle(1), - acquisition(2), - down(3), - up(4), - cease(5) - } - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 1 } - -egpNeighAddr OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 2 } - -egpNeighAs OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 3 } - -egpNeighInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 4 } - -egpNeighInErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 5 } - -egpNeighOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 6 } - -egpNeighOutErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 7 } - -egpNeighInErrMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 8 } - -egpNeighOutErrMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 9 } - -egpNeighStateUps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 10 } - -egpNeighStateDowns OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 11 } - -egpNeighIntervalHello OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 12 } - -egpNeighIntervalPoll OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 13 } - -egpNeighMode OBJECT-TYPE - SYNTAX INTEGER { - active(1), - passive(2) - } - ACCESS read-only - STATUS mandatory - ::= { egpNeighEntry 14 } - -egpNeighEventTrigger OBJECT-TYPE - SYNTAX INTEGER { - start(1), - stop(2) - } - ACCESS read-write - STATUS mandatory - ::= { egpNeighEntry 15 } - --- additional EGP variables - -egpAs OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - ::= { egp 6 } - - --- the Transmission group (empty at present) - --- the SNMP group - -snmpInPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 1 } - -snmpOutPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 2 } - -snmpInBadVersions OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 3 } - -snmpInBadCommunityNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 4 } - -snmpInBadCommunityUses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 5 } - -snmpInASNParseErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 6 } - -snmpInBadTypes OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 7 } - -snmpInTooBigs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 8 } - -snmpInNoSuchNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 9 } - -snmpInBadValues OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 10 } - -snmpInReadOnlys OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 11 } - -snmpInGenErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 12 } - -snmpInTotalReqVars OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 13 } - -snmpInTotalSetVars OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 14 } - -snmpInGetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 15 } - -snmpInGetNexts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 16 } - -snmpInSetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 17 } - -snmpInGetResponses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 18 } - -snmpInTraps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 19 } - -snmpOutTooBigs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 20 } - -snmpOutNoSuchNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 21 } - -snmpOutBadValues OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 22 } - -snmpOutReadOnlys OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 23 } - -snmpOutGenErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 24 } - -snmpOutGetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 25 } - -snmpOutGetNexts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 26 } - -snmpOutSetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 27 } - -snmpOutGetResponses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 28 } - -snmpOutTraps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - ::= { snmp 29 } - -snmpEnableAuthTraps OBJECT-TYPE - SYNTAX INTEGER { - enabled(1), - disabled(2) - } - ACCESS read-write - STATUS mandatory - ::= { snmp 30 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB deleted file mode 100644 index 2a849de..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/RFC1213-MIB +++ /dev/null @@ -1,2621 +0,0 @@ -RFC1213-MIB DEFINITIONS ::= BEGIN - -IMPORTS - mgmt, NetworkAddress, IpAddress, Counter, Gauge, - TimeTicks - FROM RFC1155-SMI - OBJECT-TYPE - FROM RFC-1212; - --- This MIB module uses the extended OBJECT-TYPE macro as --- defined in [14]; - - --- MIB-II (same prefix as MIB-I) - -mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } - --- textual conventions - -DisplayString ::= - OCTET STRING --- This data type is used to model textual information taken --- from the NVT ASCII character set. By convention, objects --- with this syntax are declared as having - --- --- SIZE (0..255) - -PhysAddress ::= - OCTET STRING --- This data type is used to model media addresses. For many --- types of media, this will be in a binary representation. --- For example, an ethernet address would be represented as --- a string of 6 octets. - - --- groups in MIB-II - -system OBJECT IDENTIFIER ::= { mib-2 1 } - -interfaces OBJECT IDENTIFIER ::= { mib-2 2 } - -at OBJECT IDENTIFIER ::= { mib-2 3 } - -ip OBJECT IDENTIFIER ::= { mib-2 4 } - -icmp OBJECT IDENTIFIER ::= { mib-2 5 } - -tcp OBJECT IDENTIFIER ::= { mib-2 6 } - -udp OBJECT IDENTIFIER ::= { mib-2 7 } - -egp OBJECT IDENTIFIER ::= { mib-2 8 } - --- historical (some say hysterical) --- cmot OBJECT IDENTIFIER ::= { mib-2 9 } - -transmission OBJECT IDENTIFIER ::= { mib-2 10 } - -snmp OBJECT IDENTIFIER ::= { mib-2 11 } - - --- the System group - --- Implementation of the System group is mandatory for all --- systems. If an agent is not configured to have a value --- for any of these variables, a string of length 0 is --- returned. - -sysDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A textual description of the entity. This value - should include the full name and version - identification of the system's hardware type, - software operating-system, and networking - software. It is mandatory that this only contain - printable ASCII characters." - ::= { system 1 } - -sysObjectID OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The vendor's authoritative identification of the - network management subsystem contained in the - entity. This value is allocated within the SMI - enterprises subtree (1.3.6.1.4.1) and provides an - easy and unambiguous means for determining `what - kind of box' is being managed. For example, if - vendor `Flintstones, Inc.' was assigned the - subtree 1.3.6.1.4.1.4242, it could assign the - identifier 1.3.6.1.4.1.4242.1.1 to its `Fred - Router'." - ::= { system 2 } - -sysUpTime OBJECT-TYPE - SYNTAX TimeTicks - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The time (in hundredths of a second) since the - network management portion of the system was last - re-initialized." - ::= { system 3 } - -sysContact OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The textual identification of the contact person - for this managed node, together with information - on how to contact this person." - ::= { system 4 } - -sysName OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-write - STATUS mandatory - DESCRIPTION - "An administratively-assigned name for this - managed node. By convention, this is the node's - fully-qualified domain name." - ::= { system 5 } - -sysLocation OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The physical location of this node (e.g., - `telephone closet, 3rd floor')." - ::= { system 6 } - -sysServices OBJECT-TYPE - SYNTAX INTEGER (0..127) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A value which indicates the set of services that - this entity primarily offers. - - The value is a sum. This sum initially takes the - value zero, Then, for each layer, L, in the range - 1 through 7, that this node performs transactions - for, 2 raised to (L - 1) is added to the sum. For - example, a node which performs primarily routing - functions would have a value of 4 (2^(3-1)). In - contrast, a node which is a host offering - application services would have a value of 72 - (2^(4-1) + 2^(7-1)). Note that in the context of - the Internet suite of protocols, values should be - calculated accordingly: - - layer functionality - 1 physical (e.g., repeaters) - 2 datalink/subnetwork (e.g., bridges) - 3 internet (e.g., IP gateways) - 4 end-to-end (e.g., IP hosts) - 7 applications (e.g., mail relays) - - For systems including OSI protocols, layers 5 and - 6 may also be counted." - ::= { system 7 } - --- the Interfaces group - --- Implementation of the Interfaces group is mandatory for --- all systems. - -ifNumber OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of network interfaces (regardless of - their current state) present on this system." - ::= { interfaces 1 } - - --- the Interfaces table - --- The Interfaces table contains information on the entity's --- interfaces. Each interface is thought of as being --- attached to a `subnetwork'. Note that this term should --- not be confused with `subnet' which refers to an --- addressing partitioning scheme used in the Internet suite --- of protocols. - -ifTable OBJECT-TYPE - SYNTAX SEQUENCE OF IfEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "A list of interface entries. The number of - entries is given by the value of ifNumber." - ::= { interfaces 2 } - -ifEntry OBJECT-TYPE - SYNTAX IfEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "An interface entry containing objects at the - subnetwork layer and below for a particular - interface." - INDEX { ifIndex } - ::= { ifTable 1 } - -IfEntry ::= - SEQUENCE { - ifIndex - INTEGER, - ifDescr - DisplayString, - ifType - INTEGER, - ifMtu - INTEGER, - ifSpeed - Gauge, - ifPhysAddress - PhysAddress, - ifAdminStatus - INTEGER, - ifOperStatus - INTEGER, - ifLastChange - TimeTicks, - ifInOctets - Counter, - ifInUcastPkts - Counter, - ifInNUcastPkts - Counter, - ifInDiscards - Counter, - ifInErrors - Counter, - ifInUnknownProtos - Counter, - ifOutOctets - Counter, - ifOutUcastPkts - Counter, - ifOutNUcastPkts - Counter, - ifOutDiscards - Counter, - ifOutErrors - Counter, - ifOutQLen - Gauge, - ifSpecific - OBJECT IDENTIFIER - } - -ifIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A unique value for each interface. Its value - ranges between 1 and the value of ifNumber. The - value for each interface must remain constant at - least from one re-initialization of the entity's - network management system to the next re- - initialization." - ::= { ifEntry 1 } - -ifDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A textual string containing information about the - interface. This string should include the name of - the manufacturer, the product name and the version - of the hardware interface." - ::= { ifEntry 2 } - -ifType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - regular1822(2), - hdh1822(3), - ddn-x25(4), - rfc877-x25(5), - ethernet-csmacd(6), - iso88023-csmacd(7), - iso88024-tokenBus(8), - iso88025-tokenRing(9), - iso88026-man(10), - starLan(11), - proteon-10Mbit(12), - proteon-80Mbit(13), - hyperchannel(14), - fddi(15), - lapb(16), - sdlc(17), - ds1(18), -- T-1 - e1(19), -- european equiv. of T-1 - basicISDN(20), - primaryISDN(21), -- proprietary serial - propPointToPointSerial(22), - ppp(23), - softwareLoopback(24), - eon(25), -- CLNP over IP [11] - ethernet-3Mbit(26), - nsip(27), -- XNS over IP - slip(28), -- generic SLIP - ultra(29), -- ULTRA technologies - ds3(30), -- T-3 - sip(31), -- SMDS - frame-relay(32) - } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The type of interface, distinguished according to - the physical/link protocol(s) immediately `below' - the network layer in the protocol stack." - ::= { ifEntry 3 } - -ifMtu OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The size of the largest datagram which can be - sent/received on the interface, specified in - octets. For interfaces that are used for - transmitting network datagrams, this is the size - of the largest network datagram that can be sent - on the interface." - ::= { ifEntry 4 } - -ifSpeed OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - DESCRIPTION - "An estimate of the interface's current bandwidth - in bits per second. For interfaces which do not - vary in bandwidth or for those where no accurate - estimation can be made, this object should contain - the nominal bandwidth." - ::= { ifEntry 5 } - -ifPhysAddress OBJECT-TYPE - SYNTAX PhysAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The interface's address at the protocol layer - immediately `below' the network layer in the - protocol stack. For interfaces which do not have - such an address (e.g., a serial line), this object - should contain an octet string of zero length." - ::= { ifEntry 6 } - -ifAdminStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3) -- in some test mode - } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The desired state of the interface. The - testing(3) state indicates that no operational - packets can be passed." - ::= { ifEntry 7 } - -ifOperStatus OBJECT-TYPE - SYNTAX INTEGER { - up(1), -- ready to pass packets - down(2), - testing(3) -- in some test mode - } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The current operational state of the interface. - The testing(3) state indicates that no operational - packets can be passed." - ::= { ifEntry 8 } - -ifLastChange OBJECT-TYPE - SYNTAX TimeTicks - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The value of sysUpTime at the time the interface - entered its current operational state. If the - current state was entered prior to the last re- - initialization of the local network management - subsystem, then this object contains a zero - value." - ::= { ifEntry 9 } - -ifInOctets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of octets received on the - interface, including framing characters." - ::= { ifEntry 10 } - -ifInUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of subnetwork-unicast packets - delivered to a higher-layer protocol." - ::= { ifEntry 11 } - -ifInNUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of non-unicast (i.e., subnetwork- - broadcast or subnetwork-multicast) packets - delivered to a higher-layer protocol." - ::= { ifEntry 12 } - -ifInDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of inbound packets which were chosen - to be discarded even though no errors had been - detected to prevent their being deliverable to a - higher-layer protocol. One possible reason for - discarding such a packet could be to free up - buffer space." - ::= { ifEntry 13 } - -ifInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of inbound packets that contained - errors preventing them from being deliverable to a - higher-layer protocol." - ::= { ifEntry 14 } - -ifInUnknownProtos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of packets received via the interface - which were discarded because of an unknown or - unsupported protocol." - ::= { ifEntry 15 } - -ifOutOctets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of octets transmitted out of the - interface, including framing characters." - ::= { ifEntry 16 } - -ifOutUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of packets that higher-level - protocols requested be transmitted to a - subnetwork-unicast address, including those that - were discarded or not sent." - ::= { ifEntry 17 } - -ifOutNUcastPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of packets that higher-level - protocols requested be transmitted to a non- - unicast (i.e., a subnetwork-broadcast or - subnetwork-multicast) address, including those - that were discarded or not sent." - ::= { ifEntry 18 } - -ifOutDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of outbound packets which were chosen - to be discarded even though no errors had been - detected to prevent their being transmitted. One - possible reason for discarding such a packet could - be to free up buffer space." - ::= { ifEntry 19 } - -ifOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of outbound packets that could not be - transmitted because of errors." - ::= { ifEntry 20 } - -ifOutQLen OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The length of the output packet queue (in - packets)." - ::= { ifEntry 21 } - -ifSpecific OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A reference to MIB definitions specific to the - particular media being used to realize the - interface. For example, if the interface is - realized by an ethernet, then the value of this - object refers to a document defining objects - specific to ethernet. If this information is not - present, its value should be set to the OBJECT - IDENTIFIER { 0 0 }, which is a syntatically valid - object identifier, and any conformant - implementation of ASN.1 and BER must be able to - generate and recognize this value." - ::= { ifEntry 22 } - - --- the Address Translation group - --- Implementation of the Address Translation group is --- mandatory for all systems. Note however that this group --- is deprecated by MIB-II. That is, it is being included - --- solely for compatibility with MIB-I nodes, and will most --- likely be excluded from MIB-III nodes. From MIB-II and --- onwards, each network protocol group contains its own --- address translation tables. - --- The Address Translation group contains one table which is --- the union across all interfaces of the translation tables --- for converting a NetworkAddress (e.g., an IP address) into --- a subnetwork-specific address. For lack of a better term, --- this document refers to such a subnetwork-specific address --- as a `physical' address. - --- Examples of such translation tables are: for broadcast --- media where ARP is in use, the translation table is --- equivalent to the ARP cache; or, on an X.25 network where --- non-algorithmic translation to X.121 addresses is --- required, the translation table contains the --- NetworkAddress to X.121 address equivalences. - -atTable OBJECT-TYPE - SYNTAX SEQUENCE OF AtEntry - ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "The Address Translation tables contain the - NetworkAddress to `physical' address equivalences. - Some interfaces do not use translation tables for - determining address equivalences (e.g., DDN-X.25 - has an algorithmic method); if all interfaces are - of this type, then the Address Translation table - is empty, i.e., has zero entries." - ::= { at 1 } - -atEntry OBJECT-TYPE - SYNTAX AtEntry - ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "Each entry contains one NetworkAddress to - `physical' address equivalence." - INDEX { atIfIndex, - atNetAddress } - ::= { atTable 1 } - -AtEntry ::= - SEQUENCE { - atIfIndex - INTEGER, - atPhysAddress - PhysAddress, - atNetAddress - NetworkAddress - } - -atIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS deprecated - DESCRIPTION - "The interface on which this entry's equivalence - is effective. The interface identified by a - particular value of this index is the same - interface as identified by the same value of - ifIndex." - ::= { atEntry 1 } - -atPhysAddress OBJECT-TYPE - SYNTAX PhysAddress - ACCESS read-write - STATUS deprecated - DESCRIPTION - "The media-dependent `physical' address. - - Setting this object to a null string (one of zero - length) has the effect of invaliding the - corresponding entry in the atTable object. That - is, it effectively dissasociates the interface - identified with said entry from the mapping - identified with said entry. It is an - implementation-specific matter as to whether the - agent removes an invalidated entry from the table. - Accordingly, management stations must be prepared - to receive tabular information from agents that - corresponds to entries not currently in use. - Proper interpretation of such entries requires - examination of the relevant atPhysAddress object." - ::= { atEntry 2 } - -atNetAddress OBJECT-TYPE - SYNTAX NetworkAddress - ACCESS read-write - STATUS deprecated - DESCRIPTION - "The NetworkAddress (e.g., the IP address) - corresponding to the media-dependent `physical' - address." - ::= { atEntry 3 } - - --- the IP group - --- Implementation of the IP group is mandatory for all --- systems. - -ipForwarding OBJECT-TYPE - SYNTAX INTEGER { - forwarding(1), -- acting as a gateway - not-forwarding(2) -- NOT acting as a gateway - } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The indication of whether this entity is acting - as an IP gateway in respect to the forwarding of - datagrams received by, but not addressed to, this - entity. IP gateways forward datagrams. IP hosts - do not (except those source-routed via the host). - - Note that for some managed nodes, this object may - take on only a subset of the values possible. - Accordingly, it is appropriate for an agent to - return a `badValue' response if a management - station attempts to change this object to an - inappropriate value." - ::= { ip 1 } - -ipDefaultTTL OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The default value inserted into the Time-To-Live - field of the IP header of datagrams originated at - this entity, whenever a TTL value is not supplied - by the transport layer protocol." - ::= { ip 2 } - -ipInReceives OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of input datagrams received from - interfaces, including those received in error." - ::= { ip 3 } - -ipInHdrErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of input datagrams discarded due to - errors in their IP headers, including bad - checksums, version number mismatch, other format - errors, time-to-live exceeded, errors discovered - in processing their IP options, etc." - ::= { ip 4 } - -ipInAddrErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of input datagrams discarded because - the IP address in their IP header's destination - field was not a valid address to be received at - this entity. This count includes invalid - addresses (e.g., 0.0.0.0) and addresses of - unsupported Classes (e.g., Class E). For entities - which are not IP Gateways and therefore do not - forward datagrams, this counter includes datagrams - discarded because the destination address was not - a local address." - ::= { ip 5 } - -ipForwDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of input datagrams for which this - entity was not their final IP destination, as a - result of which an attempt was made to find a - route to forward them to that final destination. - In entities which do not act as IP Gateways, this - counter will include only those packets which were - Source-Routed via this entity, and the Source- - Route option processing was successful." - ::= { ip 6 } - -ipInUnknownProtos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of locally-addressed datagrams - received successfully but discarded because of an - unknown or unsupported protocol." - ::= { ip 7 } - -ipInDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of input IP datagrams for which no - problems were encountered to prevent their - continued processing, but which were discarded - (e.g., for lack of buffer space). Note that this - counter does not include any datagrams discarded - while awaiting re-assembly." - ::= { ip 8 } - -ipInDelivers OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of input datagrams successfully - delivered to IP user-protocols (including ICMP)." - ::= { ip 9 } - -ipOutRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of IP datagrams which local IP - user-protocols (including ICMP) supplied to IP in - requests for transmission. Note that this counter - does not include any datagrams counted in - ipForwDatagrams." - ::= { ip 10 } - -ipOutDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of output IP datagrams for which no - problem was encountered to prevent their - transmission to their destination, but which were - discarded (e.g., for lack of buffer space). Note - that this counter would include datagrams counted - in ipForwDatagrams if any such packets met this - (discretionary) discard criterion." - ::= { ip 11 } - -ipOutNoRoutes OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP datagrams discarded because no - route could be found to transmit them to their - destination. Note that this counter includes any - packets counted in ipForwDatagrams which meet this - `no-route' criterion. Note that this includes any - datagarms which a host cannot route because all of - its default gateways are down." - ::= { ip 12 } - -ipReasmTimeout OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The maximum number of seconds which received - fragments are held while they are awaiting - reassembly at this entity." - ::= { ip 13 } - -ipReasmReqds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP fragments received which needed - to be reassembled at this entity." - ::= { ip 14 } - -ipReasmOKs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP datagrams successfully re- - assembled." - ::= { ip 15 } - -ipReasmFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of failures detected by the IP re- - assembly algorithm (for whatever reason: timed - out, errors, etc). Note that this is not - necessarily a count of discarded IP fragments - since some algorithms (notably the algorithm in - RFC 815) can lose track of the number of fragments - by combining them as they are received." - ::= { ip 16 } - -ipFragOKs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP datagrams that have been - successfully fragmented at this entity." - ::= { ip 17 } - -ipFragFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP datagrams that have been - discarded because they needed to be fragmented at - this entity but could not be, e.g., because their - Don't Fragment flag was set." - ::= { ip 18 } - -ipFragCreates OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of IP datagram fragments that have - been generated as a result of fragmentation at - this entity." - ::= { ip 19 } - --- the IP address table - --- The IP address table contains this entity's IP addressing --- information. - -ipAddrTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpAddrEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "The table of addressing information relevant to - this entity's IP addresses." - ::= { ip 20 } - -ipAddrEntry OBJECT-TYPE - SYNTAX IpAddrEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "The addressing information for one of this - entity's IP addresses." - INDEX { ipAdEntAddr } - ::= { ipAddrTable 1 } - -IpAddrEntry ::= - SEQUENCE { - ipAdEntAddr - IpAddress, - ipAdEntIfIndex - INTEGER, - ipAdEntNetMask - IpAddress, - ipAdEntBcastAddr - INTEGER, - ipAdEntReasmMaxSize - INTEGER (0..65535) - } - -ipAdEntAddr OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The IP address to which this entry's addressing - information pertains." - ::= { ipAddrEntry 1 } - -ipAdEntIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The index value which uniquely identifies the - interface to which this entry is applicable. The - interface identified by a particular value of this - index is the same interface as identified by the - same value of ifIndex." - ::= { ipAddrEntry 2 } - -ipAdEntNetMask OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The subnet mask associated with the IP address of - this entry. The value of the mask is an IP - address with all the network bits set to 1 and all - the hosts bits set to 0." - ::= { ipAddrEntry 3 } - -ipAdEntBcastAddr OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The value of the least-significant bit in the IP - broadcast address used for sending datagrams on - the (logical) interface associated with the IP - address of this entry. For example, when the - Internet standard all-ones broadcast address is - used, the value will be 1. This value applies to - both the subnet and network broadcasts addresses - used by the entity on this (logical) interface." - ::= { ipAddrEntry 4 } - -ipAdEntReasmMaxSize OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The size of the largest IP datagram which this - entity can re-assemble from incoming IP fragmented - datagrams received on this interface." - ::= { ipAddrEntry 5 } - --- the IP routing table - --- The IP routing table contains an entry for each route --- presently known to this entity. - -ipRouteTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpRouteEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "This entity's IP Routing table." - ::= { ip 21 } - -ipRouteEntry OBJECT-TYPE - SYNTAX IpRouteEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "A route to a particular destination." - INDEX { ipRouteDest } - ::= { ipRouteTable 1 } - -IpRouteEntry ::= - SEQUENCE { - ipRouteDest - IpAddress, - ipRouteIfIndex - INTEGER, - ipRouteMetric1 - INTEGER, - ipRouteMetric2 - INTEGER, - ipRouteMetric3 - INTEGER, - ipRouteMetric4 - INTEGER, - ipRouteNextHop - IpAddress, - ipRouteType - INTEGER, - ipRouteProto - INTEGER, - ipRouteAge - INTEGER, - ipRouteMask - IpAddress, - ipRouteMetric5 - INTEGER, - ipRouteInfo - OBJECT IDENTIFIER - } - -ipRouteDest OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The destination IP address of this route. An - entry with a value of 0.0.0.0 is considered a - default route. Multiple routes to a single - destination can appear in the table, but access to - such multiple entries is dependent on the table- - access mechanisms defined by the network - management protocol in use." - ::= { ipRouteEntry 1 } - -ipRouteIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The index value which uniquely identifies the - local interface through which the next hop of this - route should be reached. The interface identified - by a particular value of this index is the same - interface as identified by the same value of - ifIndex." - ::= { ipRouteEntry 2 } - -ipRouteMetric1 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The primary routing metric for this route. The - semantics of this metric are determined by the - routing-protocol specified in the route's - ipRouteProto value. If this metric is not used, - its value should be set to -1." - ::= { ipRouteEntry 3 } - -ipRouteMetric2 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "An alternate routing metric for this route. The - semantics of this metric are determined by the - routing-protocol specified in the route's - ipRouteProto value. If this metric is not used, - its value should be set to -1." - ::= { ipRouteEntry 4 } - -ipRouteMetric3 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "An alternate routing metric for this route. The - semantics of this metric are determined by the - routing-protocol specified in the route's - ipRouteProto value. If this metric is not used, - its value should be set to -1." - ::= { ipRouteEntry 5 } - -ipRouteMetric4 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "An alternate routing metric for this route. The - semantics of this metric are determined by the - routing-protocol specified in the route's - ipRouteProto value. If this metric is not used, - its value should be set to -1." - ::= { ipRouteEntry 6 } - -ipRouteNextHop OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The IP address of the next hop of this route. - (In the case of a route bound to an interface - which is realized via a broadcast media, the value - of this field is the agent's IP address on that - interface.)" - ::= { ipRouteEntry 7 } - -ipRouteType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - invalid(2), -- an invalidated route - - -- route to directly - direct(3), -- connected (sub-)network - - -- route to a non-local - indirect(4) -- host/network/sub-network - } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The type of route. Note that the values - direct(3) and indirect(4) refer to the notion of - direct and indirect routing in the IP - architecture. - - Setting this object to the value invalid(2) has - the effect of invalidating the corresponding entry - in the ipRouteTable object. That is, it - effectively dissasociates the destination - identified with said entry from the route - identified with said entry. It is an - implementation-specific matter as to whether the - agent removes an invalidated entry from the table. - Accordingly, management stations must be prepared - to receive tabular information from agents that - corresponds to entries not currently in use. - Proper interpretation of such entries requires - examination of the relevant ipRouteType object." - ::= { ipRouteEntry 8 } - -ipRouteProto OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - -- non-protocol information, - -- e.g., manually configured - local(2), -- entries - - -- set via a network - netmgmt(3), -- management protocol - - -- obtained via ICMP, - icmp(4), -- e.g., Redirect - - -- the remaining values are - -- all gateway routing - -- protocols - egp(5), - ggp(6), - hello(7), - rip(8), - is-is(9), - es-is(10), - ciscoIgrp(11), - bbnSpfIgp(12), - ospf(13), - bgp(14) - } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The routing mechanism via which this route was - learned. Inclusion of values for gateway routing - protocols is not intended to imply that hosts - should support those protocols." - ::= { ipRouteEntry 9 } - -ipRouteAge OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The number of seconds since this route was last - updated or otherwise determined to be correct. - Note that no semantics of `too old' can be implied - except through knowledge of the routing protocol - by which the route was learned." - ::= { ipRouteEntry 10 } - -ipRouteMask OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - DESCRIPTION - "Indicate the mask to be logical-ANDed with the - destination address before being compared to the - value in the ipRouteDest field. For those systems - that do not support arbitrary subnet masks, an - agent constructs the value of the ipRouteMask by - determining whether the value of the correspondent - ipRouteDest field belong to a class-A, B, or C - network, and then using one of: - - mask network - 255.0.0.0 class-A - 255.255.0.0 class-B - 255.255.255.0 class-C - If the value of the ipRouteDest is 0.0.0.0 (a - default route), then the mask value is also - 0.0.0.0. It should be noted that all IP routing - subsystems implicitly use this mechanism." - ::= { ipRouteEntry 11 } - -ipRouteMetric5 OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "An alternate routing metric for this route. The - semantics of this metric are determined by the - routing-protocol specified in the route's - ipRouteProto value. If this metric is not used, - its value should be set to -1." - ::= { ipRouteEntry 12 } - -ipRouteInfo OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "A reference to MIB definitions specific to the - particular routing protocol which is responsible - for this route, as determined by the value - specified in the route's ipRouteProto value. If - this information is not present, its value should - be set to the OBJECT IDENTIFIER { 0 0 }, which is - a syntatically valid object identifier, and any - conformant implementation of ASN.1 and BER must be - able to generate and recognize this value." - ::= { ipRouteEntry 13 } - - --- the IP Address Translation table - --- The IP address translation table contain the IpAddress to --- `physical' address equivalences. Some interfaces do not --- use translation tables for determining address --- equivalences (e.g., DDN-X.25 has an algorithmic method); --- if all interfaces are of this type, then the Address --- Translation table is empty, i.e., has zero entries. - -ipNetToMediaTable OBJECT-TYPE - SYNTAX SEQUENCE OF IpNetToMediaEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "The IP Address Translation table used for mapping - from IP addresses to physical addresses." - ::= { ip 22 } - -ipNetToMediaEntry OBJECT-TYPE - SYNTAX IpNetToMediaEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "Each entry contains one IpAddress to `physical' - address equivalence." - INDEX { ipNetToMediaIfIndex, - ipNetToMediaNetAddress } - ::= { ipNetToMediaTable 1 } - -IpNetToMediaEntry ::= - SEQUENCE { - ipNetToMediaIfIndex - INTEGER, - ipNetToMediaPhysAddress - PhysAddress, - ipNetToMediaNetAddress - IpAddress, - ipNetToMediaType - INTEGER - } - -ipNetToMediaIfIndex OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The interface on which this entry's equivalence - is effective. The interface identified by a - particular value of this index is the same - interface as identified by the same value of - ifIndex." - ::= { ipNetToMediaEntry 1 } - -ipNetToMediaPhysAddress OBJECT-TYPE - SYNTAX PhysAddress - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The media-dependent `physical' address." - ::= { ipNetToMediaEntry 2 } - -ipNetToMediaNetAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The IpAddress corresponding to the media- - dependent `physical' address." - ::= { ipNetToMediaEntry 3 } - -ipNetToMediaType OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - invalid(2), -- an invalidated mapping - dynamic(3), - static(4) - } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The type of mapping. - - Setting this object to the value invalid(2) has - the effect of invalidating the corresponding entry - in the ipNetToMediaTable. That is, it effectively - dissasociates the interface identified with said - entry from the mapping identified with said entry. - It is an implementation-specific matter as to - whether the agent removes an invalidated entry - from the table. Accordingly, management stations - must be prepared to receive tabular information - from agents that corresponds to entries not - currently in use. Proper interpretation of such - entries requires examination of the relevant - ipNetToMediaType object." - ::= { ipNetToMediaEntry 4 } - - --- additional IP objects - -ipRoutingDiscards OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of routing entries which were chosen - to be discarded even though they are valid. One - possible reason for discarding such an entry could - be to free-up buffer space for other routing - entries." - ::= { ip 23 } - - --- the ICMP group - --- Implementation of the ICMP group is mandatory for all --- systems. - -icmpInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of ICMP messages which the - entity received. Note that this counter includes - all those counted by icmpInErrors." - ::= { icmp 1 } - -icmpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP messages which the entity - received but determined as having ICMP-specific - errors (bad ICMP checksums, bad length, etc.)." - ::= { icmp 2 } - -icmpInDestUnreachs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Destination Unreachable - messages received." - ::= { icmp 3 } - -icmpInTimeExcds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Time Exceeded messages - received." - ::= { icmp 4 } - -icmpInParmProbs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Parameter Problem messages - received." - ::= { icmp 5 } - -icmpInSrcQuenchs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Source Quench messages - received." - ::= { icmp 6 } - -icmpInRedirects OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Redirect messages received." - ::= { icmp 7 } - -icmpInEchos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Echo (request) messages - received." - ::= { icmp 8 } - -icmpInEchoReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Echo Reply messages received." - ::= { icmp 9 } - -icmpInTimestamps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Timestamp (request) messages - received." - ::= { icmp 10 } - -icmpInTimestampReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Timestamp Reply messages - received." - ::= { icmp 11 } - -icmpInAddrMasks OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Address Mask Request messages - received." - ::= { icmp 12 } - -icmpInAddrMaskReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Address Mask Reply messages - received." - ::= { icmp 13 } - -icmpOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of ICMP messages which this - entity attempted to send. Note that this counter - includes all those counted by icmpOutErrors." - ::= { icmp 14 } - -icmpOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP messages which this entity did - not send due to problems discovered within ICMP - such as a lack of buffers. This value should not - include errors discovered outside the ICMP layer - such as the inability of IP to route the resultant - datagram. In some implementations there may be no - types of error which contribute to this counter's - value." - ::= { icmp 15 } - -icmpOutDestUnreachs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Destination Unreachable - messages sent." - ::= { icmp 16 } - -icmpOutTimeExcds OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Time Exceeded messages sent." - ::= { icmp 17 } - -icmpOutParmProbs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Parameter Problem messages - sent." - ::= { icmp 18 } - -icmpOutSrcQuenchs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Source Quench messages sent." - ::= { icmp 19 } - -icmpOutRedirects OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Redirect messages sent. For a - host, this object will always be zero, since hosts - do not send redirects." - ::= { icmp 20 } - -icmpOutEchos OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Echo (request) messages sent." - ::= { icmp 21 } - -icmpOutEchoReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Echo Reply messages sent." - ::= { icmp 22 } - -icmpOutTimestamps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Timestamp (request) messages - sent." - ::= { icmp 23 } - -icmpOutTimestampReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Timestamp Reply messages - sent." - ::= { icmp 24 } - -icmpOutAddrMasks OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Address Mask Request messages - sent." - ::= { icmp 25 } - -icmpOutAddrMaskReps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of ICMP Address Mask Reply messages - sent." - ::= { icmp 26 } - - --- the TCP group - --- Implementation of the TCP group is mandatory for all --- systems that implement the TCP. - --- Note that instances of object types that represent --- information about a particular TCP connection are --- transient; they persist only as long as the connection --- in question. - -tcpRtoAlgorithm OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - - constant(2), -- a constant rto - rsre(3), -- MIL-STD-1778, Appendix B - vanj(4) -- Van Jacobson's algorithm [10] - } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The algorithm used to determine the timeout value - used for retransmitting unacknowledged octets." - ::= { tcp 1 } - -tcpRtoMin OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The minimum value permitted by a TCP - implementation for the retransmission timeout, - measured in milliseconds. More refined semantics - for objects of this type depend upon the algorithm - used to determine the retransmission timeout. In - particular, when the timeout algorithm is rsre(3), - an object of this type has the semantics of the - LBOUND quantity described in RFC 793." - ::= { tcp 2 } - - -tcpRtoMax OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The maximum value permitted by a TCP - implementation for the retransmission timeout, - measured in milliseconds. More refined semantics - for objects of this type depend upon the algorithm - used to determine the retransmission timeout. In - particular, when the timeout algorithm is rsre(3), - an object of this type has the semantics of the - UBOUND quantity described in RFC 793." - ::= { tcp 3 } - -tcpMaxConn OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The limit on the total number of TCP connections - the entity can support. In entities where the - maximum number of connections is dynamic, this - object should contain the value -1." - ::= { tcp 4 } - -tcpActiveOpens OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of times TCP connections have made a - direct transition to the SYN-SENT state from the - CLOSED state." - ::= { tcp 5 } - -tcpPassiveOpens OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of times TCP connections have made a - direct transition to the SYN-RCVD state from the - LISTEN state." - ::= { tcp 6 } - -tcpAttemptFails OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of times TCP connections have made a - direct transition to the CLOSED state from either - the SYN-SENT state or the SYN-RCVD state, plus the - number of times TCP connections have made a direct - transition to the LISTEN state from the SYN-RCVD - state." - ::= { tcp 7 } - -tcpEstabResets OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of times TCP connections have made a - direct transition to the CLOSED state from either - the ESTABLISHED state or the CLOSE-WAIT state." - ::= { tcp 8 } - -tcpCurrEstab OBJECT-TYPE - SYNTAX Gauge - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of TCP connections for which the - current state is either ESTABLISHED or CLOSE- - WAIT." - ::= { tcp 9 } - -tcpInSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of segments received, including - those received in error. This count includes - segments received on currently established - connections." - ::= { tcp 10 } - -tcpOutSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of segments sent, including - those on current connections but excluding those - containing only retransmitted octets." - ::= { tcp 11 } - -tcpRetransSegs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of segments retransmitted - that - is, the number of TCP segments transmitted - containing one or more previously transmitted - octets." - ::= { tcp 12 } - - --- the TCP Connection table - --- The TCP connection table contains information about this --- entity's existing TCP connections. - -tcpConnTable OBJECT-TYPE - SYNTAX SEQUENCE OF TcpConnEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "A table containing TCP connection-specific - information." - ::= { tcp 13 } - -tcpConnEntry OBJECT-TYPE - SYNTAX TcpConnEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "Information about a particular current TCP - connection. An object of this type is transient, - in that it ceases to exist when (or soon after) - the connection makes the transition to the CLOSED - state." - INDEX { tcpConnLocalAddress, - tcpConnLocalPort, - tcpConnRemAddress, - tcpConnRemPort } - ::= { tcpConnTable 1 } - -TcpConnEntry ::= - SEQUENCE { - tcpConnState - INTEGER, - tcpConnLocalAddress - IpAddress, - tcpConnLocalPort - INTEGER (0..65535), - tcpConnRemAddress - IpAddress, - tcpConnRemPort - INTEGER (0..65535) - } - -tcpConnState OBJECT-TYPE - SYNTAX INTEGER { - closed(1), - listen(2), - synSent(3), - synReceived(4), - established(5), - finWait1(6), - finWait2(7), - closeWait(8), - lastAck(9), - closing(10), - timeWait(11), - deleteTCB(12) - } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "The state of this TCP connection. - - The only value which may be set by a management - station is deleteTCB(12). Accordingly, it is - appropriate for an agent to return a `badValue' - response if a management station attempts to set - this object to any other value. - - If a management station sets this object to the - value deleteTCB(12), then this has the effect of - deleting the TCB (as defined in RFC 793) of the - corresponding connection on the managed node, - resulting in immediate termination of the - connection. - - As an implementation-specific option, a RST - segment may be sent from the managed node to the - other TCP endpoint (note however that RST segments - are not sent reliably)." - ::= { tcpConnEntry 1 } - -tcpConnLocalAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The local IP address for this TCP connection. In - the case of a connection in the listen state which - is willing to accept connections for any IP - interface associated with the node, the value - 0.0.0.0 is used." - ::= { tcpConnEntry 2 } - -tcpConnLocalPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The local port number for this TCP connection." - ::= { tcpConnEntry 3 } - -tcpConnRemAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The remote IP address for this TCP connection." - ::= { tcpConnEntry 4 } - -tcpConnRemPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The remote port number for this TCP connection." - ::= { tcpConnEntry 5 } - - --- additional TCP objects - -tcpInErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of segments received in error - (e.g., bad TCP checksums)." - ::= { tcp 14 } - -tcpOutRsts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of TCP segments sent containing the - RST flag." - ::= { tcp 15 } - - --- the UDP group - --- Implementation of the UDP group is mandatory for all --- systems which implement the UDP. - -udpInDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of UDP datagrams delivered to - UDP users." - ::= { udp 1 } - -udpNoPorts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of received UDP datagrams for - which there was no application at the destination - port." - ::= { udp 2 } - -udpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of received UDP datagrams that could - not be delivered for reasons other than the lack - of an application at the destination port." - ::= { udp 3 } - -udpOutDatagrams OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of UDP datagrams sent from this - entity." - ::= { udp 4 } - - --- the UDP Listener table - --- The UDP listener table contains information about this --- entity's UDP end-points on which a local application is --- currently accepting datagrams. - -udpTable OBJECT-TYPE - SYNTAX SEQUENCE OF UdpEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "A table containing UDP listener information." - ::= { udp 5 } - -udpEntry OBJECT-TYPE - SYNTAX UdpEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "Information about a particular current UDP - listener." - INDEX { udpLocalAddress, udpLocalPort } - ::= { udpTable 1 } - -UdpEntry ::= - SEQUENCE { - udpLocalAddress - IpAddress, - udpLocalPort - INTEGER (0..65535) - } - -udpLocalAddress OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The local IP address for this UDP listener. In - the case of a UDP listener which is willing to - accept datagrams for any IP interface associated - with the node, the value 0.0.0.0 is used." - ::= { udpEntry 1 } - -udpLocalPort OBJECT-TYPE - SYNTAX INTEGER (0..65535) - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The local port number for this UDP listener." - ::= { udpEntry 2 } - - --- the EGP group - --- Implementation of the EGP group is mandatory for all --- systems which implement the EGP. - -egpInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP messages received without - error." - ::= { egp 1 } - -egpInErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP messages received that proved - to be in error." - ::= { egp 2 } - -egpOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of locally generated EGP - messages." - ::= { egp 3 } - -egpOutErrors OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of locally generated EGP messages not - sent due to resource limitations within an EGP - entity." - ::= { egp 4 } - - --- the EGP Neighbor table - --- The EGP neighbor table contains information about this --- entity's EGP neighbors. - -egpNeighTable OBJECT-TYPE - SYNTAX SEQUENCE OF EgpNeighEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "The EGP neighbor table." - ::= { egp 5 } - -egpNeighEntry OBJECT-TYPE - SYNTAX EgpNeighEntry - ACCESS not-accessible - STATUS mandatory - DESCRIPTION - "Information about this entity's relationship with - a particular EGP neighbor." - INDEX { egpNeighAddr } - ::= { egpNeighTable 1 } - -EgpNeighEntry ::= - SEQUENCE { - egpNeighState - INTEGER, - egpNeighAddr - IpAddress, - egpNeighAs - INTEGER, - egpNeighInMsgs - Counter, - egpNeighInErrs - Counter, - egpNeighOutMsgs - Counter, - egpNeighOutErrs - Counter, - egpNeighInErrMsgs - Counter, - egpNeighOutErrMsgs - Counter, - egpNeighStateUps - Counter, - egpNeighStateDowns - Counter, - egpNeighIntervalHello - INTEGER, - egpNeighIntervalPoll - INTEGER, - egpNeighMode - INTEGER, - egpNeighEventTrigger - INTEGER - } - -egpNeighState OBJECT-TYPE - SYNTAX INTEGER { - idle(1), - acquisition(2), - down(3), - up(4), - cease(5) - } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The EGP state of the local system with respect to - this entry's EGP neighbor. Each EGP state is - represented by a value that is one greater than - the numerical value associated with said state in - RFC 904." - ::= { egpNeighEntry 1 } - -egpNeighAddr OBJECT-TYPE - SYNTAX IpAddress - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The IP address of this entry's EGP neighbor." - ::= { egpNeighEntry 2 } - -egpNeighAs OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The autonomous system of this EGP peer. Zero - should be specified if the autonomous system - number of the neighbor is not yet known." - ::= { egpNeighEntry 3 } - -egpNeighInMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP messages received without error - from this EGP peer." - ::= { egpNeighEntry 4 } - -egpNeighInErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP messages received from this EGP - peer that proved to be in error (e.g., bad EGP - checksum)." - ::= { egpNeighEntry 5 } - -egpNeighOutMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of locally generated EGP messages to - this EGP peer." - ::= { egpNeighEntry 6 } - -egpNeighOutErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of locally generated EGP messages not - sent to this EGP peer due to resource limitations - within an EGP entity." - ::= { egpNeighEntry 7 } - -egpNeighInErrMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP-defined error messages received - from this EGP peer." - ::= { egpNeighEntry 8 } - -egpNeighOutErrMsgs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP-defined error messages sent to - this EGP peer." - ::= { egpNeighEntry 9 } - -egpNeighStateUps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP state transitions to the UP - state with this EGP peer." - ::= { egpNeighEntry 10 } - -egpNeighStateDowns OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The number of EGP state transitions from the UP - state to any other state with this EGP peer." - ::= { egpNeighEntry 11 } - -egpNeighIntervalHello OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The interval between EGP Hello command - retransmissions (in hundredths of a second). This - represents the t1 timer as defined in RFC 904." - ::= { egpNeighEntry 12 } - -egpNeighIntervalPoll OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The interval between EGP poll command - retransmissions (in hundredths of a second). This - represents the t3 timer as defined in RFC 904." - ::= { egpNeighEntry 13 } - -egpNeighMode OBJECT-TYPE - SYNTAX INTEGER { active(1), passive(2) } - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The polling mode of this EGP entity, either - passive or active." - ::= { egpNeighEntry 14 } - -egpNeighEventTrigger OBJECT-TYPE - SYNTAX INTEGER { start(1), stop(2) } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "A control variable used to trigger operator- - initiated Start and Stop events. When read, this - variable always returns the most recent value that - egpNeighEventTrigger was set to. If it has not - been set since the last initialization of the - network management subsystem on the node, it - returns a value of `stop'. - - When set, this variable causes a Start or Stop - event on the specified neighbor, as specified on - pages 8-10 of RFC 904. Briefly, a Start event - causes an Idle peer to begin neighbor acquisition - and a non-Idle peer to reinitiate neighbor - acquisition. A stop event causes a non-Idle peer - to return to the Idle state until a Start event - occurs, either via egpNeighEventTrigger or - otherwise." - ::= { egpNeighEntry 15 } - - --- additional EGP objects - -egpAs OBJECT-TYPE - SYNTAX INTEGER - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The autonomous system number of this EGP entity." - ::= { egp 6 } - --- the Transmission group - --- Based on the transmission media underlying each interface --- on a system, the corresponding portion of the Transmission --- group is mandatory for that system. - --- When Internet-standard definitions for managing --- transmission media are defined, the transmission group is --- used to provide a prefix for the names of those objects. - --- Typically, such definitions reside in the experimental --- portion of the MIB until they are "proven", then as a --- part of the Internet standardization process, the --- definitions are accordingly elevated and a new object --- identifier, under the transmission group is defined. By --- convention, the name assigned is: --- --- type OBJECT IDENTIFIER ::= { transmission number } --- --- where "type" is the symbolic value used for the media in --- the ifType column of the ifTable object, and "number" is --- the actual integer value corresponding to the symbol. - - --- the SNMP group - --- Implementation of the SNMP group is mandatory for all --- systems which support an SNMP protocol entity. Some of --- the objects defined below will be zero-valued in those --- SNMP implementations that are optimized to support only --- those functions specific to either a management agent or --- a management station. In particular, it should be --- observed that the objects below refer to an SNMP entity, --- and there may be several SNMP entities residing on a --- managed node (e.g., if the node is hosting acting as --- a management station). - -snmpInPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of Messages delivered to the - SNMP entity from the transport service." - ::= { snmp 1 } - -snmpOutPkts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Messages which were - passed from the SNMP protocol entity to the - transport service." - ::= { snmp 2 } - -snmpInBadVersions OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Messages which were - delivered to the SNMP protocol entity and were for - an unsupported SNMP version." - ::= { snmp 3 } - -snmpInBadCommunityNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Messages delivered to - the SNMP protocol entity which used a SNMP - community name not known to said entity." - ::= { snmp 4 } - -snmpInBadCommunityUses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Messages delivered to - the SNMP protocol entity which represented an SNMP - operation which was not allowed by the SNMP - community named in the Message." - ::= { snmp 5 } - -snmpInASNParseErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of ASN.1 or BER errors - encountered by the SNMP protocol entity when - decoding received SNMP Messages." - ::= { snmp 6 } - --- { snmp 7 } is not used - -snmpInTooBigs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `tooBig'." - ::= { snmp 8 } - -snmpInNoSuchNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `noSuchName'." - ::= { snmp 9 } - -snmpInBadValues OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `badValue'." - ::= { snmp 10 } - -snmpInReadOnlys OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number valid SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `readOnly'. It should be noted that it is a - protocol error to generate an SNMP PDU which - contains the value `readOnly' in the error-status - field, as such this object is provided as a means - of detecting incorrect implementations of the - SNMP." - ::= { snmp 11 } - -snmpInGenErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field is - `genErr'." - ::= { snmp 12 } - -snmpInTotalReqVars OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of MIB objects which have been - retrieved successfully by the SNMP protocol entity - as the result of receiving valid SNMP Get-Request - and Get-Next PDUs." - ::= { snmp 13 } - -snmpInTotalSetVars OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of MIB objects which have been - altered successfully by the SNMP protocol entity - as the result of receiving valid SNMP Set-Request - PDUs." - ::= { snmp 14 } - -snmpInGetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Request PDUs which - have been accepted and processed by the SNMP - protocol entity." - ::= { snmp 15 } - -snmpInGetNexts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Next PDUs which have - been accepted and processed by the SNMP protocol - entity." - ::= { snmp 16 } - -snmpInSetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Set-Request PDUs which - have been accepted and processed by the SNMP - protocol entity." - ::= { snmp 17 } - -snmpInGetResponses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Response PDUs which - have been accepted and processed by the SNMP - protocol entity." - ::= { snmp 18 } - -snmpInTraps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Trap PDUs which have - been accepted and processed by the SNMP protocol - entity." - ::= { snmp 19 } - -snmpOutTooBigs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `tooBig.'" - ::= { snmp 20 } - -snmpOutNoSuchNames OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status is - `noSuchName'." - ::= { snmp 21 } - -snmpOutBadValues OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `badValue'." - ::= { snmp 22 } - --- { snmp 23 } is not used - -snmpOutGenErrs OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP PDUs which were - generated by the SNMP protocol entity and for - which the value of the error-status field is - `genErr'." - ::= { snmp 24 } - -snmpOutGetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Request PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 25 } - -snmpOutGetNexts OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Next PDUs which have - been generated by the SNMP protocol entity." - ::= { snmp 26 } - -snmpOutSetRequests OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Set-Request PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 27 } - -snmpOutGetResponses OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Get-Response PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 28 } - -snmpOutTraps OBJECT-TYPE - SYNTAX Counter - ACCESS read-only - STATUS mandatory - DESCRIPTION - "The total number of SNMP Trap PDUs which have - been generated by the SNMP protocol entity." - ::= { snmp 29 } - -snmpEnableAuthenTraps OBJECT-TYPE - SYNTAX INTEGER { enabled(1), disabled(2) } - ACCESS read-write - STATUS mandatory - DESCRIPTION - "Indicates whether the SNMP agent process is - permitted to generate authentication-failure - traps. The value of this object overrides any - configuration information; as such, it provides a - means whereby all authentication-failure traps may - be disabled. - - Note that it is strongly recommended that this - object be stored in non-volatile memory so that it - remains constant between re-initializations of the - network management system." - ::= { snmp 30 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF deleted file mode 100644 index 904dbbb..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-CONF +++ /dev/null @@ -1,318 +0,0 @@ -SNMPv2-CONF DEFINITIONS ::= BEGIN - -IMPORTS ObjectName, NotificationName, ObjectSyntax - FROM SNMPv2-SMI; - --- definitions for conformance groups - -OBJECT-GROUP MACRO ::= -BEGIN - TYPE NOTATION ::= - ObjectsPart - "STATUS" Status - "DESCRIPTION" Text - ReferPart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - ObjectsPart ::= - "OBJECTS" "{" Objects "}" - Objects ::= - Object - | Objects "," Object - Object ::= - value(ObjectName) - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - -- a character string as defined in [2] - Text ::= value(IA5String) -END - --- more definitions for conformance groups - -NOTIFICATION-GROUP MACRO ::= -BEGIN - TYPE NOTATION ::= - NotificationsPart - "STATUS" Status - "DESCRIPTION" Text - ReferPart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - NotificationsPart ::= - "NOTIFICATIONS" "{" Notifications "}" - Notifications ::= - Notification - | Notifications "," Notification - Notification ::= - value(NotificationName) - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - -- a character string as defined in [2] - Text ::= value(IA5String) -END - --- definitions for compliance statements - -MODULE-COMPLIANCE MACRO ::= -BEGIN - TYPE NOTATION ::= - "STATUS" Status - "DESCRIPTION" Text - ReferPart - ModulePart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - ModulePart ::= - Modules - Modules ::= - Module - | Modules Module - Module ::= - -- name of module -- - "MODULE" ModuleName - MandatoryPart - CompliancePart - - ModuleName ::= - -- identifier must start with uppercase letter - identifier ModuleIdentifier - -- must not be empty unless contained - -- in MIB Module - | empty - ModuleIdentifier ::= - value(OBJECT IDENTIFIER) - | empty - - MandatoryPart ::= - "MANDATORY-GROUPS" "{" Groups "}" - | empty - - Groups ::= - Group - | Groups "," Group - Group ::= - value(OBJECT IDENTIFIER) - - CompliancePart ::= - Compliances - | empty - - Compliances ::= - Compliance - | Compliances Compliance - Compliance ::= - ComplianceGroup - | Object - - ComplianceGroup ::= - "GROUP" value(OBJECT IDENTIFIER) - "DESCRIPTION" Text - - Object ::= - "OBJECT" value(ObjectName) - SyntaxPart - WriteSyntaxPart - AccessPart - "DESCRIPTION" Text - - -- must be a refinement for object's SYNTAX clause - SyntaxPart ::= "SYNTAX" Syntax - | empty - - -- must be a refinement for object's SYNTAX clause - WriteSyntaxPart ::= "WRITE-SYNTAX" Syntax - | empty - - Syntax ::= -- Must be one of the following: - -- a base type (or its refinement), - -- a textual convention (or its refinement), or - -- a BITS pseudo-type - type - | "BITS" "{" NamedBits "}" - - NamedBits ::= NamedBit - | NamedBits "," NamedBit - - NamedBit ::= identifier "(" number ")" -- number is nonnegative - - AccessPart ::= - "MIN-ACCESS" Access - | empty - Access ::= - "not-accessible" - | "accessible-for-notify" - | "read-only" - | "read-write" - | "read-create" - - -- a character string as defined in [2] - Text ::= value(IA5String) -END - --- definitions for capabilities statements - -AGENT-CAPABILITIES MACRO ::= -BEGIN - TYPE NOTATION ::= - "PRODUCT-RELEASE" Text - "STATUS" Status - "DESCRIPTION" Text - ReferPart - ModulePart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - Status ::= - "current" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - ModulePart ::= - Modules - | empty - Modules ::= - Module - | Modules Module - Module ::= - -- name of module -- - "SUPPORTS" ModuleName - "INCLUDES" "{" Groups "}" - VariationPart - - ModuleName ::= - -- identifier must start with uppercase letter - identifier ModuleIdentifier - ModuleIdentifier ::= - value(OBJECT IDENTIFIER) - | empty - - Groups ::= - Group - | Groups "," Group - Group ::= - value(OBJECT IDENTIFIER) - - VariationPart ::= - Variations - | empty - Variations ::= - Variation - | Variations Variation - - Variation ::= - ObjectVariation - | NotificationVariation - - NotificationVariation ::= - "VARIATION" value(NotificationName) - AccessPart - "DESCRIPTION" Text - - ObjectVariation ::= - "VARIATION" value(ObjectName) - SyntaxPart - WriteSyntaxPart - AccessPart - CreationPart - DefValPart - "DESCRIPTION" Text - - -- must be a refinement for object's SYNTAX clause - SyntaxPart ::= "SYNTAX" Syntax - | empty - - WriteSyntaxPart ::= "WRITE-SYNTAX" Syntax - | empty - - Syntax ::= -- Must be one of the following: - -- a base type (or its refinement), - -- a textual convention (or its refinement), or - -- a BITS pseudo-type - type - | "BITS" "{" NamedBits "}" - - NamedBits ::= NamedBit - | NamedBits "," NamedBit - - NamedBit ::= identifier "(" number ")" -- number is nonnegative - - AccessPart ::= - "ACCESS" Access - | empty - - Access ::= - "not-implemented" - -- only "not-implemented" for notifications - | "accessible-for-notify" - | "read-only" - | "read-write" - | "read-create" - -- following is for backward-compatibility only - | "write-only" - - CreationPart ::= - "CREATION-REQUIRES" "{" Cells "}" - | empty - Cells ::= - Cell - | Cells "," Cell - Cell ::= - value(ObjectName) - - DefValPart ::= "DEFVAL" "{" Defvalue "}" - | empty - - Defvalue ::= -- must be valid for the object's syntax - -- in this macro's SYNTAX clause, if present, - -- or if not, in object's OBJECT-TYPE macro - value(ObjectSyntax) - | "{" BitsValue "}" - - BitsValue ::= BitNames - | empty - - BitNames ::= BitName - | BitNames "," BitName - - BitName ::= identifier - - -- a character string as defined in [2] - Text ::= value(IA5String) -END - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB deleted file mode 100644 index 9494e42..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-MIB +++ /dev/null @@ -1,903 +0,0 @@ -SNMPv2-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE, - TimeTicks, Counter32, snmpModules, mib-2 - FROM SNMPv2-SMI - DisplayString, TestAndIncr, TimeStamp - - - - FROM SNMPv2-TC - MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP - FROM SNMPv2-CONF; - -snmpMIB MODULE-IDENTITY - LAST-UPDATED "200210160000Z" - ORGANIZATION "IETF SNMPv3 Working Group" - CONTACT-INFO - "WG-EMail: snmpv3@lists.tislabs.com - Subscribe: snmpv3-request@lists.tislabs.com - - Co-Chair: Russ Mundy - Network Associates Laboratories - postal: 15204 Omega Drive, Suite 300 - Rockville, MD 20850-4601 - USA - EMail: mundy@tislabs.com - phone: +1 301 947-7107 - - Co-Chair: David Harrington - Enterasys Networks - postal: 35 Industrial Way - P. O. Box 5005 - Rochester, NH 03866-5005 - USA - EMail: dbh@enterasys.com - phone: +1 603 337-2614 - - Editor: Randy Presuhn - BMC Software, Inc. - postal: 2141 North First Street - San Jose, CA 95131 - USA - EMail: randy_presuhn@bmc.com - phone: +1 408 546-1006" - DESCRIPTION - "The MIB module for SNMP entities. - - Copyright (C) The Internet Society (2002). This - version of this MIB module is part of RFC 3418; - see the RFC itself for full legal notices. - " - REVISION "200210160000Z" - DESCRIPTION - "This revision of this MIB module was published as - RFC 3418." - REVISION "199511090000Z" - DESCRIPTION - - - - "This revision of this MIB module was published as - RFC 1907." - REVISION "199304010000Z" - DESCRIPTION - "The initial revision of this MIB module was published - as RFC 1450." - ::= { snmpModules 1 } - -snmpMIBObjects OBJECT IDENTIFIER ::= { snmpMIB 1 } - --- ::= { snmpMIBObjects 1 } this OID is obsolete --- ::= { snmpMIBObjects 2 } this OID is obsolete --- ::= { snmpMIBObjects 3 } this OID is obsolete - --- the System group --- --- a collection of objects common to all managed systems. - -system OBJECT IDENTIFIER ::= { mib-2 1 } - -sysDescr OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A textual description of the entity. This value should - include the full name and version identification of - the system's hardware type, software operating-system, - and networking software." - ::= { system 1 } - -sysObjectID OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The vendor's authoritative identification of the - network management subsystem contained in the entity. - This value is allocated within the SMI enterprises - subtree (1.3.6.1.4.1) and provides an easy and - unambiguous means for determining `what kind of box' is - being managed. For example, if vendor `Flintstones, - Inc.' was assigned the subtree 1.3.6.1.4.1.424242, - it could assign the identifier 1.3.6.1.4.1.424242.1.1 - to its `Fred Router'." - ::= { system 2 } - -sysUpTime OBJECT-TYPE - - - - SYNTAX TimeTicks - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The time (in hundredths of a second) since the - network management portion of the system was last - re-initialized." - ::= { system 3 } - -sysContact OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The textual identification of the contact person for - this managed node, together with information on how - to contact this person. If no contact information is - known, the value is the zero-length string." - ::= { system 4 } - -sysName OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "An administratively-assigned name for this managed - node. By convention, this is the node's fully-qualified - domain name. If the name is unknown, the value is - the zero-length string." - ::= { system 5 } - -sysLocation OBJECT-TYPE - SYNTAX DisplayString (SIZE (0..255)) - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "The physical location of this node (e.g., 'telephone - closet, 3rd floor'). If the location is unknown, the - value is the zero-length string." - ::= { system 6 } - -sysServices OBJECT-TYPE - SYNTAX INTEGER (0..127) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A value which indicates the set of services that this - entity may potentially offer. The value is a sum. - - - - This sum initially takes the value zero. Then, for - each layer, L, in the range 1 through 7, that this node - performs transactions for, 2 raised to (L - 1) is added - to the sum. For example, a node which performs only - routing functions would have a value of 4 (2^(3-1)). - In contrast, a node which is a host offering application - services would have a value of 72 (2^(4-1) + 2^(7-1)). - Note that in the context of the Internet suite of - protocols, values should be calculated accordingly: - - layer functionality - 1 physical (e.g., repeaters) - 2 datalink/subnetwork (e.g., bridges) - 3 internet (e.g., supports the IP) - 4 end-to-end (e.g., supports the TCP) - 7 applications (e.g., supports the SMTP) - - For systems including OSI protocols, layers 5 and 6 - may also be counted." - ::= { system 7 } - --- object resource information --- --- a collection of objects which describe the SNMP entity's --- (statically and dynamically configurable) support of --- various MIB modules. - -sysORLastChange OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The value of sysUpTime at the time of the most recent - change in state or value of any instance of sysORID." - ::= { system 8 } - -sysORTable OBJECT-TYPE - SYNTAX SEQUENCE OF SysOREntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The (conceptual) table listing the capabilities of - the local SNMP application acting as a command - responder with respect to various MIB modules. - SNMP entities having dynamically-configurable support - of MIB modules will have a dynamically-varying number - of conceptual rows." - ::= { system 9 } - - - -sysOREntry OBJECT-TYPE - SYNTAX SysOREntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "An entry (conceptual row) in the sysORTable." - INDEX { sysORIndex } - ::= { sysORTable 1 } - -SysOREntry ::= SEQUENCE { - sysORIndex INTEGER, - sysORID OBJECT IDENTIFIER, - sysORDescr DisplayString, - sysORUpTime TimeStamp -} - -sysORIndex OBJECT-TYPE - SYNTAX INTEGER (1..2147483647) - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The auxiliary variable used for identifying instances - of the columnar objects in the sysORTable." - ::= { sysOREntry 1 } - -sysORID OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "An authoritative identification of a capabilities - statement with respect to various MIB modules supported - by the local SNMP application acting as a command - responder." - ::= { sysOREntry 2 } - -sysORDescr OBJECT-TYPE - SYNTAX DisplayString - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "A textual description of the capabilities identified - by the corresponding instance of sysORID." - ::= { sysOREntry 3 } - -sysORUpTime OBJECT-TYPE - SYNTAX TimeStamp - MAX-ACCESS read-only - - - - STATUS current - DESCRIPTION - "The value of sysUpTime at the time this conceptual - row was last instantiated." - ::= { sysOREntry 4 } - - --- the SNMP group --- --- a collection of objects providing basic instrumentation and --- control of an SNMP entity. - -snmp OBJECT IDENTIFIER ::= { mib-2 11 } - -snmpInPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of messages delivered to the SNMP - entity from the transport service." - ::= { snmp 1 } - -snmpInBadVersions OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of SNMP messages which were delivered - to the SNMP entity and were for an unsupported SNMP - version." - ::= { snmp 3 } - -snmpInBadCommunityNames OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of community-based SNMP messages (for - example, SNMPv1) delivered to the SNMP entity which - used an SNMP community name not known to said entity. - Also, implementations which authenticate community-based - SNMP messages using check(s) in addition to matching - the community name (for example, by also checking - whether the message originated from a transport address - allowed to use a specified community name) MAY include - in this value the number of messages which failed the - additional check(s). It is strongly RECOMMENDED that - - - - the documentation for any security model which is used - to authenticate community-based SNMP messages specify - the precise conditions that contribute to this value." - ::= { snmp 4 } - -snmpInBadCommunityUses OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of community-based SNMP messages (for - example, SNMPv1) delivered to the SNMP entity which - represented an SNMP operation that was not allowed for - the SNMP community named in the message. The precise - conditions under which this counter is incremented - (if at all) depend on how the SNMP entity implements - its access control mechanism and how its applications - interact with that access control mechanism. It is - strongly RECOMMENDED that the documentation for any - access control mechanism which is used to control access - to and visibility of MIB instrumentation specify the - precise conditions that contribute to this value." - ::= { snmp 5 } - -snmpInASNParseErrs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of ASN.1 or BER errors encountered by - the SNMP entity when decoding received SNMP messages." - ::= { snmp 6 } - -snmpEnableAuthenTraps OBJECT-TYPE - SYNTAX INTEGER { enabled(1), disabled(2) } - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "Indicates whether the SNMP entity is permitted to - generate authenticationFailure traps. The value of this - object overrides any configuration information; as such, - it provides a means whereby all authenticationFailure - traps may be disabled. - - Note that it is strongly recommended that this object - be stored in non-volatile memory so that it remains - constant across re-initializations of the network - management system." - - - - ::= { snmp 30 } - -snmpSilentDrops OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of Confirmed Class PDUs (such as - GetRequest-PDUs, GetNextRequest-PDUs, - GetBulkRequest-PDUs, SetRequest-PDUs, and - InformRequest-PDUs) delivered to the SNMP entity which - were silently dropped because the size of a reply - containing an alternate Response Class PDU (such as a - Response-PDU) with an empty variable-bindings field - was greater than either a local constraint or the - maximum message size associated with the originator of - the request." - ::= { snmp 31 } - -snmpProxyDrops OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of Confirmed Class PDUs - (such as GetRequest-PDUs, GetNextRequest-PDUs, - GetBulkRequest-PDUs, SetRequest-PDUs, and - InformRequest-PDUs) delivered to the SNMP entity which - were silently dropped because the transmission of - the (possibly translated) message to a proxy target - failed in a manner (other than a time-out) such that - no Response Class PDU (such as a Response-PDU) could - be returned." - ::= { snmp 32 } - --- information for notifications --- --- a collection of objects which allow the SNMP entity, when --- supporting a notification originator application, --- to be configured to generate SNMPv2-Trap-PDUs. - -snmpTrap OBJECT IDENTIFIER ::= { snmpMIBObjects 4 } - -snmpTrapOID OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS accessible-for-notify - STATUS current - DESCRIPTION - - - - "The authoritative identification of the notification - currently being sent. This variable occurs as - the second varbind in every SNMPv2-Trap-PDU and - InformRequest-PDU." - ::= { snmpTrap 1 } - --- ::= { snmpTrap 2 } this OID is obsolete - -snmpTrapEnterprise OBJECT-TYPE - SYNTAX OBJECT IDENTIFIER - MAX-ACCESS accessible-for-notify - STATUS current - DESCRIPTION - "The authoritative identification of the enterprise - associated with the trap currently being sent. When an - SNMP proxy agent is mapping an RFC1157 Trap-PDU - into a SNMPv2-Trap-PDU, this variable occurs as the - last varbind." - ::= { snmpTrap 3 } - --- ::= { snmpTrap 4 } this OID is obsolete - - --- well-known traps - -snmpTraps OBJECT IDENTIFIER ::= { snmpMIBObjects 5 } - -coldStart NOTIFICATION-TYPE - STATUS current - DESCRIPTION - "A coldStart trap signifies that the SNMP entity, - supporting a notification originator application, is - reinitializing itself and that its configuration may - have been altered." - ::= { snmpTraps 1 } - -warmStart NOTIFICATION-TYPE - STATUS current - DESCRIPTION - "A warmStart trap signifies that the SNMP entity, - supporting a notification originator application, - is reinitializing itself such that its configuration - is unaltered." - ::= { snmpTraps 2 } - --- Note the linkDown NOTIFICATION-TYPE ::= { snmpTraps 3 } --- and the linkUp NOTIFICATION-TYPE ::= { snmpTraps 4 } --- are defined in RFC 2863 [RFC2863] - - - -authenticationFailure NOTIFICATION-TYPE - STATUS current - DESCRIPTION - "An authenticationFailure trap signifies that the SNMP - entity has received a protocol message that is not - properly authenticated. While all implementations - of SNMP entities MAY be capable of generating this - trap, the snmpEnableAuthenTraps object indicates - whether this trap will be generated." - ::= { snmpTraps 5 } - --- Note the egpNeighborLoss notification is defined --- as { snmpTraps 6 } in RFC 1213 - --- the set group --- --- a collection of objects which allow several cooperating --- command generator applications to coordinate their use of the --- set operation. - -snmpSet OBJECT IDENTIFIER ::= { snmpMIBObjects 6 } - -snmpSetSerialNo OBJECT-TYPE - SYNTAX TestAndIncr - MAX-ACCESS read-write - STATUS current - DESCRIPTION - "An advisory lock used to allow several cooperating - command generator applications to coordinate their - use of the SNMP set operation. - - This object is used for coarse-grain coordination. - To achieve fine-grain coordination, one or more similar - objects might be defined within each MIB group, as - appropriate." - ::= { snmpSet 1 } - --- conformance information - -snmpMIBConformance - OBJECT IDENTIFIER ::= { snmpMIB 2 } - -snmpMIBCompliances - OBJECT IDENTIFIER ::= { snmpMIBConformance 1 } -snmpMIBGroups OBJECT IDENTIFIER ::= { snmpMIBConformance 2 } - --- compliance statements - - - - --- ::= { snmpMIBCompliances 1 } this OID is obsolete -snmpBasicCompliance MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "The compliance statement for SNMPv2 entities which - implement the SNMPv2 MIB. - - This compliance statement is replaced by - snmpBasicComplianceRev2." - MODULE -- this module - MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup, - snmpBasicNotificationsGroup } - - GROUP snmpCommunityGroup - DESCRIPTION - "This group is mandatory for SNMPv2 entities which - support community-based authentication." - - ::= { snmpMIBCompliances 2 } - -snmpBasicComplianceRev2 MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for SNMP entities which - implement this MIB module." - MODULE -- this module - MANDATORY-GROUPS { snmpGroup, snmpSetGroup, systemGroup, - snmpBasicNotificationsGroup } - - GROUP snmpCommunityGroup - DESCRIPTION - "This group is mandatory for SNMP entities which - support community-based authentication." - - GROUP snmpWarmStartNotificationGroup - DESCRIPTION - "This group is mandatory for an SNMP entity which - supports command responder applications, and is - able to reinitialize itself such that its - configuration is unaltered." - - ::= { snmpMIBCompliances 3 } - --- units of conformance - --- ::= { snmpMIBGroups 1 } this OID is obsolete --- ::= { snmpMIBGroups 2 } this OID is obsolete --- ::= { snmpMIBGroups 3 } this OID is obsolete - - - --- ::= { snmpMIBGroups 4 } this OID is obsolete - -snmpGroup OBJECT-GROUP - OBJECTS { snmpInPkts, - snmpInBadVersions, - snmpInASNParseErrs, - snmpSilentDrops, - snmpProxyDrops, - snmpEnableAuthenTraps } - STATUS current - DESCRIPTION - "A collection of objects providing basic instrumentation - and control of an SNMP entity." - ::= { snmpMIBGroups 8 } - -snmpCommunityGroup OBJECT-GROUP - OBJECTS { snmpInBadCommunityNames, - snmpInBadCommunityUses } - STATUS current - DESCRIPTION - "A collection of objects providing basic instrumentation - of a SNMP entity which supports community-based - authentication." - ::= { snmpMIBGroups 9 } - -snmpSetGroup OBJECT-GROUP - OBJECTS { snmpSetSerialNo } - STATUS current - DESCRIPTION - "A collection of objects which allow several cooperating - command generator applications to coordinate their - use of the set operation." - ::= { snmpMIBGroups 5 } - -systemGroup OBJECT-GROUP - OBJECTS { sysDescr, sysObjectID, sysUpTime, - sysContact, sysName, sysLocation, - sysServices, - sysORLastChange, sysORID, - sysORUpTime, sysORDescr } - STATUS current - DESCRIPTION - "The system group defines objects which are common to all - managed systems." - ::= { snmpMIBGroups 6 } - -snmpBasicNotificationsGroup NOTIFICATION-GROUP - NOTIFICATIONS { coldStart, authenticationFailure } - - - - STATUS current - DESCRIPTION - "The basic notifications implemented by an SNMP entity - supporting command responder applications." - ::= { snmpMIBGroups 7 } - -snmpWarmStartNotificationGroup NOTIFICATION-GROUP - NOTIFICATIONS { warmStart } - STATUS current - DESCRIPTION - "An additional notification for an SNMP entity supporting - command responder applications, if it is able to reinitialize - itself such that its configuration is unaltered." - ::= { snmpMIBGroups 11 } - -snmpNotificationGroup OBJECT-GROUP - OBJECTS { snmpTrapOID, snmpTrapEnterprise } - STATUS current - DESCRIPTION - "These objects are required for entities - which support notification originator applications." - ::= { snmpMIBGroups 12 } - --- definitions in RFC 1213 made obsolete by the inclusion of a --- subset of the snmp group in this MIB - -snmpOutPkts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Messages which were - passed from the SNMP protocol entity to the - transport service." - ::= { snmp 2 } - --- { snmp 7 } is not used - -snmpInTooBigs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field was - `tooBig'." - ::= { snmp 8 } - - - -snmpInNoSuchNames OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field was - `noSuchName'." - ::= { snmp 9 } - -snmpInBadValues OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were - delivered to the SNMP protocol entity and for - which the value of the error-status field was - `badValue'." - ::= { snmp 10 } - -snmpInReadOnlys OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number valid SNMP PDUs which were delivered - to the SNMP protocol entity and for which the value - of the error-status field was `readOnly'. It should - be noted that it is a protocol error to generate an - SNMP PDU which contains the value `readOnly' in the - error-status field, as such this object is provided - as a means of detecting incorrect implementations of - the SNMP." - ::= { snmp 11 } - -snmpInGenErrs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were delivered - to the SNMP protocol entity and for which the value - of the error-status field was `genErr'." - ::= { snmp 12 } - -snmpInTotalReqVars OBJECT-TYPE - - - - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of MIB objects which have been - retrieved successfully by the SNMP protocol entity - as the result of receiving valid SNMP Get-Request - and Get-Next PDUs." - ::= { snmp 13 } - -snmpInTotalSetVars OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of MIB objects which have been - altered successfully by the SNMP protocol entity as - the result of receiving valid SNMP Set-Request PDUs." - ::= { snmp 14 } - -snmpInGetRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Request PDUs which - have been accepted and processed by the SNMP - protocol entity." - ::= { snmp 15 } - -snmpInGetNexts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Next PDUs which have been - accepted and processed by the SNMP protocol entity." - ::= { snmp 16 } - -snmpInSetRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Set-Request PDUs which - have been accepted and processed by the SNMP protocol - entity." - ::= { snmp 17 } - - - -snmpInGetResponses OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Response PDUs which - have been accepted and processed by the SNMP protocol - entity." - ::= { snmp 18 } - -snmpInTraps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Trap PDUs which have been - accepted and processed by the SNMP protocol entity." - ::= { snmp 19 } - -snmpOutTooBigs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were generated - by the SNMP protocol entity and for which the value - of the error-status field was `tooBig.'" - ::= { snmp 20 } - -snmpOutNoSuchNames OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were generated - by the SNMP protocol entity and for which the value - of the error-status was `noSuchName'." - ::= { snmp 21 } - -snmpOutBadValues OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were generated - by the SNMP protocol entity and for which the value - of the error-status field was `badValue'." - ::= { snmp 22 } - - - --- { snmp 23 } is not used - -snmpOutGenErrs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP PDUs which were generated - by the SNMP protocol entity and for which the value - of the error-status field was `genErr'." - ::= { snmp 24 } - -snmpOutGetRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Request PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 25 } - -snmpOutGetNexts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Next PDUs which have - been generated by the SNMP protocol entity." - ::= { snmp 26 } - -snmpOutSetRequests OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Set-Request PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 27 } - -snmpOutGetResponses OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Get-Response PDUs which - have been generated by the SNMP protocol entity." - ::= { snmp 28 } - - - - -snmpOutTraps OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS obsolete - DESCRIPTION - "The total number of SNMP Trap PDUs which have - been generated by the SNMP protocol entity." - ::= { snmp 29 } - -snmpObsoleteGroup OBJECT-GROUP - OBJECTS { snmpOutPkts, snmpInTooBigs, snmpInNoSuchNames, - snmpInBadValues, snmpInReadOnlys, snmpInGenErrs, - snmpInTotalReqVars, snmpInTotalSetVars, - snmpInGetRequests, snmpInGetNexts, snmpInSetRequests, - snmpInGetResponses, snmpInTraps, snmpOutTooBigs, - snmpOutNoSuchNames, snmpOutBadValues, - snmpOutGenErrs, snmpOutGetRequests, snmpOutGetNexts, - snmpOutSetRequests, snmpOutGetResponses, snmpOutTraps - } - STATUS obsolete - DESCRIPTION - "A collection of objects from RFC 1213 made obsolete - by this MIB module." - ::= { snmpMIBGroups 10 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI deleted file mode 100644 index 2132646..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-SMI +++ /dev/null @@ -1,352 +0,0 @@ -SNMPv2-SMI DEFINITIONS ::= BEGIN - - --- the path to the root - -org OBJECT IDENTIFIER ::= { iso 3 } -- "iso" = 1 -dod OBJECT IDENTIFIER ::= { org 6 } -internet OBJECT IDENTIFIER ::= { dod 1 } - -directory OBJECT IDENTIFIER ::= { internet 1 } - -mgmt OBJECT IDENTIFIER ::= { internet 2 } -mib-2 OBJECT IDENTIFIER ::= { mgmt 1 } -transmission OBJECT IDENTIFIER ::= { mib-2 10 } - -experimental OBJECT IDENTIFIER ::= { internet 3 } - -private OBJECT IDENTIFIER ::= { internet 4 } -enterprises OBJECT IDENTIFIER ::= { private 1 } - -security OBJECT IDENTIFIER ::= { internet 5 } - -snmpV2 OBJECT IDENTIFIER ::= { internet 6 } - --- transport domains -snmpDomains OBJECT IDENTIFIER ::= { snmpV2 1 } - --- transport proxies -snmpProxys OBJECT IDENTIFIER ::= { snmpV2 2 } - --- module identities -snmpModules OBJECT IDENTIFIER ::= { snmpV2 3 } - --- Extended UTCTime, to allow dates with four-digit years --- (Note that this definition of ExtUTCTime is not to be IMPORTed --- by MIB modules.) -ExtUTCTime ::= OCTET STRING(SIZE(11 | 13)) - -- format is YYMMDDHHMMZ or YYYYMMDDHHMMZ - -- where: YY - last two digits of year (only years - -- between 1900-1999) - -- YYYY - last four digits of the year (any year) - -- MM - month (01 through 12) - -- DD - day of month (01 through 31) - -- HH - hours (00 through 23) - -- MM - minutes (00 through 59) - -- Z - denotes GMT (the ASCII character Z) - -- - -- For example, "9502192015Z" and "199502192015Z" represent - -- 8:15pm GMT on 19 February 1995. Years after 1999 must use - -- the four digit year format. Years 1900-1999 may use the - -- two or four digit format. - --- definitions for information modules - -MODULE-IDENTITY MACRO ::= -BEGIN - TYPE NOTATION ::= - "LAST-UPDATED" value(Update ExtUTCTime) - "ORGANIZATION" Text - "CONTACT-INFO" Text - "DESCRIPTION" Text - RevisionPart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - RevisionPart ::= - Revisions - | empty - Revisions ::= - Revision - | Revisions Revision - Revision ::= - "REVISION" value(Update ExtUTCTime) - "DESCRIPTION" Text - - -- a character string as defined in section 3.1.1 - Text ::= value(IA5String) -END - - -OBJECT-IDENTITY MACRO ::= -BEGIN - TYPE NOTATION ::= - "STATUS" Status - "DESCRIPTION" Text - ReferPart - - VALUE NOTATION ::= - value(VALUE OBJECT IDENTIFIER) - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - -- a character string as defined in section 3.1.1 - Text ::= value(IA5String) -END - - --- names of objects --- (Note that these definitions of ObjectName and NotificationName --- are not to be IMPORTed by MIB modules.) - -ObjectName ::= - OBJECT IDENTIFIER - -NotificationName ::= - OBJECT IDENTIFIER - --- syntax of objects - --- the "base types" defined here are: --- 3 built-in ASN.1 types: INTEGER, OCTET STRING, OBJECT IDENTIFIER --- 8 application-defined types: Integer32, IpAddress, Counter32, --- Gauge32, Unsigned32, TimeTicks, Opaque, and Counter64 - -ObjectSyntax ::= - CHOICE { - simple - SimpleSyntax, - - -- note that SEQUENCEs for conceptual tables and - -- rows are not mentioned here... - - application-wide - ApplicationSyntax - } - --- built-in ASN.1 types - -SimpleSyntax ::= - CHOICE { - -- INTEGERs with a more restrictive range - -- may also be used - integer-value -- includes Integer32 - INTEGER (-2147483648..2147483647), - - -- OCTET STRINGs with a more restrictive size - -- may also be used - string-value - OCTET STRING (SIZE (0..65535)), - - objectID-value - OBJECT IDENTIFIER - } - --- indistinguishable from INTEGER, but never needs more than --- 32-bits for a two's complement representation -Integer32 ::= - INTEGER (-2147483648..2147483647) - - --- application-wide types - -ApplicationSyntax ::= - CHOICE { - ipAddress-value - IpAddress, - - counter-value - Counter32, - - timeticks-value - TimeTicks, - - arbitrary-value - Opaque, - - big-counter-value - Counter64, - - unsigned-integer-value -- includes Gauge32 - Unsigned32 - } - --- in network-byte order --- (this is a tagged type for historical reasons) -IpAddress ::= - [APPLICATION 0] - IMPLICIT OCTET STRING (SIZE (4)) - --- this wraps -Counter32 ::= - [APPLICATION 1] - IMPLICIT INTEGER (0..4294967295) - --- this doesn't wrap -Gauge32 ::= - [APPLICATION 2] - IMPLICIT INTEGER (0..4294967295) - --- an unsigned 32-bit quantity --- indistinguishable from Gauge32 -Unsigned32 ::= - [APPLICATION 2] - IMPLICIT INTEGER (0..4294967295) - --- hundredths of seconds since an epoch -TimeTicks ::= - [APPLICATION 3] - IMPLICIT INTEGER (0..4294967295) - --- for backward-compatibility only -Opaque ::= - [APPLICATION 4] - IMPLICIT OCTET STRING - --- for counters that wrap in less than one hour with only 32 bits -Counter64 ::= - [APPLICATION 6] - IMPLICIT INTEGER (0..18446744073709551615) - - --- definition for objects - -OBJECT-TYPE MACRO ::= -BEGIN - TYPE NOTATION ::= - "SYNTAX" Syntax - UnitsPart - "MAX-ACCESS" Access - "STATUS" Status - "DESCRIPTION" Text - ReferPart - IndexPart - DefValPart - - VALUE NOTATION ::= - value(VALUE ObjectName) - - Syntax ::= -- Must be one of the following: - -- a base type (or its refinement), - -- a textual convention (or its refinement), or - -- a BITS pseudo-type - type - | "BITS" "{" NamedBits "}" - - NamedBits ::= NamedBit - | NamedBits "," NamedBit - - NamedBit ::= identifier "(" number ")" -- number is nonnegative - - UnitsPart ::= - "UNITS" Text - | empty - - Access ::= - "not-accessible" - | "accessible-for-notify" - | "read-only" - | "read-write" - | "read-create" - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - IndexPart ::= - "INDEX" "{" IndexTypes "}" - | "AUGMENTS" "{" Entry "}" - | empty - IndexTypes ::= - IndexType - | IndexTypes "," IndexType - IndexType ::= - "IMPLIED" Index - | Index - Index ::= - -- use the SYNTAX value of the - -- correspondent OBJECT-TYPE invocation - value(ObjectName) - Entry ::= - -- use the INDEX value of the - -- correspondent OBJECT-TYPE invocation - value(ObjectName) - - DefValPart ::= "DEFVAL" "{" Defvalue "}" - | empty - - Defvalue ::= -- must be valid for the type specified in - -- SYNTAX clause of same OBJECT-TYPE macro - value(ObjectSyntax) - | "{" BitsValue "}" - - BitsValue ::= BitNames - | empty - - BitNames ::= BitName - | BitNames "," BitName - - BitName ::= identifier - - -- a character string as defined in section 3.1.1 - Text ::= value(IA5String) -END - - --- definitions for notifications - -NOTIFICATION-TYPE MACRO ::= -BEGIN - TYPE NOTATION ::= - ObjectsPart - "STATUS" Status - "DESCRIPTION" Text - ReferPart - - VALUE NOTATION ::= - value(VALUE NotificationName) - - ObjectsPart ::= - "OBJECTS" "{" Objects "}" - | empty - Objects ::= - Object - | Objects "," Object - Object ::= - value(ObjectName) - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - -- a character string as defined in section 3.1.1 - Text ::= value(IA5String) -END - --- definitions of administrative identifiers - -zeroDotZero OBJECT-IDENTITY - STATUS current - DESCRIPTION - "A value used for null identifiers." - ::= { 0 0 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC deleted file mode 100644 index a68f969..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TC +++ /dev/null @@ -1,786 +0,0 @@ -SNMPv2-TC DEFINITIONS ::= BEGIN - -IMPORTS - TimeTicks FROM SNMPv2-SMI; - - --- definition of textual conventions - -TEXTUAL-CONVENTION MACRO ::= -BEGIN - TYPE NOTATION ::= - DisplayPart - "STATUS" Status - "DESCRIPTION" Text - ReferPart - "SYNTAX" Syntax - - VALUE NOTATION ::= - value(VALUE Syntax) -- adapted ASN.1 - - DisplayPart ::= - "DISPLAY-HINT" Text - | empty - - Status ::= - "current" - | "deprecated" - | "obsolete" - - ReferPart ::= - "REFERENCE" Text - | empty - - -- a character string as defined in [2] - Text ::= value(IA5String) - - Syntax ::= -- Must be one of the following: - -- a base type (or its refinement), or - -- a BITS pseudo-type - type - | "BITS" "{" NamedBits "}" - - NamedBits ::= NamedBit - | NamedBits "," NamedBit - - NamedBit ::= identifier "(" number ")" -- number is nonnegative - -END - - - - -DisplayString ::= TEXTUAL-CONVENTION - DISPLAY-HINT "255a" - STATUS current - DESCRIPTION - "Represents textual information taken from the NVT ASCII - character set, as defined in pages 4, 10-11 of RFC 854. - - To summarize RFC 854, the NVT ASCII repertoire specifies: - - - the use of character codes 0-127 (decimal) - - - the graphics characters (32-126) are interpreted as - US ASCII - - - NUL, LF, CR, BEL, BS, HT, VT and FF have the special - meanings specified in RFC 854 - - - the other 25 codes have no standard interpretation - - - the sequence 'CR LF' means newline - - - the sequence 'CR NUL' means carriage-return - - - an 'LF' not preceded by a 'CR' means moving to the - same column on the next line. - - - the sequence 'CR x' for any x other than LF or NUL is - illegal. (Note that this also means that a string may - end with either 'CR LF' or 'CR NUL', but not with CR.) - - Any object defined using this syntax may not exceed 255 - characters in length." - SYNTAX OCTET STRING (SIZE (0..255)) - -PhysAddress ::= TEXTUAL-CONVENTION - DISPLAY-HINT "1x:" - STATUS current - DESCRIPTION - "Represents media- or physical-level addresses." - SYNTAX OCTET STRING - - -MacAddress ::= TEXTUAL-CONVENTION - DISPLAY-HINT "1x:" - STATUS current - DESCRIPTION - "Represents an 802 MAC address represented in the - `canonical' order defined by IEEE 802.1a, i.e., as if it - were transmitted least significant bit first, even though - 802.5 (in contrast to other 802.x protocols) requires MAC - addresses to be transmitted most significant bit first." - SYNTAX OCTET STRING (SIZE (6)) - -TruthValue ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents a boolean value." - SYNTAX INTEGER { true(1), false(2) } - -TestAndIncr ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents integer-valued information used for atomic - operations. When the management protocol is used to specify - that an object instance having this syntax is to be - modified, the new value supplied via the management protocol - must precisely match the value presently held by the - instance. If not, the management protocol set operation - fails with an error of `inconsistentValue'. Otherwise, if - the current value is the maximum value of 2^31-1 (2147483647 - decimal), then the value held by the instance is wrapped to - zero; otherwise, the value held by the instance is - incremented by one. (Note that regardless of whether the - management protocol set operation succeeds, the variable- - binding in the request and response PDUs are identical.) - - The value of the ACCESS clause for objects having this - syntax is either `read-write' or `read-create'. When an - instance of a columnar object having this syntax is created, - any value may be supplied via the management protocol. - - When the network management portion of the system is re- - initialized, the value of every object instance having this - syntax must either be incremented from its value prior to - the re-initialization, or (if the value prior to the re- - initialization is unknown) be set to a pseudo-randomly - generated value." - SYNTAX INTEGER (0..2147483647) - -AutonomousType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents an independently extensible type identification - value. It may, for example, indicate a particular sub-tree - with further MIB definitions, or define a particular type of - protocol or hardware." - SYNTAX OBJECT IDENTIFIER - - -InstancePointer ::= TEXTUAL-CONVENTION - STATUS obsolete - DESCRIPTION - "A pointer to either a specific instance of a MIB object or - a conceptual row of a MIB table in the managed device. In - the latter case, by convention, it is the name of the - particular instance of the first accessible columnar object - in the conceptual row. - - The two uses of this textual convention are replaced by - VariablePointer and RowPointer, respectively." - SYNTAX OBJECT IDENTIFIER - - -VariablePointer ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "A pointer to a specific object instance. For example, - sysContact.0 or ifInOctets.3." - SYNTAX OBJECT IDENTIFIER - - -RowPointer ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents a pointer to a conceptual row. The value is the - name of the instance of the first accessible columnar object - in the conceptual row. - - For example, ifIndex.3 would point to the 3rd row in the - ifTable (note that if ifIndex were not-accessible, then - ifDescr.3 would be used instead)." - SYNTAX OBJECT IDENTIFIER - -RowStatus ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The RowStatus textual convention is used to manage the - creation and deletion of conceptual rows, and is used as the - value of the SYNTAX clause for the status column of a - conceptual row (as described in Section 7.7.1 of [2].) - The status column has six defined values: - - - `active', which indicates that the conceptual row is - available for use by the managed device; - - - `notInService', which indicates that the conceptual - row exists in the agent, but is unavailable for use by - the managed device (see NOTE below); 'notInService' has - no implication regarding the internal consistency of - the row, availability of resources, or consistency with - the current state of the managed device; - - - `notReady', which indicates that the conceptual row - exists in the agent, but is missing information - necessary in order to be available for use by the - managed device (i.e., one or more required columns in - the conceptual row have not been instanciated); - - - `createAndGo', which is supplied by a management - station wishing to create a new instance of a - conceptual row and to have its status automatically set - to active, making it available for use by the managed - device; - - - `createAndWait', which is supplied by a management - station wishing to create a new instance of a - conceptual row (but not make it available for use by - the managed device); and, - - - `destroy', which is supplied by a management station - wishing to delete all of the instances associated with - an existing conceptual row. - - Whereas five of the six values (all except `notReady') may - be specified in a management protocol set operation, only - three values will be returned in response to a management - protocol retrieval operation: `notReady', `notInService' or - `active'. That is, when queried, an existing conceptual row - has only three states: it is either available for use by - the managed device (the status column has value `active'); - it is not available for use by the managed device, though - the agent has sufficient information to attempt to make it - so (the status column has value `notInService'); or, it is - not available for use by the managed device, and an attempt - to make it so would fail because the agent has insufficient - information (the state column has value `notReady'). - - NOTE WELL - - This textual convention may be used for a MIB table, - irrespective of whether the values of that table's - conceptual rows are able to be modified while it is - active, or whether its conceptual rows must be taken - out of service in order to be modified. That is, it is - the responsibility of the DESCRIPTION clause of the - status column to specify whether the status column must - not be `active' in order for the value of some other - column of the same conceptual row to be modified. If - such a specification is made, affected columns may be - changed by an SNMP set PDU if the RowStatus would not - be equal to `active' either immediately before or after - processing the PDU. In other words, if the PDU also - contained a varbind that would change the RowStatus - value, the column in question may be changed if the - RowStatus was not equal to `active' as the PDU was - received, or if the varbind sets the status to a value - other than 'active'. - - - Also note that whenever any elements of a row exist, the - RowStatus column must also exist. - - To summarize the effect of having a conceptual row with a - status column having a SYNTAX clause value of RowStatus, - consider the following state diagram: - - - STATE - +--------------+-----------+-------------+------------- - | A | B | C | D - | |status col.|status column| - |status column | is | is |status column - ACTION |does not exist| notReady | notInService| is active ---------------+--------------+-----------+-------------+------------- -set status |noError ->D|inconsist- |inconsistent-|inconsistent- -column to | or | entValue| Value| Value -createAndGo |inconsistent- | | | - | Value| | | ---------------+--------------+-----------+-------------+------------- -set status |noError see 1|inconsist- |inconsistent-|inconsistent- -column to | or | entValue| Value| Value -createAndWait |wrongValue | | | ---------------+--------------+-----------+-------------+------------- -set status |inconsistent- |inconsist- |noError |noError -column to | Value| entValue| | -active | | | | - | | or | | - | | | | - | |see 2 ->D|see 8 ->D| ->D ---------------+--------------+-----------+-------------+------------- -set status |inconsistent- |inconsist- |noError |noError ->C -column to | Value| entValue| | -notInService | | | | - | | or | | or - | | | | - | |see 3 ->C| ->C|see 6 ---------------+--------------+-----------+-------------+------------- -set status |noError |noError |noError |noError ->A -column to | | | | or -destroy | ->A| ->A| ->A|see 7 ---------------+--------------+-----------+-------------+------------- -set any other |see 4 |noError |noError |see 5 -column to some| | | | -value | | see 1| ->C| ->D ---------------+--------------+-----------+-------------+------------- - - (1) goto B or C, depending on information available to the - agent. - - (2) if other variable bindings included in the same PDU, - provide values for all columns which are missing but - required, and all columns have acceptable values, then - return noError and goto D. - - (3) if other variable bindings included in the same PDU, - provide legal values for all columns which are missing but - required, then return noError and goto C. - - (4) at the discretion of the agent, the return value may be - either: - - inconsistentName: because the agent does not choose to - create such an instance when the corresponding - RowStatus instance does not exist, or - - inconsistentValue: if the supplied value is - inconsistent with the state of some other MIB object's - value, or - - noError: because the agent chooses to create the - instance. - - If noError is returned, then the instance of the status - column must also be created, and the new state is B or C, - depending on the information available to the agent. If - inconsistentName or inconsistentValue is returned, the row - remains in state A. - - (5) depending on the MIB definition for the column/table, - either noError or inconsistentValue may be returned. - - (6) the return value can indicate one of the following - errors: - - wrongValue: because the agent does not support - notInService (e.g., an agent which does not support - createAndWait), or - - inconsistentValue: because the agent is unable to take - the row out of service at this time, perhaps because it - is in use and cannot be de-activated. - - (7) the return value can indicate the following error: - - inconsistentValue: because the agent is unable to - remove the row at this time, perhaps because it is in - use and cannot be de-activated. - - (8) the transition to D can fail, e.g., if the values of the - conceptual row are inconsistent, then the error code would - be inconsistentValue. - - NOTE: Other processing of (this and other varbinds of) the - set request may result in a response other than noError - being returned, e.g., wrongValue, noCreation, etc. - - - Conceptual Row Creation - - There are four potential interactions when creating a - conceptual row: selecting an instance-identifier which is - not in use; creating the conceptual row; initializing any - objects for which the agent does not supply a default; and, - making the conceptual row available for use by the managed - device. - - Interaction 1: Selecting an Instance-Identifier - - The algorithm used to select an instance-identifier varies - for each conceptual row. In some cases, the instance- - identifier is semantically significant, e.g., the - destination address of a route, and a management station - selects the instance-identifier according to the semantics. - - In other cases, the instance-identifier is used solely to - distinguish conceptual rows, and a management station - without specific knowledge of the conceptual row might - examine the instances present in order to determine an - unused instance-identifier. (This approach may be used, but - it is often highly sub-optimal; however, it is also a - questionable practice for a naive management station to - attempt conceptual row creation.) - - Alternately, the MIB module which defines the conceptual row - might provide one or more objects which provide assistance - in determining an unused instance-identifier. For example, - if the conceptual row is indexed by an integer-value, then - an object having an integer-valued SYNTAX clause might be - defined for such a purpose, allowing a management station to - issue a management protocol retrieval operation. In order - to avoid unnecessary collisions between competing management - stations, `adjacent' retrievals of this object should be - different. - - Finally, the management station could select a pseudo-random - number to use as the index. In the event that this index - was already in use and an inconsistentValue was returned in - response to the management protocol set operation, the - management station should simply select a new pseudo-random - number and retry the operation. - - A MIB designer should choose between the two latter - algorithms based on the size of the table (and therefore the - efficiency of each algorithm). For tables in which a large - number of entries are expected, it is recommended that a MIB - object be defined that returns an acceptable index for - creation. For tables with small numbers of entries, it is - recommended that the latter pseudo-random index mechanism be - used. - - Interaction 2: Creating the Conceptual Row - - Once an unused instance-identifier has been selected, the - management station determines if it wishes to create and - activate the conceptual row in one transaction or in a - negotiated set of interactions. - - Interaction 2a: Creating and Activating the Conceptual Row - - The management station must first determine the column - requirements, i.e., it must determine those columns for - which it must or must not provide values. Depending on the - complexity of the table and the management station's - knowledge of the agent's capabilities, this determination - can be made locally by the management station. Alternately, - the management station issues a management protocol get - operation to examine all columns in the conceptual row that - it wishes to create. In response, for each column, there - are three possible outcomes: - - - a value is returned, indicating that some other - management station has already created this conceptual - row. We return to interaction 1. - - - the exception `noSuchInstance' is returned, - indicating that the agent implements the object-type - associated with this column, and that this column in at - least one conceptual row would be accessible in the MIB - view used by the retrieval were it to exist. For those - columns to which the agent provides read-create access, - the `noSuchInstance' exception tells the management - station that it should supply a value for this column - when the conceptual row is to be created. - - - the exception `noSuchObject' is returned, indicating - that the agent does not implement the object-type - associated with this column or that there is no - conceptual row for which this column would be - accessible in the MIB view used by the retrieval. As - such, the management station can not issue any - management protocol set operations to create an - instance of this column. - - Once the column requirements have been determined, a - management protocol set operation is accordingly issued. - This operation also sets the new instance of the status - column to `createAndGo'. - - When the agent processes the set operation, it verifies that - it has sufficient information to make the conceptual row - available for use by the managed device. The information - available to the agent is provided by two sources: the - management protocol set operation which creates the - conceptual row, and, implementation-specific defaults - supplied by the agent (note that an agent must provide - implementation-specific defaults for at least those objects - which it implements as read-only). If there is sufficient - information available, then the conceptual row is created, a - `noError' response is returned, the status column is set to - `active', and no further interactions are necessary (i.e., - interactions 3 and 4 are skipped). If there is insufficient - information, then the conceptual row is not created, and the - set operation fails with an error of `inconsistentValue'. - On this error, the management station can issue a management - protocol retrieval operation to determine if this was - because it failed to specify a value for a required column, - or, because the selected instance of the status column - already existed. In the latter case, we return to - interaction 1. In the former case, the management station - can re-issue the set operation with the additional - information, or begin interaction 2 again using - `createAndWait' in order to negotiate creation of the - conceptual row. - - NOTE WELL - - Regardless of the method used to determine the column - requirements, it is possible that the management - station might deem a column necessary when, in fact, - the agent will not allow that particular columnar - instance to be created or written. In this case, the - management protocol set operation will fail with an - error such as `noCreation' or `notWritable'. In this - case, the management station decides whether it needs - to be able to set a value for that particular columnar - instance. If not, the management station re-issues the - management protocol set operation, but without setting - a value for that particular columnar instance; - otherwise, the management station aborts the row - creation algorithm. - - Interaction 2b: Negotiating the Creation of the Conceptual - Row - - The management station issues a management protocol set - operation which sets the desired instance of the status - column to `createAndWait'. If the agent is unwilling to - process a request of this sort, the set operation fails with - an error of `wrongValue'. (As a consequence, such an agent - must be prepared to accept a single management protocol set - operation, i.e., interaction 2a above, containing all of the - columns indicated by its column requirements.) Otherwise, - the conceptual row is created, a `noError' response is - returned, and the status column is immediately set to either - `notInService' or `notReady', depending on whether it has - sufficient information to (attempt to) make the conceptual - row available for use by the managed device. If there is - sufficient information available, then the status column is - set to `notInService'; otherwise, if there is insufficient - information, then the status column is set to `notReady'. - Regardless, we proceed to interaction 3. - - Interaction 3: Initializing non-defaulted Objects - - The management station must now determine the column - requirements. It issues a management protocol get operation - to examine all columns in the created conceptual row. In - the response, for each column, there are three possible - outcomes: - - - a value is returned, indicating that the agent - implements the object-type associated with this column - and had sufficient information to provide a value. For - those columns to which the agent provides read-create - access (and for which the agent allows their values to - be changed after their creation), a value return tells - the management station that it may issue additional - management protocol set operations, if it desires, in - order to change the value associated with this column. - - - the exception `noSuchInstance' is returned, - indicating that the agent implements the object-type - associated with this column, and that this column in at - least one conceptual row would be accessible in the MIB - view used by the retrieval were it to exist. However, - the agent does not have sufficient information to - provide a value, and until a value is provided, the - conceptual row may not be made available for use by the - managed device. For those columns to which the agent - provides read-create access, the `noSuchInstance' - exception tells the management station that it must - issue additional management protocol set operations, in - order to provide a value associated with this column. - - - the exception `noSuchObject' is returned, indicating - that the agent does not implement the object-type - associated with this column or that there is no - conceptual row for which this column would be - accessible in the MIB view used by the retrieval. As - such, the management station can not issue any - management protocol set operations to create an - instance of this column. - - If the value associated with the status column is - `notReady', then the management station must first deal with - all `noSuchInstance' columns, if any. Having done so, the - value of the status column becomes `notInService', and we - proceed to interaction 4. - - Interaction 4: Making the Conceptual Row Available - - Once the management station is satisfied with the values - associated with the columns of the conceptual row, it issues - a management protocol set operation to set the status column - to `active'. If the agent has sufficient information to - make the conceptual row available for use by the managed - device, the management protocol set operation succeeds (a - `noError' response is returned). Otherwise, the management - protocol set operation fails with an error of - `inconsistentValue'. - - NOTE WELL - - A conceptual row having a status column with value - `notInService' or `notReady' is unavailable to the - managed device. As such, it is possible for the - managed device to create its own instances during the - time between the management protocol set operation - which sets the status column to `createAndWait' and the - management protocol set operation which sets the status - column to `active'. In this case, when the management - protocol set operation is issued to set the status - column to `active', the values held in the agent - supersede those used by the managed device. - - If the management station is prevented from setting the - status column to `active' (e.g., due to management station - or network failure) the conceptual row will be left in the - `notInService' or `notReady' state, consuming resources - indefinitely. The agent must detect conceptual rows that - have been in either state for an abnormally long period of - time and remove them. It is the responsibility of the - DESCRIPTION clause of the status column to indicate what an - abnormally long period of time would be. This period of - time should be long enough to allow for human response time - (including `think time') between the creation of the - conceptual row and the setting of the status to `active'. - In the absence of such information in the DESCRIPTION - clause, it is suggested that this period be approximately 5 - minutes in length. This removal action applies not only to - newly-created rows, but also to previously active rows which - are set to, and left in, the notInService state for a - prolonged period exceeding that which is considered normal - for such a conceptual row. - - Conceptual Row Suspension - - When a conceptual row is `active', the management station - may issue a management protocol set operation which sets the - instance of the status column to `notInService'. If the - agent is unwilling to do so, the set operation fails with an - error of `wrongValue' or `inconsistentValue'. Otherwise, - the conceptual row is taken out of service, and a `noError' - response is returned. It is the responsibility of the - DESCRIPTION clause of the status column to indicate under - what circumstances the status column should be taken out of - service (e.g., in order for the value of some other column - of the same conceptual row to be modified). - - - Conceptual Row Deletion - - For deletion of conceptual rows, a management protocol set - operation is issued which sets the instance of the status - column to `destroy'. This request may be made regardless of - the current value of the status column (e.g., it is possible - to delete conceptual rows which are either `notReady', - `notInService' or `active'.) If the operation succeeds, - then all instances associated with the conceptual row are - immediately removed." - SYNTAX INTEGER { - -- the following two values are states: - -- these values may be read or written - active(1), - notInService(2), - - -- the following value is a state: - -- this value may be read, but not written - notReady(3), - - -- the following three values are - -- actions: these values may be written, - -- but are never read - createAndGo(4), - createAndWait(5), - destroy(6) - } - -TimeStamp ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "The value of the sysUpTime object at which a specific - occurrence happened. The specific occurrence must be - defined in the description of any object defined using this - type. - - If sysUpTime is reset to zero as a result of a re- - initialization of the network management (sub)system, then - the values of all TimeStamp objects are also reset. - However, after approximately 497 days without a re- - initialization, the sysUpTime object will reach 2^^32-1 and - then increment around to zero; in this case, existing values - of TimeStamp objects do not change. This can lead to - ambiguities in the value of TimeStamp objects." - SYNTAX TimeTicks - - -TimeInterval ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "A period of time, measured in units of 0.01 seconds." - SYNTAX INTEGER (0..2147483647) - -DateAndTime ::= TEXTUAL-CONVENTION - DISPLAY-HINT "2d-1d-1d,1d:1d:1d.1d,1a1d:1d" - STATUS current - DESCRIPTION - "A date-time specification. - - field octets contents range - ----- ------ -------- ----- - 1 1-2 year* 0..65536 - 2 3 month 1..12 - 3 4 day 1..31 - 4 5 hour 0..23 - 5 6 minutes 0..59 - 6 7 seconds 0..60 - (use 60 for leap-second) - 7 8 deci-seconds 0..9 - 8 9 direction from UTC '+' / '-' - 9 10 hours from UTC* 0..13 - 10 11 minutes from UTC 0..59 - - * Notes: - - the value of year is in network-byte order - - daylight saving time in New Zealand is +13 - - For example, Tuesday May 26, 1992 at 1:30:15 PM EDT would be - displayed as: - - 1992-5-26,13:30:15.0,-4:0 - - Note that if only local time is known, then timezone - information (fields 8-10) is not present." - SYNTAX OCTET STRING (SIZE (8 | 11)) - - -StorageType ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Describes the memory realization of a conceptual row. A - row which is volatile(2) is lost upon reboot. A row which - is either nonVolatile(3), permanent(4) or readOnly(5), is - backed up by stable storage. A row which is permanent(4) - can be changed but not deleted. A row which is readOnly(5) - cannot be changed nor deleted. - - If the value of an object with this syntax is either - permanent(4) or readOnly(5), it cannot be written. - Conversely, if the value is either other(1), volatile(2) or - nonVolatile(3), it cannot be modified to be permanent(4) or - readOnly(5). (All illegal modifications result in a - 'wrongValue' error.) - - Every usage of this textual convention is required to - specify the columnar objects which a permanent(4) row must - at a minimum allow to be writable." - SYNTAX INTEGER { - other(1), -- eh? - volatile(2), -- e.g., in RAM - nonVolatile(3), -- e.g., in NVRAM - permanent(4), -- e.g., partially in ROM - readOnly(5) -- e.g., completely in ROM - } - -TDomain ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Denotes a kind of transport service. - - Some possible values, such as snmpUDPDomain, are defined in - the SNMPv2-TM MIB module. Other possible values are defined - in other MIB modules." - REFERENCE "The SNMPv2-TM MIB module is defined in RFC 1906." - SYNTAX OBJECT IDENTIFIER - - -TAddress ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Denotes a transport service address. - - A TAddress value is always interpreted within the context of a - TDomain value. Thus, each definition of a TDomain value must - be accompanied by a definition of a textual convention for use - with that TDomain. Some possible textual conventions, such as - SnmpUDPAddress for snmpUDPDomain, are defined in the SNMPv2-TM - MIB module. Other possible textual conventions are defined in - other MIB modules." - REFERENCE "The SNMPv2-TM MIB module is defined in RFC 1906." - SYNTAX OCTET STRING (SIZE (1..255)) - - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM deleted file mode 100644 index dadbc4a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/SNMPv2-TM +++ /dev/null @@ -1,194 +0,0 @@ -SNMPv2-TM DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-IDENTITY, - snmpModules, snmpDomains, snmpProxys - FROM SNMPv2-SMI - TEXTUAL-CONVENTION - FROM SNMPv2-TC; - -snmpv2tm MODULE-IDENTITY - LAST-UPDATED "200210160000Z" - ORGANIZATION "IETF SNMPv3 Working Group" - CONTACT-INFO - "WG-EMail: snmpv3@lists.tislabs.com - Subscribe: snmpv3-request@lists.tislabs.com - - Co-Chair: Russ Mundy - Network Associates Laboratories - postal: 15204 Omega Drive, Suite 300 - Rockville, MD 20850-4601 - USA - EMail: mundy@tislabs.com - phone: +1 301 947-7107 - - - - Co-Chair: David Harrington - Enterasys Networks - postal: 35 Industrial Way - P. O. Box 5005 - Rochester, NH 03866-5005 - USA - EMail: dbh@enterasys.com - phone: +1 603 337-2614 - - Editor: Randy Presuhn - BMC Software, Inc. - postal: 2141 North First Street - San Jose, CA 95131 - USA - EMail: randy_presuhn@bmc.com - phone: +1 408 546-1006" - DESCRIPTION - "The MIB module for SNMP transport mappings. - - Copyright (C) The Internet Society (2002). This - version of this MIB module is part of RFC 3417; - see the RFC itself for full legal notices. - " - REVISION "200210160000Z" - DESCRIPTION - "Clarifications, published as RFC 3417." - REVISION "199601010000Z" - DESCRIPTION - "Clarifications, published as RFC 1906." - REVISION "199304010000Z" - DESCRIPTION - "The initial version, published as RFC 1449." - ::= { snmpModules 19 } - --- SNMP over UDP over IPv4 - -snmpUDPDomain OBJECT-IDENTITY - STATUS current - DESCRIPTION - "The SNMP over UDP over IPv4 transport domain. - The corresponding transport address is of type - SnmpUDPAddress." - ::= { snmpDomains 1 } - - - - - - - - -SnmpUDPAddress ::= TEXTUAL-CONVENTION - DISPLAY-HINT "1d.1d.1d.1d/2d" - STATUS current - DESCRIPTION - "Represents a UDP over IPv4 address: - - octets contents encoding - 1-4 IP-address network-byte order - 5-6 UDP-port network-byte order - " - SYNTAX OCTET STRING (SIZE (6)) - --- SNMP over OSI - -snmpCLNSDomain OBJECT-IDENTITY - STATUS current - DESCRIPTION - "The SNMP over CLNS transport domain. - The corresponding transport address is of type - SnmpOSIAddress." - ::= { snmpDomains 2 } - -snmpCONSDomain OBJECT-IDENTITY - STATUS current - DESCRIPTION - "The SNMP over CONS transport domain. - The corresponding transport address is of type - SnmpOSIAddress." - ::= { snmpDomains 3 } - -SnmpOSIAddress ::= TEXTUAL-CONVENTION - DISPLAY-HINT "*1x:/1x:" - STATUS current - DESCRIPTION - "Represents an OSI transport-address: - - octets contents encoding - 1 length of NSAP 'n' as an unsigned-integer - (either 0 or from 3 to 20) - 2..(n+1) NSAP concrete binary representation - (n+2)..m TSEL string of (up to 64) octets - " - SYNTAX OCTET STRING (SIZE (1 | 4..85)) - - - - - - - - --- SNMP over DDP - -snmpDDPDomain OBJECT-IDENTITY - STATUS current - DESCRIPTION - "The SNMP over DDP transport domain. The corresponding - transport address is of type SnmpNBPAddress." - ::= { snmpDomains 4 } - -SnmpNBPAddress ::= TEXTUAL-CONVENTION - STATUS current - DESCRIPTION - "Represents an NBP name: - - octets contents encoding - 1 length of object 'n' as an unsigned integer - 2..(n+1) object string of (up to 32) octets - n+2 length of type 'p' as an unsigned integer - (n+3)..(n+2+p) type string of (up to 32) octets - n+3+p length of zone 'q' as an unsigned integer - (n+4+p)..(n+3+p+q) zone string of (up to 32) octets - - For comparison purposes, strings are - case-insensitive. All strings may contain any octet - other than 255 (hex ff)." - SYNTAX OCTET STRING (SIZE (3..99)) - --- SNMP over IPX - -snmpIPXDomain OBJECT-IDENTITY - STATUS current - DESCRIPTION - "The SNMP over IPX transport domain. The corresponding - transport address is of type SnmpIPXAddress." - ::= { snmpDomains 5 } - -SnmpIPXAddress ::= TEXTUAL-CONVENTION - DISPLAY-HINT "4x.1x:1x:1x:1x:1x:1x.2d" - STATUS current - DESCRIPTION - "Represents an IPX address: - - octets contents encoding - 1-4 network-number network-byte order - 5-10 physical-address network-byte order - 11-12 socket-number network-byte order - " - SYNTAX OCTET STRING (SIZE (12)) - - - --- for proxy to SNMPv1 (RFC 1157) - -rfc1157Proxy OBJECT IDENTIFIER ::= { snmpProxys 1 } - -rfc1157Domain OBJECT-IDENTITY - STATUS deprecated - DESCRIPTION - "The transport domain for SNMPv1 over UDP over IPv4. - The corresponding transport address is of type - SnmpUDPAddress." - ::= { rfc1157Proxy 1 } - --- ::= { rfc1157Proxy 2 } this OID is obsolete - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB deleted file mode 100644 index 5b9e0bf..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/TCP-MIB +++ /dev/null @@ -1,829 +0,0 @@ -TCP-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-TYPE, Integer32, Unsigned32, - Gauge32, Counter32, Counter64, IpAddress, mib-2 - FROM SNMPv2-SMI - MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF - InetAddress, InetAddressType, - InetPortNumber FROM INET-ADDRESS-MIB; - -tcpMIB MODULE-IDENTITY - LAST-UPDATED "200502180000Z" -- 18 February 2005 - ORGANIZATION - "IETF IPv6 MIB Revision Team - http://www.ietf.org/html.charters/ipv6-charter.html" - CONTACT-INFO - "Rajiv Raghunarayan (editor) - - Cisco Systems Inc. - 170 West Tasman Drive - San Jose, CA 95134 - - Phone: +1 408 853 9612 - Email: - - Send comments to " - DESCRIPTION - "The MIB module for managing TCP implementations. - - Copyright (C) The Internet Society (2005). This version - of this MIB module is a part of RFC 4022; see the RFC - itself for full legal notices." - REVISION "200502180000Z" -- 18 February 2005 - DESCRIPTION - "IP version neutral revision, published as RFC 4022." - REVISION "9411010000Z" - DESCRIPTION - "Initial SMIv2 version, published as RFC 2012." - REVISION "9103310000Z" - DESCRIPTION - "The initial revision of this MIB module was part of - MIB-II." - ::= { mib-2 49 } - --- the TCP base variables group - - - - -tcp OBJECT IDENTIFIER ::= { mib-2 6 } - --- Scalars - -tcpRtoAlgorithm OBJECT-TYPE - SYNTAX INTEGER { - other(1), -- none of the following - constant(2), -- a constant rto - rsre(3), -- MIL-STD-1778, Appendix B - vanj(4), -- Van Jacobson's algorithm - rfc2988(5) -- RFC 2988 - } - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The algorithm used to determine the timeout value used for - retransmitting unacknowledged octets." - ::= { tcp 1 } - -tcpRtoMin OBJECT-TYPE - SYNTAX Integer32 (0..2147483647) - UNITS "milliseconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The minimum value permitted by a TCP implementation for - the retransmission timeout, measured in milliseconds. - More refined semantics for objects of this type depend - on the algorithm used to determine the retransmission - timeout; in particular, the IETF standard algorithm - rfc2988(5) provides a minimum value." - ::= { tcp 2 } - -tcpRtoMax OBJECT-TYPE - SYNTAX Integer32 (0..2147483647) - UNITS "milliseconds" - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The maximum value permitted by a TCP implementation for - the retransmission timeout, measured in milliseconds. - More refined semantics for objects of this type depend - on the algorithm used to determine the retransmission - timeout; in particular, the IETF standard algorithm - rfc2988(5) provides an upper bound (as part of an - adaptive backoff algorithm)." - ::= { tcp 3 } - - - - -tcpMaxConn OBJECT-TYPE - SYNTAX Integer32 (-1 | 0..2147483647) - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The limit on the total number of TCP connections the entity - can support. In entities where the maximum number of - connections is dynamic, this object should contain the - value -1." - ::= { tcp 4 } - -tcpActiveOpens OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of times that TCP connections have made a direct - transition to the SYN-SENT state from the CLOSED state. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 5 } - -tcpPassiveOpens OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of times TCP connections have made a direct - transition to the SYN-RCVD state from the LISTEN state. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 6 } - -tcpAttemptFails OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of times that TCP connections have made a direct - transition to the CLOSED state from either the SYN-SENT - state or the SYN-RCVD state, plus the number of times that - TCP connections have made a direct transition to the - LISTEN state from the SYN-RCVD state. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - - - - ::= { tcp 7 } - -tcpEstabResets OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of times that TCP connections have made a direct - transition to the CLOSED state from either the ESTABLISHED - state or the CLOSE-WAIT state. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 8 } - -tcpCurrEstab OBJECT-TYPE - SYNTAX Gauge32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of TCP connections for which the current state - is either ESTABLISHED or CLOSE-WAIT." - ::= { tcp 9 } - -tcpInSegs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments received, including those - received in error. This count includes segments received - on currently established connections. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 10 } - -tcpOutSegs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments sent, including those on - current connections but excluding those containing only - retransmitted octets. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - - - - ::= { tcp 11 } - -tcpRetransSegs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments retransmitted; that is, the - number of TCP segments transmitted containing one or more - previously transmitted octets. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 12 } - -tcpInErrs OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments received in error (e.g., bad - TCP checksums). - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 14 } - -tcpOutRsts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of TCP segments sent containing the RST flag. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 15 } - --- { tcp 16 } was used to represent the ipv6TcpConnTable in RFC 2452, --- which has since been obsoleted. It MUST not be used. - -tcpHCInSegs OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments received, including those - received in error. This count includes segments received - - - - on currently established connections. This object is - the 64-bit equivalent of tcpInSegs. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 17 } - -tcpHCOutSegs OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of segments sent, including those on - current connections but excluding those containing only - retransmitted octets. This object is the 64-bit - equivalent of tcpOutSegs. - - Discontinuities in the value of this counter are - indicated via discontinuities in the value of sysUpTime." - ::= { tcp 18 } - - --- The TCP Connection table - -tcpConnectionTable OBJECT-TYPE - SYNTAX SEQUENCE OF TcpConnectionEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A table containing information about existing TCP - connections. Note that unlike earlier TCP MIBs, there - is a separate table for connections in the LISTEN state." - ::= { tcp 19 } - -tcpConnectionEntry OBJECT-TYPE - SYNTAX TcpConnectionEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row of the tcpConnectionTable containing - information about a particular current TCP connection. - Each row of this table is transient in that it ceases to - exist when (or soon after) the connection makes the - transition to the CLOSED state." - INDEX { tcpConnectionLocalAddressType, - tcpConnectionLocalAddress, - tcpConnectionLocalPort, - tcpConnectionRemAddressType, - - - - tcpConnectionRemAddress, - tcpConnectionRemPort } - ::= { tcpConnectionTable 1 } - -TcpConnectionEntry ::= SEQUENCE { - tcpConnectionLocalAddressType InetAddressType, - tcpConnectionLocalAddress InetAddress, - tcpConnectionLocalPort InetPortNumber, - tcpConnectionRemAddressType InetAddressType, - tcpConnectionRemAddress InetAddress, - tcpConnectionRemPort InetPortNumber, - tcpConnectionState INTEGER, - tcpConnectionProcess Unsigned32 - } - -tcpConnectionLocalAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of tcpConnectionLocalAddress." - ::= { tcpConnectionEntry 1 } - -tcpConnectionLocalAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local IP address for this TCP connection. The type - of this address is determined by the value of - tcpConnectionLocalAddressType. - - As this object is used in the index for the - tcpConnectionTable, implementors should be - careful not to create entries that would result in OIDs - with more than 128 subidentifiers; otherwise the information - cannot be accessed by using SNMPv1, SNMPv2c, or SNMPv3." - ::= { tcpConnectionEntry 2 } - -tcpConnectionLocalPort OBJECT-TYPE - SYNTAX InetPortNumber - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local port number for this TCP connection." - ::= { tcpConnectionEntry 3 } - -tcpConnectionRemAddressType OBJECT-TYPE - - - - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of tcpConnectionRemAddress." - ::= { tcpConnectionEntry 4 } - -tcpConnectionRemAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The remote IP address for this TCP connection. The type - of this address is determined by the value of - tcpConnectionRemAddressType. - - As this object is used in the index for the - tcpConnectionTable, implementors should be - careful not to create entries that would result in OIDs - with more than 128 subidentifiers; otherwise the information - cannot be accessed by using SNMPv1, SNMPv2c, or SNMPv3." - ::= { tcpConnectionEntry 5 } - -tcpConnectionRemPort OBJECT-TYPE - SYNTAX InetPortNumber - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The remote port number for this TCP connection." - ::= { tcpConnectionEntry 6 } - -tcpConnectionState OBJECT-TYPE - SYNTAX INTEGER { - closed(1), - listen(2), - synSent(3), - synReceived(4), - established(5), - finWait1(6), - finWait2(7), - closeWait(8), - lastAck(9), - closing(10), - timeWait(11), - deleteTCB(12) - } - MAX-ACCESS read-write - STATUS current - - - - DESCRIPTION - "The state of this TCP connection. - - The value listen(2) is included only for parallelism to the - old tcpConnTable and should not be used. A connection in - LISTEN state should be present in the tcpListenerTable. - - The only value that may be set by a management station is - deleteTCB(12). Accordingly, it is appropriate for an agent - to return a `badValue' response if a management station - attempts to set this object to any other value. - - If a management station sets this object to the value - deleteTCB(12), then the TCB (as defined in [RFC793]) of - the corresponding connection on the managed node is - deleted, resulting in immediate termination of the - connection. - - As an implementation-specific option, a RST segment may be - sent from the managed node to the other TCP endpoint (note, - however, that RST segments are not sent reliably)." - ::= { tcpConnectionEntry 7 } - -tcpConnectionProcess OBJECT-TYPE - SYNTAX Unsigned32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The system's process ID for the process associated with - this connection, or zero if there is no such process. This - value is expected to be the same as HOST-RESOURCES-MIB:: - hrSWRunIndex or SYSAPPL-MIB::sysApplElmtRunIndex for some - row in the appropriate tables." - ::= { tcpConnectionEntry 8 } - --- The TCP Listener table - -tcpListenerTable OBJECT-TYPE - SYNTAX SEQUENCE OF TcpListenerEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A table containing information about TCP listeners. A - listening application can be represented in three - possible ways: - - 1. An application that is willing to accept both IPv4 and - IPv6 datagrams is represented by - - - - a tcpListenerLocalAddressType of unknown (0) and - a tcpListenerLocalAddress of ''h (a zero-length - octet-string). - - 2. An application that is willing to accept only IPv4 or - IPv6 datagrams is represented by a - tcpListenerLocalAddressType of the appropriate address - type and a tcpListenerLocalAddress of '0.0.0.0' or '::' - respectively. - - 3. An application that is listening for data destined - only to a specific IP address, but from any remote - system, is represented by a tcpListenerLocalAddressType - of an appropriate address type, with - tcpListenerLocalAddress as the specific local address. - - NOTE: The address type in this table represents the - address type used for the communication, irrespective - of the higher-layer abstraction. For example, an - application using IPv6 'sockets' to communicate via - IPv4 between ::ffff:10.0.0.1 and ::ffff:10.0.0.2 would - use InetAddressType ipv4(1))." - ::= { tcp 20 } - -tcpListenerEntry OBJECT-TYPE - SYNTAX TcpListenerEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A conceptual row of the tcpListenerTable containing - information about a particular TCP listener." - INDEX { tcpListenerLocalAddressType, - tcpListenerLocalAddress, - tcpListenerLocalPort } - ::= { tcpListenerTable 1 } - -TcpListenerEntry ::= SEQUENCE { - tcpListenerLocalAddressType InetAddressType, - tcpListenerLocalAddress InetAddress, - tcpListenerLocalPort InetPortNumber, - tcpListenerProcess Unsigned32 - } - -tcpListenerLocalAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - - - - "The address type of tcpListenerLocalAddress. The value - should be unknown (0) if connection initiations to all - local IP addresses are accepted." - ::= { tcpListenerEntry 1 } - -tcpListenerLocalAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local IP address for this TCP connection. - - The value of this object can be represented in three - possible ways, depending on the characteristics of the - listening application: - - 1. For an application willing to accept both IPv4 and - IPv6 datagrams, the value of this object must be - ''h (a zero-length octet-string), with the value - of the corresponding tcpListenerLocalAddressType - object being unknown (0). - - 2. For an application willing to accept only IPv4 or - IPv6 datagrams, the value of this object must be - '0.0.0.0' or '::' respectively, with - tcpListenerLocalAddressType representing the - appropriate address type. - - 3. For an application which is listening for data - destined only to a specific IP address, the value - of this object is the specific local address, with - tcpListenerLocalAddressType representing the - appropriate address type. - - As this object is used in the index for the - tcpListenerTable, implementors should be - careful not to create entries that would result in OIDs - with more than 128 subidentifiers; otherwise the information - cannot be accessed, using SNMPv1, SNMPv2c, or SNMPv3." - ::= { tcpListenerEntry 2 } - -tcpListenerLocalPort OBJECT-TYPE - SYNTAX InetPortNumber - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local port number for this TCP connection." - ::= { tcpListenerEntry 3 } - - - -tcpListenerProcess OBJECT-TYPE - SYNTAX Unsigned32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The system's process ID for the process associated with - this listener, or zero if there is no such process. This - value is expected to be the same as HOST-RESOURCES-MIB:: - hrSWRunIndex or SYSAPPL-MIB::sysApplElmtRunIndex for some - row in the appropriate tables." - ::= { tcpListenerEntry 4 } - - --- The deprecated TCP Connection table - -tcpConnTable OBJECT-TYPE - SYNTAX SEQUENCE OF TcpConnEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "A table containing information about existing IPv4-specific - TCP connections or listeners. This table has been - deprecated in favor of the version neutral - tcpConnectionTable." - ::= { tcp 13 } - -tcpConnEntry OBJECT-TYPE - SYNTAX TcpConnEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "A conceptual row of the tcpConnTable containing information - about a particular current IPv4 TCP connection. Each row - of this table is transient in that it ceases to exist when - (or soon after) the connection makes the transition to the - CLOSED state." - INDEX { tcpConnLocalAddress, - tcpConnLocalPort, - tcpConnRemAddress, - tcpConnRemPort } - ::= { tcpConnTable 1 } - -TcpConnEntry ::= SEQUENCE { - tcpConnState INTEGER, - tcpConnLocalAddress IpAddress, - tcpConnLocalPort Integer32, - tcpConnRemAddress IpAddress, - tcpConnRemPort Integer32 - - - - } - -tcpConnState OBJECT-TYPE - SYNTAX INTEGER { - closed(1), - listen(2), - synSent(3), - synReceived(4), - established(5), - finWait1(6), - finWait2(7), - closeWait(8), - lastAck(9), - closing(10), - timeWait(11), - deleteTCB(12) - } - MAX-ACCESS read-write - STATUS deprecated - DESCRIPTION - "The state of this TCP connection. - - The only value that may be set by a management station is - deleteTCB(12). Accordingly, it is appropriate for an agent - to return a `badValue' response if a management station - attempts to set this object to any other value. - - If a management station sets this object to the value - deleteTCB(12), then the TCB (as defined in [RFC793]) of - the corresponding connection on the managed node is - deleted, resulting in immediate termination of the - connection. - - As an implementation-specific option, a RST segment may be - sent from the managed node to the other TCP endpoint (note, - however, that RST segments are not sent reliably)." - ::= { tcpConnEntry 1 } - -tcpConnLocalAddress OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The local IP address for this TCP connection. In the case - of a connection in the listen state willing to - accept connections for any IP interface associated with the - node, the value 0.0.0.0 is used." - ::= { tcpConnEntry 2 } - - - -tcpConnLocalPort OBJECT-TYPE - SYNTAX Integer32 (0..65535) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The local port number for this TCP connection." - ::= { tcpConnEntry 3 } - -tcpConnRemAddress OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The remote IP address for this TCP connection." - ::= { tcpConnEntry 4 } - -tcpConnRemPort OBJECT-TYPE - SYNTAX Integer32 (0..65535) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The remote port number for this TCP connection." - ::= { tcpConnEntry 5 } - --- conformance information - -tcpMIBConformance OBJECT IDENTIFIER ::= { tcpMIB 2 } - -tcpMIBCompliances OBJECT IDENTIFIER ::= { tcpMIBConformance 1 } -tcpMIBGroups OBJECT IDENTIFIER ::= { tcpMIBConformance 2 } - --- compliance statements - -tcpMIBCompliance2 MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for systems that implement TCP. - - A number of INDEX objects cannot be - represented in the form of OBJECT clauses in SMIv2 but - have the following compliance requirements, - expressed in OBJECT clause form in this description - clause: - - -- OBJECT tcpConnectionLocalAddressType - -- SYNTAX InetAddressType { ipv4(1), ipv6(2) } - -- DESCRIPTION - -- This MIB requires support for only global IPv4 - - - - -- and IPv6 address types. - -- - -- OBJECT tcpConnectionRemAddressType - -- SYNTAX InetAddressType { ipv4(1), ipv6(2) } - -- DESCRIPTION - -- This MIB requires support for only global IPv4 - -- and IPv6 address types. - -- - -- OBJECT tcpListenerLocalAddressType - -- SYNTAX InetAddressType { unknown(0), ipv4(1), - -- ipv6(2) } - -- DESCRIPTION - -- This MIB requires support for only global IPv4 - -- and IPv6 address types. The type unknown also - -- needs to be supported to identify a special - -- case in the listener table: a listen using - -- both IPv4 and IPv6 addresses on the device. - -- - " - MODULE -- this module - MANDATORY-GROUPS { tcpBaseGroup, tcpConnectionGroup, - tcpListenerGroup } - GROUP tcpHCGroup - DESCRIPTION - "This group is mandatory for systems that are capable - of receiving or transmitting more than 1 million TCP - segments per second. 1 million segments per second will - cause a Counter32 to wrap in just over an hour." - OBJECT tcpConnectionState - SYNTAX INTEGER { closed(1), listen(2), synSent(3), - synReceived(4), established(5), - finWait1(6), finWait2(7), closeWait(8), - lastAck(9), closing(10), timeWait(11) } - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required, nor is support for the value - deleteTCB (12)." - ::= { tcpMIBCompliances 2 } - -tcpMIBCompliance MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "The compliance statement for IPv4-only systems that - implement TCP. In order to be IP version independent, this - compliance statement is deprecated in favor of - tcpMIBCompliance2. However, agents are still encouraged - to implement these objects in order to interoperate with - the deployed base of managers." - - - - MODULE -- this module - MANDATORY-GROUPS { tcpGroup } - OBJECT tcpConnState - MIN-ACCESS read-only - DESCRIPTION - "Write access is not required." - ::= { tcpMIBCompliances 1 } - - --- units of conformance - -tcpGroup OBJECT-GROUP - OBJECTS { tcpRtoAlgorithm, tcpRtoMin, tcpRtoMax, - tcpMaxConn, tcpActiveOpens, - tcpPassiveOpens, tcpAttemptFails, - tcpEstabResets, tcpCurrEstab, tcpInSegs, - tcpOutSegs, tcpRetransSegs, tcpConnState, - tcpConnLocalAddress, tcpConnLocalPort, - tcpConnRemAddress, tcpConnRemPort, - tcpInErrs, tcpOutRsts } - STATUS deprecated - DESCRIPTION - "The tcp group of objects providing for management of TCP - entities." - ::= { tcpMIBGroups 1 } - -tcpBaseGroup OBJECT-GROUP - OBJECTS { tcpRtoAlgorithm, tcpRtoMin, tcpRtoMax, - tcpMaxConn, tcpActiveOpens, - tcpPassiveOpens, tcpAttemptFails, - tcpEstabResets, tcpCurrEstab, tcpInSegs, - tcpOutSegs, tcpRetransSegs, - tcpInErrs, tcpOutRsts } - STATUS current - DESCRIPTION - "The group of counters common to TCP entities." - ::= { tcpMIBGroups 2 } - -tcpConnectionGroup OBJECT-GROUP - OBJECTS { tcpConnectionState, tcpConnectionProcess } - STATUS current - DESCRIPTION - "The group provides general information about TCP - connections." - ::= { tcpMIBGroups 3 } - -tcpListenerGroup OBJECT-GROUP - OBJECTS { tcpListenerProcess } - - - - STATUS current - DESCRIPTION - "This group has objects providing general information about - TCP listeners." - ::= { tcpMIBGroups 4 } - -tcpHCGroup OBJECT-GROUP - OBJECTS { tcpHCInSegs, tcpHCOutSegs } - STATUS current - DESCRIPTION - "The group of objects providing for counters of high speed - TCP implementations." - ::= { tcpMIBGroups 5 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB deleted file mode 100644 index b947b81..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/Mibs/UDP-MIB +++ /dev/null @@ -1,579 +0,0 @@ -UDP-MIB DEFINITIONS ::= BEGIN - -IMPORTS - MODULE-IDENTITY, OBJECT-TYPE, Integer32, Counter32, Counter64, - Unsigned32, IpAddress, mib-2 FROM SNMPv2-SMI - MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF - InetAddress, InetAddressType, - InetPortNumber FROM INET-ADDRESS-MIB; - -udpMIB MODULE-IDENTITY - LAST-UPDATED "200505200000Z" -- May 20, 2005 - ORGANIZATION - "IETF IPv6 Working Group - http://www.ietf.org/html.charters/ipv6-charter.html" - CONTACT-INFO - "Bill Fenner (editor) - - AT&T Labs -- Research - 75 Willow Rd. - Menlo Park, CA 94025 - - Phone: +1 650 330-7893 - Email: - - John Flick (editor) - - Hewlett-Packard Company - 8000 Foothills Blvd. M/S 5557 - Roseville, CA 95747 - - Phone: +1 916 785 4018 - Email: - - Send comments to " - - - - DESCRIPTION - "The MIB module for managing UDP implementations. - Copyright (C) The Internet Society (2005). This - version of this MIB module is part of RFC 4113; - see the RFC itself for full legal notices." - REVISION "200505200000Z" -- May 20, 2005 - DESCRIPTION - "IP version neutral revision, incorporating the - following revisions: - - - Added udpHCInDatagrams and udpHCOutDatagrams in order - to provide high-capacity counters for fast networks. - - Added text to the descriptions of all counter objects - to indicate how discontinuities are detected. - - Deprecated the IPv4-specific udpTable and replaced it - with the version neutral udpEndpointTable. This - table includes support for connected UDP endpoints - and support for identification of the operating - system process associated with a UDP endpoint. - - Deprecated the udpGroup and replaced it with object - groups representing the current set of objects. - - Deprecated udpMIBCompliance and replaced it with - udpMIBCompliance2, which includes the compliance - information for the new object groups. - - This version published as RFC 4113." - REVISION "199411010000Z" -- November 1, 1994 - DESCRIPTION - "Initial SMIv2 version, published as RFC 2013." - REVISION "199103310000Z" -- March 31, 1991 - DESCRIPTION - "The initial revision of this MIB module was part of - MIB-II, published as RFC 1213." - ::= { mib-2 50 } - --- the UDP group - -udp OBJECT IDENTIFIER ::= { mib-2 7 } - -udpInDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of UDP datagrams delivered to UDP - users. - - - - - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 1 } - -udpNoPorts OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of received UDP datagrams for which - there was no application at the destination port. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 2 } - -udpInErrors OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The number of received UDP datagrams that could not be - delivered for reasons other than the lack of an - application at the destination port. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 3 } - -udpOutDatagrams OBJECT-TYPE - SYNTAX Counter32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of UDP datagrams sent from this - entity. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 4 } - - - -udpHCInDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of UDP datagrams delivered to UDP - users, for devices that can receive more than 1 - million UDP datagrams per second. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 8 } - -udpHCOutDatagrams OBJECT-TYPE - SYNTAX Counter64 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The total number of UDP datagrams sent from this - entity, for devices that can transmit more than 1 - million UDP datagrams per second. - - Discontinuities in the value of this counter can occur - at re-initialization of the management system, and at - other times as indicated by discontinuities in the - value of sysUpTime." - ::= { udp 9 } - --- --- { udp 6 } was defined as the ipv6UdpTable in RFC2454's --- IPV6-UDP-MIB. This RFC obsoletes RFC 2454, so { udp 6 } is --- obsoleted. --- - --- The UDP "Endpoint" table. - -udpEndpointTable OBJECT-TYPE - SYNTAX SEQUENCE OF UdpEndpointEntry - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "A table containing information about this entity's UDP - endpoints on which a local application is currently - accepting or sending datagrams. - - - - - - The address type in this table represents the address - type used for the communication, irrespective of the - higher-layer abstraction. For example, an application - using IPv6 'sockets' to communicate via IPv4 between - ::ffff:10.0.0.1 and ::ffff:10.0.0.2 would use - InetAddressType ipv4(1). - - Unlike the udpTable in RFC 2013, this table also allows - the representation of an application that completely - specifies both local and remote addresses and ports. A - listening application is represented in three possible - ways: - - 1) An application that is willing to accept both IPv4 - and IPv6 datagrams is represented by a - udpEndpointLocalAddressType of unknown(0) and a - udpEndpointLocalAddress of ''h (a zero-length - octet-string). - - 2) An application that is willing to accept only IPv4 - or only IPv6 datagrams is represented by a - udpEndpointLocalAddressType of the appropriate - address type and a udpEndpointLocalAddress of - '0.0.0.0' or '::' respectively. - - 3) An application that is listening for datagrams only - for a specific IP address but from any remote - system is represented by a - udpEndpointLocalAddressType of the appropriate - address type, with udpEndpointLocalAddress - specifying the local address. - - In all cases where the remote is a wildcard, the - udpEndpointRemoteAddressType is unknown(0), the - udpEndpointRemoteAddress is ''h (a zero-length - octet-string), and the udpEndpointRemotePort is 0. - - If the operating system is demultiplexing UDP packets - by remote address and port, or if the application has - 'connected' the socket specifying a default remote - address and port, the udpEndpointRemote* values should - be used to reflect this." - ::= { udp 7 } - -udpEndpointEntry OBJECT-TYPE - SYNTAX UdpEndpointEntry - MAX-ACCESS not-accessible - STATUS current - - - - DESCRIPTION - "Information about a particular current UDP endpoint. - - Implementers need to be aware that if the total number - of elements (octets or sub-identifiers) in - udpEndpointLocalAddress and udpEndpointRemoteAddress - exceeds 111, then OIDs of column instances in this table - will have more than 128 sub-identifiers and cannot be - accessed using SNMPv1, SNMPv2c, or SNMPv3." - INDEX { udpEndpointLocalAddressType, - udpEndpointLocalAddress, - udpEndpointLocalPort, - udpEndpointRemoteAddressType, - udpEndpointRemoteAddress, - udpEndpointRemotePort, - udpEndpointInstance } - ::= { udpEndpointTable 1 } - -UdpEndpointEntry ::= SEQUENCE { - udpEndpointLocalAddressType InetAddressType, - udpEndpointLocalAddress InetAddress, - udpEndpointLocalPort InetPortNumber, - udpEndpointRemoteAddressType InetAddressType, - udpEndpointRemoteAddress InetAddress, - udpEndpointRemotePort InetPortNumber, - udpEndpointInstance Unsigned32, - udpEndpointProcess Unsigned32 - } - -udpEndpointLocalAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of udpEndpointLocalAddress. Only - IPv4, IPv4z, IPv6, and IPv6z addresses are expected, or - unknown(0) if datagrams for all local IP addresses are - accepted." - ::= { udpEndpointEntry 1 } - -udpEndpointLocalAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local IP address for this UDP endpoint. - - The value of this object can be represented in three - - - - possible ways, depending on the characteristics of the - listening application: - - 1. For an application that is willing to accept both - IPv4 and IPv6 datagrams, the value of this object - must be ''h (a zero-length octet-string), with - the value of the corresponding instance of the - udpEndpointLocalAddressType object being unknown(0). - - 2. For an application that is willing to accept only IPv4 - or only IPv6 datagrams, the value of this object - must be '0.0.0.0' or '::', respectively, while the - corresponding instance of the - udpEndpointLocalAddressType object represents the - appropriate address type. - - 3. For an application that is listening for data - destined only to a specific IP address, the value - of this object is the specific IP address for which - this node is receiving packets, with the - corresponding instance of the - udpEndpointLocalAddressType object representing the - appropriate address type. - - As this object is used in the index for the - udpEndpointTable, implementors of this table should be - careful not to create entries that would result in OIDs - with more than 128 subidentifiers; else the information - cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3." - ::= { udpEndpointEntry 2 } - -udpEndpointLocalPort OBJECT-TYPE - SYNTAX InetPortNumber - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The local port number for this UDP endpoint." - ::= { udpEndpointEntry 3 } - -udpEndpointRemoteAddressType OBJECT-TYPE - SYNTAX InetAddressType - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The address type of udpEndpointRemoteAddress. Only - IPv4, IPv4z, IPv6, and IPv6z addresses are expected, or - unknown(0) if datagrams for all remote IP addresses are - accepted. Also, note that some combinations of - - - - udpEndpointLocalAdressType and - udpEndpointRemoteAddressType are not supported. In - particular, if the value of this object is not - unknown(0), it is expected to always refer to the - same IP version as udpEndpointLocalAddressType." - ::= { udpEndpointEntry 4 } - -udpEndpointRemoteAddress OBJECT-TYPE - SYNTAX InetAddress - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The remote IP address for this UDP endpoint. If - datagrams from any remote system are to be accepted, - this value is ''h (a zero-length octet-string). - Otherwise, it has the type described by - udpEndpointRemoteAddressType and is the address of the - remote system from which datagrams are to be accepted - (or to which all datagrams will be sent). - - As this object is used in the index for the - udpEndpointTable, implementors of this table should be - careful not to create entries that would result in OIDs - with more than 128 subidentifiers; else the information - cannot be accessed using SNMPv1, SNMPv2c, or SNMPv3." - ::= { udpEndpointEntry 5 } - -udpEndpointRemotePort OBJECT-TYPE - SYNTAX InetPortNumber - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The remote port number for this UDP endpoint. If - datagrams from any remote system are to be accepted, - this value is zero." - ::= { udpEndpointEntry 6 } - -udpEndpointInstance OBJECT-TYPE - SYNTAX Unsigned32 (1..'ffffffff'h) - MAX-ACCESS not-accessible - STATUS current - DESCRIPTION - "The instance of this tuple. This object is used to - distinguish among multiple processes 'connected' to - the same UDP endpoint. For example, on a system - implementing the BSD sockets interface, this would be - used to support the SO_REUSEADDR and SO_REUSEPORT - socket options." - - - - ::= { udpEndpointEntry 7 } - -udpEndpointProcess OBJECT-TYPE - SYNTAX Unsigned32 - MAX-ACCESS read-only - STATUS current - DESCRIPTION - "The system's process ID for the process associated with - this endpoint, or zero if there is no such process. - This value is expected to be the same as - HOST-RESOURCES-MIB::hrSWRunIndex or SYSAPPL-MIB:: - sysApplElmtRunIndex for some row in the appropriate - tables." - ::= { udpEndpointEntry 8 } - --- The deprecated UDP Listener table - --- The deprecated UDP listener table only contains information --- about this entity's IPv4 UDP end-points on which a local --- application is currently accepting datagrams. It does not --- provide more detailed connection information, or information --- about IPv6 endpoints. - -udpTable OBJECT-TYPE - SYNTAX SEQUENCE OF UdpEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "A table containing IPv4-specific UDP listener - information. It contains information about all local - IPv4 UDP end-points on which an application is - currently accepting datagrams. This table has been - deprecated in favor of the version neutral - udpEndpointTable." - ::= { udp 5 } - -udpEntry OBJECT-TYPE - SYNTAX UdpEntry - MAX-ACCESS not-accessible - STATUS deprecated - DESCRIPTION - "Information about a particular current UDP listener." - INDEX { udpLocalAddress, udpLocalPort } - ::= { udpTable 1 } - -UdpEntry ::= SEQUENCE { - udpLocalAddress IpAddress, - udpLocalPort Integer32 - - - -} - -udpLocalAddress OBJECT-TYPE - SYNTAX IpAddress - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The local IP address for this UDP listener. In the - case of a UDP listener that is willing to accept - datagrams for any IP interface associated with the - node, the value 0.0.0.0 is used." - ::= { udpEntry 1 } - -udpLocalPort OBJECT-TYPE - SYNTAX Integer32 (0..65535) - MAX-ACCESS read-only - STATUS deprecated - DESCRIPTION - "The local port number for this UDP listener." - ::= { udpEntry 2 } - --- conformance information - -udpMIBConformance OBJECT IDENTIFIER ::= { udpMIB 2 } -udpMIBCompliances OBJECT IDENTIFIER ::= { udpMIBConformance 1 } -udpMIBGroups OBJECT IDENTIFIER ::= { udpMIBConformance 2 } - --- compliance statements - -udpMIBCompliance2 MODULE-COMPLIANCE - STATUS current - DESCRIPTION - "The compliance statement for systems that implement - UDP. - - There are a number of INDEX objects that cannot be - represented in the form of OBJECT clauses in SMIv2, but - for which we have the following compliance - requirements, expressed in OBJECT clause form in this - description clause: - - -- OBJECT udpEndpointLocalAddressType - -- SYNTAX InetAddressType { unknown(0), ipv4(1), - -- ipv6(2), ipv4z(3), - -- ipv6z(4) } - -- DESCRIPTION - -- Support for dns(5) is not required. - -- OBJECT udpEndpointLocalAddress - - - - -- SYNTAX InetAddress (SIZE(0|4|8|16|20)) - -- DESCRIPTION - -- Support is only required for zero-length - -- octet-strings, and for scoped and unscoped - -- IPv4 and IPv6 addresses. - -- OBJECT udpEndpointRemoteAddressType - -- SYNTAX InetAddressType { unknown(0), ipv4(1), - -- ipv6(2), ipv4z(3), - -- ipv6z(4) } - -- DESCRIPTION - -- Support for dns(5) is not required. - -- OBJECT udpEndpointRemoteAddress - -- SYNTAX InetAddress (SIZE(0|4|8|16|20)) - -- DESCRIPTION - -- Support is only required for zero-length - -- octet-strings, and for scoped and unscoped - -- IPv4 and IPv6 addresses. - " - MODULE -- this module - MANDATORY-GROUPS { udpBaseGroup, udpEndpointGroup } - GROUP udpHCGroup - DESCRIPTION - "This group is mandatory for systems that - are capable of receiving or transmitting more than - 1 million UDP datagrams per second. 1 million - datagrams per second will cause a Counter32 to - wrap in just over an hour." - ::= { udpMIBCompliances 2 } - -udpMIBCompliance MODULE-COMPLIANCE - STATUS deprecated - DESCRIPTION - "The compliance statement for IPv4-only systems that - implement UDP. For IP version independence, this - compliance statement is deprecated in favor of - udpMIBCompliance2. However, agents are still - encouraged to implement these objects in order to - interoperate with the deployed base of managers." - MODULE -- this module - MANDATORY-GROUPS { udpGroup } - ::= { udpMIBCompliances 1 } - --- units of conformance - -udpGroup OBJECT-GROUP - OBJECTS { udpInDatagrams, udpNoPorts, - udpInErrors, udpOutDatagrams, - udpLocalAddress, udpLocalPort } - - - - STATUS deprecated - DESCRIPTION - "The deprecated group of objects providing for - management of UDP over IPv4." - ::= { udpMIBGroups 1 } - -udpBaseGroup OBJECT-GROUP - OBJECTS { udpInDatagrams, udpNoPorts, udpInErrors, - udpOutDatagrams } - STATUS current - DESCRIPTION - "The group of objects providing for counters of UDP - statistics." - ::= { udpMIBGroups 2 } - -udpHCGroup OBJECT-GROUP - OBJECTS { udpHCInDatagrams, udpHCOutDatagrams } - STATUS current - DESCRIPTION - "The group of objects providing for counters of high - speed UDP implementations." - ::= { udpMIBGroups 3 } - -udpEndpointGroup OBJECT-GROUP - OBJECTS { udpEndpointProcess } - STATUS current - DESCRIPTION - "The group of objects providing for the IP version - independent management of UDP 'endpoints'." - ::= { udpMIBGroups 4 } - -END diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs deleted file mode 100644 index 831f117..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/DisplayHint.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections; - -namespace Lextm.SharpSnmpLib.Mib -{ - public class DisplayHint - { - private enum NumType { - dec, - hex, - oct, - bin, - str - } - - private string _str; - private NumType _type; - private int _decimalPoints = 0; - - public DisplayHint(string str) - { - _str = str; - if (str.StartsWith("d")) - { - _type = NumType.dec; - if (str.StartsWith("d-")) - { - _decimalPoints = Convert.ToInt32(str.Substring(2)); - } - } - else if (str.StartsWith("o")) - { - _type = NumType.oct; - } - else if (str.StartsWith("h")) - { - _type = NumType.hex; - } - else if (str.StartsWith("b")) - { - _type = NumType.bin; - } - else - { - _type = NumType.str; - foreach (char c in str) - { - - } - } - - } - - public override string ToString() - { - return _str; - } - - internal object Decode(int i) - { - switch (_type) - { - case NumType.dec: - if (_decimalPoints == 0) - { - return i; - } - else - { - return i / Math.Pow(10.0, _decimalPoints); - } - case NumType.hex: - return System.Convert.ToString(i, 16); - case NumType.oct: - return System.Convert.ToString(i, 8); - case NumType.bin: - return System.Convert.ToString(i, 2); - default: - return null; - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs deleted file mode 100644 index 2f79cce..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/AgentCapabilities.cs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/31 - * Time: 13:18 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// The AGENT-CAPABILITIES construct is used to specify implementation characteristics of an SNMP agent sub-system with respect to object types and events. - /// - public sealed class AgentCapabilities : EntityBase - { - /// - /// Creates an instance. - /// - /// - /// - /// - public AgentCapabilities(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs deleted file mode 100644 index 6da9b18..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/EntityBase.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - public abstract class EntityBase: IEntity - { - private readonly IModule _module; - private string _parent; - private readonly uint _value; - private readonly string _name; - - public EntityBase(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - { - _module = module; - _name = preAssignSymbols[0].ToString(); - - Lexer.ParseOidValue(symbols, out _parent, out _value); - } - - public IModule Module - { - get { return _module; } - } - - public string Parent - { - get { return _parent; } - set { _parent = value; } - } - - public uint Value - { - get { return _value; } - } - - public string Name - { - get { return _name; } - } - - public virtual string Description - { - get { return string.Empty; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs deleted file mode 100644 index 7360a47..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/IEntity.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Entity interface. -// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/19 - * Time: 20:10 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Basic interface for all elements building up the MIB tree, thus having an OID as value. - /// - public interface IEntity : IDeclaration - { - /// - /// Parent name. - /// - string Parent - { - get; - set; - } - - /// - /// Value. - /// - uint Value - { - get; - } - - /// - /// Gets the description. - /// - /// The description. - string Description - { - get; - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs deleted file mode 100644 index 008c354..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleCompliance.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/21 - * Time: 19:35 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Description of ModuleComplianceNode. - /// - public sealed class ModuleCompliance : EntityBase - { - public ModuleCompliance(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs deleted file mode 100644 index 6de28ce..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ModuleIdentity.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - public sealed class ModuleIdentity : EntityBase - { - public ModuleIdentity(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs deleted file mode 100644 index 27d3e4c..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationGroup.cs +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/21 - * Time: 19:34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Description of NotificationGroupNode. - /// - public sealed class NotificationGroup : EntityBase - { - public NotificationGroup(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs deleted file mode 100644 index 7386e21..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/NotificationType.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - public sealed class NotificationType : EntityBase - { - public NotificationType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs deleted file mode 100644 index d846cdb..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectGroup.cs +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/21 - * Time: 19:27 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Description of ObjectGroupNode. - /// - public sealed class ObjectGroup : EntityBase - { - public ObjectGroup(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs deleted file mode 100644 index 9c1e084..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectIdentity.cs +++ /dev/null @@ -1,21 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Object identifier node. - /// - public sealed class ObjectIdentity : EntityBase - { - - /// - /// Creates a . - /// - /// Module name - /// Header - /// Lexer - public ObjectIdentity(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs deleted file mode 100644 index 3a8b567..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/ObjectType.cs +++ /dev/null @@ -1,336 +0,0 @@ -using System; -using System.Collections.Generic; -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - public sealed class ObjectType : EntityBase, ITypeReferrer - { - private ITypeAssignment _syntax; - private string _units; - private MaxAccess _access; - private Status _status; - private string _description; - private string _reference; - private IList _indices; - private string _augments; - private string _defVal; - - public ObjectType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - ParseProperties(preAssignSymbols); - } - - private void ParseProperties(SymbolList header) - { - ISymbolEnumerator headerSymbols = header.GetSymbolEnumerator(); - Symbol temp = headerSymbols.NextNonEOLSymbol(); - - // Skip name - temp = headerSymbols.NextNonEOLSymbol(); - temp.Expect(Symbol.ObjectType); - - _syntax = ParseSyntax (Module, headerSymbols); - _units = ParseUnits (headerSymbols); - _access = ParseAccess (headerSymbols); - _status = ParseStatus (headerSymbols); - _description = ParseDescription (headerSymbols); - _reference = ParseReference (headerSymbols); - _indices = ParseIndices (headerSymbols); - _augments = ParseAugments (headerSymbols); - _defVal = ParseDefVal (headerSymbols); - } - - private static string ParseAugments(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Augments) - { - string augment = null; - - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenBracket); - - current = symbols.NextNonEOLSymbol(); - augment = current.ToString(); - - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseBracket); - - return augment; - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static string ParseDefVal(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.DefVal) - { - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenBracket); - - string defVal = null; - current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.OpenBracket) - { - int depth = 1; - // TODO: decode this. - while (depth > 0) - { - current = symbols.NextNonEOLSymbol(); - if (current == Symbol.OpenBracket) - { - depth++; - } - else if (current == Symbol.CloseBracket) - { - depth--; - } - } - } - else - { - defVal = current.ToString(); - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseBracket); - } - - return defVal; - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static IList ParseIndices(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Index) - { - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenBracket); - - List indices = new List(); - - while (current != Symbol.CloseBracket) - { - current = symbols.NextNonEOLSymbol(); - - bool lastIndex = false; - if (current == Symbol.Implied) - { - current = symbols.NextNonEOLSymbol(); - lastIndex = true; // 'IMPLIED' may only be used for last index - } - - current.Assert((current != Symbol.Comma) && (current != Symbol.CloseBracket), "Expected index name but found symbol!"); - indices.Add(current.ToString()); - - current = symbols.NextNonEOLSymbol(); - if (lastIndex) - { - current.Expect(Symbol.CloseBracket); - } - else - { - current.Expect(Symbol.Comma, Symbol.CloseBracket); - } - } - - return indices; - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static string ParseReference(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Reference) - { - return symbols.NextNonEOLSymbol().ToString(); - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static string ParseDescription(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Description) - { - return symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' }); - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static Status ParseStatus(ISymbolEnumerator symbols) - { - Status status = Status.obsolete; - - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.Status); - - current = symbols.NextNonEOLSymbol(); - try - { - status = (Status)Enum.Parse(typeof(Status), current.ToString()); - } - catch (ArgumentException) - { - current.Assert(false, "Invalid/Unknown status"); - } - - return status; - } - - private static MaxAccess ParseAccess(ISymbolEnumerator symbols) - { - MaxAccess access = MaxAccess.notAccessible; - - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.MaxAccess, Symbol.Access); - - current = symbols.NextNonEOLSymbol(); - switch (current.ToString()) - { - case "not-accessible": - access = MaxAccess.notAccessible; - break; - case "accessible-for-notify": - access = MaxAccess.accessibleForNotify; - break; - case "read-only": - access = MaxAccess.readOnly; - break; - case "read-write": - access = MaxAccess.readWrite; - break; - case "read-create": - access = MaxAccess.readCreate; - break; - case "write-only": - access = MaxAccess.readWrite; - break; - default: - current.Assert(false, "Invalid/Unknown access"); - break; - } - - return access; - } - - private static string ParseUnits(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Units) - { - return symbols.NextNonEOLSymbol().ToString(); - } - else if (current != null) - { - symbols.PutBack(current); - } - - return null; - } - - private static ITypeAssignment ParseSyntax(IModule module, ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.Syntax); - - return Lexer.ParseBasicTypeDef(module, String.Empty, symbols, isMacroSyntax: true); - } - - private static bool IsProperty(Symbol sym) - { - string s = sym.ToString(); - return s == "SYNTAX" || s == "MAX-ACCESS" || s == "STATUS" || s == "DESCRIPTION"; - } - - public ITypeAssignment Syntax - { - get { return _syntax; } - internal set { _syntax = value; } - } - - public override string Description - { - get { return _description; } - } - - public MaxAccess Access - { - get { return _access; } - } - - public IList Indices - { - get { return _indices; } - } - - public string Augments - { - get { return _augments; } - } - - #region ITypeReferrer Member - - public ITypeAssignment ReferredType - { - get { return _syntax; } - set { _syntax = value; } - } - - public ITypeAssignment BaseType - { - get - { - ITypeReferrer tr = this; - ITypeAssignment result = null; - - while ((tr != null) && (tr.ReferredType != null)) - { - result = tr.ReferredType; - tr = tr.ReferredType as ITypeReferrer; - } - - return result; - } - } - - #endregion - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs deleted file mode 100644 index 3c65940..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Entities/OidValueAssignment.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 20:49 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Entities -{ - /// - /// Object identifier node. - /// - public sealed class OidValueAssignment : EntityBase - { - /// - /// Creates a . - /// - /// Module - /// Name - /// Lexer - public OidValueAssignment(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - : base(module, preAssignSymbols, symbols) - { - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs deleted file mode 100644 index c1e66e3..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Exports.cs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/6/7 - * Time: 17:34 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - /// - /// Description of Exports. - /// - public sealed class Exports: IElement - { - private IModule _module; - private readonly IList _types = new List(); - - public Exports(IModule module, ISymbolEnumerator s) - { - _module = module; - - Symbol previous = null; - Symbol current; - do - { - current = s.NextSymbol(); - - if (current == Symbol.EOL) - { - continue; - } - else if (((current == Symbol.Comma) || (current == Symbol.Semicolon)) && (previous != null)) - { - previous.AssertIsValidIdentifier(); - _types.Add(previous.ToString()); - } - - previous = current; - } - while (current != Symbol.Semicolon); - } - - #region IElement Member - - public IModule Module - { - get { return _module; } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs deleted file mode 100644 index 0958ac6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IDeclaration.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - public interface IDeclaration: IElement - { - /// - /// Name. - /// - string Name - { - get; - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs deleted file mode 100644 index e2db7fd..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/IElement.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Construct interface. -// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - /// - /// Construct interface. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1040:AvoidEmptyInterfaces")] - public interface IElement - { - /// - /// Containing module. - /// - IModule Module - { - get; - } - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs deleted file mode 100644 index f0f5705..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ITypeReferrer.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - public interface ITypeReferrer - { - ITypeAssignment ReferredType { get; set; } - ITypeAssignment BaseType { get; } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs deleted file mode 100644 index 3a4ec6e..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Imports.cs +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/31 - * Time: 12:07 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - /// - /// The IMPORTS construct is used to specify items used in the current MIB module which are defined in another MIB module or ASN.1 module. - /// - public sealed class Imports : List, IElement - { - private IModule _module; - - /// - /// Creates an instance. - /// - /// - public Imports(IModule module, ISymbolEnumerator symbols) - { - _module = module; - - Symbol current; - while ((current = symbols.NextSymbol()) != Symbol.Semicolon) - { - if (current == Symbol.EOL) - { - continue; - } - - ImportsFrom imports = new ImportsFrom(current, symbols); - - this.Add(imports); - } - } - - public IList Dependents - { - get - { - List result = new List(); - - foreach (ImportsFrom import in this) - { - result.Add(import.Module); - } - - return result; - } - } - - public ImportsFrom GetImportFromType(string type) - { - foreach (ImportsFrom import in this) - { - if (import.Types.Contains(type)) - { - return import; - } - } - - return null; - } - - #region IElement Member - - public IModule Module - { - get { return _module; } - } - - #endregion - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs deleted file mode 100644 index cd5154b..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/ImportsFrom.cs +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/31 - * Time: 12:07 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - public sealed class ImportsFrom - { - private readonly string _module; - private readonly List _types = new List(); - - public ImportsFrom(Symbol last, ISymbolEnumerator symbols) - { - Symbol previous = last; - Symbol current; - while ((current = symbols.NextSymbol()) != Symbol.From) - { - if (current == Symbol.EOL) - { - continue; - } - - if (current == Symbol.Comma) - { - previous.AssertIsValidIdentifier(); - _types.Add(previous.ToString()); - } - - previous = current; - } - - previous.AssertIsValidIdentifier(); - _types.Add(previous.ToString()); - - _module = symbols.NextSymbol().ToString().ToUpperInvariant(); // module names are uppercase - } - - public string Module - { - get { return _module; } - } - - public IList Types - { - get { return _types; } - } - - public override string ToString() - { - return string.Join(", ", _types.ToArray()) + " FROM " + _module; - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs deleted file mode 100644 index 9c5ca45..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/TrapType.cs +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/31 - * Time: 12:20 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements -{ - public sealed class TrapType : IDeclaration - { - private readonly IModule _module; - private readonly string _name; - private readonly int _value; - - public TrapType(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - { - _module = module; - _name = preAssignSymbols[0].ToString(); - - Symbol valueSymbol = symbols.NextNonEOLSymbol(); - - bool succeeded = int.TryParse(valueSymbol.ToString(), out _value); - valueSymbol.Assert(succeeded, "not a decimal"); - } - - public int Value - { - get { return _value; } - } - - #region IDeclaration Member - - public IModule Module - { - get { return _module; } - } - - public string Name - { - get { return _name; } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs deleted file mode 100644 index a441281..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BaseType.cs +++ /dev/null @@ -1,54 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public abstract class BaseType : ITypeAssignment - { - private IModule _module; - private string _name; - - protected BaseType(IModule module, string name) - { - _module = module; - _name = name; - } - - public virtual IModule Module - { - // differentiate between: - // FddiTimeNano ::= INTEGER (0..2147483647) - // which is an IntegerType which appears under Types in a MibModule and therefore has a name and module - // and - // SYNTAX INTEGER (0..2147483647) - // which is also an IntegerType but not defined as a separate type and therefore has NO name and NO module - get - { - if (!string.IsNullOrEmpty(_name)) - { - return _module; - } - else - { - return null; - } - } - protected set { _module = value; } - } - - public virtual string Name - { - get - { - if (!string.IsNullOrEmpty(_name)) - { - return _name; - } - else - { - return "{ Implicit Base Type }"; - } - } - protected set { _name = value; } - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs deleted file mode 100644 index a64c8db..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/BitsType.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public class BitsType : BaseType - { - private ValueMap _map; - - public BitsType(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name) - { - _map = Lexer.DecodeEnumerations(symbols); - } - - public ValueMap Map - { - get { return _map; } - } - - public string this[int value] - { - get { return _map[value]; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs deleted file mode 100644 index c66d1f3..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Choice.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/31 - * Time: 11:39 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /// - /// The CHOICE type represents a list of alternatives.. - /// - public sealed class Choice : BaseType - { - /// - /// Creates a instance. - /// - /// - /// - /// - public Choice(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name) - { - while (symbols.NextNonEOLSymbol() != Symbol.OpenBracket) - { - } - - while (symbols.NextNonEOLSymbol() != Symbol.CloseBracket) - { - } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs deleted file mode 100644 index e962f9d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ITypeAssignment.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public interface ITypeAssignment : IDeclaration - { - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs deleted file mode 100644 index 4841ad5..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IntegerType.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/7/25 - * Time: 20:41 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /// - /// The INTEGER type represents a list of alternatives, or a range of numbers.. - /// Includes Integer32 as it's indistinguishable from INTEGER. - /// - /** - * As this type is used for Integer32 as well as INTEGER it incorrectly - * allows enumeration sub-typing of Integer32. This is ok as currently we - * do not care about detecting incorrect MIBs and this doesn't block the - * decoding of correct MIBs. - */ - public sealed class IntegerType : BaseType - { - public enum Types - { - Integer, - Integer32 - } - - private Types _type; - private bool _isEnumeration; - private ValueMap _map; - private ValueRanges _ranges; - - /// - /// Creates an instance. - /// - /// - /// - /// - public IntegerType(IModule module, string name, Symbol type, ISymbolEnumerator symbols) - : base (module, name) - { - Types? t = GetExactType(type); - type.Assert(t.HasValue, "Unknown symbol for unsigned type!"); - _type = t.Value; - - _isEnumeration = false; - - Symbol current = symbols.NextNonEOLSymbol(); - if (current == Symbol.OpenBracket) - { - _isEnumeration = true; - symbols.PutBack(current); - _map = Lexer.DecodeEnumerations(symbols); - } - else if (current == Symbol.OpenParentheses) - { - symbols.PutBack(current); - _ranges = Lexer.DecodeRanges(symbols); - current.Assert(!_ranges.IsSizeDeclaration, "SIZE keyword is not allowed for ranges of integer types!"); - } - else - { - symbols.PutBack(current); - } - } - - public Types Type - { - get { return _type; } - } - - public ValueRanges Ranges - { - get { return _ranges; } - } - - public bool IsEnumeration - { - get - { - return _isEnumeration; - } - } - - public ValueMap Enumeration - { - get { return _isEnumeration ? _map : null; } - } - - internal static Types? GetExactType(Symbol symbol) - { - if (symbol == Symbol.Integer) - { - // represents the ASN.1 builtin INTEGER type: - // may be represent any arbitrary (signed/unsigned) integer (in theory may have any size) - return Types.Integer; - } - else if (symbol == Symbol.Integer32) - { - // Integer32 ::= INTEGER (-2147483648..2147483647) // from SNMPv2-SMI - return Types.Integer32; - } - - return null; - } - - internal static bool IsIntegerType(Symbol symbol) - { - return GetExactType(symbol).HasValue; - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs deleted file mode 100644 index 84d78d6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/IpAddressType.cs +++ /dev/null @@ -1,21 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public class IpAddressType : OctetStringType - { - public IpAddressType(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name, symbols) - { - if (this.Size.Count != 0) - { - throw new MibException("Size definition not allowed for IpAddress type!"); - } - - // IpAddress type is defined as: - // IpAddress ::= - // [APPLICATION 0] - // IMPLICIT OCTET STRING (SIZE (4)) - this.Size.Add(new ValueRange(4, null)); - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs deleted file mode 100644 index 9f911ac..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Macro.cs +++ /dev/null @@ -1,34 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public sealed class Macro : ITypeAssignment - { - private IModule _module; - private string _name; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "temp")] - public Macro(IModule module, SymbolList preAssignSymbols, ISymbolEnumerator symbols) - { - _module = module; - _name = preAssignSymbols[0].ToString(); - - while (symbols.NextNonEOLSymbol() != Symbol.Begin) - { - } - - while (symbols.NextNonEOLSymbol() != Symbol.End) - { - } - } - - public IModule Module - { - get { return _module; } - } - - public string Name - { - get { return _name; } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs deleted file mode 100644 index cacd415..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/ObjectIdentifierType.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public class ObjectIdentifierType : BaseType - { - public ObjectIdentifierType(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name) - { - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs deleted file mode 100644 index f6453ce..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OctetStringType.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public class OctetStringType : BaseType - { - private ValueRanges _size; - - public OctetStringType(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name) - { - Symbol current = symbols.NextNonEOLSymbol(); - if (current == Symbol.OpenParentheses) - { - symbols.PutBack(current); - _size = Lexer.DecodeRanges(symbols); - current.Assert(_size.IsSizeDeclaration, "SIZE keyword is required for ranges of octet string!"); - } - else - { - symbols.PutBack(current); - _size = new ValueRanges(isSizeDecl: true); - } - } - - public ValueRanges Size - { - get { return _size; } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs deleted file mode 100644 index 5a7eda3..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/OpaqueType.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public class OpaqueType : OctetStringType - { - public OpaqueType(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name, symbols) - { - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs deleted file mode 100644 index 0162de3..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/Sequence.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/21 - * Time: 19:43 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /// - /// The SEQUENCE type represents a set of specified types. This is roughtly analogous to a struct in C. - /// - public sealed class Sequence : BaseType - { - /// - /// Creates a instance. - /// - /// The module. - /// The name. - /// The enumerator. - public Sequence(IModule module, string name, ISymbolEnumerator symbols) - : base(module, name) - { - // parse between ( ) - Symbol temp = symbols.NextNonEOLSymbol(); - int bracketSection = 0; - temp.Expect(Symbol.OpenBracket); - bracketSection++; - while (bracketSection > 0) - { - temp = symbols.NextNonEOLSymbol(); - if (temp == Symbol.OpenBracket) - { - bracketSection++; - } - else if (temp == Symbol.CloseBracket) - { - bracketSection--; - } - } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs deleted file mode 100644 index 4160ca4..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/SequenceOf.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /// - /// The SEQUENCE OF type represents a list of data sets.. - /// - public sealed class SequenceOf : BaseType - { - private string _type; - - public SequenceOf(IModule module, string name, ISymbolEnumerator sym) - : base(module, name) - { - _type = sym.NextNonEOLSymbol().ToString(); - } - - public string Type - { - get { return _type; } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs deleted file mode 100644 index ab47731..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TextualConvention.cs +++ /dev/null @@ -1,238 +0,0 @@ -using System; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - public sealed class TextualConvention : ITypeAssignment, ITypeReferrer - { - private IModule _module; - private string _name; - private DisplayHint _displayHint; - private Status _status; - private string _description; - private string _reference; - private ITypeAssignment _syntax; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "module")] - public TextualConvention(IModule module, string name, ISymbolEnumerator symbols) - { - _module = module; - _name = name; - - _displayHint = ParseDisplayHint(symbols); - _status = ParseStatus(symbols); - _description = ParseDescription(symbols); - _reference = ParseReference(symbols); - _syntax = ParseSyntax(module, symbols); - } - - private static DisplayHint ParseDisplayHint(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.DisplayHint) - { - return new DisplayHint(symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' })); - } - - symbols.PutBack(current); - return null; - } - - private static Status ParseStatus(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.Status); - - try - { - return (Status)Enum.Parse(typeof(Status), symbols.NextNonEOLSymbol().ToString()); - } - catch (ArgumentException) - { - current.Assert(false, "Invalid/Unknown status"); - } - - return Status.current; - } - - private static string ParseDescription(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.Description); - - return symbols.NextNonEOLSymbol().ToString().Trim(new char[] { '"' }); - } - - private static string ParseReference(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Reference) - { - string reference = symbols.NextNonEOLSymbol().ToString(); - if ((reference.Length >= 2) && reference.StartsWith("\"") && reference.EndsWith("\"")) - { - return reference.Substring(1, reference.Length-2); - } - - return reference; - } - - symbols.PutBack(current); - return null; - } - - private static ITypeAssignment ParseSyntax(IModule module, ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.Syntax); - - /* - * RFC2579 definition: - * Syntax ::= -- Must be one of the following: - * -- a base type (or its refinement), or - * -- a BITS pseudo-type - * type - * | "BITS" "{" NamedBits "}" - * - * From section 3.5: - * The data structure must be one of the alternatives defined - * in the ObjectSyntax CHOICE or the BITS construct. Note - * that this means that the SYNTAX clause of a Textual - * Convention can not refer to a previously defined Textual - * Convention. - * - * The SYNTAX clause of a TEXTUAL CONVENTION macro may be - * sub-typed in the same way as the SYNTAX clause of an - * OBJECT-TYPE macro. - * - * Therefore the possible values are (grouped by underlying type): - * INTEGER, Integer32 - * OCTET STRING, Opaque - * OBJECT IDENTIFIER - * IpAddress - * Counter64 - * Unsigned32, Counter32, Gauge32, TimeTicks - * BITS - * With appropriate sub-typing. - */ - - return Lexer.ParseBasicTypeDef(module, String.Empty, symbols, isMacroSyntax: true); - } - - public IModule Module - { - get { return _module; } - } - - public string Name - { - get { return _name; } - } - - public string DisplayHint - { - get { return _displayHint == null ? null : _displayHint.ToString(); } - } - - public Status Status - { - get { return _status; } - } - - public string Description - { - get { return _description; } - } - - public string Reference - { - get { return _reference; } - } - - public ITypeAssignment Syntax - { - get { return _syntax; } - } - - //internal object Decode(Variable v) - //{ - // if (_syntax is IntegerType) - // { - // Integer32 i = v.Data as Integer32; - // if (i == null || (_syntax as IntegerType).IsEnumeration) - // { - // return null; - // } - // else if (_displayHint != null) - // { - // return _displayHint.Decode(i.ToInt32()); - // } - // else - // { - // return i.ToInt32(); - // } - // } - // else if (_syntax is UnsignedType) - // { - // Integer32 i = v.Data as Integer32; - // if (i == null) - // { - // return null; - // } - // else if (_displayHint != null) - // { - // return _displayHint.Decode(i.ToInt32()); - // } - // else - // { - // return i.ToInt32(); - // } - // } - // else if (_syntax is OctetStringType) - // { - // OctetString o = v.Data as OctetString; - // if (o == null) - // { - // return null; - // } - // else - // { - // // TODO: Follow the format specifier for octet strings. - // return null; - // } - // } - // else - // { - // return null; - // } - //} - - #region ITypeReferrer Member - - public ITypeAssignment ReferredType - { - get { return _syntax; } - set { _syntax = value; } - } - - public ITypeAssignment BaseType - { - get - { - ITypeReferrer tr = this; - ITypeAssignment result = this; - - while ((tr != null) && (tr.ReferredType != null)) - { - result = tr.ReferredType; - tr = tr.ReferredType as ITypeReferrer; - } - - return result; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs deleted file mode 100644 index b074ef6..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/TypeAssignment.cs +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/18 - * Time: 13:24 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -using System; -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /* Please be aware of the following possible constructs: - * - * isnsRegEntityIndex OBJECT-TYPE - * SYNTAX IsnsEntityIndexIdOrZero - * ( 1 .. 4294967295 ) - * MAX-ACCESS not-accessible - * - * - */ - - /// - /// - public sealed class TypeAssignment : ITypeAssignment - { - private IModule _module; - private string _name; - private string _type; - private ValueRanges _ranges; - private ValueMap _map; - - /// - /// Creates an . - /// - /// The module. - /// The name. - /// The type. - /// The symbols. - /// if set to true indicates that the syntax clause of a macro is parsed (e.g. OBJECT-TYPE, TEXTUAL-CONVENTION). - public TypeAssignment(IModule module, string name, Symbol type, ISymbolEnumerator symbols, bool isMacroSyntax) - { - _module = module; - _name = name; - - SymbolList typeSymbols = new SymbolList(); - typeSymbols.Add(type); - - Symbol current = symbols.NextSymbol(); - while (current != Symbol.EOL) - { - if (current == Symbol.OpenParentheses) - { - // parse range of unknown type - symbols.PutBack(current); - _ranges = Lexer.DecodeRanges(symbols); - break; - } - else if (current == Symbol.OpenBracket) - { - symbols.PutBack(current); - _map = Lexer.DecodeEnumerations(symbols); - break; - } - - typeSymbols.Add(current); - current = symbols.NextSymbol(); - } - - _type = typeSymbols.Join(" "); - - if ((_ranges == null) && (_map == null)) - { - current = symbols.NextNonEOLSymbol(); - if (current == Symbol.OpenParentheses) - { - // parse range of unknown type - symbols.PutBack(current); - _ranges = Lexer.DecodeRanges(symbols); - } - else if (current == Symbol.OpenBracket) - { - symbols.PutBack(current); - _map = Lexer.DecodeEnumerations(symbols); - } - else if (current != null) - { - symbols.PutBack(current); - } - } - - if (isMacroSyntax) - { - // inside a macro the syntax is limited to one line, except there are brackets used for ranges/enums - return; - } - - // outside macro Syntax clause we wait for two consecutive linebreaks with a following valid identifier as end condition - Symbol previous = current; - Symbol veryPrevious = null; - - while ((current = symbols.NextSymbol()) != null) - { - if ((veryPrevious == Symbol.EOL) && (previous == Symbol.EOL) && current.IsValidIdentifier()) - { - symbols.PutBack(current); - return; - } - - veryPrevious = previous; - previous = current; - } - - previous.Assert(false, "end of file reached"); - } - - public string Type - { - get { return _type; } - } - - public ValueRanges Ranges - { - get { return _ranges; } - } - - public IDictionary Map - { - get { return _map; } - } - - #region ITypeAssignment Member - - public IModule Module - { - get { return _module; } - } - - public string Name - { - get { return _name; } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs deleted file mode 100644 index 4866fc9..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Elements/Types/UnsignedType.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib.Elements.Types -{ - /** - * As this type is used for Counter32 and TimeTicks as well as Unsigned32 - * and Gauge32 it incorrectly allows range restrictions of Counter32 and - * TimeTicks. This is ok as currently we do not care about detecting - * incorrect MIBs and this doesn't block the decoding of correct MIBs. - */ - public class UnsignedType : BaseType - { - public enum Types - { - Unsigned32, - Gauge32, - Counter32, - TimeTicks, - Counter64, - } - - private Types _type; - private ValueRanges _ranges; - - public UnsignedType(IModule module, string name, Symbol type, ISymbolEnumerator symbols) - : base(module, name) - { - Types? t = GetExactType(type); - type.Assert(t.HasValue, "Unknown symbol for unsigned type!"); - _type = t.Value; - - Symbol current = symbols.NextNonEOLSymbol(); - if (current == Symbol.OpenParentheses) - { - current.Assert((_type != Types.Counter64), "Ranges are not supported for Counter64 type!"); // our internal struct can only hold int64 values - - symbols.PutBack(current); - _ranges = Lexer.DecodeRanges(symbols); - current.Assert(!_ranges.IsSizeDeclaration, "SIZE keyword is not allowed for ranges of unsigned types!"); - } - else - { - symbols.PutBack(current); - } - } - - public Types Type - { - get { return _type; } - } - - public ValueRanges Ranges - { - get { return _ranges; } - } - - internal static Types? GetExactType(Symbol symbol) - { - if (symbol == Symbol.Unsigned32) - { - // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI - return Types.Unsigned32; - } - else if (symbol == Symbol.Gauge32) - { - // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI - return Types.Gauge32; - } - else if (symbol == Symbol.Counter32) - { - // [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI - return Types.Counter32; - } - else if (symbol == Symbol.TimeTicks) - { - // [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) // from SNMPv2-SMI + RFC1155-SMI - return Types.TimeTicks; - } - else if (symbol == Symbol.Gauge) - { - // [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) // from RFC1155-SMI - return Types.Gauge32; - } - else if (symbol == Symbol.Counter) - { - // [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) // from RFC1155-SMI - return Types.Counter32; - } - else if (symbol == Symbol.Counter64) - { - // [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) // from SNMPv2-SMI - return Types.Counter64; - } - - return null; - } - - internal static bool IsUnsignedType(Symbol symbol) - { - return GetExactType(symbol).HasValue; - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs deleted file mode 100644 index d41ab12..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/IModule.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Module interface. -// Copyright (C) 2008-2010 Malcolm Crowe, Lex Li, and other contributors. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -/* - * Created by SharpDevelop. - * User: lextm - * Date: 5/1/2009 - * Time: 10:40 AM - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ -using System.Collections.Generic; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using Lextm.SharpSnmpLib.Mib.Elements.Types; -using Lextm.SharpSnmpLib.Mib.Elements; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// MIB Module interface. - /// - public interface IModule - { - /// - /// Module name. - /// - string Name - { - get; - } - - Exports Exports - { - get; - } - - Imports Imports - { - get; - } - - /// - /// Entities + Types + all other elements implementing IDeclaration - /// - IList Declarations - { - get; - } - - /// - /// Entities. - /// - IList Entities - { - get; - } - - /// - /// Known types. - /// - IList Types - { - get; - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs deleted file mode 100644 index e9dd592..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ISymbolEnumerator.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib -{ - public interface ISymbolEnumerator: IEnumerator - { - bool PutBack(Symbol item); - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs deleted file mode 100644 index d54b9b9..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Lexer.cs +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 16:50 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// Lexer class that parses MIB files into symbol list. - /// - public sealed class Lexer - { - private readonly SymbolList _symbols = new SymbolList(); - - public Lexer(string file) - : this(file, new StreamReader(file)) - { - } - - public Lexer(string file, TextReader stream) - { - this.Parse(file, stream); - } - - - public ISymbolEnumerator GetEnumerator() - { - return _symbols.GetSymbolEnumerator(); - } - - - #region Parsing of MIB File - - private class ParseParams - { - public string File; - public StringBuilder Temp = new StringBuilder(); - public bool StringSection = false; - public bool AssignSection = false; - public bool AssignAhead = false; - public bool DotSection = false; - - } - - /// - /// Parses MIB file to symbol list. - /// - /// File - /// File stream - private void Parse(string file, TextReader stream) - { - if (stream == null) - { - throw new ArgumentNullException("stream"); - } - - ParseParams pp = new ParseParams(); - pp.File = file; - - string line; - int row = 0; - while ((line = stream.ReadLine()) != null) - { - if (!pp.StringSection && line.TrimStart().StartsWith("--", StringComparison.Ordinal)) - { - row++; - continue; // commented line - } - - ParseLine(pp, line, row); - row++; - } - } - - private void ParseLine(ParseParams pp, string line, int row) - { - line = line + "\n"; - int count = line.Length; - for (int i = 0; i < count; i++) - { - char current = line[i]; - bool moveNext = Parse(pp, current, row, i); - if (moveNext) - { - break; - } - } - } - - private bool Parse(ParseParams pp, char current, int row, int column) - { - switch (current) - { - case '\n': - case '{': - case '}': - case '(': - case ')': - case '[': - case ']': - case ';': - case ',': - case '|': - if (!pp.StringSection) - { - bool moveNext = ParseLastSymbol(pp, row, column); - if (moveNext) - { - _symbols.Add(CreateSpecialSymbol(pp.File, '\n', row, column)); - return true; - } - - _symbols.Add(CreateSpecialSymbol(pp.File, current, row, column)); - return false; - } - - break; - case '"': - pp.StringSection = !pp.StringSection; - break; - case '\r': - return false; - default: - if ((int)current == 0x1A) - { - // IMPORTANT: ignore invisible characters such as SUB. - return false; - } - - if (Char.IsWhiteSpace(current) && !pp.AssignSection && !pp.StringSection) - { - bool moveNext = ParseLastSymbol(pp, row, column); - if (moveNext) - { - _symbols.Add(CreateSpecialSymbol(pp.File, '\n', row, column)); - return true; - } - - return false; - } - - if (pp.AssignAhead) - { - pp.AssignAhead = false; - ParseLastSymbol(pp, row, column); - break; - } - - if (pp.DotSection && current != '.') - { - ParseLastSymbol(pp, row, column); - pp.DotSection = false; - } - - if (current == '.' && !pp.StringSection) - { - if (!pp.DotSection) - { - ParseLastSymbol(pp, row, column); - pp.DotSection = true; - } - } - - if (current == ':' && !pp.StringSection) - { - if (!pp.AssignSection) - { - ParseLastSymbol(pp, row, column); - } - - pp.AssignSection = true; - } - - if (current == '=' && !pp.StringSection) - { - pp.AssignSection = false; - pp.AssignAhead = true; - } - - break; - } - - pp.Temp.Append(current); - return false; - } - - private bool ParseLastSymbol(ParseParams pp, int row, int column) - { - if (pp.Temp.Length > 0) - { - Symbol s = new Symbol(pp.File, pp.Temp.ToString(), row, column); - - pp.Temp.Length = 0; - - if (s.ToString().StartsWith(Symbol.Comment.ToString())) - { - // ignore the rest symbols on this line because they are in comment. - return true; - } - - _symbols.Add(s); - } - - return false; - } - - private static Symbol CreateSpecialSymbol(string file, char value, int row, int column) - { - string str; - switch (value) - { - case '\n': - str = Environment.NewLine; - break; - case '{': - str = "{"; - break; - case '}': - str = "}"; - break; - case '(': - str = "("; - break; - case ')': - str = ")"; - break; - case '[': - str = "["; - break; - case ']': - str = "]"; - break; - case ';': - str = ";"; - break; - case ',': - str = ","; - break; - case '|': - str = "|"; - break; - default: - throw new ArgumentException("value is not a special character"); - } - - return new Symbol(file, str, row, column); - } - - #endregion - - #region Static Parse Helper - - public static ITypeAssignment ParseBasicTypeDef(IModule module, string name, ISymbolEnumerator symbols, bool isMacroSyntax = false) - { - Symbol current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.Bits) - { - return new BitsType(module, name, symbols); - } - if (IntegerType.IsIntegerType(current)) - { - return new IntegerType(module, name, current, symbols); - } - if (UnsignedType.IsUnsignedType(current)) - { - return new UnsignedType(module, name, current, symbols); - } - if (current == Symbol.Opaque) - { - return new OpaqueType(module, name, symbols); - } - if (current == Symbol.IpAddress) - { - return new IpAddressType(module, name, symbols); - } - if (current == Symbol.TextualConvention) - { - return new TextualConvention(module, name, symbols); - } - if (current == Symbol.Octet) - { - Symbol next = symbols.NextNonEOLSymbol(); - - if (next == Symbol.String) - { - return new OctetStringType(module, name, symbols); - } - - symbols.PutBack(next); - } - if (current == Symbol.Object) - { - Symbol next = symbols.NextNonEOLSymbol(); - - if (next == Symbol.Identifier) - { - return new ObjectIdentifierType(module, name, symbols); - } - - symbols.PutBack(next); - } - if (current == Symbol.Sequence) - { - Symbol next = symbols.NextNonEOLSymbol(); - - if (next == Symbol.Of) - { - return new SequenceOf(module, name, symbols); - } - else - { - symbols.PutBack(next); - return new Sequence(module, name, symbols); - } - } - if (current == Symbol.Choice) - { - return new Choice(module, name, symbols); - } - - - return new TypeAssignment(module, name, current, symbols, isMacroSyntax); - } - - public static void ParseOidValue(ISymbolEnumerator symbols, out string parent, out uint value) - { - parent = null; - value = 0; - - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenBracket); - - Symbol previous = null; - StringBuilder longParent = new StringBuilder(); - - current = symbols.NextNonEOLSymbol(); - longParent.Append(current); - - while ((current = symbols.NextNonEOLSymbol()) != null) - { - bool succeeded; - - if (current == Symbol.OpenParentheses) - { - longParent.Append(current); - - current = symbols.NextNonEOLSymbol(); - succeeded = UInt32.TryParse(current.ToString(), out value); - current.Assert(succeeded, "not a decimal"); - longParent.Append(current); - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseParentheses); - longParent.Append(current); - continue; - } - - if (current == Symbol.CloseBracket) - { - parent = longParent.ToString(); - return; - } - - succeeded = UInt32.TryParse(current.ToString(), out value); - if (succeeded) - { - // numerical way - while ((current = symbols.NextNonEOLSymbol()) != Symbol.CloseBracket) - { - longParent.Append(".").Append(value); - succeeded = UInt32.TryParse(current.ToString(), out value); - current.Assert(succeeded, "not a decimal"); - } - - current.Expect(Symbol.CloseBracket); - parent = longParent.ToString(); - return; - } - - longParent.Append("."); - longParent.Append(current); - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenParentheses); - longParent.Append(current); - current = symbols.NextNonEOLSymbol(); - succeeded = UInt32.TryParse(current.ToString(), out value); - current.Assert(succeeded, "not a decimal"); - longParent.Append(current); - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseParentheses); - longParent.Append(current); - previous = current; - } - - throw MibException.Create("end of file reached", previous); - } - - - public static ValueRanges DecodeRanges(ISymbolEnumerator symbols) - { - ValueRanges result = new ValueRanges(); - - Symbol startSymbol = symbols.NextNonEOLSymbol(); - Symbol current = startSymbol; - current.Expect(Symbol.OpenParentheses); - - while (current != Symbol.CloseParentheses) - { - Symbol value1Symbol = symbols.NextNonEOLSymbol(); - - if ((value1Symbol == Symbol.Size) && !result.IsSizeDeclaration) - { - result.IsSizeDeclaration = true; - symbols.NextNonEOLSymbol().Expect(Symbol.OpenParentheses); - continue; - } - - // check for valid number - Int64? value1 = DecodeNumber(value1Symbol); - if (!value1.HasValue) - { - value1Symbol.Assert(false, "Invalid range declaration!"); - } - - // process next symbol - ValueRange range; - current = symbols.NextNonEOLSymbol(); - - if (current == Symbol.DoubleDot) - { - // its a continous range - Symbol value2Symbol = symbols.NextNonEOLSymbol(); - Int64? value2 = DecodeNumber(value2Symbol); - value2Symbol.Assert(value2.HasValue && (value2.Value >= value1.Value), "Invalid range declaration!"); - - if (value2.Value == value1.Value) - { - range = new ValueRange(value1.Value, null); - } - else - { - range = new ValueRange(value1.Value, value2.Value); - } - - current = symbols.NextNonEOLSymbol(); - } - else - { - // its a single number - range = new ValueRange(value1.Value, null); - } - - // validate range - if (result.IsSizeDeclaration) - { - value1Symbol.Assert(range.Start >= 0, "Invalid range declaration! Size must be greater than 0"); - } - - result.Add(range); - - // check next symbol - current.Expect(Symbol.Pipe, Symbol.CloseParentheses); - } - - if (result.IsSizeDeclaration) - { - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseParentheses); - } - - // validate ranges in between - for (int i=0; i 3)) - { - // search second apostrophe - int end = numString.IndexOf('\'', 1); - if (end == (numString.Length - 2)) - { - try - { - switch (numString[numString.Length - 1]) - { - case 'b': - case 'B': - result = Convert.ToInt64(numString.Substring(1, numString.Length - 3), 2); - return result; - case 'h': - case 'H': - result = Convert.ToInt64(numString.Substring(1, numString.Length - 3), 16); - return result; - } - } - catch - { - } - } - } - else if (Int64.TryParse(numString, out result)) - { - return result; - } - } - - return null; - } - - public static ValueMap DecodeEnumerations(ISymbolEnumerator symbols) - { - Symbol current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenBracket); - - ValueMap map = new ValueMap(); - do - { - current = symbols.NextNonEOLSymbol(); - string identifier = current.ToString(); - - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.OpenParentheses); - - current = symbols.NextNonEOLSymbol(); - Int64 enumValue; - if (Int64.TryParse(current.ToString(), out enumValue)) - { - try - { - // Have to include the number as it seems repeated identifiers are allowed ?? - map.Add(enumValue, String.Format("{0}({1})", identifier, enumValue)); - } - catch (ArgumentException ex) - { - current.Assert(false, ex.Message); - } - } - else - { - // Need to get "DefinedValue". - } - - current = symbols.NextNonEOLSymbol(); - current.Expect(Symbol.CloseParentheses); - - current = symbols.NextNonEOLSymbol(); - } while (current == Symbol.Comma); - - current.Expect(Symbol.CloseBracket); - - return map; - } - - #endregion - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs deleted file mode 100644 index f802990..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MaxAccess.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib -{ - public enum MaxAccess - { - notAccessible, - accessibleForNotify, - readOnly, - readWrite, - readCreate - } - -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs deleted file mode 100644 index aac3b28..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibDocument.cs +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 17:38 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// MIB document. - /// - public sealed class MibDocument - { - private readonly List _modules = new List(); - - /// - /// Initializes a new instance of the class. - /// - /// The file. - public MibDocument(string file) - : this(new Lexer(file)) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The lexer. - public MibDocument(Lexer lexer) - { - ISymbolEnumerator symbols = lexer.GetEnumerator(); - - Symbol current; - while ((current = symbols.NextNonEOLSymbol()) != null) - { - symbols.PutBack(current); - _modules.Add(new MibModule(symbols)); - } - } - - /// - /// containing in this document. - /// - public IList Modules - { - get - { - return _modules; - } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs deleted file mode 100644 index efd89b3..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibException.cs +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 16:33 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Globalization; -#if (!SILVERLIGHT) -using System.Runtime.Serialization; -using System.Security.Permissions; -#endif - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// Description of MibException. - /// - [Serializable] - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mib")] - public sealed class MibException : Exception - { - /// - /// Symbol. - /// - public Symbol Symbol { get; private set; } - - /// - /// Creates a . - /// - public MibException() - { - } - - /// - /// Creates a instance with a specific . - /// - /// Message - public MibException(string message) : base(message) - { - } - - /// - /// Creates a instance with a specific and an . - /// - /// Message - /// Inner exception - public MibException(string message, Exception inner) - : base(message, inner) - { - } -#if (!SILVERLIGHT) - /// - /// Creates a instance. - /// - /// Info - /// Context - private MibException(SerializationInfo info, StreamingContext context) : base(info, context) - { - if (info == null) - { - throw new ArgumentNullException("info"); - } - - Symbol = (Symbol)info.GetValue("Symbol", typeof(Symbol)); - } - - /// - /// Gets object data. - /// - /// Info - /// Context - [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - info.AddValue("Symbol", Symbol); - } -#endif - - /// - /// Creates a with a specific . - /// - /// Message - /// Symbol - /// - public static MibException Create(string message, Symbol symbol) - { - if (symbol == null) - { - throw new ArgumentNullException("symbol"); - } - - if (String.IsNullOrEmpty(message)) - { - message = "Unknown MIB Exception"; - } - - message = String.Format( - "{0} (file: \"{1}\"; row: {2}; column: {3})", - message, - symbol.File, - symbol.Row + 1, - symbol.Column + 1); - - MibException ex = new MibException(message) { Symbol = symbol }; - return ex; - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs deleted file mode 100644 index 3c6b770..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibModule.cs +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 17:38 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Collections.Generic; -using Lextm.SharpSnmpLib.Mib.Elements; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// MIB module class. - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Mib")] - public sealed class MibModule : IModule - { - private readonly string _name; - private readonly Imports _imports; - private readonly Exports _exports; - private readonly List _tokens = new List(); - - /// - /// Creates a with a specific . - /// - /// Module name - /// Lexer - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "lexer")] - public MibModule(ISymbolEnumerator symbols) - { - if (symbols == null) - { - throw new ArgumentNullException("lexer"); - } - - Symbol temp = symbols.NextNonEOLSymbol(); - temp.AssertIsValidIdentifier(); - _name = temp.ToString().ToUpperInvariant(); // all module names are uppercase - - temp = symbols.NextNonEOLSymbol(); - temp.Expect(Symbol.Definitions); - - temp = symbols.NextNonEOLSymbol(); - temp.Expect(Symbol.Assign); - - temp = symbols.NextSymbol(); - temp.Expect(Symbol.Begin); - - temp = symbols.NextNonEOLSymbol(); - if (temp == Symbol.Imports) - { - _imports = ParseDependents(symbols); - } - else if (temp == Symbol.Exports) - { - _exports = ParseExports(symbols); - } - else - { - symbols.PutBack(temp); - } - - ParseEntities(symbols); - } - - #region Accessors - - /// - /// Module name. - /// - public string Name - { - get { return _name; } - } - - public Exports Exports - { - get { return _exports; } - } - - public Imports Imports - { - get { return _imports; } - } - - public List Tokens - { - get { return this._tokens; } - } - - /// - /// Entities + Types + all other elements implementing IDeclaration - /// - public IList Declarations - { - get - { - IList result = new List(); - foreach (IElement e in _tokens) - { - IDeclaration decl = e as IDeclaration; - if (decl != null) - { - result.Add(decl); - } - } - - return result; - } - } - - /// - /// OID nodes. - /// - public IList Entities - { - get - { - IList result = new List(); - foreach (IElement e in _tokens) - { - IEntity entity = e as IEntity; - if (entity != null) - { - result.Add(entity); - } - } - - return result; - } - } - - public IList Types - { - get - { - IList result = new List(); - foreach (IElement e in _tokens) - { - ITypeAssignment type = e as ITypeAssignment; - if (type != null) - { - result.Add(type); - } - } - - return result; - } - } - - #endregion - - #region Parsing of Symbols - - private Exports ParseExports(ISymbolEnumerator symbols) - { - return new Exports(this, symbols); - } - - private Imports ParseDependents(ISymbolEnumerator symbols) - { - return new Imports(this, symbols); - } - - private void ParseEntities(ISymbolEnumerator symbols) - { - Symbol temp = symbols.NextNonEOLSymbol(); - SymbolList buffer = new SymbolList(); - - while (temp != Symbol.End) - { - if (temp == Symbol.Assign) - { - ParseEntity(buffer, symbols); - buffer.Clear(); - // skip linebreaks behind an entity - temp = symbols.NextNonEOLSymbol(); - } - else - { - buffer.Add(temp); - temp = symbols.NextSymbol(); - } - } - } - - private void ParseEntity(SymbolList preAssignSymbols, ISymbolEnumerator symbols) - { - if ((preAssignSymbols == null) || (preAssignSymbols.Count == 0)) - { - Symbol s = symbols.NextSymbol(); - if (s != null) - { - s.Assert(false, "Invalid Entitiy declaration"); - } - else - { - throw new MibException("Invalid Entitiy declaration"); - } - } - - // check for a valid identifier - preAssignSymbols[0].AssertIsValidIdentifier(); - - if (preAssignSymbols.Count == 1) - { - // its a typedef - _tokens.Add(Lexer.ParseBasicTypeDef(this, preAssignSymbols[0].ToString(), symbols, isMacroSyntax: false)); - return; - } - - ISymbolEnumerator preAssignSymbolsEnumerator = preAssignSymbols.GetSymbolEnumerator(); - preAssignSymbolsEnumerator.NextNonEOLSymbol(); // returns identifier - Symbol type = preAssignSymbolsEnumerator.NextNonEOLSymbol(); - - // parse declarations - if (type == Symbol.Object) - { - Symbol next = preAssignSymbolsEnumerator.NextNonEOLSymbol(); - - if (next == Symbol.Identifier) - { - _tokens.Add(new OidValueAssignment(this, preAssignSymbols, symbols)); - return; - } - else if (next != null) - { - preAssignSymbolsEnumerator.PutBack(next); - } - } - if (type == Symbol.ModuleIdentity) - { - _tokens.Add(new ModuleIdentity(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.ObjectType) - { - _tokens.Add(new ObjectType(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.ObjectGroup) - { - _tokens.Add(new ObjectGroup(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.NotificationGroup) - { - _tokens.Add(new NotificationGroup(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.ModuleCompliance) - { - _tokens.Add(new ModuleCompliance(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.NotificationType) - { - _tokens.Add(new NotificationType(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.ObjectIdentity) - { - _tokens.Add(new ObjectIdentity(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.Macro) - { - _tokens.Add(new Macro(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.TrapType) - { - _tokens.Add(new TrapType(this, preAssignSymbols, symbols)); - return; - } - if (type == Symbol.AgentCapabilities) - { - _tokens.Add(new AgentCapabilities(this, preAssignSymbols, symbols)); - return; - } - - preAssignSymbols[1].Assert(false, "Unknown/Invalid declaration"); - } - - #endregion - - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs deleted file mode 100644 index 96978e1..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibResolver.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.IO; -using System.Reflection; - -namespace Lextm.SharpSnmpLib.Mib -{ - public interface IMibResolver - { - IModule Resolve(string moduleName); - } - - public class FileSystemMibResolver : IMibResolver - { - private string _path; - private bool _recursive; - - public FileSystemMibResolver(string path, bool recursive) - { - _path = path; - _recursive = recursive; - } - - #region IMibResolver Member - - public IModule Resolve(string moduleName) - { - if (Directory.Exists(_path)) - { - string[] matchedFiles = Directory.GetFiles( - _path, - "*", - (_recursive) ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); - - if ((matchedFiles != null) && (matchedFiles.Length >= 1)) - { - foreach (string matchedFile in matchedFiles) - { - if (Path.GetFileNameWithoutExtension(matchedFile.ToLowerInvariant()) == moduleName.ToLowerInvariant()) - { - try - { - MibDocument md = new MibDocument (matchedFile); - if (md.Modules.Count > 0) - { - return md.Modules [0]; - } - } catch - { - } - } - } - } - } - - return null; - } - - #endregion - - } - - // earlier code for search of versioned MIBs: - // - //private const string Pattern = "-V[0-9]+$"; - //public static bool AllDependentsAvailable(MibModule module, IDictionary modules) - //{ - // foreach (string dependent in module.Dependents) - // { - // if (!DependentFound(dependent, modules)) - // { - // return false; - // } - // } - - // return true; - //} - - //private static bool DependentFound(string dependent, IDictionary modules) - //{ - // if (!Regex.IsMatch(dependent, Pattern)) - // { - // return modules.ContainsKey(dependent); - // } - - // if (modules.ContainsKey(dependent)) - // { - // return true; - // } - - // string dependentNonVersion = Regex.Replace(dependent, Pattern, string.Empty); - // return modules.ContainsKey(dependentNonVersion); - //} - -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs deleted file mode 100644 index 76101aa..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTree.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System.Collections.Generic; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// Builds up a tree from a single MIB - /// - public class MibTree - { - private readonly List _root = new List(); - - public MibTree(MibModule module) - { - IList entities = module.Entities; - - if (entities.Count > 0) - { - // try to find module identity as root - foreach (IEntity element in entities) - { - ModuleIdentity mi = element as ModuleIdentity; - - if (mi != null) - { - _root.Add(new MibTreeNode(null, mi)); - } - } - - // gather all items below ModuleIdentity - foreach (MibTreeNode mibTreeNode in _root) - { - entities.Remove (mibTreeNode.Entity); - BuildTree(mibTreeNode, entities); - UpdateTreeNodeTypes(mibTreeNode); - } - - // find OID assignments as root, if there are any that are not below ModuleIdentity - // FIXME: There may be multiple OID assignments that create a tree (find the root ones!) - foreach (IEntity element in entities) - { - OidValueAssignment oa = element as OidValueAssignment; - - if (oa != null) - { - _root.Add(new MibTreeNode(null, oa)); - } - } - - if (_root.Count == 0) - { - //no module identity, assume first entity is root - _root.Add(new MibTreeNode(null, entities[0])); - } - - foreach (MibTreeNode mibTreeNode in _root) - { - if (entities.Contains (mibTreeNode.Entity)) - { - entities.Remove (mibTreeNode.Entity); - } - BuildTree(mibTreeNode, entities); - UpdateTreeNodeTypes(mibTreeNode); - } - } - } - - public IList Root - { - get { return _root; } - } - - - private void BuildTree(MibTreeNode node, IList entities) - { - int i = 0; - while (i < entities.Count) - { - if (entities[i].Parent == node.Entity.Name) - { - node.AddChild(entities[i]); - entities.RemoveAt(i); - } - else - { - i++; - } - } - - foreach (MibTreeNode childNode in node.ChildNodes) - { - BuildTree(childNode, entities); - } - } - - private void UpdateTreeNodeTypes(MibTreeNode node) - { - node.UpdateNodeType(); - foreach (MibTreeNode childNode in node.ChildNodes) - { - UpdateTreeNodeTypes(childNode); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs deleted file mode 100644 index 386c8e5..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTreeNode.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib -{ - [Flags] - public enum MibTreeNodeType - { - Unknown = 0, - Container = (1 << 0), - Scalar = (1 << 1), - Table = (1 << 2), - TableRow = (1 << 3), - TableCell = (1 << 4), - NotificationRelated = (1 << 5), - ConformanceRelated = (1 << 6) - } - - - public class MibTreeNode - { - private MibTreeNode _parent = null; - private List _childNodes = new List(); - private IEntity _entity = null; - private MibTreeNodeType _nodeType = MibTreeNodeType.Unknown; - - public MibTreeNode(MibTreeNode parent, IEntity entity) - { - _parent = parent; - _entity = entity; - } - - public MibTreeNode Parent - { - get { return _parent; } - } - - public IEntity Entity - { - get { return _entity; } - } - - public MibTreeNodeType NodeType - { - get { return _nodeType; } - } - - public List ChildNodes - { - get { return _childNodes; } - } - - public MibTreeNode AddChild(IEntity element) - { - MibTreeNode result = new MibTreeNode(this, element); - this.ChildNodes.Add(result); - - return result; - } - - public void UpdateNodeType() - { - _nodeType = MibTreeNodeType.Unknown; - - if (_entity != null) - { - if ((_entity is OidValueAssignment) || (_entity is ObjectIdentity)) - { - _nodeType |= MibTreeNodeType.Container; - return; - } - else if (_childNodes.Count > 0) - { - _nodeType |= MibTreeNodeType.Container; - } - - if (_entity is ObjectType) - { - ObjectType ot = _entity as ObjectType; - - if (ot.Syntax is SequenceOf) - { - _nodeType |= MibTreeNodeType.Table; - } - else if (ot.Syntax is Sequence) - { - _nodeType |= MibTreeNodeType.TableRow; - } - else if ((_parent != null) && ((_parent.NodeType & MibTreeNodeType.TableRow) != 0)) - { - _nodeType |= MibTreeNodeType.TableCell; - _nodeType |= MibTreeNodeType.Scalar; - } - else - { - _nodeType |= MibTreeNodeType.Scalar; - } - } - else if ((_entity is ModuleCompliance) || (_entity is ObjectGroup) || (_entity is NotificationGroup)) - { - _nodeType |= MibTreeNodeType.ConformanceRelated; - } - else if ((_entity is NotificationGroup) || (_entity is NotificationType)) - { - _nodeType |= MibTreeNodeType.NotificationRelated; - } - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs deleted file mode 100644 index 1e7529a..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/MibTypesResolver.cs +++ /dev/null @@ -1,216 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; -using Lextm.SharpSnmpLib.Mib.Elements; -using Lextm.SharpSnmpLib.Mib.Elements.Entities; -using Lextm.SharpSnmpLib.Mib.Elements.Types; - -namespace Lextm.SharpSnmpLib.Mib -{ - public static class MibTypesResolver - { - private static readonly Regex _namedOidPathRegex = new Regex(@"^(?[^\(]+)\((?\d+)\)$"); - private static readonly List _resolver = new List(); - private static readonly List _cachedModules = new List(); - - public static void RegisterResolver(IMibResolver resolver) - { - if (resolver != null) - { - _resolver.Add(resolver); - } - } - - public static IModule ResolveModule(string moduleName) - { - // check if module is already cached - foreach (MibModule cachedModule in _cachedModules) - { - if (cachedModule.Name == moduleName) - { - return cachedModule; - } - } - - foreach (IMibResolver resolver in _resolver) - { - IModule resolvedModule = resolver.Resolve(moduleName); - if (resolvedModule != null) - { - ResolveTypes(resolvedModule); - _cachedModules.Add(resolvedModule); - return resolvedModule; - } - } - - return null; - } - - public static void ResolveTypes(IModule module) - { - foreach (IEntity entity in module.Entities) - { - ITypeReferrer typeReferringEntity = entity as ITypeReferrer; - - if (typeReferringEntity != null) - { - CheckTypeReferrer(module, typeReferringEntity); - } - } - - if (!_cachedModules.Contains(module)) - { - _cachedModules.Add(module); - } - } - - private static void CheckTypeReferrer(IModule module, ITypeReferrer typeReferringEntity) - { - TypeAssignment unknownType = typeReferringEntity.ReferredType as TypeAssignment; - if (unknownType != null) - { - typeReferringEntity.ReferredType = ResolveType(module, unknownType); - - if (typeReferringEntity.ReferredType is TypeAssignment) - { - Console.WriteLine(String.Format("Could not resolve type '{0}' declared in module '{1}'", (typeReferringEntity.ReferredType as TypeAssignment).Type, typeReferringEntity.ReferredType.Module.Name)); - } - } - - ITypeReferrer nextTypeReferringEntity = typeReferringEntity.ReferredType as ITypeReferrer; - if (nextTypeReferringEntity != null) - { - CheckTypeReferrer(module, nextTypeReferringEntity); - } - } - - public static ITypeAssignment ResolveType(IModule module, TypeAssignment type) - { - ITypeAssignment result = ResolveDeclaration(module, type.Type) as ITypeAssignment; - - return (result != null) ? result : type; - } - - public static IDeclaration ResolveDeclaration(IModule module, string name) - { - if ((module == null) || String.IsNullOrEmpty(name)) - { - return null; - } - - // check module internal types - foreach (IDeclaration decl in module.Declarations) - { - if (decl.Name == name) - { - return decl; - } - } - - // check if type is imported - if (module.Imports != null) - { - ImportsFrom imports = module.Imports.GetImportFromType(name); - if (imports != null) - { - IModule importedModule = ResolveModule(imports.Module); - if (importedModule != null) - { - return ResolveDeclaration(importedModule, name); - } - } - } - - return null; - } - - public static ObjectIdentifier ResolveOid(IEntity entity) - { - ObjectIdentifier result = new ObjectIdentifier(); - - if (entity != null) - { - ResolveOid(entity, result); - } - - return result; - } - - private static void ResolveOid(IEntity entity, ObjectIdentifier result) - { - result.Prepend(entity.Name, entity.Value); - - // check parent - if (!String.IsNullOrEmpty(entity.Parent)) - { - string[] pathParts = entity.Parent.Split('.'); - uint value; - - // all parts except the first should have their value directly or indirectly with them - if (pathParts.Length > 1) - { - for (int i=pathParts.Length-1; i>=1; i--) - { - if (uint.TryParse(pathParts[i], out value)) - { - result.Prepend("", value); - } - else - { - Match m = _namedOidPathRegex.Match(pathParts[i]); - if (m.Success) - { - result.Prepend(m.Groups["Name"].Value, uint.Parse(m.Groups["Value"].Value)); - } - else - { - throw new MibException("Invalid OID path detected for entity '" + entity.Name + "' in module '" + entity.Module + "'!"); - } - } - } - } - - // parse root part: either another entity or a standard root object - if (IsOidRoot(pathParts[0], out value)) - { - result.Prepend(pathParts[0], value); - } - else - { - // try to find entity inside this module - if (entity.Module != null) - { - entity = ResolveDeclaration(entity.Module, pathParts[0]) as IEntity; - - if (entity != null) - { - ResolveOid(entity, result); - } - else - { - result.Prepend("", uint.MaxValue); - } - } - else - { - result.Prepend("", uint.MaxValue); - } - } - } - } - - public static bool IsOidRoot(string name, out uint value) - { - value = uint.MaxValue; - - switch (name) - { - case "ccitt": value = 0; return true; - case "iso": value = 1; return true; - case "joint-iso-ccitt": value = 2; return true; - } - - return false; - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs deleted file mode 100644 index 0424804..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ObjectIdentifier.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Collections.Generic; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib -{ - public class ObjectIdentifier: List> - { - public void Add(string name, uint oid) - { - this.Add(new KeyValuePair(name, oid)); - } - - public void Prepend(string name, uint oid) - { - this.Insert(0, new KeyValuePair(name, oid)); - } - - public void Insert(int index, string name, uint oid) - { - this.Insert(index, new KeyValuePair(name, oid)); - } - - public string GetOidString() - { - StringBuilder result = new StringBuilder(); - - foreach (KeyValuePair level in this) - { - result.Append(level.Value); - result.Append('.'); - } - - if (result.Length > 0) - { - result.Length--; - } - - return result.ToString(); - } - - public uint[] GetOidValues() - { - List result = new List(); - - foreach (KeyValuePair level in this) - { - result.Add(level.Value); - } - - return result.ToArray(); - } - - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs deleted file mode 100644 index 4ddd3ba..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Status.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib -{ - public enum Status - { - current, - deprecated, - obsolete, - mandatory, - optional - } - -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs deleted file mode 100644 index b11386d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/Symbol.cs +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Created by SharpDevelop. - * User: lextm - * Date: 2008/5/17 - * Time: 17:14 - * - * To change this template use Tools | Options | Coding | Edit Standard Headers. - */ - -using System; -using System.Configuration; -using System.Globalization; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib -{ - /// - /// Description of Symbol. - /// - public sealed class Symbol : IEquatable - { - private readonly string _text; - private readonly int _row; - private readonly int _column; - private readonly string _file; - - private Symbol(string text) : this(null, text, -1, -1) - { - } - - /// - /// Creates a . - /// - /// File - /// Text - /// Row number - /// column number - public Symbol(string file, string text, int row, int column) - { - _file = file; - _text = text; - _row = row; - _column = column; - } - - /// - /// File. - /// - public string File - { - get - { - return _file; - } - } - - /// - /// Row number. - /// - public int Row - { - get - { - return _row; - } - } - - /// - /// Column number. - /// - public int Column - { - get - { - return _column; - } - } - - /// - /// Returns a that represents this . - /// - /// - public override string ToString() - { - return _text; - } - - /// - /// Determines whether the specified is equal to the current . - /// - /// The to compare with the current . - /// true if the specified is equal to the current ; otherwise, false. - /// - public override bool Equals(object obj) - { - if (obj == null) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return GetType() == obj.GetType() && Equals((Symbol)obj); - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current . - public override int GetHashCode() - { - return _text.GetHashCode(); - } - - /// - /// The equality operator. - /// - /// Left object - /// Right object - /// - /// Returns true if the values of its operands are equal, false otherwise. - public static bool operator ==(Symbol left, Symbol right) - { - return Equals(left, right); - } - - /// - /// Determines whether the specified is equal to the current . - /// - /// Left object - /// Right object - /// - /// Returns true if the values of its operands are equal, false otherwise. - public static bool Equals(Symbol left, Symbol right) - { - object l = left; - object r = right; - if (l == r) - { - return true; - } - - if (l == null || r == null) - { - return false; - } - - return left._text.Equals(right._text); - } - - /// - /// The inequality operator. - /// - /// Left object - /// Right object - /// - /// Returns true if the values of its operands are not equal, false otherwise. - public static bool operator !=(Symbol left, Symbol right) - { - return !(left == right); - } - - #region IEquatable Members - /// - /// Indicates whether the current object is equal to another object of the same type. - /// - /// An object to compare with this object. - /// true if the current object is equal to the parameter; otherwise, false. - /// - public bool Equals(Symbol other) - { - return Equals(this, other); - } - - #endregion - - public static readonly Symbol Definitions = new Symbol("DEFINITIONS"); - public static readonly Symbol Begin = new Symbol("BEGIN"); - public static readonly Symbol Object = new Symbol("OBJECT"); - public static readonly Symbol Identifier = new Symbol("IDENTIFIER"); - public static readonly Symbol Assign = new Symbol("::="); - public static readonly Symbol OpenBracket = new Symbol("{"); - public static readonly Symbol CloseBracket = new Symbol("}"); - public static readonly Symbol Comment = new Symbol("--"); - public static readonly Symbol Imports = new Symbol("IMPORTS"); - public static readonly Symbol Semicolon = new Symbol(";"); - public static readonly Symbol From = new Symbol("FROM"); - public static readonly Symbol ModuleIdentity = new Symbol("MODULE-IDENTITY"); - public static readonly Symbol ObjectType = new Symbol("OBJECT-TYPE"); - public static readonly Symbol ObjectGroup = new Symbol("OBJECT-GROUP"); - public static readonly Symbol NotificationGroup = new Symbol("NOTIFICATION-GROUP"); - public static readonly Symbol ModuleCompliance = new Symbol("MODULE-COMPLIANCE"); - public static readonly Symbol Sequence = new Symbol("SEQUENCE"); - public static readonly Symbol NotificationType = new Symbol("NOTIFICATION-TYPE"); - public static readonly Symbol EOL = new Symbol(Environment.NewLine); - public static readonly Symbol ObjectIdentity = new Symbol("OBJECT-IDENTITY"); - public static readonly Symbol End = new Symbol("END"); - public static readonly Symbol Macro = new Symbol("MACRO"); - public static readonly Symbol Choice = new Symbol("CHOICE"); - public static readonly Symbol TrapType = new Symbol("TRAP-TYPE"); - public static readonly Symbol AgentCapabilities = new Symbol("AGENT-CAPABILITIES"); - public static readonly Symbol Comma = new Symbol(","); - public static readonly Symbol TextualConvention = new Symbol("TEXTUAL-CONVENTION"); - public static readonly Symbol Syntax = new Symbol("SYNTAX"); - public static readonly Symbol Bits = new Symbol("BITS"); - public static readonly Symbol Octet = new Symbol("OCTET"); - public static readonly Symbol String = new Symbol("STRING"); - public static readonly Symbol OpenParentheses = new Symbol("("); - public static readonly Symbol CloseParentheses = new Symbol(")"); - public static readonly Symbol Exports = new Symbol("EXPORTS"); - public static readonly Symbol DisplayHint = new Symbol("DISPLAY-HINT"); - public static readonly Symbol Status = new Symbol("STATUS"); - public static readonly Symbol Description = new Symbol("DESCRIPTION"); - public static readonly Symbol Reference = new Symbol("REFERENCE"); - public static readonly Symbol DoubleDot = new Symbol(".."); - public static readonly Symbol Pipe = new Symbol("|"); - public static readonly Symbol Size = new Symbol("SIZE"); - public static readonly Symbol Units = new Symbol("UNITS"); - public static readonly Symbol MaxAccess = new Symbol("MAX-ACCESS"); - public static readonly Symbol Access = new Symbol("ACCESS"); - public static readonly Symbol Index = new Symbol("INDEX"); - public static readonly Symbol Augments = new Symbol("AUGMENTS"); - public static readonly Symbol DefVal = new Symbol("DEFVAL"); - public static readonly Symbol Of = new Symbol("OF"); - public static readonly Symbol Integer = new Symbol("INTEGER"); - public static readonly Symbol Integer32 = new Symbol("Integer32"); - public static readonly Symbol IpAddress = new Symbol("IpAddress"); - public static readonly Symbol Counter32 = new Symbol("Counter32"); - public static readonly Symbol Counter = new Symbol("Counter"); - public static readonly Symbol TimeTicks = new Symbol("TimeTicks"); - public static readonly Symbol Opaque = new Symbol("Opaque"); - public static readonly Symbol Counter64 = new Symbol("Counter64"); - public static readonly Symbol Unsigned32 = new Symbol("Unsigned32"); - public static readonly Symbol Gauge32 = new Symbol("Gauge32"); - public static readonly Symbol Gauge = new Symbol("Gauge"); - public static readonly Symbol TruthValue = new Symbol("TruthValue"); - public static readonly Symbol Implied = new Symbol("IMPLIED"); - - internal void Expect(Symbol expected, params Symbol[] orExpected) - { - bool isExpected = (this == expected); - - if (!isExpected && (orExpected != null) && (orExpected.Length > 0)) - { - // check the alternatives - for (int i=0; i 64)) - { - message = "an identifier must consist of 1 to 64 letters, digits, and hyphens"; - return false; - } - - if (!Char.IsLetter(name[0])) - { - message = "the initial character must be a letter"; - return false; - } - - if (name.EndsWith("-", StringComparison.Ordinal)) - { - message = "a hyphen cannot be the last character of an identifier"; - return false; - } - - if (name.Contains("--")) - { - message = "a hyphen cannot be immediately followed by another hyphen in an identifier"; - return false; - } - - if (UseStricterValidation && name.Contains("_")) - { - message = "underscores are not allowed in identifiers"; - return false; - } - - // TODO: SMIv2 forbids "-" except in module names and keywords - message = null; - return true; - } - - private static bool? _useStricterValidation; - - private static bool UseStricterValidation - { - get - { - if (_useStricterValidation == null) - { - object setting = ConfigurationManager.AppSettings["StricterValidationEnabled"]; - _useStricterValidation = setting != null && Convert.ToBoolean(setting.ToString(), CultureInfo.InvariantCulture); - } - - return _useStricterValidation.Value; - } - } - } -} \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs deleted file mode 100644 index 5b2218e..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/SymbolList.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Lextm.SharpSnmpLib.Mib -{ - public class SymbolList : List - { - public class SymbolEnumerator : ISymbolEnumerator - { - private SymbolList _list = null; - private int _index = -1; - - internal SymbolEnumerator(SymbolList list) - { - if (list == null) - { - throw new ArgumentNullException("lexer"); - } - - _list = list; - } - - #region ISymbolEnumerator Member - - public bool PutBack(Symbol item) - { - if ((_index < 0) || (_index >= _list.Count) || (item != _list[_index])) - { - throw new ArgumentException(@"wrong last symbol", "last"); - //return false; - } - - _index--; - return true; - } - - #endregion - - #region IEnumerator Member - - public Symbol Current - { - get - { - if ((_index >= 0) && (_index <= _list.Count)) - { - return _list[_index]; - } - - return null; - } - } - - #endregion - - #region IDisposable Member - - public void Dispose() - { - } - - #endregion - - #region IEnumerator Member - - object System.Collections.IEnumerator.Current - { - get { return this.Current; } - } - - public bool MoveNext() - { - _index++; - return (_index >= 0) && (_index < _list.Count); - } - - public void Reset() - { - _index = -1; - } - - #endregion - } - - /// - /// Initializes a new instance of the class. - /// - public SymbolList() - { - } - - public ISymbolEnumerator GetSymbolEnumerator() - { - return new SymbolEnumerator(this); - } - - public string Join(string separator) - { - if (separator == null) - separator = ""; - - StringBuilder result = new StringBuilder(); - - foreach (Symbol s in this) - { - result.Append(s); - result.Append(separator); - } - - if (result.Length > 0) - { - result.Length -= separator.Length; - } - - return result.ToString(); - } - } - - public static class SymbolEnumeratorExtension - { - public static Symbol NextSymbol(this IEnumerator enumerator) - { - if (enumerator.MoveNext()) - { - return enumerator.Current; - } - - return null; - } - - public static Symbol NextNonEOLSymbol(this IEnumerator enumerator) - { - while (enumerator.MoveNext()) - { - if (enumerator.Current != Symbol.EOL) - { - return enumerator.Current; - } - } - - return null; - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs deleted file mode 100644 index 184dd58..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueMap.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib -{ - public class ValueMap : Dictionary - { - public ValueMap() - { - } - - /// - /// Returns the values of the map as continous range. At best as one range. - /// - /// - public ValueRanges GetContinousRanges() - { - ValueRanges result = new ValueRanges(); - - if (this.Count > 0) - { - List values = new List(this.Keys); - values.Sort(); - - Int64 last = values[0]; - Int64 offset = values[0]; - for (int i=1; i - /// Gets the highest value contained in this value map. - /// - /// - public Int64 GetHighestValue() - { - Int64 result = 0; - - foreach (Int64 value in this.Keys) - { - if (value > result) - { - result = value; - } - } - - return result; - } - - /// - /// Interprets the single values as bit positions and creates a mask of it. - /// - /// - public UInt32 GetBitMask() - { - UInt32 result = 0; - - foreach (Int64 key in this.Keys) - { - if (key < 0) - { - throw new NotSupportedException("Negative numbers are not allowed for Bits!"); - } - if (key > 31) - { - throw new NotSupportedException("Bits with more than 32 bits are not supported!"); - } - - result |= (UInt32)(1 << (int)key); - } - - return result; - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs deleted file mode 100644 index 3ff5bcb..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Mib/ValueRange.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Lextm.SharpSnmpLib.Mib -{ - public class ValueRanges: List - { - public bool IsSizeDeclaration { get; internal set; } - - public ValueRanges(bool isSizeDecl = false) - { - IsSizeDeclaration = isSizeDecl; - } - - public bool Contains(Int64 value) - { - foreach (ValueRange range in this) - { - if (range.Contains(value)) - { - return true; - } - } - - return false; - } - } - - public class ValueRange - { - private readonly Int64 _start; - private readonly Int64? _end; - - public ValueRange(Int64 first, Int64? second) - { - _start = first; - _end = second; - } - - public Int64 Start - { - get { return _start; } - } - - public Int64? End - { - get { return _end; } - } - - public bool IntersectsWith(ValueRange other) - { - if (this._end == null) - { - return other.Contains(this._start); - } - else if (other._end == null) - { - return this.Contains(other._start); - } - - return (this._start <= other.End) && (this._end >= other._start); - } - - public bool Contains(Int64 value) - { - if (_end == null) - { - return value == _start; - } - else - { - return (_start <= value) && (value <= _end); - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs deleted file mode 100644 index f96080d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,61 +0,0 @@ -// #SNMP Library. An open source SNMP implementation for .NET. -// Copyright (C) 2008 Lex Y. Li -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -#region Using directives - -using System; -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -#endregion - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SharpSnmpLib")] -[assembly: AssemblyDescription("#SNMP Library for .NET")] -[assembly: AssemblyConfiguration("Lesser GPL 2.1+")] -[assembly: AssemblyCompany("LeXtudio")] -[assembly: AssemblyProduct("#SNMPLib")] -[assembly: AssemblyCopyright("(C) 2008-2010 Malcolm Crowe, Lex Li, Steve Santacroce, and other contributors.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose index type to COM, use [ComVisible(true)] on that type. -[assembly: ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all the values or you can use the default the Revision and -// Build Numbers by using the '*' as shown below: -[assembly: AssemblyVersion("7.0.011207.31")] -#if (!CF) -[assembly: AssemblyFileVersion("7.0.011207.31")] -#endif -[assembly: NeutralResourcesLanguage("en-US")] -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Lextm")] - -[assembly: InternalsVisibleTo("SharpSnmpLib.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f7030532c52524" -+ "993841a0d09420340f3814e1b65473851bdcd18815510b035a2ae9ecee69c4cd2d9e4d6e6d5fbf" -+ "a564e86c4a4cddc9597619a31c060846ebb2e99511a0323ff82b1ebd95d6a4912502945f0e769f" -+ "190a69a439dbfb969ebad72a6f7e2e047907da4a7b9c08c6e98d5f1be8b8cafaf3eb978914059a" -+ "245d4bc1")] diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs deleted file mode 100644 index 38bc6bb..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.Designer.cs +++ /dev/null @@ -1,63 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.225 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace Lextm.SharpSnmpLib.Mib { - using System; - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Lextm.SharpSnmpLib.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx deleted file mode 100644 index 7080a7d..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/Properties/Resources.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj deleted file mode 100644 index e955426..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/SharpSnmpLib.Mib.csproj +++ /dev/null @@ -1,139 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {CBE20411-5DB7-487D-825D-7694267BB6F5} - Library - Properties - Lextm.SharpSnmpLib - SharpSnmpLib.Mib - ..\bin\SharpSnmpLib.Mib.xml - 512 - - True - sharpsnmplib.snk - False - File - - - - - - - - - False - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Lextm.SharpSnmpLib.Mib - Designer - - - - - - - - \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt deleted file mode 100644 index 27946de..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/license.txt +++ /dev/null @@ -1,458 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/SharpSnmpLib/sharpsnmplib.snk deleted file mode 100644 index fe6f345af4820b6758f6909a2d489ac524eaf889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098^0|he0B_x?RL7>o-AT$p+6ydg1bA=n+ z(TEjM3jFn-l#LX?9O>S*pzolg8Y)VYs$ys(8qZ|eZM(eWal@XvaKlm#iy_MFa zktG6@Uk-Mk8478nIotb|p1Rj6Z+5X3-=(x)I^Xr$16a|_jT}#2q z4>os95Q>xdhUx6jI|K!RX~hw1f!(|e#!5;$P6^h;CwzlPPCzNSv5=EJ`&INw3Z=7z zpCl>Gkp_CX1_JoM)uqwp7RO;18$@HiTuXhh8G#I(lCQ>caMi|5DbsK=Ij`BFCHTSV z)k^SjW~pvk&&IH|pd-nVVYBt0_=U$ArZ<6G8WE6Fm+B494}Ss(+%Lc_4Ia8yP8XWx z#8OMKTbAeI*{B6YjJi>DVo}}N8VwM^Q}Dt#D!-QYa4P@XO=Y9CSTeQ4?wa diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh deleted file mode 100644 index 93798c0..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/example/compile_udp_mib.sh +++ /dev/null @@ -1 +0,0 @@ -../LwipMibCompiler/bin/Debug/LwipMibCompiler.exe ../Mibs/UDP-MIB ./ ../Mibs/ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README deleted file mode 100644 index d2815ec..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/README +++ /dev/null @@ -1,38 +0,0 @@ -lwIP SNMPv2c agent -================== - -Based on SNMP stack written by Christiaan Simons - -Rewritten by Martin Hentschel and -Dirk Ziegelmeier - -Features: - - SNMPv2c support. - - Low RAM usage - no memory pools, stack only. - - MIB2 implementation is separated from SNMP stack. - - Support for multiple MIBs (snmp_set_mibs() call) - e.g. for private MIB. - - Simple and generic API for MIB implementation. - - Comfortable node types and helper functions for scalar arrays and tables. - - Counter64, bit and truthvalue datatype support. - - Callbacks for SNMP writes e.g. to implement persistency. - - Runs on two APIs: RAW and netconn. - - Async API is gone - the stack now supports netconn API instead, - so blocking operations can be done in MIB calls. - SNMP runs in a worker thread when netconn API is used. - - Simplified thread sync support for MIBs - useful when MIBs - need to access variables shared with other threads where no locking is - possible. Used in MIB2 to access lwIP stats from lwIP thread. - -MIB compiler (code generator): - - Written in C#. MIB viewer used Windows Forms. - - Developed on Windows with Visual Studio 2010. - - Can be compiled and used under Linux with http://www.monodevelop.com/. - - Based on a heavily modified version of of SharpSnmpLib (a4bd05c6afb4) - (https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate). - - MIB parser, C file generation framework and LWIP code generation are cleanly - separated, which means the code may be useful as a base for code generation - of other SNMP agents. - -Notes: - - Stack and MIB compiler were used to implement a Profinet device. - Compiled/implemented MIBs: LLDP-MIB, LLDP-EXT-DOT3-MIB, LLDP-EXT-PNO-MIB. diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c deleted file mode 100644 index bdfe844..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_dummy.c +++ /dev/null @@ -1,145 +0,0 @@ -/** - * @file - * Dummy SNMPv3 functions. - */ - -/* - * Copyright (c) 2016 Elias Oenal. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * Author: Elias Oenal - * Dirk Ziegelmeier - */ - -#include "lwip/apps/snmpv3.h" -#include "snmpv3_priv.h" -#include -#include "lwip/err.h" - -#if LWIP_SNMP && LWIP_SNMP_V3 - -/** - * @param username is a pointer to a string. - * @param auth_algo is a pointer to u8_t. The implementation has to set this if user was found. - * @param auth_key is a pointer to a pointer to a string. Implementation has to set this if user was found. - * @param priv_algo is a pointer to u8_t. The implementation has to set this if user was found. - * @param priv_key is a pointer to a pointer to a string. Implementation has to set this if user was found. - */ -err_t -snmpv3_get_user(const char* username, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key) -{ - const char* engine_id; - u8_t engine_id_len; - - if(strlen(username) == 0) { - return ERR_OK; - } - - if(memcmp(username, "lwip", 4) != 0) { - return ERR_VAL; - } - - snmpv3_get_engine_id(&engine_id, &engine_id_len); - - if(auth_key != NULL) { - snmpv3_password_to_key_sha((const u8_t*)"maplesyrup", 10, - (const u8_t*)engine_id, engine_id_len, - auth_key); - *auth_algo = SNMP_V3_AUTH_ALGO_SHA; - } - if(priv_key != NULL) { - snmpv3_password_to_key_sha((const u8_t*)"maplesyrup", 10, - (const u8_t*)engine_id, engine_id_len, - priv_key); - *priv_algo = SNMP_V3_PRIV_ALGO_DES; - } - return ERR_OK; -} - -/** - * Get engine ID from persistence - * @param id - * @param len - */ -void -snmpv3_get_engine_id(const char **id, u8_t *len) -{ - *id = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"; - *len = 12; -} - -/** - * Store engine ID in persistence - * @param id - * @param len - */ -err_t -snmpv3_set_engine_id(const char *id, u8_t len) -{ - LWIP_UNUSED_ARG(id); - LWIP_UNUSED_ARG(len); - return ERR_OK; -} - -/** - * Get engine boots from persistence. Must be increased on each boot. - * @return - */ -u32_t -snmpv3_get_engine_boots(void) -{ - return 0; -} - -/** - * Store engine boots in persistence - * @param boots - */ -void -snmpv3_set_engine_boots(u32_t boots) -{ - LWIP_UNUSED_ARG(boots); -} - -/** - * RFC3414 2.2.2. - * Once the timer reaches 2147483647 it gets reset to zero and the - * engine boot ups get incremented. - */ -u32_t -snmpv3_get_engine_time(void) -{ - return 0; -} - -/** - * Reset current engine time to 0 - */ -void -snmpv3_reset_engine_time(void) -{ -} - -#endif /* LWIP_SNMP && LWIP_SNMP_V3 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c deleted file mode 100644 index a647433..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip_frag.c +++ /dev/null @@ -1,897 +0,0 @@ -/** - * @file - * This is the IPv4 packet segmentation and reassembly implementation. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Jani Monoses - * Simon Goldschmidt - * original reassembly code by Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#if LWIP_IPV4 - -#include "lwip/ip_frag.h" -#include "lwip/def.h" -#include "lwip/inet_chksum.h" -#include "lwip/netif.h" -#include "lwip/stats.h" -#include "lwip/icmp.h" - -#include - -#if IP_REASSEMBLY -/** - * The IP reassembly code currently has the following limitations: - * - IP header options are not supported - * - fragments must not overlap (e.g. due to different routes), - * currently, overlapping or duplicate fragments are thrown away - * if IP_REASS_CHECK_OVERLAP=1 (the default)! - * - * @todo: work with IP header options - */ - -/** Setting this to 0, you can turn off checking the fragments for overlapping - * regions. The code gets a little smaller. Only use this if you know that - * overlapping won't occur on your network! */ -#ifndef IP_REASS_CHECK_OVERLAP -#define IP_REASS_CHECK_OVERLAP 1 -#endif /* IP_REASS_CHECK_OVERLAP */ - -/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is - * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. - * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA - * is set to 1, so one datagram can be reassembled at a time, only. */ -#ifndef IP_REASS_FREE_OLDEST -#define IP_REASS_FREE_OLDEST 1 -#endif /* IP_REASS_FREE_OLDEST */ - -#define IP_REASS_FLAG_LASTFRAG 0x01 - -/** This is a helper struct which holds the starting - * offset and the ending offset of this fragment to - * easily chain the fragments. - * It has the same packing requirements as the IP header, since it replaces - * the IP header in memory in incoming fragments (after copying it) to keep - * track of the various fragments. (-> If the IP header doesn't need packing, - * this struct doesn't need packing, too.) - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip_reass_helper { - PACK_STRUCT_FIELD(struct pbuf *next_pbuf); - PACK_STRUCT_FIELD(u16_t start); - PACK_STRUCT_FIELD(u16_t end); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB) \ - (ip4_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \ - ip4_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \ - IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0 - -/* global variables */ -static struct ip_reassdata *reassdatagrams; -static u16_t ip_reass_pbufcount; - -/* function prototypes */ -static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); -static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); - -/** - * Reassembly timer base function - * for both NO_SYS == 0 and 1 (!). - * - * Should be called every 1000 msec (defined by IP_TMR_INTERVAL). - */ -void -ip_reass_tmr(void) -{ - struct ip_reassdata *r, *prev = NULL; - - r = reassdatagrams; - while (r != NULL) { - /* Decrement the timer. Once it reaches 0, - * clean up the incomplete fragment assembly */ - if (r->timer > 0) { - r->timer--; - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); - prev = r; - r = r->next; - } else { - /* reassembly timed out */ - struct ip_reassdata *tmp; - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n")); - tmp = r; - /* get the next pointer before freeing */ - r = r->next; - /* free the helper struct and all enqueued pbufs */ - ip_reass_free_complete_datagram(tmp, prev); - } - } -} - -/** - * Free a datagram (struct ip_reassdata) and all its pbufs. - * Updates the total count of enqueued pbufs (ip_reass_pbufcount), - * SNMP counters and sends an ICMP time exceeded packet. - * - * @param ipr datagram to free - * @param prev the previous datagram in the linked list - * @return the number of pbufs freed - */ -static int -ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) -{ - u16_t pbufs_freed = 0; - u8_t clen; - struct pbuf *p; - struct ip_reass_helper *iprh; - - LWIP_ASSERT("prev != ipr", prev != ipr); - if (prev != NULL) { - LWIP_ASSERT("prev->next == ipr", prev->next == ipr); - } - - MIB2_STATS_INC(mib2.ipreasmfails); -#if LWIP_ICMP - iprh = (struct ip_reass_helper *)ipr->p->payload; - if (iprh->start == 0) { - /* The first fragment was received, send ICMP time exceeded. */ - /* First, de-queue the first pbuf from r->p. */ - p = ipr->p; - ipr->p = iprh->next_pbuf; - /* Then, copy the original header into it. */ - SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); - icmp_time_exceeded(p, ICMP_TE_FRAG); - clen = pbuf_clen(p); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(p); - } -#endif /* LWIP_ICMP */ - - /* First, free all received pbufs. The individual pbufs need to be released - separately as they have not yet been chained */ - p = ipr->p; - while (p != NULL) { - struct pbuf *pcur; - iprh = (struct ip_reass_helper *)p->payload; - pcur = p; - /* get the next pointer before freeing */ - p = iprh->next_pbuf; - clen = pbuf_clen(pcur); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(pcur); - } - /* Then, unchain the struct ip_reassdata from the list and free it. */ - ip_reass_dequeue_datagram(ipr, prev); - LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); - ip_reass_pbufcount -= pbufs_freed; - - return pbufs_freed; -} - -#if IP_REASS_FREE_OLDEST -/** - * Free the oldest datagram to make room for enqueueing new fragments. - * The datagram 'fraghdr' belongs to is not freed! - * - * @param fraghdr IP header of the current fragment - * @param pbufs_needed number of pbufs needed to enqueue - * (used for freeing other datagrams if not enough space) - * @return the number of pbufs freed - */ -static int -ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) -{ - /* @todo Can't we simply remove the last datagram in the - * linked list behind reassdatagrams? - */ - struct ip_reassdata *r, *oldest, *prev, *oldest_prev; - int pbufs_freed = 0, pbufs_freed_current; - int other_datagrams; - - /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, - * but don't free the datagram that 'fraghdr' belongs to! */ - do { - oldest = NULL; - prev = NULL; - oldest_prev = NULL; - other_datagrams = 0; - r = reassdatagrams; - while (r != NULL) { - if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { - /* Not the same datagram as fraghdr */ - other_datagrams++; - if (oldest == NULL) { - oldest = r; - oldest_prev = prev; - } else if (r->timer <= oldest->timer) { - /* older than the previous oldest */ - oldest = r; - oldest_prev = prev; - } - } - if (r->next != NULL) { - prev = r; - } - r = r->next; - } - if (oldest != NULL) { - pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev); - pbufs_freed += pbufs_freed_current; - } - } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); - return pbufs_freed; -} -#endif /* IP_REASS_FREE_OLDEST */ - -/** - * Enqueues a new fragment into the fragment queue - * @param fraghdr points to the new fragments IP hdr - * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) - * @return A pointer to the queue location into which the fragment was enqueued - */ -static struct ip_reassdata* -ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) -{ - struct ip_reassdata* ipr; -#if ! IP_REASS_FREE_OLDEST - LWIP_UNUSED_ARG(clen); -#endif - - /* No matching previous fragment found, allocate a new reassdata struct */ - ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); - if (ipr == NULL) { -#if IP_REASS_FREE_OLDEST - if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { - ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); - } - if (ipr == NULL) -#endif /* IP_REASS_FREE_OLDEST */ - { - IPFRAG_STATS_INC(ip_frag.memerr); - LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); - return NULL; - } - } - memset(ipr, 0, sizeof(struct ip_reassdata)); - ipr->timer = IP_REASS_MAXAGE; - - /* enqueue the new structure to the front of the list */ - ipr->next = reassdatagrams; - reassdatagrams = ipr; - /* copy the ip header for later tests and input */ - /* @todo: no ip options supported? */ - SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); - return ipr; -} - -/** - * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs. - * @param ipr points to the queue entry to dequeue - */ -static void -ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) -{ - /* dequeue the reass struct */ - if (reassdatagrams == ipr) { - /* it was the first in the list */ - reassdatagrams = ipr->next; - } else { - /* it wasn't the first, so it must have a valid 'prev' */ - LWIP_ASSERT("sanity check linked list", prev != NULL); - prev->next = ipr->next; - } - - /* now we can free the ip_reassdata struct */ - memp_free(MEMP_REASSDATA, ipr); -} - -/** - * Chain a new pbuf into the pbuf list that composes the datagram. The pbuf list - * will grow over time as new pbufs are rx. - * Also checks that the datagram passes basic continuity checks (if the last - * fragment was received at least once). - * @param root_p points to the 'root' pbuf for the current datagram being assembled. - * @param new_p points to the pbuf for the current fragment - * @return 0 if invalid, >0 otherwise - */ -static int -ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p) -{ - struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; - struct pbuf *q; - u16_t offset,len; - struct ip_hdr *fraghdr; - int valid = 1; - - /* Extract length and fragment offset from current fragment */ - fraghdr = (struct ip_hdr*)new_p->payload; - len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; - offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; - - /* overwrite the fragment's ip header from the pbuf with our helper struct, - * and setup the embedded helper structure. */ - /* make sure the struct ip_reass_helper fits into the IP header */ - LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", - sizeof(struct ip_reass_helper) <= IP_HLEN); - iprh = (struct ip_reass_helper*)new_p->payload; - iprh->next_pbuf = NULL; - iprh->start = offset; - iprh->end = offset + len; - - /* Iterate through until we either get to the end of the list (append), - * or we find one with a larger offset (insert). */ - for (q = ipr->p; q != NULL;) { - iprh_tmp = (struct ip_reass_helper*)q->payload; - if (iprh->start < iprh_tmp->start) { - /* the new pbuf should be inserted before this */ - iprh->next_pbuf = q; - if (iprh_prev != NULL) { - /* not the fragment with the lowest offset */ -#if IP_REASS_CHECK_OVERLAP - if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { - /* fragment overlaps with previous or following, throw away */ - goto freepbuf; - } -#endif /* IP_REASS_CHECK_OVERLAP */ - iprh_prev->next_pbuf = new_p; - } else { - /* fragment with the lowest offset */ - ipr->p = new_p; - } - break; - } else if (iprh->start == iprh_tmp->start) { - /* received the same datagram twice: no need to keep the datagram */ - goto freepbuf; -#if IP_REASS_CHECK_OVERLAP - } else if (iprh->start < iprh_tmp->end) { - /* overlap: no need to keep the new datagram */ - goto freepbuf; -#endif /* IP_REASS_CHECK_OVERLAP */ - } else { - /* Check if the fragments received so far have no holes. */ - if (iprh_prev != NULL) { - if (iprh_prev->end != iprh_tmp->start) { - /* There is a fragment missing between the current - * and the previous fragment */ - valid = 0; - } - } - } - q = iprh_tmp->next_pbuf; - iprh_prev = iprh_tmp; - } - - /* If q is NULL, then we made it to the end of the list. Determine what to do now */ - if (q == NULL) { - if (iprh_prev != NULL) { - /* this is (for now), the fragment with the highest offset: - * chain it to the last fragment */ -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); -#endif /* IP_REASS_CHECK_OVERLAP */ - iprh_prev->next_pbuf = new_p; - if (iprh_prev->end != iprh->start) { - valid = 0; - } - } else { -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("no previous fragment, this must be the first fragment!", - ipr->p == NULL); -#endif /* IP_REASS_CHECK_OVERLAP */ - /* this is the first fragment we ever received for this ip datagram */ - ipr->p = new_p; - } - } - - /* At this point, the validation part begins: */ - /* If we already received the last fragment */ - if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) { - /* and had no holes so far */ - if (valid) { - /* then check if the rest of the fragments is here */ - /* Check if the queue starts with the first datagram */ - if ((ipr->p == NULL) || (((struct ip_reass_helper*)ipr->p->payload)->start != 0)) { - valid = 0; - } else { - /* and check that there are no holes after this datagram */ - iprh_prev = iprh; - q = iprh->next_pbuf; - while (q != NULL) { - iprh = (struct ip_reass_helper*)q->payload; - if (iprh_prev->end != iprh->start) { - valid = 0; - break; - } - iprh_prev = iprh; - q = iprh->next_pbuf; - } - /* if still valid, all fragments are received - * (because to the MF==0 already arrived */ - if (valid) { - LWIP_ASSERT("sanity check", ipr->p != NULL); - LWIP_ASSERT("sanity check", - ((struct ip_reass_helper*)ipr->p->payload) != iprh); - LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", - iprh->next_pbuf == NULL); - LWIP_ASSERT("validate_datagram:datagram end!=datagram len", - iprh->end == ipr->datagram_len); - } - } - } - /* If valid is 0 here, there are some fragments missing in the middle - * (since MF == 0 has already arrived). Such datagrams simply time out if - * no more fragments are received... */ - return valid; - } - /* If we come here, not all fragments were received, yet! */ - return 0; /* not yet valid! */ -#if IP_REASS_CHECK_OVERLAP -freepbuf: - ip_reass_pbufcount -= pbuf_clen(new_p); - pbuf_free(new_p); - return 0; -#endif /* IP_REASS_CHECK_OVERLAP */ -} - -/** - * Reassembles incoming IP fragments into an IP datagram. - * - * @param p points to a pbuf chain of the fragment - * @return NULL if reassembly is incomplete, ? otherwise - */ -struct pbuf * -ip4_reass(struct pbuf *p) -{ - struct pbuf *r; - struct ip_hdr *fraghdr; - struct ip_reassdata *ipr; - struct ip_reass_helper *iprh; - u16_t offset, len; - u8_t clen; - - IPFRAG_STATS_INC(ip_frag.recv); - MIB2_STATS_INC(mib2.ipreasmreqds); - - fraghdr = (struct ip_hdr*)p->payload; - - if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: IP options currently not supported!\n")); - IPFRAG_STATS_INC(ip_frag.err); - goto nullreturn; - } - - offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; - len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; - - /* Check if we are allowed to enqueue more datagrams. */ - clen = pbuf_clen(p); - if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { -#if IP_REASS_FREE_OLDEST - if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || - ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) -#endif /* IP_REASS_FREE_OLDEST */ - { - /* No datagram could be freed and still too many pbufs enqueued */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", - ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); - IPFRAG_STATS_INC(ip_frag.memerr); - /* @todo: send ICMP time exceeded here? */ - /* drop this pbuf */ - goto nullreturn; - } - } - - /* Look for the datagram the fragment belongs to in the current datagram queue, - * remembering the previous in the queue for later dequeueing. */ - for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { - /* Check if the incoming fragment matches the one currently present - in the reassembly buffer. If so, we proceed with copying the - fragment into the buffer. */ - if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: matching previous fragment ID=%"X16_F"\n", - ntohs(IPH_ID(fraghdr)))); - IPFRAG_STATS_INC(ip_frag.cachehit); - break; - } - } - - if (ipr == NULL) { - /* Enqueue a new datagram into the datagram queue */ - ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); - /* Bail if unable to enqueue */ - if (ipr == NULL) { - goto nullreturn; - } - } else { - if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && - ((ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { - /* ipr->iphdr is not the header from the first fragment, but fraghdr is - * -> copy fraghdr into ipr->iphdr since we want to have the header - * of the first fragment (for ICMP time exceeded and later, for copying - * all options, if supported)*/ - SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); - } - } - /* Track the current number of pbufs current 'in-flight', in order to limit - the number of fragments that may be enqueued at any one time */ - ip_reass_pbufcount += clen; - - /* At this point, we have either created a new entry or pointing - * to an existing one */ - - /* check for 'no more fragments', and update queue entry*/ - if ((IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0) { - ipr->flags |= IP_REASS_FLAG_LASTFRAG; - ipr->datagram_len = offset + len; - LWIP_DEBUGF(IP_REASS_DEBUG, - ("ip4_reass: last fragment seen, total len %"S16_F"\n", - ipr->datagram_len)); - } - /* find the right place to insert this pbuf */ - /* @todo: trim pbufs if fragments are overlapping */ - if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) { - struct ip_reassdata *ipr_prev; - /* the totally last fragment (flag more fragments = 0) was received at least - * once AND all fragments are received */ - ipr->datagram_len += IP_HLEN; - - /* save the second pbuf before copying the header over the pointer */ - r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; - - /* copy the original ip header back to the first pbuf */ - fraghdr = (struct ip_hdr*)(ipr->p->payload); - SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); - IPH_LEN_SET(fraghdr, htons(ipr->datagram_len)); - IPH_OFFSET_SET(fraghdr, 0); - IPH_CHKSUM_SET(fraghdr, 0); - /* @todo: do we need to set/calculate the correct checksum? */ -#if CHECKSUM_GEN_IP - IF__NETIF_CHECKSUM_ENABLED(ip_current_input_netif(), NETIF_CHECKSUM_GEN_IP) { - IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); - } -#endif /* CHECKSUM_GEN_IP */ - - p = ipr->p; - - /* chain together the pbufs contained within the reass_data list. */ - while (r != NULL) { - iprh = (struct ip_reass_helper*)r->payload; - - /* hide the ip header for every succeeding fragment */ - pbuf_header(r, -IP_HLEN); - pbuf_cat(p, r); - r = iprh->next_pbuf; - } - - /* find the previous entry in the linked list */ - if (ipr == reassdatagrams) { - ipr_prev = NULL; - } else { - for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { - if (ipr_prev->next == ipr) { - break; - } - } - } - - /* release the sources allocate for the fragment queue entry */ - ip_reass_dequeue_datagram(ipr, ipr_prev); - - /* and adjust the number of pbufs currently queued for reassembly. */ - ip_reass_pbufcount -= pbuf_clen(p); - - MIB2_STATS_INC(mib2.ipreasmoks); - - /* Return the pbuf chain */ - return p; - } - /* the datagram is not (yet?) reassembled completely */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); - return NULL; - -nullreturn: - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: nullreturn\n")); - IPFRAG_STATS_INC(ip_frag.drop); - pbuf_free(p); - return NULL; -} -#endif /* IP_REASSEMBLY */ - -#if IP_FRAG -#if IP_FRAG_USES_STATIC_BUF -static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)]; -#else /* IP_FRAG_USES_STATIC_BUF */ - -#if !LWIP_NETIF_TX_SINGLE_PBUF -/** Allocate a new struct pbuf_custom_ref */ -static struct pbuf_custom_ref* -ip_frag_alloc_pbuf_custom_ref(void) -{ - return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF); -} - -/** Free a struct pbuf_custom_ref */ -static void -ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) -{ - LWIP_ASSERT("p != NULL", p != NULL); - memp_free(MEMP_FRAG_PBUF, p); -} - -/** Free-callback function to free a 'struct pbuf_custom_ref', called by - * pbuf_free. */ -static void -ipfrag_free_pbuf_custom(struct pbuf *p) -{ - struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p; - LWIP_ASSERT("pcr != NULL", pcr != NULL); - LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p); - if (pcr->original != NULL) { - pbuf_free(pcr->original); - } - ip_frag_free_pbuf_custom_ref(pcr); -} -#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */ -#endif /* IP_FRAG_USES_STATIC_BUF */ - -/** - * Fragment an IP datagram if too large for the netif. - * - * Chop the datagram in MTU sized chunks and send them in order - * by using a fixed size static memory buffer (PBUF_REF) or - * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF). - * - * @param p ip packet to send - * @param netif the netif on which to send - * @param dest destination ip address to which to send - * - * @return ERR_OK if sent successfully, err_t otherwise - */ -err_t -ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) -{ - struct pbuf *rambuf; -#if IP_FRAG_USES_STATIC_BUF - struct pbuf *header; -#else -#if !LWIP_NETIF_TX_SINGLE_PBUF - struct pbuf *newpbuf; -#endif - struct ip_hdr *original_iphdr; -#endif - struct ip_hdr *iphdr; - u16_t nfb; - u16_t left, cop; - u16_t mtu = netif->mtu; - u16_t ofo, omf; - u16_t last; - u16_t poff = IP_HLEN; - u16_t tmp; -#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF - u16_t newpbuflen = 0; - u16_t left_to_copy; -#endif - - /* Get a RAM based MTU sized pbuf */ -#if IP_FRAG_USES_STATIC_BUF - /* When using a static buffer, we use a PBUF_REF, which we will - * use to reference the packet (without link header). - * Layer and length is irrelevant. - */ - rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF); - if (rambuf == NULL) { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n")); - goto memerr; - } - rambuf->tot_len = rambuf->len = mtu; - rambuf->payload = LWIP_MEM_ALIGN((void *)buf); - - /* Copy the IP header in it */ - iphdr = (struct ip_hdr *)rambuf->payload; - SMEMCPY(iphdr, p->payload, IP_HLEN); -#else /* IP_FRAG_USES_STATIC_BUF */ - original_iphdr = (struct ip_hdr *)p->payload; - iphdr = original_iphdr; -#endif /* IP_FRAG_USES_STATIC_BUF */ - - /* Save original offset */ - tmp = ntohs(IPH_OFFSET(iphdr)); - ofo = tmp & IP_OFFMASK; - omf = tmp & IP_MF; - - left = p->tot_len - IP_HLEN; - - nfb = (mtu - IP_HLEN) / 8; - - while (left) { - last = (left <= mtu - IP_HLEN); - - /* Set new offset and MF flag */ - tmp = omf | (IP_OFFMASK & (ofo)); - if (!last) { - tmp = tmp | IP_MF; - } - - /* Fill this fragment */ - cop = last ? left : nfb * 8; - -#if IP_FRAG_USES_STATIC_BUF - poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff); -#else /* IP_FRAG_USES_STATIC_BUF */ -#if LWIP_NETIF_TX_SINGLE_PBUF - rambuf = pbuf_alloc(PBUF_IP, cop, PBUF_RAM); - if (rambuf == NULL) { - goto memerr; - } - LWIP_ASSERT("this needs a pbuf in one piece!", - (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); - poff += pbuf_copy_partial(p, rambuf->payload, cop, poff); - /* make room for the IP header */ - if (pbuf_header(rambuf, IP_HLEN)) { - pbuf_free(rambuf); - goto memerr; - } - /* fill in the IP header */ - SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); - iphdr = (struct ip_hdr*)rambuf->payload; -#else /* LWIP_NETIF_TX_SINGLE_PBUF */ - /* When not using a static buffer, create a chain of pbufs. - * The first will be a PBUF_RAM holding the link and IP header. - * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, - * but limited to the size of an mtu. - */ - rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); - if (rambuf == NULL) { - goto memerr; - } - LWIP_ASSERT("this needs a pbuf in one piece!", - (p->len >= (IP_HLEN))); - SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); - iphdr = (struct ip_hdr *)rambuf->payload; - - /* Can just adjust p directly for needed offset. */ - p->payload = (u8_t *)p->payload + poff; - p->len -= poff; - - left_to_copy = cop; - while (left_to_copy) { - struct pbuf_custom_ref *pcr; - newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; - /* Is this pbuf already empty? */ - if (!newpbuflen) { - p = p->next; - continue; - } - pcr = ip_frag_alloc_pbuf_custom_ref(); - if (pcr == NULL) { - pbuf_free(rambuf); - goto memerr; - } - /* Mirror this pbuf, although we might not need all of it. */ - newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen); - if (newpbuf == NULL) { - ip_frag_free_pbuf_custom_ref(pcr); - pbuf_free(rambuf); - goto memerr; - } - pbuf_ref(p); - pcr->original = p; - pcr->pc.custom_free_function = ipfrag_free_pbuf_custom; - - /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain - * so that it is removed when pbuf_dechain is later called on rambuf. - */ - pbuf_cat(rambuf, newpbuf); - left_to_copy -= newpbuflen; - if (left_to_copy) { - p = p->next; - } - } - poff = newpbuflen; -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ -#endif /* IP_FRAG_USES_STATIC_BUF */ - - /* Correct header */ - IPH_OFFSET_SET(iphdr, htons(tmp)); - IPH_LEN_SET(iphdr, htons(cop + IP_HLEN)); - IPH_CHKSUM_SET(iphdr, 0); -#if CHECKSUM_GEN_IP - IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) { - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); - } -#endif /* CHECKSUM_GEN_IP */ - -#if IP_FRAG_USES_STATIC_BUF - if (last) { - pbuf_realloc(rambuf, left + IP_HLEN); - } - - /* This part is ugly: we alloc a RAM based pbuf for - * the link level header for each chunk and then - * free it. A PBUF_ROM style pbuf for which pbuf_header - * worked would make things simpler. - */ - header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM); - if (header != NULL) { - pbuf_chain(header, rambuf); - netif->output(netif, header, dest); - IPFRAG_STATS_INC(ip_frag.xmit); - MIB2_STATS_INC(mib2.ipfragcreates); - pbuf_free(header); - } else { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n")); - pbuf_free(rambuf); - goto memerr; - } -#else /* IP_FRAG_USES_STATIC_BUF */ - /* No need for separate header pbuf - we allowed room for it in rambuf - * when allocated. - */ - netif->output(netif, rambuf, dest); - IPFRAG_STATS_INC(ip_frag.xmit); - - /* Unfortunately we can't reuse rambuf - the hardware may still be - * using the buffer. Instead we free it (and the ensuing chain) and - * recreate it next time round the loop. If we're lucky the hardware - * will have already sent the packet, the free will really free, and - * there will be zero memory penalty. - */ - - pbuf_free(rambuf); -#endif /* IP_FRAG_USES_STATIC_BUF */ - left -= cop; - ofo += nfb; - } -#if IP_FRAG_USES_STATIC_BUF - pbuf_free(rambuf); -#endif /* IP_FRAG_USES_STATIC_BUF */ - MIB2_STATS_INC(mib2.ipfragoks); - return ERR_OK; -memerr: - MIB2_STATS_INC(mib2.ipfragfails); - return ERR_MEM; -} -#endif /* IP_FRAG */ - -#endif /* LWIP_IPV4 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c deleted file mode 100644 index e3d1f98..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timers.c +++ /dev/null @@ -1,572 +0,0 @@ -/** - * @file - * Stack-internal timers implementation. - * This file includes timer callbacks for stack-internal timers as well as - * functions to set up or stop timers and check for expired timers. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * Simon Goldschmidt - * - */ - -#include "lwip/opt.h" - -#include "lwip/timers.h" -#include "lwip/priv/tcp_priv.h" - -#if LWIP_TIMERS - -#include "lwip/def.h" -#include "lwip/memp.h" -#include "lwip/priv/tcpip_priv.h" - -#include "lwip/ip_frag.h" -#include "netif/etharp.h" -#include "lwip/dhcp.h" -#include "lwip/autoip.h" -#include "lwip/igmp.h" -#include "lwip/dns.h" -#include "lwip/nd6.h" -#include "lwip/ip6_frag.h" -#include "lwip/mld6.h" -#include "lwip/sys.h" -#include "lwip/pbuf.h" -#include "lwip/alg.h" - -#define MAX_TIMEO_SIZE 5 -/** The one and only timeout list */ -static struct sys_timeo *next_timeout[MAX_TIMEO_SIZE]; -#if NO_SYS -static u32_t timeouts_last_time; -#endif /* NO_SYS */ - -#if LWIP_TCP -/** global variable that shows if the tcp timer is currently scheduled or not */ -static int tcpip_tcp_timer_active; - -/** - * Timer callback function that calls tcp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -tcpip_tcp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - - /* call TCP timer handler */ - tcp_tmr(); - /* timer still needed? */ - if (tcp_active_pcbs || tcp_tw_pcbs) { - /* restart timer */ - sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); - } else { - /* disable timer */ - tcpip_tcp_timer_active = 0; - } -} - -/** - * Called from TCP_REG when registering a new PCB: - * the reason is to have the TCP timer only running when - * there are active (or time-wait) PCBs. - */ -void -tcp_timer_needed(void) -{ - /* timer is off but needed again? */ - if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { - /* enable and start timer */ - tcpip_tcp_timer_active = 1; - sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); - } -} -#endif /* LWIP_TCP */ - -#if LWIP_IPV4 -#if IP_REASSEMBLY -/** - * Timer callback function that calls ip_reass_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -ip_reass_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: ip_reass_tmr()\n")); - ip_reass_tmr(); - sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); -} -#endif /* IP_REASSEMBLY */ - -#if LWIP_ARP -/** - * Timer callback function that calls etharp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -arp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n")); - etharp_tmr(); - sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); -} -#endif /* LWIP_ARP */ - -#if LWIP_DHCP -/** - * Timer callback function that calls dhcp_coarse_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dhcp_timer_coarse(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n")); - dhcp_coarse_tmr(); - sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); -} - -/** - * Timer callback function that calls dhcp_fine_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dhcp_timer_fine(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n")); - dhcp_fine_tmr(); - sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); -} -#endif /* LWIP_DHCP */ - -#if LWIP_AUTOIP -/** - * Timer callback function that calls autoip_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -autoip_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: autoip_tmr()\n")); - autoip_tmr(); - sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); -} -#endif /* LWIP_AUTOIP */ - -#if LWIP_IGMP -/** - * Timer callback function that calls igmp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -igmp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: igmp_tmr()\n")); - igmp_tmr(); - sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); -} -#endif /* LWIP_IGMP */ -#endif /* LWIP_IPV4 */ - -#if LWIP_DNS -/** - * Timer callback function that calls dns_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dns_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dns_tmr()\n")); - dns_tmr(); - sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); -} -#endif /* LWIP_DNS */ - -#if LWIP_IPV6 -/** - * Timer callback function that calls nd6_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -nd6_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: nd6_tmr()\n")); - nd6_tmr(); - sys_timeout(ND6_TMR_INTERVAL, nd6_timer, NULL); -} - -#if LWIP_IPV6_REASS -/** - * Timer callback function that calls ip6_reass_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -ip6_reass_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: ip6_reass_tmr()\n")); - ip6_reass_tmr(); - sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timer, NULL); -} -#endif /* LWIP_IPV6_REASS */ - -#if LWIP_IPV6_MLD -/** - * Timer callback function that calls mld6_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -mld6_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: mld6_tmr()\n")); - mld6_tmr(); - sys_timeout(MLD6_TMR_INTERVAL, mld6_timer, NULL); -} -#endif /* LWIP_IPV6_MLD */ -#endif /* LWIP_IPV6 */ - -/** Initialize this module */ -void sys_timeouts_init(void) -{ -#if LWIP_IPV4 -#if IP_REASSEMBLY - sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); -#endif /* IP_REASSEMBLY */ -#if LWIP_ARP - sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); -#endif /* LWIP_ARP */ -#if LWIP_DHCP - sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); - sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); -#endif /* LWIP_DHCP */ -#if LWIP_AUTOIP - sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); -#endif /* LWIP_AUTOIP */ -#if LWIP_IGMP - sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); -#endif /* LWIP_IGMP */ -#endif /* LWIP_IPV4 */ -#if LWIP_DNS - sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); -#endif /* LWIP_DNS */ -#if LWIP_IPV6 - sys_timeout(ND6_TMR_INTERVAL, nd6_timer, NULL); -#if LWIP_IPV6_REASS - sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timer, NULL); -#endif /* LWIP_IPV6_REASS */ -#if LWIP_IPV6_MLD - sys_timeout(MLD6_TMR_INTERVAL, mld6_timer, NULL); -#endif /* LWIP_IPV6_MLD */ -#endif /* LWIP_IPV6 */ - -#if NO_SYS - /* Initialise timestamp for sys_check_timeouts */ - timeouts_last_time = sys_now(); -#endif -} - -/** - * Create a one-shot timer (aka timeout). Timeouts are processed in the - * following cases: - * - while waiting for a message using sys_timeouts_mbox_fetch() - * - by calling sys_check_timeouts() (NO_SYS==1 only) - * - * @param msecs time in milliseconds after that the timer should expire - * @param handler callback function to call when msecs have elapsed - * @param arg argument to pass to the callback function - */ -#if LWIP_DEBUG_TIMERNAMES -void -sys_timeout_debug_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name) -#else /* LWIP_DEBUG_TIMERNAMES */ -void -sys_timeout_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg) -#endif /* LWIP_DEBUG_TIMERNAMES */ -{ - struct sys_timeo *timeout, *t; - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); - if (timeout == NULL) { - LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); - return; - } - timeout->next = NULL; - timeout->h = handler; - timeout->arg = arg; - timeout->time = msecs; -#if LWIP_DEBUG_TIMERNAMES - timeout->handler_name = handler_name; - LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n", - (void *)timeout, msecs, handler_name, (void *)arg)); -#endif /* LWIP_DEBUG_TIMERNAMES */ - - if (*timeo == NULL) { - *timeo = timeout; - return; - } - - if ((*timeo)->time > msecs) { - (*timeo)->time -= msecs; - timeout->next = *timeo; - *timeo = timeout; - } else { - for(t = *timeo; t != NULL; t = t->next) { - timeout->time -= t->time; - if (t->next == NULL || t->next->time > timeout->time) { - if (t->next != NULL) { - t->next->time -= timeout->time; - } - timeout->next = t->next; - t->next = timeout; - break; - } - } - } -} - -/** - * Go through timeout list (for this task only) and remove the first matching - * entry (subsequent entries remain untouched), even though the timeout has not - * triggered yet. - * - * @param handler callback function that would be called by the timeout - * @param arg callback argument that would be passed to handler -*/ -void -sys_untimeout_p(u8 timeo_assigned, sys_timeout_handler handler, void *arg) -{ - struct sys_timeo *prev_t, *t; - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - - if (*timeo == NULL) { - return; - } - - for (t = *timeo, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { - if ((t->h == handler) && (t->arg == arg)) { - /* We have a match */ - /* Unlink from previous in list */ - if (prev_t == NULL) { - *timeo = t->next; - } else { - prev_t->next = t->next; - } - /* If not the last one, add time of this one back to next */ - if (t->next != NULL) { - t->next->time += t->time; - } - memp_free(MEMP_SYS_TIMEOUT, t); - return; - } - } - return; -} - -#if NO_SYS - -/** Handle timeouts for NO_SYS==1 (i.e. without using - * tcpip_thread/sys_timeouts_mbox_fetch(). Uses sys_now() to call timeout - * handler functions when timeouts expire. - * - * Must be called periodically from your main loop. - */ -void -sys_check_timeouts(void) -{ - struct sys_timeo **timeo = &next_timeout[0]; - if (*timeo) { - struct sys_timeo *tmptimeout; - u32_t diff; - sys_timeout_handler handler; - void *arg; - u8_t had_one; - u32_t now; - - now = sys_now(); - /* this cares for wraparounds */ - diff = now - timeouts_last_time; - do - { -#if PBUF_POOL_FREE_OOSEQ - PBUF_CHECK_FREE_OOSEQ(); -#endif /* PBUF_POOL_FREE_OOSEQ */ - had_one = 0; - tmptimeout = *timeo; - if (tmptimeout && (tmptimeout->time <= diff)) { - /* timeout has expired */ - had_one = 1; - timeouts_last_time = now; - diff -= tmptimeout->time; - *timeo = tmptimeout->next; - handler = tmptimeout->h; - arg = tmptimeout->arg; -#if LWIP_DEBUG_TIMERNAMES - if (handler != NULL) { - LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n", - tmptimeout->handler_name, arg)); - } -#endif /* LWIP_DEBUG_TIMERNAMES */ - memp_free(MEMP_SYS_TIMEOUT, tmptimeout); - if (handler != NULL) { - handler(arg); - } - } - /* repeat until all expired timers have been called */ - }while(had_one); - } -} - -/** Set back the timestamp of the last call to sys_check_timeouts() - * This is necessary if sys_check_timeouts() hasn't been called for a long - * time (e.g. while saving energy) to prevent all timer functions of that - * period being called. - */ -void -sys_restart_timeouts(void) -{ - timeouts_last_time = sys_now(); -} - -/** Return the time left before the next timeout is due. If no timeouts are - * enqueued, returns 0xffffffff - */ -u32_t -sys_timeouts_sleeptime(void) -{ - u32_t diff; - if (next_timeout == NULL) { - return 0xffffffff; - } - diff = sys_now() - timeouts_last_time; - if (diff > next_timeout->time) { - return 0; - } else { - return next_timeout->time - diff; - } -} - -#else /* NO_SYS */ - -/** - * Wait (forever) for a message to arrive in an mbox. - * While waiting, timeouts are processed. - * - * @param mbox the mbox to fetch the message from - * @param msg the place to store the message - */ -void -sys_timeouts_mbox_fetch_p(u8 timeo_assigned, sys_mbox_t mbox, void **msg) -{ - u32_t time_needed; - struct sys_timeo *tmptimeout; - sys_timeout_handler handler; - void *arg; - - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - - again: - if (!(*timeo)) { - time_needed = sys_arch_mbox_fetch(&mbox, msg, 0); - } else { - if ((*timeo)->time > 0) { - time_needed = sys_arch_mbox_fetch(&mbox, msg, (*timeo)->time); - } else { - time_needed = SYS_ARCH_TIMEOUT; - } - - if (time_needed == SYS_ARCH_TIMEOUT) { - /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message - could be fetched. We should now call the timeout handler and - deallocate the memory allocated for the timeout. */ - tmptimeout = *timeo; - *timeo = tmptimeout->next; - handler = tmptimeout->h; - arg = tmptimeout->arg; -#if LWIP_DEBUG_TIMERNAMES - if (handler != NULL) { - LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n", - tmptimeout->handler_name, arg)); - } -#endif /* LWIP_DEBUG_TIMERNAMES */ - memp_free(MEMP_SYS_TIMEOUT, tmptimeout); - if (handler != NULL) { - /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the - timeout handler function. */ - LOCK_TCPIP_CORE(); - handler(arg); - UNLOCK_TCPIP_CORE(); - } - LWIP_TCPIP_THREAD_ALIVE(); - - /* We try again to fetch a message from the mbox. */ - goto again; - } else { - /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout - occured. The time variable is set to the number of - milliseconds we waited for the message. */ - if (time_needed < (*timeo)->time) { - (*timeo)->time -= time_needed; - } else { - (*timeo)->time = 0; - } - } - } -} - -#endif /* NO_SYS */ - -#else /* LWIP_TIMERS */ -/* Satisfy the TCP code which calls this function */ -void -tcp_timer_needed(void) -{ -} -#endif /* LWIP_TIMERS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h deleted file mode 100644 index 94b38b4..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/arch.h +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef LWIP_HDR_ARCH_H -#define LWIP_HDR_ARCH_H - -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#endif - -#ifndef BIG_ENDIAN -#define BIG_ENDIAN 4321 -#endif - -#include "arch/cc.h" -#include - -/** Temporary: define format string for size_t if not defined in cc.h */ -#ifndef SZT_F -#define SZT_F U32_F -#endif /* SZT_F */ -/** Temporary upgrade helper: define format string for u8_t as hex if not - defined in cc.h */ -#ifndef X8_F -#define X8_F "02x" -#endif /* X8_F */ - -/** Define this to 1 in arch/cc.h of your port if your compiler does not provide - * the limits.h header. You need to define the type limits yourself in this case - * (e.g. INT_MAX). - */ -#ifndef LWIP_NO_LIMITS_H -#define LWIP_NO_LIMITS_H 0 -#endif - -/* Include limits.h? */ -#if !LWIP_NO_LIMITS_H -#include -#endif - -/** C++ const_cast(val) equivalent to remove constness from a value (GCC -Wcast-qual) */ -#ifndef LWIP_CONST_CAST -#define LWIP_CONST_CAST(target_type, val) ((target_type)(val)) -#endif - -/** Get rid of alignment cast warnings (GCC -Wcast-align) */ -#ifndef LWIP_ALIGNMENT_CAST -#define LWIP_ALIGNMENT_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) -#endif - -/** Get rid of warnings related to pointer-to-numeric and vice-versa casts, - * e.g. "conversion from 'u8_t' to 'void *' of greater size" - */ -#ifndef LWIP_PTR_NUMERIC_CAST -#define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) -#endif - -/** Allocates a memory buffer of specified size that is of sufficient size to align - * its start address using LWIP_MEM_ALIGN. - * You can declare your own version here e.g. to enforce alignment without adding - * trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement - * requirements.\n - * e.g. if you use gcc and need 32 bit alignment:\n - * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \_\_attribute\_\_((aligned(4)))\n - * or more portable:\n - * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] - */ -#ifndef LWIP_DECLARE_MEMORY_ALIGNED -#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)] -#endif - -/** Calculate memory size for an aligned buffer - returns the next highest - * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and - * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). - */ -#ifndef LWIP_MEM_ALIGN_SIZE -#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1U) & ~(MEM_ALIGNMENT-1U)) -#endif - -/** Calculate safe memory size for an aligned buffer when using an unaligned - * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the - * start (e.g. if buffer is u8_t[] and actual data will be u32_t*) - */ -#ifndef LWIP_MEM_ALIGN_BUFFER -#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1U)) -#endif - -/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT - * so that ADDR % MEM_ALIGNMENT == 0 - */ -#ifndef LWIP_MEM_ALIGN -#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) -#endif -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef PACK_STRUCT_BEGIN -#define PACK_STRUCT_BEGIN -#endif /* PACK_STRUCT_BEGIN */ - -#ifndef PACK_STRUCT_END -#define PACK_STRUCT_END -#endif /* PACK_STRUCT_END */ - -#ifndef PACK_STRUCT_STRUCT -#define PACK_STRUCT_STRUCT -#endif /* PACK_STRUCT_STRUCT */ - -#ifndef PACK_STRUCT_FIELD -#define PACK_STRUCT_FIELD(x) x -#endif /* PACK_STRUCT_FIELD */ - -/* Used for struct fields of u8_t, - * where some compilers warn that packing is not necessary */ -#ifndef PACK_STRUCT_FLD_8 -#define PACK_STRUCT_FLD_8(x) PACK_STRUCT_FIELD(x) -#endif /* PACK_STRUCT_FLD_8 */ - -/* Used for struct fields of that are packed structs themself, - * where some compilers warn that packing is not necessary */ -#ifndef PACK_STRUCT_FLD_S -#define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x) -#endif /* PACK_STRUCT_FLD_S */ - - -#ifndef LWIP_UNUSED_ARG -#define LWIP_UNUSED_ARG(x) (void)x -#endif /* LWIP_UNUSED_ARG */ - - -#ifdef LWIP_PROVIDE_ERRNO - -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Arg list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No child processes */ -#define EAGAIN 11 /* Try again */ -#ifdef ENOMEM -#undef ENOMEM -#endif -#define ENOMEM 12 /* Out of memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#ifdef EINVAL -#undef EINVAL -#endif -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* File table overflow */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#ifdef EDOM -#undef EDOM -#endif -#define EDOM 33 /* Math argument out of domain of func */ -#ifdef ERANGE -#undef ERANGE -#endif -#define ERANGE 34 /* Math result not representable */ -#define EDEADLK 35 /* Resource deadlock would occur */ -#define ENAMETOOLONG 36 /* File name too long */ -#define ENOLCK 37 /* No record locks available */ -#define ENOSYS 38 /* Function not implemented */ -#define ENOTEMPTY 39 /* Directory not empty */ -#define ELOOP 40 /* Too many symbolic links encountered */ -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define ENOMSG 42 /* No message of desired type */ -#define EIDRM 43 /* Identifier removed */ -#define ECHRNG 44 /* Channel number out of range */ -#define EL2NSYNC 45 /* Level 2 not synchronized */ -#define EL3HLT 46 /* Level 3 halted */ -#define EL3RST 47 /* Level 3 reset */ -#define ELNRNG 48 /* Link number out of range */ -#define EUNATCH 49 /* Protocol driver not attached */ -#define ENOCSI 50 /* No CSI structure available */ -#define EL2HLT 51 /* Level 2 halted */ -#define EBADE 52 /* Invalid exchange */ -#define EBADR 53 /* Invalid request descriptor */ -#define EXFULL 54 /* Exchange full */ -#define ENOANO 55 /* No anode */ -#define EBADRQC 56 /* Invalid request code */ -#define EBADSLT 57 /* Invalid slot */ - -#define EDEADLOCK EDEADLK - -#define EBFONT 59 /* Bad font file format */ -#define ENOSTR 60 /* Device not a stream */ -#define ENODATA 61 /* No data available */ -#define ETIME 62 /* Timer expired */ -#define ENOSR 63 /* Out of streams resources */ -#define ENONET 64 /* Machine is not on the network */ -#define ENOPKG 65 /* Package not installed */ -#define EREMOTE 66 /* Object is remote */ -#define ENOLINK 67 /* Link has been severed */ -#define EADV 68 /* Advertise error */ -#define ESRMNT 69 /* Srmount error */ -#define ECOMM 70 /* Communication error on send */ -#define EPROTO 71 /* Protocol error */ -#define EMULTIHOP 72 /* Multihop attempted */ -#define EDOTDOT 73 /* RFS specific error */ -#define EBADMSG 74 /* Not a data message */ -#define EOVERFLOW 75 /* Value too large for defined data type */ -#define ENOTUNIQ 76 /* Name not unique on network */ -#define EBADFD 77 /* File descriptor in bad state */ -#define EREMCHG 78 /* Remote address changed */ -#define ELIBACC 79 /* Can not access a needed shared library */ -#define ELIBBAD 80 /* Accessing a corrupted shared library */ -#define ELIBSCN 81 /* .lib section in a.out corrupted */ -#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ -#define ELIBEXEC 83 /* Cannot exec a shared library directly */ -#ifdef EILSEQ -#undef EILSEQ -#endif -#define EILSEQ 84 /* Illegal byte sequence */ -#define ERESTART 85 /* Interrupted system call should be restarted */ -#define ESTRPIPE 86 /* Streams pipe error */ -#define EUSERS 87 /* Too many users */ -#define ENOTSOCK 88 /* Socket operation on non-socket */ -#define EDESTADDRREQ 89 /* Destination address required */ -#define EMSGSIZE 90 /* Message too long */ -#define EPROTOTYPE 91 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 92 /* Protocol not available */ -#define EPROTONOSUPPORT 93 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define EPFNOSUPPORT 96 /* Protocol family not supported */ -#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ -#define EADDRINUSE 98 /* Address already in use */ -#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ -#define ENETDOWN 100 /* Network is down */ -#define ENETUNREACH 101 /* Network is unreachable */ -#define ENETRESET 102 /* Network dropped connection because of reset */ -#define ECONNABORTED 103 /* Software caused connection abort */ -#define ECONNRESET 104 /* Connection reset by peer */ -#define ENOBUFS 105 /* No buffer space available */ -#define EISCONN 106 /* Transport endpoint is already connected */ -#define ENOTCONN 107 /* Transport endpoint is not connected */ -#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ -#define ETOOMANYREFS 109 /* Too many references: cannot splice */ -#define ETIMEDOUT 110 /* Connection timed out */ -#define ECONNREFUSED 111 /* Connection refused */ -#define EHOSTDOWN 112 /* Host is down */ -#define EHOSTUNREACH 113 /* No route to host */ -#define EALREADY 114 /* Operation already in progress */ -#define EINPROGRESS 115 /* Operation now in progress */ -#define ESTALE 116 /* Stale NFS file handle */ -#define EUCLEAN 117 /* Structure needs cleaning */ -#define ENOTNAM 118 /* Not a XENIX named type file */ -#define ENAVAIL 119 /* No XENIX semaphores available */ -#define EISNAM 120 /* Is a named type file */ -#define EREMOTEIO 121 /* Remote I/O error */ -#define EDQUOT 122 /* Quota exceeded */ - -#define ENOMEDIUM 123 /* No medium found */ -#define EMEDIUMTYPE 124 /* Wrong medium type */ - -#ifndef errno -extern int errno; -#endif - -#endif /* LWIP_PROVIDE_ERRNO */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_HDR_ARCH_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h deleted file mode 100644 index 6626dbe..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pppapi.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#ifndef __LWIP_PPPAPI_H__ -#define __LWIP_PPPAPI_H__ - -#include "lwip/opt.h" - -#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/sys.h" -#include "lwip/netif.h" -#include "netif/ppp/ppp.h" -#if PPPOS_SUPPORT -#include "netif/ppp/pppos.h" -#endif /* PPPOS_SUPPORT */ - -#ifdef __cplusplus -extern "C" { -#endif - -struct pppapi_msg_msg { -#if !LWIP_TCPIP_CORE_LOCKING - sys_sem_t sem; -#endif /* !LWIP_TCPIP_CORE_LOCKING */ - err_t err; - ppp_pcb *ppp; - union { - struct { - u8_t authtype; - const char *user; - const char *passwd; - } setauth; -#if PPP_NOTIFY_PHASE - struct { - ppp_notify_phase_cb_fn notify_phase_cb; - } setnotifyphasecb; -#endif /* PPP_NOTIFY_PHASE */ -#if PPPOS_SUPPORT - struct { - struct netif *pppif; - pppos_output_cb_fn output_cb; - ppp_link_status_cb_fn link_status_cb; - void *ctx_cb; - } serialcreate; -#endif /* PPPOS_SUPPORT */ -#if PPPOE_SUPPORT - struct { - struct netif *pppif; - struct netif *ethif; - const char *service_name; - const char *concentrator_name; - ppp_link_status_cb_fn link_status_cb; - void *ctx_cb; - } ethernetcreate; -#endif /* PPPOE_SUPPORT */ -#if PPPOL2TP_SUPPORT - struct { - struct netif *pppif; - struct netif *netif; - ip_addr_t *ipaddr; - u16_t port; -#if PPPOL2TP_AUTH_SUPPORT - const u8_t *secret; - u8_t secret_len; -#endif /* PPPOL2TP_AUTH_SUPPORT */ - ppp_link_status_cb_fn link_status_cb; - void *ctx_cb; - } l2tpcreate; -#endif /* PPPOL2TP_SUPPORT */ - struct { - u16_t holdoff; - } connect; -#if PPP_SERVER - struct { - struct ppp_addrs *addrs; - } listen; -#endif /* PPP_SERVER */ - struct { - u8_t nocarrier; - } close; - struct { - u8_t cmd; - void *arg; - } ioctl; - } msg; -}; - -struct pppapi_msg { - void (* function)(struct pppapi_msg_msg *msg); - struct pppapi_msg_msg msg; -}; - -/* API for application */ -void pppapi_set_default(ppp_pcb *pcb); -void pppapi_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd); -#if PPP_NOTIFY_PHASE -void pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb); -#endif /* PPP_NOTIFY_PHASE */ -#if PPPOS_SUPPORT -ppp_pcb *pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb); -#endif /* PPPOS_SUPPORT */ -#if PPPOE_SUPPORT -ppp_pcb *pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name, - const char *concentrator_name, ppp_link_status_cb_fn link_status_cb, - void *ctx_cb); -#endif /* PPPOE_SUPPORT */ -#if PPPOL2TP_SUPPORT -ppp_pcb *pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port, - const u8_t *secret, u8_t secret_len, - ppp_link_status_cb_fn link_status_cb, void *ctx_cb); -#endif /* PPPOL2TP_SUPPORT */ -err_t pppapi_connect(ppp_pcb *pcb, u16_t holdoff); -#if PPP_SERVER -err_t pppapi_listen(ppp_pcb *pcb, struct ppp_addrs *addrs); -#endif /* PPP_SERVER */ -err_t pppapi_close(ppp_pcb *pcb, u8_t nocarrier); -err_t pppapi_free(ppp_pcb *pcb); -err_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_PPP_API */ - -#endif /* __LWIP_PPPAPI_H__ */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h deleted file mode 100644 index 60762c8..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timers.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * Simon Goldschmidt - * - */ -#ifndef LWIP_HDR_TIMERS_H -#define LWIP_HDR_TIMERS_H - -#include "lwip/opt.h" - -/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */ -#undef LWIP_TIMERS -#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) - -#if LWIP_TIMERS - -#include "lwip/err.h" -#if !NO_SYS -#include "lwip/sys.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef LWIP_DEBUG_TIMERNAMES -#ifdef LWIP_DEBUG -#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG -#else /* LWIP_DEBUG */ -#define LWIP_DEBUG_TIMERNAMES 0 -#endif /* LWIP_DEBUG*/ -#endif - -/** Function prototype for a timeout callback function. Register such a function - * using sys_timeout(). - * - * @param arg Additional argument to pass to the function - set up by sys_timeout() - */ -typedef void (* sys_timeout_handler)(void *arg); - -struct sys_timeo { - struct sys_timeo *next; - u32_t time; - sys_timeout_handler h; - void *arg; -#if LWIP_DEBUG_TIMERNAMES - const char* handler_name; -#endif /* LWIP_DEBUG_TIMERNAMES */ -}; - -void sys_timeouts_init(void); - -#if LWIP_DEBUG_TIMERNAMES -void sys_timeout_debug_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); -#define sys_timeout_p(timeo_assigned, msecs, handler, arg) sys_timeout_debug_p(timeo_assigned, msecs, handler, arg, #handler) -#define sys_timeout(msecs, handler, arg) sys_timeout_p(0, msecs, handler, arg) -#else /* LWIP_DEBUG_TIMERNAMES */ -void sys_timeout_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg); -#define sys_timeout(msecs, handler, arg) sys_timeout_p(0, msecs, handler, arg) -#endif /* LWIP_DEBUG_TIMERNAMES */ - -void sys_untimeout_p(u8 timeo_assigned, sys_timeout_handler handler, void *arg); -#define sys_untimeout(handler, arg) sys_untimeout_p(0, handler, arg) -#if NO_SYS -void sys_check_timeouts(void); -void sys_restart_timeouts(void); -u32_t sys_timeouts_sleeptime(void); -#else /* NO_SYS */ -void sys_timeouts_mbox_fetch_p(u8 timeo_assigned, sys_mbox_t mbox, void **msg); -#define sys_timeouts_mbox_fetch(mbox, msg) sys_timeouts_mbox_fetch_p(0, mbox, msg) -#endif /* NO_SYS */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_TIMERS */ -#endif /* LWIP_HDR_TIMERS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c deleted file mode 100644 index 9a84cbc..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/lowpan6.c +++ /dev/null @@ -1,1193 +0,0 @@ -/** - * @file - * - * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. - */ - -/* - * Copyright (c) 2015 Inico Technologies Ltd. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -/** - * @defgroup sixlowpan 6LowPAN netif - * @ingroup addons - * 6LowPAN netif implementation - */ - -#include "netif/lowpan6.h" - -#if LWIP_IPV6 && LWIP_6LOWPAN - -#include "lwip/ip.h" -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" -#include "lwip/nd6.h" -#include "lwip/mem.h" -#include "lwip/udp.h" -#include "lwip/tcpip.h" -#include "lwip/snmp.h" - -#include - -struct ieee_802154_addr { - u8_t addr_len; - u8_t addr[8]; -}; - -/** This is a helper struct. - */ -struct lowpan6_reass_helper { - struct pbuf *pbuf; - struct lowpan6_reass_helper *next_packet; - u8_t timer; - struct ieee_802154_addr sender_addr; - u16_t datagram_size; - u16_t datagram_tag; -}; - -static struct lowpan6_reass_helper * reass_list; - -#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 -static ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS]; -#endif - -static u16_t ieee_802154_pan_id; - -static const struct ieee_802154_addr ieee_802154_broadcast = {2, {0xff, 0xff}}; - -#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS -static struct ieee_802154_addr short_mac_addr = {2, {0,0}}; -#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ - -static err_t dequeue_datagram(struct lowpan6_reass_helper *lrh); - -/** - * Periodic timer for 6LowPAN functions: - * - * - Remove incomplete/old packets - */ -void -lowpan6_tmr(void) -{ - struct lowpan6_reass_helper *lrh, *lrh_temp; - - lrh = reass_list; - while (lrh != NULL) { - lrh_temp = lrh->next_packet; - if ((--lrh->timer) == 0) { - dequeue_datagram(lrh); - pbuf_free(lrh->pbuf); - mem_free(lrh); - } - lrh = lrh_temp; - } -} - -/** - * Removes a datagram from the reassembly queue. - **/ -static err_t -dequeue_datagram(struct lowpan6_reass_helper *lrh) -{ - struct lowpan6_reass_helper *lrh_temp; - - if (reass_list == lrh) { - reass_list = reass_list->next_packet; - } else { - lrh_temp = reass_list; - while (lrh_temp != NULL) { - if (lrh_temp->next_packet == lrh) { - lrh_temp->next_packet = lrh->next_packet; - break; - } - lrh_temp = lrh_temp->next_packet; - } - } - - return ERR_OK; -} - -static s8_t -lowpan6_context_lookup(const ip6_addr_t *ip6addr) -{ - s8_t i; - - for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) { - if (ip6_addr_netcmp(&lowpan6_context[i], ip6addr)) { - return i; - } - } - - return -1; -} - -/* Determine compression mode for unicast address. */ -static s8_t -lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct ieee_802154_addr *mac_addr) -{ - if (mac_addr->addr_len == 2) { - if ((ip6addr->addr[2] == (u32_t)PP_HTONL(0x000000ff)) && - ((ip6addr->addr[3] & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000))) { - if ((ip6addr->addr[3] & PP_HTONL(0x0000ffff)) == lwip_ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) { - return 3; - } - } - } else if (mac_addr->addr_len == 8) { - if ((ip6addr->addr[2] == lwip_ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) && - (ip6addr->addr[3] == lwip_ntohl((mac_addr->addr[4] << 24) | (mac_addr->addr[5] << 16) | mac_addr->addr[6] << 8 | mac_addr->addr[7]))) { - return 3; - } - } - - if ((ip6addr->addr[2] == PP_HTONL(0x000000ffUL)) && - ((ip6addr->addr[3] & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000UL))) { - return 2; - } - - return 1; -} - -/* Determine compression mode for multicast address. */ -static s8_t -lowpan6_get_address_mode_mc(const ip6_addr_t *ip6addr) -{ - if ((ip6addr->addr[0] == PP_HTONL(0xff020000)) && - (ip6addr->addr[1] == 0) && - (ip6addr->addr[2] == 0) && - ((ip6addr->addr[3] & PP_HTONL(0xffffff00)) == 0)) { - return 3; - } else if (((ip6addr->addr[0] & PP_HTONL(0xff00ffff)) == PP_HTONL(0xff000000)) && - (ip6addr->addr[1] == 0)) { - if ((ip6addr->addr[2] == 0) && - ((ip6addr->addr[3] & PP_HTONL(0xff000000)) == 0)) { - return 2; - } else if ((ip6addr->addr[2] & PP_HTONL(0xffffff00)) == 0) { - return 1; - } - } - - return 0; -} - -/* - * Encapsulates data into IEEE 802.15.4 frames. - * Fragments an IPv6 datagram into 6LowPAN units, which fit into IEEE 802.15.4 frames. - * If configured, will compress IPv6 and or UDP headers. - * */ -static err_t -lowpan6_frag(struct netif *netif, struct pbuf *p, const struct ieee_802154_addr *src, const struct ieee_802154_addr *dst) -{ - struct pbuf * p_frag; - u16_t frag_len, remaining_len; - u8_t * buffer; - u8_t ieee_header_len; - u8_t lowpan6_header_len; - s8_t i; - static u8_t frame_seq_num; - static u16_t datagram_tag; - u16_t datagram_offset; - err_t err = ERR_IF; - - /* We'll use a dedicated pbuf for building 6LowPAN fragments. */ - p_frag = pbuf_alloc(PBUF_RAW, 127, PBUF_RAM); - if (p_frag == NULL) { - MIB2_STATS_NETIF_INC(netif, ifoutdiscards); - return ERR_MEM; - } - - /* Write IEEE 802.15.4 header. */ - buffer = (u8_t*)p_frag->payload; - ieee_header_len = 0; - if (dst == &ieee_802154_broadcast) { - buffer[ieee_header_len++] = 0x01; /* data packet, no ack required. */ - } else { - buffer[ieee_header_len++] = 0x21; /* data packet, ack required. */ - } - buffer[ieee_header_len] = (0x00 << 4); /* 2003 frame version */ - buffer[ieee_header_len] |= (dst->addr_len == 2) ? (0x02 << 2) : (0x03 << 2); /* destination addressing mode */ - buffer[ieee_header_len] |= (src->addr_len == 2) ? (0x02 << 6) : (0x03 << 6); /* source addressing mode */ - ieee_header_len++; - buffer[ieee_header_len++] = frame_seq_num++; - - buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */ - buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */ - i = dst->addr_len; - while (i-- > 0) { - buffer[ieee_header_len++] = dst->addr[i]; - } - - buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */ - buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */ - i = src->addr_len; - while (i-- > 0) { - buffer[ieee_header_len++] = src->addr[i]; - } - -#if LWIP_6LOWPAN_IPHC - /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */ - { - struct ip6_hdr *ip6hdr; - - /* Point to ip6 header and align copies of src/dest addresses. */ - ip6hdr = (struct ip6_hdr *)p->payload; - ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest); - ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src); - - /* Basic length of 6LowPAN header, set dispatch and clear fields. */ - lowpan6_header_len = 2; - buffer[ieee_header_len] = 0x60; - buffer[ieee_header_len + 1] = 0; - - /* Determine whether there will be a Context Identifier Extension byte or not. - * If so, set it already. */ -#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 - buffer[ieee_header_len + 2] = 0; - - i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_src)); - if (i >= 0) { - /* Stateful source address compression. */ - buffer[ieee_header_len + 1] |= 0x40; - buffer[ieee_header_len + 2] |= (i & 0x0f) << 4; - } - - i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_dest)); - if (i >= 0) { - /* Stateful destination address compression. */ - buffer[ieee_header_len + 1] |= 0x04; - buffer[ieee_header_len + 2] |= i & 0x0f; - } - - if (buffer[ieee_header_len + 2] != 0x00) { - /* Context identifier extension byte is appended. */ - buffer[ieee_header_len + 1] |= 0x80; - lowpan6_header_len++; - } -#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */ - - /* Determine TF field: Traffic Class, Flow Label */ - if (IP6H_FL(ip6hdr) == 0) { - /* Flow label is elided. */ - buffer[ieee_header_len] |= 0x10; - if (IP6H_TC(ip6hdr) == 0) { - /* Traffic class (ECN+DSCP) elided too. */ - buffer[ieee_header_len] |= 0x08; - } else { - /* Traffic class (ECN+DSCP) appended. */ - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr); - } - } else { - if (((IP6H_TC(ip6hdr) & 0x3f) == 0)) { - /* DSCP portion of Traffic Class is elided, ECN and FL are appended (3 bytes) */ - buffer[ieee_header_len] |= 0x08; - - buffer[ieee_header_len + lowpan6_header_len] = IP6H_TC(ip6hdr) & 0xc0; - buffer[ieee_header_len + lowpan6_header_len++] |= (IP6H_FL(ip6hdr) >> 16) & 0x0f; - buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff; - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff; - } else { - /* Traffic class and flow label are appended (4 bytes) */ - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr); - buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 16) & 0x0f; - buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff; - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff; - } - } - - /* Compress NH? - * Only if UDP for now. @todo support other NH compression. */ - if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) { - buffer[ieee_header_len] |= 0x04; - } else { - /* append nexth. */ - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_NEXTH(ip6hdr); - } - - /* Compress hop limit? */ - if (IP6H_HOPLIM(ip6hdr) == 255) { - buffer[ieee_header_len] |= 0x03; - } else if (IP6H_HOPLIM(ip6hdr) == 64) { - buffer[ieee_header_len] |= 0x02; - } else if (IP6H_HOPLIM(ip6hdr) == 1) { - buffer[ieee_header_len] |= 0x01; - } else { - /* append hop limit */ - buffer[ieee_header_len + lowpan6_header_len++] = IP6H_HOPLIM(ip6hdr); - } - - /* Compress source address */ - if (((buffer[ieee_header_len + 1] & 0x40) != 0) || - (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_src)))) { - /* Context-based or link-local source address compression. */ - i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_src), src); - buffer[ieee_header_len + 1] |= (i & 0x03) << 4; - if (i == 1) { - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 16, 8); - lowpan6_header_len += 8; - } else if (i == 2) { - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 22, 2); - lowpan6_header_len += 2; - } - } else if (ip6_addr_isany(ip_2_ip6(&ip_data.current_iphdr_src))) { - /* Special case: mark SAC and leave SAM=0 */ - buffer[ieee_header_len + 1] |= 0x40; - } else { - /* Append full address. */ - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 8, 16); - lowpan6_header_len += 16; - } - - /* Compress destination address */ - if (ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_dest))) { - /* @todo support stateful multicast address compression */ - - buffer[ieee_header_len + 1] |= 0x08; - - i = lowpan6_get_address_mode_mc(ip_2_ip6(&ip_data.current_iphdr_dest)); - buffer[ieee_header_len + 1] |= i & 0x03; - if (i == 0) { - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16); - lowpan6_header_len += 16; - } else if (i == 1) { - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25]; - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 35, 5); - lowpan6_header_len += 5; - } else if (i == 2) { - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25]; - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 37, 3); - lowpan6_header_len += 3; - } else if (i == 3) { - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[39]; - } - } else if (((buffer[ieee_header_len + 1] & 0x04) != 0) || - (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_dest)))) { - /* Context-based or link-local destination address compression. */ - i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_dest), dst); - buffer[ieee_header_len + 1] |= i & 0x03; - if (i == 1) { - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 32, 8); - lowpan6_header_len += 8; - } else if (i == 2) { - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 38, 2); - lowpan6_header_len += 2; - } - } else { - /* Append full address. */ - MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16); - lowpan6_header_len += 16; - } - - /* Move to payload. */ - pbuf_header(p, -IP6_HLEN); - - /* Compress UDP header? */ - if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) { - /* @todo support optional checksum compression */ - - buffer[ieee_header_len + lowpan6_header_len] = 0xf0; - - /* determine port compression mode. */ - if ((((u8_t *)p->payload)[0] == 0xf0) && ((((u8_t *)p->payload)[1] & 0xf0) == 0xb0) && - (((u8_t *)p->payload)[2] == 0xf0) && ((((u8_t *)p->payload)[3] & 0xf0) == 0xb0)) { - /* Compress source and dest ports. */ - buffer[ieee_header_len + lowpan6_header_len++] |= 0x03; - buffer[ieee_header_len + lowpan6_header_len++] = ((((u8_t *)p->payload)[1] & 0x0f) << 4) | (((u8_t *)p->payload)[3] & 0x0f); - } else if (((u8_t *)p->payload)[0] == 0xf0) { - /* Compress source port. */ - buffer[ieee_header_len + lowpan6_header_len++] |= 0x02; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3]; - } else if (((u8_t *)p->payload)[2] == 0xf0) { - /* Compress dest port. */ - buffer[ieee_header_len + lowpan6_header_len++] |= 0x01; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3]; - } else { - /* append full ports. */ - lowpan6_header_len++; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3]; - } - - /* elide length and copy checksum */ - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[6]; - buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[7]; - - pbuf_header(p, -UDP_HLEN); - } - } - -#else /* LWIP_6LOWPAN_HC */ - /* Send uncompressed IPv6 header with appropriate dispatch byte. */ - lowpan6_header_len = 1; - buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */ -#endif /* LWIP_6LOWPAN_HC */ - - /* Calculate remaining packet length */ - remaining_len = p->tot_len; - - if (remaining_len > 0x7FF) { - MIB2_STATS_NETIF_INC(netif, ifoutdiscards); - /* datagram_size must fit into 11 bit */ - pbuf_free(p_frag); - return ERR_VAL; - } - - /* Fragment, or 1 packet? */ - if (remaining_len > (127 - ieee_header_len - lowpan6_header_len - 3)) { /* 127 - header - 1 byte dispatch - 2 bytes CRC */ - /* We must move the 6LowPAN header to make room for the FRAG header. */ - i = lowpan6_header_len; - while (i-- != 0) { - buffer[ieee_header_len + i + 4] = buffer[ieee_header_len + i]; - } - - /* Now we need to fragment the packet. FRAG1 header first */ - buffer[ieee_header_len] = 0xc0 | (((p->tot_len + lowpan6_header_len) >> 8) & 0x7); - buffer[ieee_header_len + 1] = (p->tot_len + lowpan6_header_len) & 0xff; - - datagram_tag++; - buffer[ieee_header_len + 2] = datagram_tag & 0xff; - buffer[ieee_header_len + 3] = (datagram_tag >> 8) & 0xff; - - /* Fragment follows. */ - frag_len = (127 - ieee_header_len - 4 - 2) & 0xf8; - - pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len + 4, frag_len - lowpan6_header_len, 0); - remaining_len -= frag_len - lowpan6_header_len; - datagram_offset = frag_len; - - /* 2 bytes CRC */ -#if LWIP_6LOWPAN_HW_CRC - /* Leave blank, will be filled by HW. */ -#else /* LWIP_6LOWPAN_HW_CRC */ - /* @todo calculate CRC */ -#endif /* LWIP_6LOWPAN_HW_CRC */ - - /* Calculate frame length */ - p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 dummy bytes for crc*/ - - /* send the packet */ - MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); - LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); - err = netif->linkoutput(netif, p_frag); - - while ((remaining_len > 0) && (err == ERR_OK)) { - /* new frame, new seq num for ACK */ - buffer[2] = frame_seq_num++; - - buffer[ieee_header_len] |= 0x20; /* Change FRAG1 to FRAGN */ - - buffer[ieee_header_len + 4] = (u8_t)(datagram_offset >> 3); /* datagram offset in FRAGN header (datagram_offset is max. 11 bit) */ - - frag_len = (127 - ieee_header_len - 5 - 2) & 0xf8; - if (frag_len > remaining_len) { - frag_len = remaining_len; - } - - pbuf_copy_partial(p, buffer + ieee_header_len + 5, frag_len, p->tot_len - remaining_len); - remaining_len -= frag_len; - datagram_offset += frag_len; - - /* 2 bytes CRC */ -#if LWIP_6LOWPAN_HW_CRC - /* Leave blank, will be filled by HW. */ -#else /* LWIP_6LOWPAN_HW_CRC */ - /* @todo calculate CRC */ -#endif /* LWIP_6LOWPAN_HW_CRC */ - - /* Calculate frame length */ - p_frag->len = p_frag->tot_len = frag_len + 5 + ieee_header_len + 2; - - /* send the packet */ - MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); - LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); - err = netif->linkoutput(netif, p_frag); - } - } else { - /* It fits in one frame. */ - frag_len = remaining_len; - - /* Copy IPv6 packet */ - pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len, frag_len, 0); - remaining_len = 0; - - /* 2 bytes CRC */ -#if LWIP_6LOWPAN_HW_CRC - /* Leave blank, will be filled by HW. */ -#else /* LWIP_6LOWPAN_HW_CRC */ - /* @todo calculate CRC */ -#endif /* LWIP_6LOWPAN_HW_CRC */ - - /* Calculate frame length */ - p_frag->len = p_frag->tot_len = frag_len + lowpan6_header_len + ieee_header_len + 2; - - /* send the packet */ - MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); - LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); - err = netif->linkoutput(netif, p_frag); - } - - pbuf_free(p_frag); - - return err; -} - -err_t -lowpan6_set_context(u8_t idx, const ip6_addr_t * context) -{ - if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) { - return ERR_ARG; - } - - ip6_addr_set(&lowpan6_context[idx], context); - - return ERR_OK; -} - -#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS -err_t -lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low) -{ - short_mac_addr.addr[0] = addr_high; - short_mac_addr.addr[1] = addr_low; - - return ERR_OK; -} -#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ - -#if LWIP_IPV4 -err_t -lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) -{ - (void)netif; - (void)q; - (void)ipaddr; - - return ERR_IF; -} -#endif /* LWIP_IPV4 */ - -/** - * Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet. - * - * Perform Header Compression and fragment if necessary. - * - * @param netif The lwIP network interface which the IP packet will be sent on. - * @param q The pbuf(s) containing the IP packet to be sent. - * @param ip6addr The IP address of the packet destination. - * - * @return err_t - */ -err_t -lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr) -{ - err_t result; - const u8_t *hwaddr; - struct ieee_802154_addr src, dest; -#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS - ip6_addr_t ip6_src; - struct ip6_hdr * ip6_hdr; -#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ - -#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS - /* Check if we can compress source address (use aligned copy) */ - ip6_hdr = (struct ip6_hdr *)q->payload; - ip6_addr_set(&ip6_src, &ip6_hdr->src); - if (lowpan6_get_address_mode(&ip6_src, &short_mac_addr) == 3) { - src.addr_len = 2; - src.addr[0] = short_mac_addr.addr[0]; - src.addr[1] = short_mac_addr.addr[1]; - } else -#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ - { - src.addr_len = netif->hwaddr_len; - SMEMCPY(src.addr, netif->hwaddr, netif->hwaddr_len); - } - - /* multicast destination IP address? */ - if (ip6_addr_ismulticast(ip6addr)) { - MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts); - /* We need to send to the broadcast address.*/ - return lowpan6_frag(netif, q, &src, &ieee_802154_broadcast); - } - - /* We have a unicast destination IP address */ - /* @todo anycast? */ - -#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS - if (src.addr_len == 2) { - /* If source address was compressable to short_mac_addr, and dest has same subnet and - * is also compressable to 2-bytes, assume we can infer dest as a short address too. */ - dest.addr_len = 2; - dest.addr[0] = ((u8_t *)q->payload)[38]; - dest.addr[1] = ((u8_t *)q->payload)[39]; - if ((src.addr_len == 2) && (ip6_addr_netcmp(&ip6_hdr->src, &ip6_hdr->dest)) && - (lowpan6_get_address_mode(ip6addr, &dest) == 3)) { - MIB2_STATS_NETIF_INC(netif, ifoutucastpkts); - return lowpan6_frag(netif, q, &src, &dest); - } - } -#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ - - /* Ask ND6 what to do with the packet. */ - result = nd6_get_next_hop_addr_or_queue(netif, q, ip6addr, &hwaddr); - if (result != ERR_OK) { - MIB2_STATS_NETIF_INC(netif, ifoutdiscards); - return result; - } - - /* If no hardware address is returned, nd6 has queued the packet for later. */ - if (hwaddr == NULL) { - return ERR_OK; - } - - /* Send out the packet using the returned hardware address. */ - dest.addr_len = netif->hwaddr_len; - SMEMCPY(dest.addr, hwaddr, netif->hwaddr_len); - MIB2_STATS_NETIF_INC(netif, ifoutucastpkts); - return lowpan6_frag(netif, q, &src, &dest); -} - -static struct pbuf * -lowpan6_decompress(struct pbuf * p, struct ieee_802154_addr * src, struct ieee_802154_addr * dest) -{ - struct pbuf * q; - u8_t * lowpan6_buffer; - s8_t lowpan6_offset; - struct ip6_hdr *ip6hdr; - s8_t i; - s8_t ip6_offset = IP6_HLEN; - - - q = pbuf_alloc(PBUF_IP, p->len + IP6_HLEN + UDP_HLEN, PBUF_POOL); - if (q == NULL) { - pbuf_free(p); - return NULL; - } - - lowpan6_buffer = (u8_t *)p->payload; - ip6hdr = (struct ip6_hdr *)q->payload; - - lowpan6_offset = 2; - if (lowpan6_buffer[1] & 0x80) { - lowpan6_offset++; - } - - /* Set IPv6 version, traffic class and flow label. */ - if ((lowpan6_buffer[0] & 0x18) == 0x00) { - IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset], ((lowpan6_buffer[lowpan6_offset+1] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset+3]); - lowpan6_offset += 4; - } else if ((lowpan6_buffer[0] & 0x18) == 0x08) { - IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset] & 0xc0, ((lowpan6_buffer[lowpan6_offset] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset+2]); - lowpan6_offset += 3; - } else if ((lowpan6_buffer[0] & 0x18) == 0x10) { - IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset],0); - lowpan6_offset += 1; - } else if ((lowpan6_buffer[0] & 0x18) == 0x18) { - IP6H_VTCFL_SET(ip6hdr, 6, 0, 0); - } - - /* Set Next Header */ - if ((lowpan6_buffer[0] & 0x04) == 0x00) { - IP6H_NEXTH_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]); - } else { - /* We should fill this later with NHC decoding */ - IP6H_NEXTH_SET(ip6hdr, 0); - } - - /* Set Hop Limit */ - if ((lowpan6_buffer[0] & 0x03) == 0x00) { - IP6H_HOPLIM_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]); - } else if ((lowpan6_buffer[0] & 0x03) == 0x01) { - IP6H_HOPLIM_SET(ip6hdr, 1); - } else if ((lowpan6_buffer[0] & 0x03) == 0x02) { - IP6H_HOPLIM_SET(ip6hdr, 64); - } else if ((lowpan6_buffer[0] & 0x03) == 0x03) { - IP6H_HOPLIM_SET(ip6hdr, 255); - } - - /* Source address decoding. */ - if ((lowpan6_buffer[1] & 0x40) == 0x00) { - /* Stateless compression */ - if ((lowpan6_buffer[1] & 0x30) == 0x00) { - /* copy full address */ - MEMCPY(&ip6hdr->src.addr[0], lowpan6_buffer + lowpan6_offset, 16); - lowpan6_offset += 16; - } else if ((lowpan6_buffer[1] & 0x30) == 0x10) { - ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); - ip6hdr->src.addr[1] = 0; - MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8); - lowpan6_offset += 8; - } else if ((lowpan6_buffer[1] & 0x30) == 0x20) { - ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); - ip6hdr->src.addr[1] = 0; - ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | - lowpan6_buffer[lowpan6_offset+1]); - lowpan6_offset += 2; - } else if ((lowpan6_buffer[1] & 0x30) == 0x30) { - ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); - ip6hdr->src.addr[1] = 0; - if (src->addr_len == 2) { - ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]); - } else { - ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | - (src->addr[2] << 8) | src->addr[3]); - ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | - (src->addr[6] << 8) | src->addr[7]); - } - } - } else { - /* Stateful compression */ - if ((lowpan6_buffer[1] & 0x30) == 0x00) { - /* ANY address */ - ip6hdr->src.addr[0] = 0; - ip6hdr->src.addr[1] = 0; - ip6hdr->src.addr[2] = 0; - ip6hdr->src.addr[3] = 0; - } else { - /* Set prefix from context info */ - if (lowpan6_buffer[1] & 0x80) { - i = (lowpan6_buffer[2] >> 4) & 0x0f; - } else { - i = 0; - } - if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) { - /* Error */ - pbuf_free(p); - pbuf_free(q); - return NULL; - } - - ip6hdr->src.addr[0] = lowpan6_context[i].addr[0]; - ip6hdr->src.addr[1] = lowpan6_context[i].addr[1]; - } - - if ((lowpan6_buffer[1] & 0x30) == 0x10) { - MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8); - lowpan6_offset += 8; - } else if ((lowpan6_buffer[1] & 0x30) == 0x20) { - ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset+1]); - lowpan6_offset += 2; - } else if ((lowpan6_buffer[1] & 0x30) == 0x30) { - if (src->addr_len == 2) { - ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]); - } else { - ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]); - ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | (src->addr[6] << 8) | src->addr[7]); - } - } - } - - /* Destination address decoding. */ - if (lowpan6_buffer[1] & 0x08) { - /* Multicast destination */ - if (lowpan6_buffer[1] & 0x04) { - /* @todo support stateful multicast addressing */ - pbuf_free(p); - pbuf_free(q); - return NULL; - } - - if ((lowpan6_buffer[1] & 0x03) == 0x00) { - /* copy full address */ - MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16); - lowpan6_offset += 16; - } else if ((lowpan6_buffer[1] & 0x03) == 0x01) { - ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16)); - ip6hdr->dest.addr[1] = 0; - ip6hdr->dest.addr[2] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]); - ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 24) | (lowpan6_buffer[lowpan6_offset + 1] << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset + 3]); - lowpan6_offset += 4; - } else if ((lowpan6_buffer[1] & 0x03) == 0x02) { - ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | lowpan6_buffer[lowpan6_offset++]); - ip6hdr->dest.addr[1] = 0; - ip6hdr->dest.addr[2] = 0; - ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset + 2]); - lowpan6_offset += 3; - } else if ((lowpan6_buffer[1] & 0x03) == 0x03) { - ip6hdr->dest.addr[0] = PP_HTONL(0xff020000UL); - ip6hdr->dest.addr[1] = 0; - ip6hdr->dest.addr[2] = 0; - ip6hdr->dest.addr[3] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]); - } - - } else { - if (lowpan6_buffer[1] & 0x04) { - /* Stateful destination compression */ - /* Set prefix from context info */ - if (lowpan6_buffer[1] & 0x80) { - i = lowpan6_buffer[2] & 0x0f; - } else { - i = 0; - } - if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) { - /* Error */ - pbuf_free(p); - pbuf_free(q); - return NULL; - } - - ip6hdr->dest.addr[0] = lowpan6_context[i].addr[0]; - ip6hdr->dest.addr[1] = lowpan6_context[i].addr[1]; - } else { - /* Link local address compression */ - ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL); - ip6hdr->dest.addr[1] = 0; - } - - if ((lowpan6_buffer[1] & 0x03) == 0x00) { - /* copy full address */ - MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16); - lowpan6_offset += 16; - } else if ((lowpan6_buffer[1] & 0x03) == 0x01) { - MEMCPY(&ip6hdr->dest.addr[2], lowpan6_buffer + lowpan6_offset, 8); - lowpan6_offset += 8; - } else if ((lowpan6_buffer[1] & 0x03) == 0x02) { - ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]); - lowpan6_offset += 2; - } else if ((lowpan6_buffer[1] & 0x03) == 0x03) { - if (dest->addr_len == 2) { - ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL); - ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]); - } else { - ip6hdr->dest.addr[2] = lwip_htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]); - ip6hdr->dest.addr[3] = lwip_htonl((dest->addr[4] << 24) | (dest->addr[5] << 16) | dest->addr[6] << 8 | dest->addr[7]); - } - } - } - - - /* Next Header Compression (NHC) decoding? */ - if (lowpan6_buffer[0] & 0x04) { - if ((lowpan6_buffer[lowpan6_offset] & 0xf8) == 0xf0) { - struct udp_hdr *udphdr; - - /* UDP compression */ - IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_UDP); - udphdr = (struct udp_hdr *)((u8_t *)q->payload + ip6_offset); - - if (lowpan6_buffer[lowpan6_offset] & 0x04) { - /* @todo support checksum decompress */ - pbuf_free(p); - pbuf_free(q); - return NULL; - } - - /* Decompress ports */ - i = lowpan6_buffer[lowpan6_offset++] & 0x03; - if (i == 0) { - udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); - udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]); - lowpan6_offset += 4; - } else if (i == 0x01) { - udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); - udphdr->dest = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]); - lowpan6_offset += 3; - } else if (i == 0x02) { - udphdr->src = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset]); - udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]); - lowpan6_offset += 3; - } else if (i == 0x03) { - udphdr->src = lwip_htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f)); - udphdr->dest = lwip_htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f)); - lowpan6_offset += 1; - } - - udphdr->chksum = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); - lowpan6_offset += 2; - udphdr->len = lwip_htons(p->tot_len - lowpan6_offset + UDP_HLEN); - - ip6_offset += UDP_HLEN; - } else { - /* @todo support NHC other than UDP */ - pbuf_free(p); - pbuf_free(q); - return NULL; - } - } - - /* Now we copy leftover contents from p to q, so we have all L2 and L3 headers (and L4?) in a single PBUF. - * Replace p with q, and free p */ - pbuf_header(p, -lowpan6_offset); - MEMCPY((u8_t*)q->payload + ip6_offset, p->payload, p->len); - q->len = q->tot_len = ip6_offset + p->len; - if (p->next != NULL) { - pbuf_cat(q, p->next); - } - p->next = NULL; - pbuf_free(p); - - /* Infer IPv6 payload length for header */ - IP6H_PLEN_SET(ip6hdr, q->tot_len - IP6_HLEN); - - /* all done */ - return q; -} - -err_t -lowpan6_input(struct pbuf * p, struct netif *netif) -{ - u8_t * puc; - s8_t i; - struct ieee_802154_addr src, dest; - u16_t datagram_size, datagram_offset, datagram_tag; - struct lowpan6_reass_helper *lrh, *lrh_temp; - - MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len); - - /* Analyze header. @todo validate. */ - puc = (u8_t*)p->payload; - datagram_offset = 5; - if ((puc[1] & 0x0c) == 0x0c) { - dest.addr_len = 8; - for (i = 0; i < 8; i++) { - dest.addr[i] = puc[datagram_offset + 7 - i]; - } - datagram_offset += 8; - } else { - dest.addr_len = 2; - dest.addr[0] = puc[datagram_offset + 1]; - dest.addr[1] = puc[datagram_offset]; - datagram_offset += 2; - } - - datagram_offset += 2; /* skip PAN ID. */ - - if ((puc[1] & 0xc0) == 0xc0) { - src.addr_len = 8; - for (i = 0; i < 8; i++) { - src.addr[i] = puc[datagram_offset + 7 - i]; - } - datagram_offset += 8; - } else { - src.addr_len = 2; - src.addr[0] = puc[datagram_offset + 1]; - src.addr[1] = puc[datagram_offset]; - datagram_offset += 2; - } - - pbuf_header(p, -datagram_offset); /* hide IEEE802.15.4 header. */ - - /* Check dispatch. */ - puc = (u8_t*)p->payload; - - if ((*puc & 0xf8) == 0xc0) { - /* FRAG1 dispatch. add this packet to reassembly list. */ - datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1]; - datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3]; - - /* check for duplicate */ - lrh = reass_list; - while (lrh != NULL) { - if ((lrh->sender_addr.addr_len == src.addr_len) && - (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0)) { - /* address match with packet in reassembly. */ - if ((datagram_tag == lrh->datagram_tag) && (datagram_size == lrh->datagram_size)) { - MIB2_STATS_NETIF_INC(netif, ifindiscards); - /* duplicate fragment. */ - pbuf_free(p); - return ERR_OK; - } else { - /* We are receiving the start of a new datagram. Discard old one (incomplete). */ - lrh_temp = lrh->next_packet; - dequeue_datagram(lrh); - pbuf_free(lrh->pbuf); - mem_free(lrh); - - /* Check next datagram in queue. */ - lrh = lrh_temp; - } - } else { - /* Check next datagram in queue. */ - lrh = lrh->next_packet; - } - } - - pbuf_header(p, -4); /* hide frag1 dispatch */ - - lrh = (struct lowpan6_reass_helper *) mem_malloc(sizeof(struct lowpan6_reass_helper)); - if (lrh == NULL) { - MIB2_STATS_NETIF_INC(netif, ifindiscards); - pbuf_free(p); - return ERR_MEM; - } - - lrh->sender_addr.addr_len = src.addr_len; - for (i = 0; i < src.addr_len; i++) { - lrh->sender_addr.addr[i] = src.addr[i]; - } - lrh->datagram_size = datagram_size; - lrh->datagram_tag = datagram_tag; - lrh->pbuf = p; - lrh->next_packet = reass_list; - lrh->timer = 2; - reass_list = lrh; - - return ERR_OK; - } else if ((*puc & 0xf8) == 0xe0) { - /* FRAGN dispatch, find packet being reassembled. */ - datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1]; - datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3]; - datagram_offset = (u16_t)puc[4] << 3; - pbuf_header(p, -5); /* hide frag1 dispatch */ - - for (lrh = reass_list; lrh != NULL; lrh = lrh->next_packet) { - if ((lrh->sender_addr.addr_len == src.addr_len) && - (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0) && - (datagram_tag == lrh->datagram_tag) && - (datagram_size == lrh->datagram_size)) { - break; - } - } - if (lrh == NULL) { - /* rogue fragment */ - MIB2_STATS_NETIF_INC(netif, ifindiscards); - pbuf_free(p); - return ERR_OK; - } - - if (lrh->pbuf->tot_len < datagram_offset) { - /* duplicate, ignore. */ - pbuf_free(p); - return ERR_OK; - } else if (lrh->pbuf->tot_len > datagram_offset) { - MIB2_STATS_NETIF_INC(netif, ifindiscards); - /* We have missed a fragment. Delete whole reassembly. */ - dequeue_datagram(lrh); - pbuf_free(lrh->pbuf); - mem_free(lrh); - pbuf_free(p); - return ERR_OK; - } - pbuf_cat(lrh->pbuf, p); - p = NULL; - - /* is packet now complete?*/ - if (lrh->pbuf->tot_len >= lrh->datagram_size) { - /* dequeue from reass list. */ - dequeue_datagram(lrh); - - /* get pbuf */ - p = lrh->pbuf; - - /* release helper */ - mem_free(lrh); - } else { - return ERR_OK; - } - } - - if (p == NULL) { - return ERR_OK; - } - - /* We have a complete packet, check dispatch for headers. */ - puc = (u8_t*)p->payload; - - if (*puc == 0x41) { - /* This is a complete IPv6 packet, just skip dispatch byte. */ - pbuf_header(p, -1); /* hide dispatch byte. */ - } else if ((*puc & 0xe0 )== 0x60) { - /* IPv6 headers are compressed using IPHC. */ - p = lowpan6_decompress(p, &src, &dest); - if (p == NULL) { - MIB2_STATS_NETIF_INC(netif, ifindiscards); - return ERR_OK; - } - } else { - MIB2_STATS_NETIF_INC(netif, ifindiscards); - pbuf_free(p); - return ERR_OK; - } - - /* @todo: distinguish unicast/multicast */ - MIB2_STATS_NETIF_INC(netif, ifinucastpkts); - - return ip6_input(p, netif); -} - -err_t -lowpan6_if_init(struct netif *netif) -{ - netif->name[0] = 'L'; - netif->name[1] = '6'; -#if LWIP_IPV4 - netif->output = lowpan4_output; -#endif /* LWIP_IPV4 */ - netif->output_ip6 = lowpan6_output; - - MIB2_INIT_NETIF(netif, snmp_ifType_other, 0); - - /* maximum transfer unit */ - netif->mtu = 1280; - - /* broadcast capability */ - netif->flags = NETIF_FLAG_BROADCAST /* | NETIF_FLAG_LOWPAN6 */; - - return ERR_OK; -} - -err_t -lowpan6_set_pan_id(u16_t pan_id) -{ - ieee_802154_pan_id = pan_id; - - return ERR_OK; -} - -#if !NO_SYS -/** - * Pass a received packet to tcpip_thread for input processing - * - * @param p the received packet, p->payload pointing to the - * IEEE 802.15.4 header. - * @param inp the network interface on which the packet was received - */ -err_t -tcpip_6lowpan_input(struct pbuf *p, struct netif *inp) -{ - return tcpip_inpkt(p, inp, lowpan6_input); -} -#endif /* !NO_SYS */ - -#endif /* LWIP_IPV6 && LWIP_6LOWPAN */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile deleted file mode 100644 index 2949ebd..0000000 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -TOP_DIR = ../../../../../.. -sinclude $(TOP_DIR)/tools/w800/conf.mk - -ifndef PDIR -GEN_LIBS = libpolarssl$(LIB_EXT) -endif - -#DEFINES += - -sinclude $(TOP_DIR)/tools/w800/rules.mk - -PDIR := ../$(PDIR) -sinclude $(PDIR)Makefile \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/FILES similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/FILES diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.cmake b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.cmake new file mode 100644 index 0000000..21d7b49 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.cmake @@ -0,0 +1,279 @@ +# This file is indended to be included in end-user CMakeLists.txt +# include(/path/to/Filelists.cmake) +# It assumes the variable LWIP_DIR is defined pointing to the +# root path of lwIP sources. +# +# This file is NOT designed (on purpose) to be used as cmake +# subdir via add_subdirectory() +# The intention is to provide greater flexibility to users to +# create their own targets using the *_SRCS variables. + +set(LWIP_VERSION_MAJOR "2") +set(LWIP_VERSION_MINOR "1") +set(LWIP_VERSION_REVISION "3") +# LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases +# LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions +# Numbers 1..31 are reserved for release candidates +set(LWIP_VERSION_RC "LWIP_RC_RELEASE") + +if ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE") + set(LWIP_VERSION_STRING + "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}" + ) +elseif ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_DEVELOPMENT") + set(LWIP_VERSION_STRING + "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}.dev" + ) +else ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE") + set(LWIP_VERSION_STRING + "${LWIP_VERSION_MAJOR}.${LWIP_VERSION_MINOR}.${LWIP_VERSION_REVISION}.rc${LWIP_VERSION_RC}" + ) +endif ("${LWIP_VERSION_RC}" STREQUAL "LWIP_RC_RELEASE") + +# The minimum set of files needed for lwIP. +set(lwipcore_SRCS + ${LWIP_DIR}/src/core/init.c + ${LWIP_DIR}/src/core/def.c + ${LWIP_DIR}/src/core/dns.c + ${LWIP_DIR}/src/core/inet_chksum.c + ${LWIP_DIR}/src/core/ip.c + ${LWIP_DIR}/src/core/mem.c + ${LWIP_DIR}/src/core/memp.c + ${LWIP_DIR}/src/core/netif.c + ${LWIP_DIR}/src/core/pbuf.c + ${LWIP_DIR}/src/core/raw.c + ${LWIP_DIR}/src/core/stats.c + ${LWIP_DIR}/src/core/sys.c + ${LWIP_DIR}/src/core/altcp.c + ${LWIP_DIR}/src/core/altcp_alloc.c + ${LWIP_DIR}/src/core/altcp_tcp.c + ${LWIP_DIR}/src/core/tcp.c + ${LWIP_DIR}/src/core/tcp_in.c + ${LWIP_DIR}/src/core/tcp_out.c + ${LWIP_DIR}/src/core/timeouts.c + ${LWIP_DIR}/src/core/udp.c +) +set(lwipcore4_SRCS + ${LWIP_DIR}/src/core/ipv4/autoip.c + ${LWIP_DIR}/src/core/ipv4/dhcp.c + ${LWIP_DIR}/src/core/ipv4/etharp.c + ${LWIP_DIR}/src/core/ipv4/icmp.c + ${LWIP_DIR}/src/core/ipv4/igmp.c + ${LWIP_DIR}/src/core/ipv4/ip4_frag.c + ${LWIP_DIR}/src/core/ipv4/ip4.c + ${LWIP_DIR}/src/core/ipv4/ip4_addr.c +) +set(lwipcore6_SRCS + ${LWIP_DIR}/src/core/ipv6/dhcp6.c + ${LWIP_DIR}/src/core/ipv6/ethip6.c + ${LWIP_DIR}/src/core/ipv6/icmp6.c + ${LWIP_DIR}/src/core/ipv6/inet6.c + ${LWIP_DIR}/src/core/ipv6/ip6.c + ${LWIP_DIR}/src/core/ipv6/ip6_addr.c + ${LWIP_DIR}/src/core/ipv6/ip6_frag.c + ${LWIP_DIR}/src/core/ipv6/mld6.c + ${LWIP_DIR}/src/core/ipv6/nd6.c +) + +# APIFILES: The files which implement the sequential and socket APIs. +set(lwipapi_SRCS + ${LWIP_DIR}/src/api/api_lib.c + ${LWIP_DIR}/src/api/api_msg.c + ${LWIP_DIR}/src/api/err.c + ${LWIP_DIR}/src/api/if_api.c + ${LWIP_DIR}/src/api/netbuf.c + ${LWIP_DIR}/src/api/netdb.c + ${LWIP_DIR}/src/api/netifapi.c + ${LWIP_DIR}/src/api/sockets.c + ${LWIP_DIR}/src/api/tcpip.c +) + +# Files implementing various generic network interface functions +set(lwipnetif_SRCS + ${LWIP_DIR}/src/netif/ethernet.c + ${LWIP_DIR}/src/netif/bridgeif.c + ${LWIP_DIR}/src/netif/bridgeif_fdb.c + ${LWIP_DIR}/src/netif/slipif.c +) + +# 6LoWPAN +set(lwipsixlowpan_SRCS + ${LWIP_DIR}/src/netif/lowpan6_common.c + ${LWIP_DIR}/src/netif/lowpan6.c + ${LWIP_DIR}/src/netif/lowpan6_ble.c + ${LWIP_DIR}/src/netif/zepif.c +) + +# PPP +set(lwipppp_SRCS + ${LWIP_DIR}/src/netif/ppp/auth.c + ${LWIP_DIR}/src/netif/ppp/ccp.c + ${LWIP_DIR}/src/netif/ppp/chap-md5.c + ${LWIP_DIR}/src/netif/ppp/chap_ms.c + ${LWIP_DIR}/src/netif/ppp/chap-new.c + ${LWIP_DIR}/src/netif/ppp/demand.c + ${LWIP_DIR}/src/netif/ppp/eap.c + ${LWIP_DIR}/src/netif/ppp/ecp.c + ${LWIP_DIR}/src/netif/ppp/eui64.c + ${LWIP_DIR}/src/netif/ppp/fsm.c + ${LWIP_DIR}/src/netif/ppp/ipcp.c + ${LWIP_DIR}/src/netif/ppp/ipv6cp.c + ${LWIP_DIR}/src/netif/ppp/lcp.c + ${LWIP_DIR}/src/netif/ppp/magic.c + ${LWIP_DIR}/src/netif/ppp/mppe.c + ${LWIP_DIR}/src/netif/ppp/multilink.c + ${LWIP_DIR}/src/netif/ppp/ppp.c + ${LWIP_DIR}/src/netif/ppp/pppapi.c + ${LWIP_DIR}/src/netif/ppp/pppcrypt.c + ${LWIP_DIR}/src/netif/ppp/pppoe.c + ${LWIP_DIR}/src/netif/ppp/pppol2tp.c + ${LWIP_DIR}/src/netif/ppp/pppos.c + ${LWIP_DIR}/src/netif/ppp/upap.c + ${LWIP_DIR}/src/netif/ppp/utils.c + ${LWIP_DIR}/src/netif/ppp/vj.c + ${LWIP_DIR}/src/netif/ppp/polarssl/arc4.c + ${LWIP_DIR}/src/netif/ppp/polarssl/des.c + ${LWIP_DIR}/src/netif/ppp/polarssl/md4.c + ${LWIP_DIR}/src/netif/ppp/polarssl/md5.c + ${LWIP_DIR}/src/netif/ppp/polarssl/sha1.c +) + +# SNMPv3 agent +set(lwipsnmp_SRCS + ${LWIP_DIR}/src/apps/snmp/snmp_asn1.c + ${LWIP_DIR}/src/apps/snmp/snmp_core.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_icmp.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_interfaces.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_ip.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_snmp.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_system.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_tcp.c + ${LWIP_DIR}/src/apps/snmp/snmp_mib2_udp.c + ${LWIP_DIR}/src/apps/snmp/snmp_snmpv2_framework.c + ${LWIP_DIR}/src/apps/snmp/snmp_snmpv2_usm.c + ${LWIP_DIR}/src/apps/snmp/snmp_msg.c + ${LWIP_DIR}/src/apps/snmp/snmpv3.c + ${LWIP_DIR}/src/apps/snmp/snmp_netconn.c + ${LWIP_DIR}/src/apps/snmp/snmp_pbuf_stream.c + ${LWIP_DIR}/src/apps/snmp/snmp_raw.c + ${LWIP_DIR}/src/apps/snmp/snmp_scalar.c + ${LWIP_DIR}/src/apps/snmp/snmp_table.c + ${LWIP_DIR}/src/apps/snmp/snmp_threadsync.c + ${LWIP_DIR}/src/apps/snmp/snmp_traps.c +) + +# HTTP server + client +set(lwiphttp_SRCS + ${LWIP_DIR}/src/apps/http/altcp_proxyconnect.c + ${LWIP_DIR}/src/apps/http/fs.c + ${LWIP_DIR}/src/apps/http/http_client.c + ${LWIP_DIR}/src/apps/http/httpd.c +) + +# MAKEFSDATA HTTP server host utility +set(lwipmakefsdata_SRCS + ${LWIP_DIR}/src/apps/http/makefsdata/makefsdata.c +) + +# IPERF server +set(lwipiperf_SRCS + ${LWIP_DIR}/src/apps/lwiperf/lwiperf.c +) + +# SMTP client +set(lwipsmtp_SRCS + ${LWIP_DIR}/src/apps/smtp/smtp.c +) + +# SNTP client +set(lwipsntp_SRCS + ${LWIP_DIR}/src/apps/sntp/sntp.c +) + +# MDNS responder +set(lwipmdns_SRCS + ${LWIP_DIR}/src/apps/mdns/mdns.c +) + +# NetBIOS name server +set(lwipnetbios_SRCS + ${LWIP_DIR}/src/apps/netbiosns/netbiosns.c +) + +# TFTP server files +set(lwiptftp_SRCS + ${LWIP_DIR}/src/apps/tftp/tftp_server.c +) + +# MQTT client files +set(lwipmqtt_SRCS + ${LWIP_DIR}/src/apps/mqtt/mqtt.c +) + +# ARM MBEDTLS related files of lwIP rep +set(lwipmbedtls_SRCS + ${LWIP_DIR}/src/apps/altcp_tls/altcp_tls_mbedtls.c + ${LWIP_DIR}/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c + ${LWIP_DIR}/src/apps/snmp/snmpv3_mbedtls.c +) + +# All LWIP files without apps +set(lwipnoapps_SRCS + ${lwipcore_SRCS} + ${lwipcore4_SRCS} + ${lwipcore6_SRCS} + ${lwipapi_SRCS} + ${lwipnetif_SRCS} + ${lwipsixlowpan_SRCS} + ${lwipppp_SRCS} +) + +# LWIPAPPFILES: All LWIP APPs +set(lwipallapps_SRCS + ${lwipsnmp_SRCS} + ${lwiphttp_SRCS} + ${lwipiperf_SRCS} + ${lwipsmtp_SRCS} + ${lwipsntp_SRCS} + ${lwipmdns_SRCS} + ${lwipnetbios_SRCS} + ${lwiptftp_SRCS} + ${lwipmqtt_SRCS} + ${lwipmbedtls_SRCS} +) + +# Generate lwip/init.h (version info) +configure_file(${LWIP_DIR}/src/include/lwip/init.h.cmake.in ${LWIP_DIR}/src/include/lwip/init.h) + +# Documentation +set(DOXYGEN_DIR ${LWIP_DIR}/doc/doxygen) +set(DOXYGEN_OUTPUT_DIR output) +set(DOXYGEN_IN ${LWIP_DIR}/doc/doxygen/lwip.Doxyfile.cmake.in) +set(DOXYGEN_OUT ${LWIP_DIR}/doc/doxygen/lwip.Doxyfile) +configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT}) + +find_package(Doxygen) +if (DOXYGEN_FOUND) + message("Doxygen build started") + + add_custom_target(lwipdocs + COMMAND ${CMAKE_COMMAND} -E remove_directory ${DOXYGEN_DIR}/${DOXYGEN_OUTPUT_DIR}/html + COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} + WORKING_DIRECTORY ${DOXYGEN_DIR} + COMMENT "Generating API documentation with Doxygen" + VERBATIM) +else (DOXYGEN_FOUND) + message("Doxygen needs to be installed to generate the doxygen documentation") +endif (DOXYGEN_FOUND) + +# lwIP libraries +add_library(lwipcore EXCLUDE_FROM_ALL ${lwipnoapps_SRCS}) +target_compile_options(lwipcore PRIVATE ${LWIP_COMPILER_FLAGS}) +target_compile_definitions(lwipcore PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS}) +target_include_directories(lwipcore PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS}) + +add_library(lwipallapps EXCLUDE_FROM_ALL ${lwipallapps_SRCS}) +target_compile_options(lwipallapps PRIVATE ${LWIP_COMPILER_FLAGS}) +target_compile_definitions(lwipallapps PRIVATE ${LWIP_DEFINITIONS} ${LWIP_MBEDTLS_DEFINITIONS}) +target_include_directories(lwipallapps PRIVATE ${LWIP_INCLUDE_DIRS} ${LWIP_MBEDTLS_INCLUDE_DIRS}) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Filelists.mk b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.mk similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Filelists.mk rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.mk index 7d30bb8..828b9f2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Filelists.mk +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Filelists.mk @@ -42,6 +42,9 @@ COREFILES=$(LWIPDIR)/core/init.c \ $(LWIPDIR)/core/raw.c \ $(LWIPDIR)/core/stats.c \ $(LWIPDIR)/core/sys.c \ + $(LWIPDIR)/core/altcp.c \ + $(LWIPDIR)/core/altcp_alloc.c \ + $(LWIPDIR)/core/altcp_tcp.c \ $(LWIPDIR)/core/tcp.c \ $(LWIPDIR)/core/tcp_in.c \ $(LWIPDIR)/core/tcp_out.c \ @@ -71,6 +74,7 @@ CORE6FILES=$(LWIPDIR)/core/ipv6/dhcp6.c \ APIFILES=$(LWIPDIR)/api/api_lib.c \ $(LWIPDIR)/api/api_msg.c \ $(LWIPDIR)/api/err.c \ + $(LWIPDIR)/api/if_api.c \ $(LWIPDIR)/api/netbuf.c \ $(LWIPDIR)/api/netdb.c \ $(LWIPDIR)/api/netifapi.c \ @@ -79,10 +83,15 @@ APIFILES=$(LWIPDIR)/api/api_lib.c \ # NETIFFILES: Files implementing various generic network interface functions NETIFFILES=$(LWIPDIR)/netif/ethernet.c \ + $(LWIPDIR)/netif/bridgeif.c \ + $(LWIPDIR)/netif/bridgeif_fdb.c \ $(LWIPDIR)/netif/slipif.c # SIXLOWPAN: 6LoWPAN -SIXLOWPAN=$(LWIPDIR)/netif/lowpan6.c \ +SIXLOWPAN=$(LWIPDIR)/netif/lowpan6_common.c \ + $(LWIPDIR)/netif/lowpan6.c \ + $(LWIPDIR)/netif/lowpan6_ble.c \ + $(LWIPDIR)/netif/zepif.c # PPPFILES: PPP PPPFILES=$(LWIPDIR)/netif/ppp/auth.c \ @@ -136,6 +145,8 @@ SNMPFILES=$(LWIPDIR)/apps/snmp/snmp_asn1.c \ $(LWIPDIR)/apps/snmp/snmp_mib2_system.c \ $(LWIPDIR)/apps/snmp/snmp_mib2_tcp.c \ $(LWIPDIR)/apps/snmp/snmp_mib2_udp.c \ + $(LWIPDIR)/apps/snmp/snmp_snmpv2_framework.c \ + $(LWIPDIR)/apps/snmp/snmp_snmpv2_usm.c \ $(LWIPDIR)/apps/snmp/snmp_msg.c \ $(LWIPDIR)/apps/snmp/snmpv3.c \ $(LWIPDIR)/apps/snmp/snmp_netconn.c \ @@ -144,17 +155,23 @@ SNMPFILES=$(LWIPDIR)/apps/snmp/snmp_asn1.c \ $(LWIPDIR)/apps/snmp/snmp_scalar.c \ $(LWIPDIR)/apps/snmp/snmp_table.c \ $(LWIPDIR)/apps/snmp/snmp_threadsync.c \ - $(LWIPDIR)/apps/snmp/snmp_traps.c \ - $(LWIPDIR)/apps/snmp/snmpv3_mbedtls.c \ - $(LWIPDIR)/apps/snmp/snmpv3_dummy.c + $(LWIPDIR)/apps/snmp/snmp_traps.c -# HTTPDFILES: HTTP server -HTTPDFILES=$(LWIPDIR)/apps/httpd/fs.c \ - $(LWIPDIR)/apps/httpd/httpd.c +# HTTPFILES: HTTP server + client +HTTPFILES=$(LWIPDIR)/apps/http/altcp_proxyconnect.c \ + $(LWIPDIR)/apps/http/fs.c \ + $(LWIPDIR)/apps/http/http_client.c \ + $(LWIPDIR)/apps/http/httpd.c + +# MAKEFSDATA: MAKEFSDATA HTTP server host utility +MAKEFSDATAFILES=$(LWIPDIR)/apps/http/makefsdata/makefsdata.c # LWIPERFFILES: IPERF server LWIPERFFILES=$(LWIPDIR)/apps/lwiperf/lwiperf.c +# SMTPFILES: SMTP client +SMTPFILES=$(LWIPDIR)/apps/smtp/smtp.c + # SNTPFILES: SNTP client SNTPFILES=$(LWIPDIR)/apps/sntp/sntp.c @@ -170,12 +187,19 @@ TFTPFILES=$(LWIPDIR)/apps/tftp/tftp_server.c # MQTTFILES: MQTT client files MQTTFILES=$(LWIPDIR)/apps/mqtt/mqtt.c +# MBEDTLS_FILES: MBEDTLS related files of lwIP rep +MBEDTLS_FILES=$(LWIPDIR)/apps/altcp_tls/altcp_tls_mbedtls.c \ + $(LWIPDIR)/apps/altcp_tls/altcp_tls_mbedtls_mem.c \ + $(LWIPDIR)/apps/snmp/snmpv3_mbedtls.c + # LWIPAPPFILES: All LWIP APPs LWIPAPPFILES=$(SNMPFILES) \ - $(HTTPDFILES) \ + $(HTTPFILES) \ $(LWIPERFFILES) \ + $(SMTPFILES) \ $(SNTPFILES) \ $(MDNSFILES) \ $(NETBIOSNSFILES) \ $(TFTPFILES) \ - $(MQTTFILES) + $(MQTTFILES) \ + $(MBEDTLS_FILES) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/Makefile diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/Makefile similarity index 69% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/Makefile index 38d6f4b..772f1a3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/Makefile +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/Makefile @@ -1,10 +1,6 @@ TOP_DIR = ../../../.. sinclude $(TOP_DIR)/tools/w800/conf.mk -EXCLUDES = pppapi.c - -CSRCS = $(filter-out $(EXCLUDES), $(wildcard *.c)) - ifndef PDIR GEN_LIBS = libapi$(LIB_EXT) endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_lib.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_lib.c similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_lib.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_lib.c index 3c1d6a6..ffa14d6 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_lib.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_lib.c @@ -1,21 +1,21 @@ /** * @file * Sequential API External module - * + * * @defgroup netconn Netconn API * @ingroup sequential_api * Thread-safe, to be called from non-TCPIP threads only. * TX/RX handling based on @ref netbuf (containing @ref pbuf) * to avoid copying data around. - * + * * @defgroup netconn_common Common functions * @ingroup netconn * For use with TCP and UDP - * + * * @defgroup netconn_tcp TCP only * @ingroup netconn * TCP only functions - * + * * @defgroup netconn_udp UDP only * @ingroup netconn * UDP only functions @@ -69,6 +69,10 @@ #include "lwip/priv/tcp_priv.h" #include "lwip/priv/tcpip_priv.h" +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif + #include #define API_MSG_VAR_REF(name) API_VAR_REF(name) @@ -77,6 +81,28 @@ #define API_MSG_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, NULL) #define API_MSG_VAR_FREE(name) API_VAR_FREE(MEMP_API_MSG, name) +#if TCP_LISTEN_BACKLOG +/* need to allocate API message for accept so empty message pool does not result in event loss + * see bug #47512: MPU_COMPATIBLE may fail on empty pool */ +#define API_MSG_VAR_ALLOC_ACCEPT(msg) API_MSG_VAR_ALLOC(msg) +#define API_MSG_VAR_FREE_ACCEPT(msg) API_MSG_VAR_FREE(msg) +#else /* TCP_LISTEN_BACKLOG */ +#define API_MSG_VAR_ALLOC_ACCEPT(msg) +#define API_MSG_VAR_FREE_ACCEPT(msg) +#endif /* TCP_LISTEN_BACKLOG */ + +#if LWIP_NETCONN_FULLDUPLEX +#define NETCONN_RECVMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->recvmbox) && (((conn)->flags & NETCONN_FLAG_MBOXINVALID) == 0)) +#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & (NETCONN_FLAG_MBOXCLOSED|NETCONN_FLAG_MBOXINVALID)) == 0)) +#define NETCONN_MBOX_WAITING_INC(conn) SYS_ARCH_INC(conn->mbox_threads_waiting, 1) +#define NETCONN_MBOX_WAITING_DEC(conn) SYS_ARCH_DEC(conn->mbox_threads_waiting, 1) +#else /* LWIP_NETCONN_FULLDUPLEX */ +#define NETCONN_RECVMBOX_WAITABLE(conn) sys_mbox_valid(&(conn)->recvmbox) +#define NETCONN_ACCEPTMBOX_WAITABLE(conn) (sys_mbox_valid(&(conn)->acceptmbox) && (((conn)->flags & NETCONN_FLAG_MBOXCLOSED) == 0)) +#define NETCONN_MBOX_WAITING_INC(conn) +#define NETCONN_MBOX_WAITING_DEC(conn) +#endif /* LWIP_NETCONN_FULLDUPLEX */ + static err_t netconn_close_shutdown(struct netconn *conn, u8_t how); /** @@ -119,7 +145,7 @@ netconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg) * @return a newly allocated struct netconn or * NULL on memory error */ -struct netconn* +struct netconn * netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback) { struct netconn *conn; @@ -155,7 +181,7 @@ netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_cal /** * @ingroup netconn_common - * Close a netconn 'connection' and free its resources. + * Close a netconn 'connection' and free all its resources but not the netconn itself. * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate * after this returns. * @@ -163,7 +189,7 @@ netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_cal * @return ERR_OK if the connection was deleted */ err_t -netconn_delete(struct netconn *conn) +netconn_prepare_delete(struct netconn *conn) { err_t err; API_MSG_VAR_DECLARE(msg); @@ -175,28 +201,59 @@ netconn_delete(struct netconn *conn) API_MSG_VAR_ALLOC(msg); API_MSG_VAR_REF(msg).conn = conn; +#if LWIP_TCP #if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER /* get the time we started, which is later compared to sys_now() + conn->send_timeout */ API_MSG_VAR_REF(msg).msg.sd.time_started = sys_now(); #else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ -#if LWIP_TCP API_MSG_VAR_REF(msg).msg.sd.polls_left = ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1; -#endif /* LWIP_TCP */ #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ +#endif /* LWIP_TCP */ err = netconn_apimsg(lwip_netconn_do_delconn, &API_MSG_VAR_REF(msg)); API_MSG_VAR_FREE(msg); if (err != ERR_OK) { return err; } - - netconn_free(conn); - return ERR_OK; } +/** + * @ingroup netconn_common + * Close a netconn 'connection' and free its resources. + * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate + * after this returns. + * + * @param conn the netconn to delete + * @return ERR_OK if the connection was deleted + */ +err_t +netconn_delete(struct netconn *conn) +{ + err_t err; + + /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */ + if (conn == NULL) { + return ERR_OK; + } + +#if LWIP_NETCONN_FULLDUPLEX + if (conn->flags & NETCONN_FLAG_MBOXINVALID) { + /* Already called netconn_prepare_delete() before */ + err = ERR_OK; + } else +#endif /* LWIP_NETCONN_FULLDUPLEX */ + { + err = netconn_prepare_delete(conn); + } + if (err == ERR_OK) { + netconn_free(conn); + } + return err; +} + /** * Get the local or remote IP address and port of a netconn. * For RAW netconns, this returns the protocol instead of a port! @@ -241,7 +298,7 @@ netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local) * Binding one netconn twice might not always be checked correctly! * * @param conn the netconn to bind - * @param addr the local IP address to bind the netconn to + * @param addr the local IP address to bind the netconn to * (use IP4_ADDR_ANY/IP6_ADDR_ANY to bind to all addresses) * @param port the local port to bind the netconn to (not used for RAW) * @return ERR_OK if bound, any other err_t on failure @@ -251,7 +308,7 @@ netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port) { API_MSG_VAR_DECLARE(msg); err_t err; - + LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;); #if LWIP_IPV4 @@ -260,13 +317,13 @@ netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port) addr = IP4_ADDR_ANY; } #endif /* LWIP_IPV4 */ - + #if LWIP_IPV4 && LWIP_IPV6 /* "Socket API like" dual-stack support: If IP to bind to is IP6_ADDR_ANY, * and NETCONN_FLAG_IPV6_V6ONLY is 0, use IP_ANY_TYPE to bind */ if ((netconn_get_ipv6only(conn) == 0) && - ip_addr_cmp(addr, IP6_ADDR_ANY)) { + ip_addr_cmp(addr, IP6_ADDR_ANY)) { addr = IP_ANY_TYPE; } #endif /* LWIP_IPV4 && LWIP_IPV6 */ @@ -281,6 +338,32 @@ netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port) return err; } +/** + * @ingroup netconn_common + * Bind a netconn to a specific interface and port. + * Binding one netconn twice might not always be checked correctly! + * + * @param conn the netconn to bind + * @param if_idx the local interface index to bind the netconn to + * @return ERR_OK if bound, any other err_t on failure + */ +err_t +netconn_bind_if(struct netconn *conn, u8_t if_idx) +{ + API_MSG_VAR_DECLARE(msg); + err_t err; + + LWIP_ERROR("netconn_bind_if: invalid conn", (conn != NULL), return ERR_ARG;); + + API_MSG_VAR_ALLOC(msg); + API_MSG_VAR_REF(msg).conn = conn; + API_MSG_VAR_REF(msg).msg.bc.if_idx = if_idx; + err = netconn_apimsg(lwip_netconn_do_bind_if, &API_MSG_VAR_REF(msg)); + API_MSG_VAR_FREE(msg); + + return err; +} + /** * @ingroup netconn_common * Connect a netconn to a specific remote IP address and port. @@ -388,6 +471,7 @@ err_t netconn_accept(struct netconn *conn, struct netconn **new_conn) { #if LWIP_TCP + err_t err; void *accept_ptr; struct netconn *newconn; #if TCP_LISTEN_BACKLOG @@ -398,52 +482,65 @@ netconn_accept(struct netconn *conn, struct netconn **new_conn) *new_conn = NULL; LWIP_ERROR("netconn_accept: invalid conn", (conn != NULL), return ERR_ARG;); - if (ERR_IS_FATAL(conn->last_err)) { - /* don't recv on fatal errors: this might block the application task - waiting on acceptmbox forever! */ - return conn->last_err; + /* NOTE: Although the opengroup spec says a pending error shall be returned to + send/recv/getsockopt(SO_ERROR) only, we return it for listening + connections also, to handle embedded-system errors */ + err = netconn_err(conn); + if (err != ERR_OK) { + /* return pending error */ + return err; } - if (!sys_mbox_valid(&conn->acceptmbox)) { + if (!NETCONN_ACCEPTMBOX_WAITABLE(conn)) { + /* don't accept if closed: this might block the application task + waiting on acceptmbox forever! */ return ERR_CLSD; } -#if TCP_LISTEN_BACKLOG - API_MSG_VAR_ALLOC(msg); -#endif /* TCP_LISTEN_BACKLOG */ + API_MSG_VAR_ALLOC_ACCEPT(msg); + NETCONN_MBOX_WAITING_INC(conn); + if (netconn_is_nonblocking(conn)) { + if (sys_arch_mbox_tryfetch(&conn->acceptmbox, &accept_ptr) == SYS_MBOX_EMPTY) { + API_MSG_VAR_FREE_ACCEPT(msg); + NETCONN_MBOX_WAITING_DEC(conn); + return ERR_WOULDBLOCK; + } + } else { #if LWIP_SO_RCVTIMEO - if (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { -#if TCP_LISTEN_BACKLOG - API_MSG_VAR_FREE(msg); -#endif /* TCP_LISTEN_BACKLOG */ - return ERR_TIMEOUT; - } + if (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { + API_MSG_VAR_FREE_ACCEPT(msg); + NETCONN_MBOX_WAITING_DEC(conn); + return ERR_TIMEOUT; + } #else - sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0); + sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0); #endif /* LWIP_SO_RCVTIMEO*/ - newconn = (struct netconn *)accept_ptr; + } + NETCONN_MBOX_WAITING_DEC(conn); +#if LWIP_NETCONN_FULLDUPLEX + if (conn->flags & NETCONN_FLAG_MBOXINVALID) { + if (lwip_netconn_is_deallocated_msg(accept_ptr)) { + /* the netconn has been closed from another thread */ + API_MSG_VAR_FREE_ACCEPT(msg); + return ERR_CONN; + } + } +#endif + /* Register event with callback */ API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); - if (accept_ptr == &netconn_aborted) { - /* a connection has been aborted: out of pcbs or out of netconns during accept */ - /* @todo: set netconn error, but this would be fatal and thus block further accepts */ -#if TCP_LISTEN_BACKLOG - API_MSG_VAR_FREE(msg); -#endif /* TCP_LISTEN_BACKLOG */ - return ERR_ABRT; + if (lwip_netconn_is_err_msg(accept_ptr, &err)) { + /* a connection has been aborted: e.g. out of pcbs or out of netconns during accept */ + API_MSG_VAR_FREE_ACCEPT(msg); + return err; } - if (newconn == NULL) { + if (accept_ptr == NULL) { /* connection has been aborted */ - /* in this special case, we set the netconn error from application thread, as - on a ready-to-accept listening netconn, there should not be anything running - in tcpip_thread */ - NETCONN_SET_SAFE_ERR(conn, ERR_CLSD); -#if TCP_LISTEN_BACKLOG - API_MSG_VAR_FREE(msg); -#endif /* TCP_LISTEN_BACKLOG */ + API_MSG_VAR_FREE_ACCEPT(msg); return ERR_CLSD; } + newconn = (struct netconn *)accept_ptr; #if TCP_LISTEN_BACKLOG /* Let the stack know that we have accepted the connection. */ API_MSG_VAR_REF(msg).conn = newconn; @@ -465,103 +562,89 @@ netconn_accept(struct netconn *conn, struct netconn **new_conn) /** * @ingroup netconn_common * Receive data: actual implementation that doesn't care whether pbuf or netbuf - * is received + * is received (this is internal, it's just here for describing common errors) * * @param conn the netconn from which to receive data * @param new_buf pointer where a new pbuf/netbuf is stored when received data + * @param apiflags flags that control function behaviour. For now only: + * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data * @return ERR_OK if data has been received, an error code otherwise (timeout, * memory error or another error) + * ERR_CONN if not connected + * ERR_CLSD if TCP connection has been closed + * ERR_WOULDBLOCK if the netconn is nonblocking but would block to wait for data + * ERR_TIMEOUT if the netconn has a receive timeout and no data was received */ static err_t -netconn_recv_data(struct netconn *conn, void **new_buf) +netconn_recv_data(struct netconn *conn, void **new_buf, u8_t apiflags) { void *buf = NULL; u16_t len; -#if LWIP_TCP - API_MSG_VAR_DECLARE(msg); -#if LWIP_MPU_COMPATIBLE - msg = NULL; -#endif -#endif /* LWIP_TCP */ LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;); *new_buf = NULL; LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;); -#if LWIP_TCP -#if (LWIP_UDP || LWIP_RAW) - if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) -#endif /* (LWIP_UDP || LWIP_RAW) */ - { - if (!sys_mbox_valid(&conn->recvmbox)) { - /* This happens when calling this function after receiving FIN */ - return sys_mbox_valid(&conn->acceptmbox) ? ERR_CONN : ERR_CLSD; + + if (!NETCONN_RECVMBOX_WAITABLE(conn)) { + err_t err = netconn_err(conn); + if (err != ERR_OK) { + /* return pending error */ + return err; } + return ERR_CONN; } -#endif /* LWIP_TCP */ - LWIP_ERROR("netconn_recv: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;); - if (ERR_IS_FATAL(conn->last_err)) { - /* don't recv on fatal errors: this might block the application task - waiting on recvmbox forever! */ - /* @todo: this does not allow us to fetch data that has been put into recvmbox - before the fatal error occurred - is that a problem? */ - return conn->last_err; - } -#if LWIP_TCP -#if (LWIP_UDP || LWIP_RAW) - if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) -#endif /* (LWIP_UDP || LWIP_RAW) */ - { - API_MSG_VAR_ALLOC(msg); - } -#endif /* LWIP_TCP */ - -#if LWIP_SO_RCVTIMEO - if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { -#if LWIP_TCP -#if (LWIP_UDP || LWIP_RAW) - if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) -#endif /* (LWIP_UDP || LWIP_RAW) */ - { - API_MSG_VAR_FREE(msg); - } -#endif /* LWIP_TCP */ - return ERR_TIMEOUT; - } -#else - sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); -#endif /* LWIP_SO_RCVTIMEO*/ - -#if LWIP_TCP -#if (LWIP_UDP || LWIP_RAW) - if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) -#endif /* (LWIP_UDP || LWIP_RAW) */ - { - /* Let the stack know that we have taken the data. */ - /* @todo: Speedup: Don't block and wait for the answer here - (to prevent multiple thread-switches). */ - API_MSG_VAR_REF(msg).conn = conn; - if (buf != NULL) { - API_MSG_VAR_REF(msg).msg.r.len = ((struct pbuf *)buf)->tot_len; - } else { - API_MSG_VAR_REF(msg).msg.r.len = 1; - } - - /* don't care for the return value of lwip_netconn_do_recv */ - netconn_apimsg(lwip_netconn_do_recv, &API_MSG_VAR_REF(msg)); - API_MSG_VAR_FREE(msg); - - /* If we are closed, we indicate that we no longer wish to use the socket */ - if (buf == NULL) { - API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); - if (conn->pcb.ip == NULL) { - /* race condition: RST during recv */ - return conn->last_err == ERR_OK ? ERR_RST : conn->last_err; + NETCONN_MBOX_WAITING_INC(conn); + if (netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK) || + (conn->flags & NETCONN_FLAG_MBOXCLOSED) || (conn->pending_err != ERR_OK)) { + if (sys_arch_mbox_tryfetch(&conn->recvmbox, &buf) == SYS_MBOX_EMPTY) { + err_t err; + NETCONN_MBOX_WAITING_DEC(conn); + err = netconn_err(conn); + if (err != ERR_OK) { + /* return pending error */ + return err; } - /* RX side is closed, so deallocate the recvmbox */ - netconn_close_shutdown(conn, NETCONN_SHUT_RD); - /* Don' store ERR_CLSD as conn->err since we are only half-closed */ - return ERR_CLSD; + if (conn->flags & NETCONN_FLAG_MBOXCLOSED) { + return ERR_CONN; + } + return ERR_WOULDBLOCK; + } + } else { +#if LWIP_SO_RCVTIMEO + if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { + NETCONN_MBOX_WAITING_DEC(conn); + return ERR_TIMEOUT; + } +#else + sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); +#endif /* LWIP_SO_RCVTIMEO*/ + } + NETCONN_MBOX_WAITING_DEC(conn); +#if LWIP_NETCONN_FULLDUPLEX + if (conn->flags & NETCONN_FLAG_MBOXINVALID) { + if (lwip_netconn_is_deallocated_msg(buf)) { + /* the netconn has been closed from another thread */ + API_MSG_VAR_FREE_ACCEPT(msg); + return ERR_CONN; + } + } +#endif + +#if LWIP_TCP +#if (LWIP_UDP || LWIP_RAW) + if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) +#endif /* (LWIP_UDP || LWIP_RAW) */ + { + err_t err; + /* Check if this is an error message or a pbuf */ + if (lwip_netconn_is_err_msg(buf, &err)) { + /* new_buf has been zeroed above already */ + if (err == ERR_CLSD) { + /* connection closed translates to ERR_OK with *new_buf == NULL */ + return ERR_OK; + } + return err; } len = ((struct pbuf *)buf)->tot_len; } @@ -572,7 +655,7 @@ netconn_recv_data(struct netconn *conn, void **new_buf) #if (LWIP_UDP || LWIP_RAW) { LWIP_ASSERT("buf != NULL", buf != NULL); - len = netbuf_len((struct netbuf*)buf); + len = netbuf_len((struct netbuf *)buf); } #endif /* (LWIP_UDP || LWIP_RAW) */ @@ -589,6 +672,102 @@ netconn_recv_data(struct netconn *conn, void **new_buf) return ERR_OK; } +#if LWIP_TCP +static err_t +netconn_tcp_recvd_msg(struct netconn *conn, size_t len, struct api_msg *msg) +{ + LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) && + NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;); + + msg->conn = conn; + msg->msg.r.len = len; + + return netconn_apimsg(lwip_netconn_do_recv, msg); +} + +err_t +netconn_tcp_recvd(struct netconn *conn, size_t len) +{ + err_t err; + API_MSG_VAR_DECLARE(msg); + LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) && + NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;); + + API_MSG_VAR_ALLOC(msg); + err = netconn_tcp_recvd_msg(conn, len, &API_VAR_REF(msg)); + API_MSG_VAR_FREE(msg); + return err; +} + +static err_t +netconn_recv_data_tcp(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags) +{ + err_t err; + struct pbuf *buf; + API_MSG_VAR_DECLARE(msg); +#if LWIP_MPU_COMPATIBLE + msg = NULL; +#endif + + if (!NETCONN_RECVMBOX_WAITABLE(conn)) { + /* This only happens when calling this function more than once *after* receiving FIN */ + return ERR_CONN; + } + if (netconn_is_flag_set(conn, NETCONN_FIN_RX_PENDING)) { + netconn_clear_flags(conn, NETCONN_FIN_RX_PENDING); + goto handle_fin; + } + + if (!(apiflags & NETCONN_NOAUTORCVD)) { + /* need to allocate API message here so empty message pool does not result in event loss + * see bug #47512: MPU_COMPATIBLE may fail on empty pool */ + API_MSG_VAR_ALLOC(msg); + } + + err = netconn_recv_data(conn, (void **)new_buf, apiflags); + if (err != ERR_OK) { + if (!(apiflags & NETCONN_NOAUTORCVD)) { + API_MSG_VAR_FREE(msg); + } + return err; + } + buf = *new_buf; + if (!(apiflags & NETCONN_NOAUTORCVD)) { + /* Let the stack know that we have taken the data. */ + u16_t len = buf ? buf->tot_len : 1; + /* don't care for the return value of lwip_netconn_do_recv */ + /* @todo: this should really be fixed, e.g. by retrying in poll on error */ + netconn_tcp_recvd_msg(conn, len, &API_VAR_REF(msg)); + API_MSG_VAR_FREE(msg); + } + + /* If we are closed, we indicate that we no longer wish to use the socket */ + if (buf == NULL) { + if (apiflags & NETCONN_NOFIN) { + /* received a FIN but the caller cannot handle it right now: + re-enqueue it and return "no data" */ + netconn_set_flags(conn, NETCONN_FIN_RX_PENDING); + return ERR_WOULDBLOCK; + } else { +handle_fin: + API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); + if (conn->pcb.ip == NULL) { + /* race condition: RST during recv */ + err = netconn_err(conn); + if (err != ERR_OK) { + return err; + } + return ERR_RST; + } + /* RX side is closed, so deallocate the recvmbox */ + netconn_close_shutdown(conn, NETCONN_SHUT_RD); + /* Don' store ERR_CLSD as conn->err since we are only half-closed */ + return ERR_CLSD; + } + } + return err; +} + /** * @ingroup netconn_tcp * Receive data (in form of a pbuf) from a TCP netconn @@ -596,16 +775,76 @@ netconn_recv_data(struct netconn *conn, void **new_buf) * @param conn the netconn from which to receive data * @param new_buf pointer where a new pbuf is stored when received data * @return ERR_OK if data has been received, an error code otherwise (timeout, - * memory error or another error) + * memory error or another error, @see netconn_recv_data) * ERR_ARG if conn is not a TCP netconn */ err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf) { - LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL) && + LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) && NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;); - return netconn_recv_data(conn, (void **)new_buf); + return netconn_recv_data_tcp(conn, new_buf, 0); +} + +/** + * @ingroup netconn_tcp + * Receive data (in form of a pbuf) from a TCP netconn + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new pbuf is stored when received data + * @param apiflags flags that control function behaviour. For now only: + * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error, @see netconn_recv_data) + * ERR_ARG if conn is not a TCP netconn + */ +err_t +netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags) +{ + LWIP_ERROR("netconn_recv_tcp_pbuf: invalid conn", (conn != NULL) && + NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;); + + return netconn_recv_data_tcp(conn, new_buf, apiflags); +} +#endif /* LWIP_TCP */ + +/** + * Receive data (in form of a netbuf) from a UDP or RAW netconn + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new netbuf is stored when received data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error) + * ERR_ARG if conn is not a UDP/RAW netconn + */ +err_t +netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf) +{ + LWIP_ERROR("netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) && + NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP, return ERR_ARG;); + + return netconn_recv_data(conn, (void **)new_buf, 0); +} + +/** + * Receive data (in form of a netbuf) from a UDP or RAW netconn + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new netbuf is stored when received data + * @param apiflags flags that control function behaviour. For now only: + * - NETCONN_DONTBLOCK: only read data that is available now, don't wait for more data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error) + * ERR_ARG if conn is not a UDP/RAW netconn + */ +err_t +netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags) +{ + LWIP_ERROR("netconn_recv_udp_raw_netbuf: invalid conn", (conn != NULL) && + NETCONNTYPE_GROUP(netconn_type(conn)) != NETCONN_TCP, return ERR_ARG;); + + return netconn_recv_data(conn, (void **)new_buf, apiflags); } /** @@ -642,7 +881,7 @@ netconn_recv(struct netconn *conn, struct netbuf **new_buf) return ERR_MEM; } - err = netconn_recv_data(conn, (void **)&p); + err = netconn_recv_data_tcp(conn, &p, 0); if (err != ERR_OK) { memp_free(MEMP_NETBUF, buf); return err; @@ -663,7 +902,7 @@ netconn_recv(struct netconn *conn, struct netbuf **new_buf) #endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */ { #if (LWIP_UDP || LWIP_RAW) - return netconn_recv_data(conn, (void **)new_buf); + return netconn_recv_data(conn, (void **)new_buf, 0); #endif /* (LWIP_UDP || LWIP_RAW) */ } } @@ -734,16 +973,38 @@ netconn_send(struct netconn *conn, struct netbuf *buf) err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written) +{ + struct netvector vector; + vector.ptr = dataptr; + vector.len = size; + return netconn_write_vectors_partly(conn, &vector, 1, apiflags, bytes_written); +} + +/** + * Send vectorized data atomically over a TCP netconn. + * + * @param conn the TCP netconn over which to send data + * @param vectors array of vectors containing data to send + * @param vectorcnt number of vectors in the array + * @param apiflags combination of following flags : + * - NETCONN_COPY: data will be copied into memory belonging to the stack + * - NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent + * - NETCONN_DONTBLOCK: only write the data if all data can be written at once + * @param bytes_written pointer to a location that receives the number of written bytes + * @return ERR_OK if data was sent, any other err_t on error + */ +err_t +netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, + u8_t apiflags, size_t *bytes_written) { API_MSG_VAR_DECLARE(msg); err_t err; u8_t dontblock; + size_t size; + int i; LWIP_ERROR("netconn_write: invalid conn", (conn != NULL), return ERR_ARG;); - LWIP_ERROR("netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type)== NETCONN_TCP), return ERR_VAL;); - if (size == 0) { - return ERR_OK; - } + LWIP_ERROR("netconn_write: invalid conn->type", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP), return ERR_VAL;); dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK); #if LWIP_SO_SNDTIMEO if (conn->send_timeout != 0) { @@ -756,12 +1017,37 @@ netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, return ERR_VAL; } + /* sum up the total size */ + size = 0; + for (i = 0; i < vectorcnt; i++) { + size += vectors[i].len; + if (size < vectors[i].len) { + /* overflow */ + return ERR_VAL; + } + } + if (size == 0) { + return ERR_OK; + } else if (size > SSIZE_MAX) { + ssize_t limited; + /* this is required by the socket layer (cannot send full size_t range) */ + if (!bytes_written) { + return ERR_VAL; + } + /* limit the amount of data to send */ + limited = SSIZE_MAX; + size = (size_t)limited; + } + API_MSG_VAR_ALLOC(msg); /* non-blocking write sends as much */ API_MSG_VAR_REF(msg).conn = conn; - API_MSG_VAR_REF(msg).msg.w.dataptr = dataptr; + API_MSG_VAR_REF(msg).msg.w.vector = vectors; + API_MSG_VAR_REF(msg).msg.w.vector_cnt = vectorcnt; + API_MSG_VAR_REF(msg).msg.w.vector_off = 0; API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags; API_MSG_VAR_REF(msg).msg.w.len = size; + API_MSG_VAR_REF(msg).msg.w.offset = 0; #if LWIP_SO_SNDTIMEO if (conn->send_timeout != 0) { /* get the time we started, which is later compared to @@ -776,13 +1062,14 @@ netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, but if it is, this is done inside api_msg.c:do_write(), so we can use the non-blocking version here. */ err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg)); - if ((err == ERR_OK) && (bytes_written != NULL)) { - if (dontblock) { - /* nonblocking write: maybe the data has been sent partly */ - *bytes_written = API_MSG_VAR_REF(msg).msg.w.len; - } else { - /* blocking call succeeded: all data has been sent if it */ - *bytes_written = size; + if (err == ERR_OK) { + if (bytes_written != NULL) { + *bytes_written = API_MSG_VAR_REF(msg).msg.w.offset; + } + /* for blocking, check all requested bytes were written, NOTE: send_timeout is + treated as dontblock (see dontblock assignment above) */ + if (!dontblock) { + LWIP_ASSERT("do_write failed to write all bytes", API_MSG_VAR_REF(msg).msg.w.offset == size); } } API_MSG_VAR_FREE(msg); @@ -841,6 +1128,28 @@ netconn_close(struct netconn *conn) return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR); } +/** + * @ingroup netconn_common + * Get and reset pending error on a netconn + * + * @param conn the netconn to get the error from + * @return and pending error or ERR_OK if no error was pending + */ +err_t +netconn_err(struct netconn *conn) +{ + err_t err; + SYS_ARCH_DECL_PROTECT(lev); + if (conn == NULL) { + return ERR_OK; + } + SYS_ARCH_PROTECT(lev); + err = conn->pending_err; + conn->pending_err = ERR_OK; + SYS_ARCH_UNPROTECT(lev); + return err; +} + /** * @ingroup netconn_tcp * Shut down one or both sides of a TCP netconn (doesn't delete it). @@ -853,7 +1162,7 @@ netconn_close(struct netconn *conn) err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx) { - return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0)); + return netconn_close_shutdown(conn, (u8_t)((shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0))); } #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) @@ -900,6 +1209,48 @@ netconn_join_leave_group(struct netconn *conn, return err; } +/** + * @ingroup netconn_udp + * Join multicast groups for UDP netconns. + * + * @param conn the UDP netconn for which to change multicast addresses + * @param multiaddr IP address of the multicast group to join or leave + * @param if_idx the index of the netif + * @param join_or_leave flag whether to send a join- or leave-message + * @return ERR_OK if the action was taken, any err_t on error + */ +err_t +netconn_join_leave_group_netif(struct netconn *conn, + const ip_addr_t *multiaddr, + u8_t if_idx, + enum netconn_igmp join_or_leave) +{ + API_MSG_VAR_DECLARE(msg); + err_t err; + + LWIP_ERROR("netconn_join_leave_group: invalid conn", (conn != NULL), return ERR_ARG;); + + API_MSG_VAR_ALLOC(msg); + +#if LWIP_IPV4 + /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */ + if (multiaddr == NULL) { + multiaddr = IP4_ADDR_ANY; + } + if (if_idx == NETIF_NO_INDEX) { + return ERR_IF; + } +#endif /* LWIP_IPV4 */ + + API_MSG_VAR_REF(msg).conn = conn; + API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr); + API_MSG_VAR_REF(msg).msg.jl.if_idx = if_idx; + API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave; + err = netconn_apimsg(lwip_netconn_do_join_leave_group_netif, &API_MSG_VAR_REF(msg)); + API_MSG_VAR_FREE(msg); + + return err; +} #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ #if LWIP_DNS @@ -938,10 +1289,20 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr) } #endif +#ifdef LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE +#if LWIP_IPV4 && LWIP_IPV6 + if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, dns_addrtype, &err)) { +#else + if (LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, NETCONN_DNS_DEFAULT, &err)) { +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + return err; + } +#endif /* LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE */ + API_VAR_ALLOC(struct dns_api_msg, MEMP_DNS_API_MSG, msg, ERR_MEM); #if LWIP_MPU_COMPATIBLE - strncpy(API_VAR_REF(msg).name, name, DNS_MAX_NAME_LENGTH-1); - API_VAR_REF(msg).name[DNS_MAX_NAME_LENGTH-1] = 0; + strncpy(API_VAR_REF(msg).name, name, DNS_MAX_NAME_LENGTH - 1); + API_VAR_REF(msg).name[DNS_MAX_NAME_LENGTH - 1] = 0; #else /* LWIP_MPU_COMPATIBLE */ msg.err = &err; msg.sem = &sem; @@ -961,18 +1322,14 @@ netconn_gethostbyname(const char *name, ip_addr_t *addr) } #endif /* LWIP_NETCONN_SEM_PER_THREAD */ - cberr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg)); - if (cberr != ERR_OK) { -#if !LWIP_NETCONN_SEM_PER_THREAD - sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem)); -#endif /* !LWIP_NETCONN_SEM_PER_THREAD */ - API_VAR_FREE(MEMP_DNS_API_MSG, msg); - return cberr; - } - sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem)); + cberr = tcpip_send_msg_wait_sem(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg), API_EXPR_REF(API_VAR_REF(msg).sem)); #if !LWIP_NETCONN_SEM_PER_THREAD sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem)); #endif /* !LWIP_NETCONN_SEM_PER_THREAD */ + if (cberr != ERR_OK) { + API_VAR_FREE(MEMP_DNS_API_MSG, msg); + return cberr; + } #if LWIP_MPU_COMPATIBLE *addr = msg->addr; @@ -989,7 +1346,7 @@ void netconn_thread_init(void) { sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET(); - if ((sem == NULL) || !sys_sem_valid(sem)) { + if (!sys_sem_valid(sem)) { /* call alloc only once */ LWIP_NETCONN_THREAD_SEM_ALLOC(); LWIP_ASSERT("LWIP_NETCONN_THREAD_SEM_ALLOC() failed", sys_sem_valid(LWIP_NETCONN_THREAD_SEM_GET())); @@ -1000,7 +1357,7 @@ void netconn_thread_cleanup(void) { sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET(); - if ((sem != NULL) && sys_sem_valid(sem)) { + if (sys_sem_valid(sem)) { /* call free only once */ LWIP_NETCONN_THREAD_SEM_FREE(); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_msg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_msg.c similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_msg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_msg.c index 0592cd0..3f08e03 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/api_msg.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/api_msg.c @@ -60,10 +60,16 @@ #define NETCONN_TCP_POLL_INTERVAL 2 #define SET_NONBLOCKING_CONNECT(conn, val) do { if (val) { \ - (conn)->flags |= NETCONN_FLAG_IN_NONBLOCKING_CONNECT; \ + netconn_set_flags(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT); \ } else { \ - (conn)->flags &= ~ NETCONN_FLAG_IN_NONBLOCKING_CONNECT; }} while(0) -#define IN_NONBLOCKING_CONNECT(conn) (((conn)->flags & NETCONN_FLAG_IN_NONBLOCKING_CONNECT) != 0) + netconn_clear_flags(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT); }} while(0) +#define IN_NONBLOCKING_CONNECT(conn) netconn_is_flag_set(conn, NETCONN_FLAG_IN_NONBLOCKING_CONNECT) + +#if LWIP_NETCONN_FULLDUPLEX +#define NETCONN_MBOX_VALID(conn, mbox) (sys_mbox_valid(mbox) && ((conn->flags & NETCONN_FLAG_MBOXINVALID) == 0)) +#else +#define NETCONN_MBOX_VALID(conn, mbox) sys_mbox_valid(mbox) +#endif /* forward declarations */ #if LWIP_TCP @@ -78,16 +84,69 @@ static err_t lwip_netconn_do_writemore(struct netconn *conn WRITE_DELAYED_PARAM static err_t lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM); #endif +static void netconn_drain(struct netconn *conn); + #if LWIP_TCPIP_CORE_LOCKING -#define TCPIP_APIMSG_ACK(m) NETCONN_SET_SAFE_ERR((m)->conn, (m)->err) +#define TCPIP_APIMSG_ACK(m) #else /* LWIP_TCPIP_CORE_LOCKING */ -#define TCPIP_APIMSG_ACK(m) do { NETCONN_SET_SAFE_ERR((m)->conn, (m)->err); sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0) +#define TCPIP_APIMSG_ACK(m) do { sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0) #endif /* LWIP_TCPIP_CORE_LOCKING */ +#if LWIP_NETCONN_FULLDUPLEX +const u8_t netconn_deleted = 0; + +int +lwip_netconn_is_deallocated_msg(void *msg) +{ + if (msg == &netconn_deleted) { + return 1; + } + return 0; +} +#endif /* LWIP_NETCONN_FULLDUPLEX */ + #if LWIP_TCP -u8_t netconn_aborted; +const u8_t netconn_aborted = 0; +const u8_t netconn_reset = 0; +const u8_t netconn_closed = 0; + +/** Translate an error to a unique void* passed via an mbox */ +static void * +lwip_netconn_err_to_msg(err_t err) +{ + switch (err) { + case ERR_ABRT: + return LWIP_CONST_CAST(void *, &netconn_aborted); + case ERR_RST: + return LWIP_CONST_CAST(void *, &netconn_reset); + case ERR_CLSD: + return LWIP_CONST_CAST(void *, &netconn_closed); + default: + LWIP_ASSERT("unhandled error", err == ERR_OK); + return NULL; + } +} + +int +lwip_netconn_is_err_msg(void *msg, err_t *err) +{ + LWIP_ASSERT("err != NULL", err != NULL); + + if (msg == &netconn_aborted) { + *err = ERR_ABRT; + return 1; + } else if (msg == &netconn_reset) { + *err = ERR_RST; + return 1; + } else if (msg == &netconn_closed) { + *err = ERR_CLSD; + return 1; + } + return 0; +} #endif /* LWIP_TCP */ + #if LWIP_RAW /** * Receive callback function for RAW netconns. @@ -98,7 +157,7 @@ u8_t netconn_aborted; */ static u8_t recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, - const ip_addr_t *addr) + const ip_addr_t *addr) { struct pbuf *q; struct netbuf *buf; @@ -107,7 +166,7 @@ recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, LWIP_UNUSED_ARG(addr); conn = (struct netconn *)arg; - if ((conn != NULL) && sys_mbox_valid(&conn->recvmbox)) { + if ((conn != NULL) && NETCONN_MBOX_VALID(conn, &conn->recvmbox)) { #if LWIP_SO_RCVBUF int recv_avail; SYS_ARCH_GET(conn->recv_avail, recv_avail); @@ -116,14 +175,7 @@ recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, } #endif /* LWIP_SO_RCVBUF */ /* copy the whole packet into new pbufs */ - q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); - if (q != NULL) { - if (pbuf_copy(q, p) != ERR_OK) { - pbuf_free(q); - q = NULL; - } - } - + q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); if (q != NULL) { u16_t len; buf = (struct netbuf *)memp_malloc(MEMP_NETBUF); @@ -164,7 +216,7 @@ recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, */ static void recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p, - const ip_addr_t *addr, u16_t port) + const ip_addr_t *addr, u16_t port) { struct netbuf *buf; struct netconn *conn; @@ -187,10 +239,10 @@ recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p, #if LWIP_SO_RCVBUF SYS_ARCH_GET(conn->recv_avail, recv_avail); - if (!sys_mbox_valid(&conn->recvmbox) || + if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox) || ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) { #else /* LWIP_SO_RCVBUF */ - if (!sys_mbox_valid(&conn->recvmbox)) { + if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) { #endif /* LWIP_SO_RCVBUF */ pbuf_free(p); return; @@ -206,12 +258,10 @@ recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_set(&buf->addr, addr); buf->port = port; #if LWIP_NETBUF_RECVINFO - { + if (conn->flags & NETCONN_FLAG_PKTINFO) { /* get the UDP header - always in the first pbuf, ensured by udp_input */ - const struct udp_hdr* udphdr = (const struct udp_hdr*)ip_next_header_ptr(); -#if LWIP_CHECKSUM_ON_COPY + const struct udp_hdr *udphdr = (const struct udp_hdr *)ip_next_header_ptr(); buf->flags = NETBUF_FLAG_DESTADDR; -#endif /* LWIP_CHECKSUM_ON_COPY */ ip_addr_set(&buf->toaddr, ip_current_dest_addr()); buf->toport_chksum = udphdr->dest; } @@ -244,10 +294,13 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { struct netconn *conn; u16_t len; + void *msg; LWIP_UNUSED_ARG(pcb); LWIP_ASSERT("recv_tcp must have a pcb argument", pcb != NULL); LWIP_ASSERT("recv_tcp must have an argument", arg != NULL); + LWIP_ASSERT("err != ERR_OK unhandled", err == ERR_OK); + LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */ conn = (struct netconn *)arg; if (conn == NULL) { @@ -255,7 +308,7 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) } LWIP_ASSERT("recv_tcp: recv for wrong pcb!", conn->pcb.tcp == pcb); - if (!sys_mbox_valid(&conn->recvmbox)) { + if (!NETCONN_MBOX_VALID(conn, &conn->recvmbox)) { /* recvmbox already deleted */ if (p != NULL) { tcp_recved(pcb, p->tot_len); @@ -267,18 +320,15 @@ recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) using recv_avail since that could break the connection (data is already ACKed) */ - /* don't overwrite fatal errors! */ - if (err != ERR_OK) { - NETCONN_SET_SAFE_ERR(conn, err); - } - if (p != NULL) { + msg = p; len = p->tot_len; } else { + msg = LWIP_CONST_CAST(void *, &netconn_closed); len = 0; } - if (sys_mbox_trypost(&conn->recvmbox, p) != ERR_OK) { + if (sys_mbox_trypost(&conn->recvmbox, msg) != ERR_OK) { /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */ return ERR_MEM; } else { @@ -328,8 +378,8 @@ poll_tcp(void *arg, struct tcp_pcb *pcb) /* If the queued byte- or pbuf-count drops below the configured low-water limit, let select mark this pcb as writable again. */ if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) && - (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { - conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE; + (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { + netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE); API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); } } @@ -362,8 +412,8 @@ sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len) /* If the queued byte- or pbuf-count drops below the configured low-water limit, let select mark this pcb as writable again. */ if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) && - (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { - conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE; + (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { + netconn_clear_flags(conn, NETCONN_FLAG_CHECK_WRITESPACE); API_EVENT(conn, NETCONN_EVT_SENDPLUS, len); } } @@ -383,26 +433,26 @@ err_tcp(void *arg, err_t err) { struct netconn *conn; enum netconn_state old_state; + void *mbox_msg; + SYS_ARCH_DECL_PROTECT(lev); conn = (struct netconn *)arg; LWIP_ASSERT("conn != NULL", (conn != NULL)); + SYS_ARCH_PROTECT(lev); + + /* when err is called, the pcb is deallocated, so delete the reference */ conn->pcb.tcp = NULL; + /* store pending error */ + conn->pending_err = err; + /* prevent application threads from blocking on 'recvmbox'/'acceptmbox' */ + conn->flags |= NETCONN_FLAG_MBOXCLOSED; /* reset conn->state now before waking up other threads */ old_state = conn->state; conn->state = NETCONN_NONE; - if (old_state == NETCONN_CLOSE) { - /* RST during close: let close return success & dealloc the netconn */ - err = ERR_OK; - NETCONN_SET_SAFE_ERR(conn, ERR_OK); - } else { - /* no check since this is always fatal! */ - SYS_ARCH_SET(conn->last_err, err); - } - - /* @todo: the type of NETCONN_EVT created should depend on 'old_state' */ + SYS_ARCH_UNPROTECT(lev); /* Notify the user layer about a connection error. Used to signal select. */ API_EVENT(conn, NETCONN_EVT_ERROR, 0); @@ -411,15 +461,16 @@ err_tcp(void *arg, err_t err) API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); - /* pass NULL-message to recvmbox to wake up pending recv */ - if (sys_mbox_valid(&conn->recvmbox)) { + mbox_msg = lwip_netconn_err_to_msg(err); + /* pass error message to recvmbox to wake up pending recv */ + if (NETCONN_MBOX_VALID(conn, &conn->recvmbox)) { /* use trypost to prevent deadlock */ - sys_mbox_trypost(&conn->recvmbox, NULL); + sys_mbox_trypost(&conn->recvmbox, mbox_msg); } - /* pass NULL-message to acceptmbox to wake up pending accept */ - if (sys_mbox_valid(&conn->acceptmbox)) { + /* pass error message to acceptmbox to wake up pending accept */ + if (NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) { /* use trypost to preven deadlock */ - sys_mbox_trypost(&conn->acceptmbox, NULL); + sys_mbox_trypost(&conn->acceptmbox, mbox_msg); } if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) || @@ -430,16 +481,23 @@ err_tcp(void *arg, err_t err) SET_NONBLOCKING_CONNECT(conn, 0); if (!was_nonblocking_connect) { - sys_sem_t* op_completed_sem; + sys_sem_t *op_completed_sem; /* set error return code */ LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL); - conn->current_msg->err = err; + if (old_state == NETCONN_CLOSE) { + /* let close succeed: the connection is closed after all... */ + conn->current_msg->err = ERR_OK; + } else { + /* Write and connect fail */ + conn->current_msg->err = err; + } op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg); LWIP_ASSERT("inavlid op_completed_sem", sys_sem_valid(op_completed_sem)); conn->current_msg = NULL; /* wake up the waiting task */ - NETCONN_SET_SAFE_ERR(conn, err); sys_sem_signal(op_completed_sem); + } else { + /* @todo: test what happens for error on nonblocking connect */ } } else { LWIP_ASSERT("conn->current_msg == NULL", conn->current_msg == NULL); @@ -480,28 +538,30 @@ accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) if (conn == NULL) { return ERR_VAL; } - if (!sys_mbox_valid(&conn->acceptmbox)) { + if (!NETCONN_MBOX_VALID(conn, &conn->acceptmbox)) { LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: acceptmbox already deleted\n")); return ERR_VAL; } if (newpcb == NULL) { /* out-of-pcbs during connect: pass on this error to the application */ - if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) { + if (sys_mbox_trypost(&conn->acceptmbox, lwip_netconn_err_to_msg(ERR_ABRT)) == ERR_OK) { /* Register event with callback */ API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); } return ERR_VAL; } + LWIP_ASSERT("expect newpcb == NULL or err == ERR_OK", err == ERR_OK); + LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */ - LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->tate: %s\n", tcp_debug_state_str(newpcb->state))); + LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->state: %s\n", tcp_debug_state_str(newpcb->state))); /* We have to set the callback here even though * the new socket is unknown. newconn->socket is marked as -1. */ newconn = netconn_alloc(conn->type, conn->callback); if (newconn == NULL) { /* outof netconns: pass on this error to the application */ - if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) { + if (sys_mbox_trypost(&conn->acceptmbox, lwip_netconn_err_to_msg(ERR_ABRT)) == ERR_OK) { /* Register event with callback */ API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); } @@ -509,9 +569,6 @@ accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) } newconn->pcb.tcp = newpcb; setup_tcp(newconn); - /* no protection: when creating the pcb, the netconn is not yet known - to the application thread */ - newconn->last_err = err; /* handle backlog counter */ tcp_backlog_delayed(newpcb); @@ -520,7 +577,7 @@ accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) /* When returning != ERR_OK, the pcb is aborted in tcp_process(), so do nothing here! */ /* remove all references to this netconn from the pcb */ - struct tcp_pcb* pcb = newconn->pcb.tcp; + struct tcp_pcb *pcb = newconn->pcb.tcp; tcp_arg(pcb, NULL); tcp_recv(pcb, NULL); tcp_sent(pcb, NULL); @@ -546,67 +603,67 @@ accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) * Create a new pcb of a specific type. * Called from lwip_netconn_do_newconn(). * - * @param msg the api_msg_msg describing the connection type + * @param msg the api_msg describing the connection type */ static void pcb_new(struct api_msg *msg) { - enum lwip_ip_addr_type iptype = (enum lwip_ip_addr_type)IPADDR_TYPE_V4; + enum lwip_ip_addr_type iptype = IPADDR_TYPE_V4; LWIP_ASSERT("pcb_new: pcb already allocated", msg->conn->pcb.tcp == NULL); - + #if LWIP_IPV6 && LWIP_IPV4 /* IPv6: Dual-stack by default, unless netconn_set_ipv6only() is called */ - if(NETCONNTYPE_ISIPV6(netconn_type(msg->conn))) { + if (NETCONNTYPE_ISIPV6(netconn_type(msg->conn))) { iptype = IPADDR_TYPE_ANY; } #endif - + /* Allocate a PCB for this connection */ - switch(NETCONNTYPE_GROUP(msg->conn->type)) { + switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW - case NETCONN_RAW: - msg->conn->pcb.raw = raw_new_ip_type(iptype, msg->msg.n.proto); - if (msg->conn->pcb.raw != NULL) { + case NETCONN_RAW: + msg->conn->pcb.raw = raw_new_ip_type(iptype, msg->msg.n.proto); + if (msg->conn->pcb.raw != NULL) { #if LWIP_IPV6 - /* ICMPv6 packets should always have checksum calculated by the stack as per RFC 3542 chapter 3.1 */ - if (NETCONNTYPE_ISIPV6(msg->conn->type) && msg->conn->pcb.raw->protocol == IP6_NEXTH_ICMP6) { - msg->conn->pcb.raw->chksum_reqd = 1; - msg->conn->pcb.raw->chksum_offset = 2; - } + /* ICMPv6 packets should always have checksum calculated by the stack as per RFC 3542 chapter 3.1 */ + if (NETCONNTYPE_ISIPV6(msg->conn->type) && msg->conn->pcb.raw->protocol == IP6_NEXTH_ICMP6) { + msg->conn->pcb.raw->chksum_reqd = 1; + msg->conn->pcb.raw->chksum_offset = 2; + } #endif /* LWIP_IPV6 */ - raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn); - } - break; + raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn); + } + break; #endif /* LWIP_RAW */ #if LWIP_UDP - case NETCONN_UDP: - msg->conn->pcb.udp = udp_new_ip_type(iptype); - if (msg->conn->pcb.udp != NULL) { + case NETCONN_UDP: + msg->conn->pcb.udp = udp_new_ip_type(iptype); + if (msg->conn->pcb.udp != NULL) { #if LWIP_UDPLITE - if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) { - udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE); - } + if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) { + udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE); + } #endif /* LWIP_UDPLITE */ - if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) { - udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM); + if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) { + udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM); + } + udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn); } - udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn); - } - break; + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case NETCONN_TCP: - msg->conn->pcb.tcp = tcp_new_ip_type(iptype); - if (msg->conn->pcb.tcp != NULL) { - setup_tcp(msg->conn); - } - break; + case NETCONN_TCP: + msg->conn->pcb.tcp = tcp_new_ip_type(iptype); + if (msg->conn->pcb.tcp != NULL) { + setup_tcp(msg->conn); + } + break; #endif /* LWIP_TCP */ - default: - /* Unsupported netconn type, e.g. protocol disabled */ - msg->err = ERR_VAL; - return; + default: + /* Unsupported netconn type, e.g. protocol disabled */ + msg->err = ERR_VAL; + return; } if (msg->conn->pcb.ip == NULL) { msg->err = ERR_MEM; @@ -617,12 +674,12 @@ pcb_new(struct api_msg *msg) * Create a new pcb of a specific type inside a netconn. * Called from netconn_new_with_proto_and_callback. * - * @param m the api_msg_msg describing the connection type + * @param m the api_msg describing the connection type */ void lwip_netconn_do_newconn(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; msg->err = ERR_OK; if (msg->conn->pcb.tcp == NULL) { @@ -644,41 +701,48 @@ lwip_netconn_do_newconn(void *m) * @return a newly allocated struct netconn or * NULL on memory error */ -struct netconn* +struct netconn * netconn_alloc(enum netconn_type t, netconn_callback callback) { struct netconn *conn; int size; + u8_t init_flags = 0; conn = (struct netconn *)memp_malloc(MEMP_NETCONN); if (conn == NULL) { return NULL; } - conn->last_err = ERR_OK; + conn->pending_err = ERR_OK; conn->type = t; conn->pcb.tcp = NULL; +#if LWIP_NETCONN_FULLDUPLEX + conn->mbox_threads_waiting = 0; +#endif /* If all sizes are the same, every compiler should optimize this switch to nothing */ - switch(NETCONNTYPE_GROUP(t)) { + switch (NETCONNTYPE_GROUP(t)) { #if LWIP_RAW - case NETCONN_RAW: - size = DEFAULT_RAW_RECVMBOX_SIZE; - break; + case NETCONN_RAW: + size = DEFAULT_RAW_RECVMBOX_SIZE; + break; #endif /* LWIP_RAW */ #if LWIP_UDP - case NETCONN_UDP: - size = DEFAULT_UDP_RECVMBOX_SIZE; - break; + case NETCONN_UDP: + size = DEFAULT_UDP_RECVMBOX_SIZE; +#if LWIP_NETBUF_RECVINFO + init_flags |= NETCONN_FLAG_PKTINFO; +#endif /* LWIP_NETBUF_RECVINFO */ + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case NETCONN_TCP: - size = DEFAULT_TCP_RECVMBOX_SIZE; - break; + case NETCONN_TCP: + size = DEFAULT_TCP_RECVMBOX_SIZE; + break; #endif /* LWIP_TCP */ - default: - LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0); - goto free_and_return; + default: + LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0); + goto free_and_return; } if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) { @@ -702,7 +766,6 @@ netconn_alloc(enum netconn_type t, netconn_callback callback) conn->callback = callback; #if LWIP_TCP conn->current_msg = NULL; - conn->write_offset = 0; #endif /* LWIP_TCP */ #if LWIP_SO_SNDTIMEO conn->send_timeout = 0; @@ -717,7 +780,7 @@ netconn_alloc(enum netconn_type t, netconn_callback callback) #if LWIP_SO_LINGER conn->linger = -1; #endif /* LWIP_SO_LINGER */ - conn->flags = 0; + conn->flags = init_flags; return conn; free_and_return: memp_free(MEMP_NETCONN, conn); @@ -734,11 +797,17 @@ void netconn_free(struct netconn *conn) { LWIP_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL); + +#if LWIP_NETCONN_FULLDUPLEX + /* in fullduplex, netconn is drained here */ + netconn_drain(conn); +#endif /* LWIP_NETCONN_FULLDUPLEX */ + LWIP_ASSERT("recvmbox must be deallocated before calling this function", - !sys_mbox_valid(&conn->recvmbox)); + !sys_mbox_valid(&conn->recvmbox)); #if LWIP_TCP LWIP_ASSERT("acceptmbox must be deallocated before calling this function", - !sys_mbox_valid(&conn->acceptmbox)); + !sys_mbox_valid(&conn->acceptmbox)); #endif /* LWIP_TCP */ #if !LWIP_NETCONN_SEM_PER_THREAD @@ -761,29 +830,31 @@ static void netconn_drain(struct netconn *conn) { void *mem; -#if LWIP_TCP - struct pbuf *p; -#endif /* LWIP_TCP */ - /* This runs in tcpip_thread, so we don't need to lock against rx packets */ + /* This runs when mbox and netconn are marked as closed, + so we don't need to lock against rx packets */ +#if LWIP_NETCONN_FULLDUPLEX + LWIP_ASSERT("netconn marked closed", conn->flags & NETCONN_FLAG_MBOXINVALID); +#endif /* LWIP_NETCONN_FULLDUPLEX */ /* Delete and drain the recvmbox. */ if (sys_mbox_valid(&conn->recvmbox)) { while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) { -#if LWIP_TCP - if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) { - if (mem != NULL) { - p = (struct pbuf*)mem; - /* pcb might be set to NULL already by err_tcp() */ - if (conn->pcb.tcp != NULL) { - tcp_recved(conn->pcb.tcp, p->tot_len); - } - pbuf_free(p); - } - } else -#endif /* LWIP_TCP */ +#if LWIP_NETCONN_FULLDUPLEX + if (!lwip_netconn_is_deallocated_msg(mem)) +#endif /* LWIP_NETCONN_FULLDUPLEX */ { - netbuf_delete((struct netbuf *)mem); +#if LWIP_TCP + if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) { + err_t err; + if (!lwip_netconn_is_err_msg(mem, &err)) { + pbuf_free((struct pbuf *)mem); + } + } else +#endif /* LWIP_TCP */ + { + netbuf_delete((struct netbuf *)mem); + } } } sys_mbox_free(&conn->recvmbox); @@ -794,17 +865,23 @@ netconn_drain(struct netconn *conn) #if LWIP_TCP if (sys_mbox_valid(&conn->acceptmbox)) { while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) { - if (mem != &netconn_aborted) { - struct netconn *newconn = (struct netconn *)mem; - /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */ - /* pcb might be set to NULL already by err_tcp() */ - /* drain recvmbox */ - netconn_drain(newconn); - if (newconn->pcb.tcp != NULL) { - tcp_abort(newconn->pcb.tcp); - newconn->pcb.tcp = NULL; +#if LWIP_NETCONN_FULLDUPLEX + if (!lwip_netconn_is_deallocated_msg(mem)) +#endif /* LWIP_NETCONN_FULLDUPLEX */ + { + err_t err; + if (!lwip_netconn_is_err_msg(mem, &err)) { + struct netconn *newconn = (struct netconn *)mem; + /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */ + /* pcb might be set to NULL already by err_tcp() */ + /* drain recvmbox */ + netconn_drain(newconn); + if (newconn->pcb.tcp != NULL) { + tcp_abort(newconn->pcb.tcp); + newconn->pcb.tcp = NULL; + } + netconn_free(newconn); } - netconn_free(newconn); } } sys_mbox_free(&conn->acceptmbox); @@ -813,6 +890,27 @@ netconn_drain(struct netconn *conn) #endif /* LWIP_TCP */ } +#if LWIP_NETCONN_FULLDUPLEX +static void +netconn_mark_mbox_invalid(struct netconn *conn) +{ + int i, num_waiting; + void *msg = LWIP_CONST_CAST(void *, &netconn_deleted); + + /* Prevent new calls/threads from reading from the mbox */ + conn->flags |= NETCONN_FLAG_MBOXINVALID; + + SYS_ARCH_LOCKED(num_waiting = conn->mbox_threads_waiting); + for (i = 0; i < num_waiting; i++) { + if (sys_mbox_valid_val(conn->recvmbox)) { + sys_mbox_trypost(&conn->recvmbox, msg); + } else { + sys_mbox_trypost(&conn->acceptmbox, msg); + } + } +} +#endif /* LWIP_NETCONN_FULLDUPLEX */ + #if LWIP_TCP /** * Internal helper function to close a TCP netconn: since this sometimes @@ -825,9 +923,9 @@ static err_t lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) { err_t err; - u8_t shut, shut_rx, shut_tx, close; + u8_t shut, shut_rx, shut_tx, shut_close; u8_t close_finished = 0; - struct tcp_pcb* tpcb; + struct tcp_pcb *tpcb; #if LWIP_SO_LINGER u8_t linger_wait_required = 0; #endif /* LWIP_SO_LINGER */ @@ -845,20 +943,20 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) /* shutting down both ends is the same as closing (also if RD or WR side was shut down before already) */ if (shut == NETCONN_SHUT_RDWR) { - close = 1; + shut_close = 1; } else if (shut_rx && ((tpcb->state == FIN_WAIT_1) || (tpcb->state == FIN_WAIT_2) || (tpcb->state == CLOSING))) { - close = 1; + shut_close = 1; } else if (shut_tx && ((tpcb->flags & TF_RXCLOSED) != 0)) { - close = 1; + shut_close = 1; } else { - close = 0; + shut_close = 0; } /* Set back some callback pointers */ - if (close) { + if (shut_close) { tcp_arg(tpcb, NULL); } if (tpcb->state == LISTEN) { @@ -872,13 +970,13 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) if (shut_tx) { tcp_sent(tpcb, NULL); } - if (close) { + if (shut_close) { tcp_poll(tpcb, NULL, 0); tcp_err(tpcb, NULL); } } /* Try to close the connection */ - if (close) { + if (shut_close) { #if LWIP_SO_LINGER /* check linger possibilites before calling tcp_close */ err = ERR_OK; @@ -894,7 +992,7 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) /* data left on a nonblocking netconn -> cannot linger */ err = ERR_WOULDBLOCK; } else if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= - (conn->linger * 1000)) { + (conn->linger * 1000)) { /* data left but linger timeout has expired (this happens on further calls to this function through poll_tcp */ tcp_abort(tpcb); @@ -947,7 +1045,7 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) if (conn->current_msg->msg.sd.polls_left == 0) { #endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ close_finished = 1; - if (close) { + if (shut_close) { /* in this case, we want to RST the connection */ tcp_abort(tpcb); err = ERR_OK; @@ -960,12 +1058,12 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) } if (close_finished) { /* Closing done (succeeded, non-memory error, nonblocking error or timeout) */ - sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg); + sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg); conn->current_msg->err = err; conn->current_msg = NULL; conn->state = NETCONN_NONE; if (err == ERR_OK) { - if (close) { + if (shut_close) { /* Set back some callback pointers as conn is going away */ conn->pcb.tcp = NULL; /* Trigger select() in socket layer. Make sure everybody notices activity @@ -979,7 +1077,6 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); } } - NETCONN_SET_SAFE_ERR(conn, err); #if LWIP_TCPIP_CORE_LOCKING if (delayed) #endif @@ -1013,30 +1110,28 @@ lwip_netconn_do_close_internal(struct netconn *conn WRITE_DELAYED_PARAM) * Delete the pcb inside a netconn. * Called from netconn_delete. * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_delconn(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; enum netconn_state state = msg->conn->state; LWIP_ASSERT("netconn state error", /* this only happens for TCP netconns */ - (state == NETCONN_NONE) || (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP)); + (state == NETCONN_NONE) || (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP)); #if LWIP_NETCONN_FULLDUPLEX /* In full duplex mode, blocking write/connect is aborted with ERR_CLSD */ if (state != NETCONN_NONE) { if ((state == NETCONN_WRITE) || ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) { /* close requested, abort running write/connect */ - sys_sem_t* op_completed_sem; + sys_sem_t *op_completed_sem; LWIP_ASSERT("msg->conn->current_msg != NULL", msg->conn->current_msg != NULL); op_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg); msg->conn->current_msg->err = ERR_CLSD; msg->conn->current_msg = NULL; - msg->conn->write_offset = 0; msg->conn->state = NETCONN_NONE; - NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD); sys_sem_signal(op_completed_sem); } } @@ -1052,49 +1147,52 @@ lwip_netconn_do_delconn(void *m) #endif /* LWIP_NETCONN_FULLDUPLEX */ { LWIP_ASSERT("blocking connect in progress", - (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn)); + (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn)); msg->err = ERR_OK; - /* Drain and delete mboxes */ +#if LWIP_NETCONN_FULLDUPLEX + /* Mark mboxes invalid */ + netconn_mark_mbox_invalid(msg->conn); +#else /* LWIP_NETCONN_FULLDUPLEX */ netconn_drain(msg->conn); +#endif /* LWIP_NETCONN_FULLDUPLEX */ if (msg->conn->pcb.tcp != NULL) { switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW - case NETCONN_RAW: - raw_remove(msg->conn->pcb.raw); - break; + case NETCONN_RAW: + raw_remove(msg->conn->pcb.raw); + break; #endif /* LWIP_RAW */ #if LWIP_UDP - case NETCONN_UDP: - msg->conn->pcb.udp->recv_arg = NULL; - udp_remove(msg->conn->pcb.udp); - break; + case NETCONN_UDP: + msg->conn->pcb.udp->recv_arg = NULL; + udp_remove(msg->conn->pcb.udp); + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case NETCONN_TCP: - LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && - msg->conn->write_offset == 0); - msg->conn->state = NETCONN_CLOSE; - msg->msg.sd.shut = NETCONN_SHUT_RDWR; - msg->conn->current_msg = msg; + case NETCONN_TCP: + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL); + msg->conn->state = NETCONN_CLOSE; + msg->msg.sd.shut = NETCONN_SHUT_RDWR; + msg->conn->current_msg = msg; #if LWIP_TCPIP_CORE_LOCKING - if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) { - LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE); - UNLOCK_TCPIP_CORE(); - sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); - LOCK_TCPIP_CORE(); - LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE); - } + if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) { + LWIP_ASSERT("state!", msg->conn->state == NETCONN_CLOSE); + UNLOCK_TCPIP_CORE(); + sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); + LOCK_TCPIP_CORE(); + LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE); + } #else /* LWIP_TCPIP_CORE_LOCKING */ - lwip_netconn_do_close_internal(msg->conn); + lwip_netconn_do_close_internal(msg->conn); #endif /* LWIP_TCPIP_CORE_LOCKING */ - /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing - the application thread, so we can return at this point! */ - return; + /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing + the application thread, so we can return at this point! */ + return; #endif /* LWIP_TCP */ - default: - break; + default: + break; } msg->conn->pcb.tcp = NULL; } @@ -1114,40 +1212,84 @@ lwip_netconn_do_delconn(void *m) * Bind a pcb contained in a netconn * Called from netconn_bind. * - * @param m the api_msg_msg pointing to the connection and containing + * @param m the api_msg pointing to the connection and containing * the IP address and port to bind to */ void lwip_netconn_do_bind(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; + err_t err; - if (ERR_IS_FATAL(msg->conn->last_err)) { - msg->err = msg->conn->last_err; - } else { - msg->err = ERR_VAL; - if (msg->conn->pcb.tcp != NULL) { - switch (NETCONNTYPE_GROUP(msg->conn->type)) { + if (msg->conn->pcb.tcp != NULL) { + switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW case NETCONN_RAW: - msg->err = raw_bind(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr)); + err = raw_bind(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr)); break; #endif /* LWIP_RAW */ #if LWIP_UDP case NETCONN_UDP: - msg->err = udp_bind(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); + err = udp_bind(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); break; #endif /* LWIP_UDP */ #if LWIP_TCP case NETCONN_TCP: - msg->err = tcp_bind(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); + err = tcp_bind(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); break; #endif /* LWIP_TCP */ default: + err = ERR_VAL; break; - } } + } else { + err = ERR_VAL; } + msg->err = err; + TCPIP_APIMSG_ACK(msg); +} +/** + * Bind a pcb contained in a netconn to an interface + * Called from netconn_bind_if. + * + * @param m the api_msg pointing to the connection and containing + * the IP address and port to bind to + */ +void +lwip_netconn_do_bind_if(void *m) +{ + struct netif *netif; + struct api_msg *msg = (struct api_msg *)m; + err_t err; + + netif = netif_get_by_index(msg->msg.bc.if_idx); + + if ((netif != NULL) && (msg->conn->pcb.tcp != NULL)) { + err = ERR_OK; + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + raw_bind_netif(msg->conn->pcb.raw, netif); + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + udp_bind_netif(msg->conn->pcb.udp, netif); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + tcp_bind_netif(msg->conn->pcb.tcp, netif); + break; +#endif /* LWIP_TCP */ + default: + err = ERR_VAL; + break; + } + } else { + err = ERR_VAL; + } + msg->err = err; TCPIP_APIMSG_ACK(msg); } @@ -1163,7 +1305,7 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err) { struct netconn *conn; int was_blocking; - sys_sem_t* op_completed_sem = NULL; + sys_sem_t *op_completed_sem = NULL; LWIP_UNUSED_ARG(pcb); @@ -1175,7 +1317,7 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err) LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT); LWIP_ASSERT("(conn->current_msg != NULL) || conn->in_non_blocking_connect", - (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn)); + (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn)); if (conn->current_msg != NULL) { conn->current_msg->err = err; @@ -1187,11 +1329,10 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err) was_blocking = !IN_NONBLOCKING_CONNECT(conn); SET_NONBLOCKING_CONNECT(conn, 0); LWIP_ASSERT("blocking connect state error", - (was_blocking && op_completed_sem != NULL) || - (!was_blocking && op_completed_sem == NULL)); + (was_blocking && op_completed_sem != NULL) || + (!was_blocking && op_completed_sem == NULL)); conn->current_msg = NULL; conn->state = NETCONN_NONE; - NETCONN_SET_SAFE_ERR(conn, ERR_OK); API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); if (was_blocking) { @@ -1205,69 +1346,73 @@ lwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err) * Connect a pcb contained inside a netconn * Called from netconn_connect. * - * @param m the api_msg_msg pointing to the connection and containing + * @param m the api_msg pointing to the connection and containing * the IP address and port to connect to */ void lwip_netconn_do_connect(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; + err_t err; if (msg->conn->pcb.tcp == NULL) { /* This may happen when calling netconn_connect() a second time */ - msg->err = ERR_CLSD; + err = ERR_CLSD; } else { switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW - case NETCONN_RAW: - msg->err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr)); - break; + case NETCONN_RAW: + err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr)); + break; #endif /* LWIP_RAW */ #if LWIP_UDP - case NETCONN_UDP: - msg->err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); - break; + case NETCONN_UDP: + err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port); + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case NETCONN_TCP: - /* Prevent connect while doing any other action. */ - if (msg->conn->state == NETCONN_CONNECT) { - msg->err = ERR_ALREADY; - } else if (msg->conn->state != NETCONN_NONE) { - msg->err = ERR_ISCONN; - } else { - setup_tcp(msg->conn); - msg->err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), - msg->msg.bc.port, lwip_netconn_do_connected); - if (msg->err == ERR_OK) { - u8_t non_blocking = netconn_is_nonblocking(msg->conn); - msg->conn->state = NETCONN_CONNECT; - SET_NONBLOCKING_CONNECT(msg->conn, non_blocking); - if (non_blocking) { - msg->err = ERR_INPROGRESS; - } else { - msg->conn->current_msg = msg; - /* sys_sem_signal() is called from lwip_netconn_do_connected (or err_tcp()), - when the connection is established! */ + case NETCONN_TCP: + /* Prevent connect while doing any other action. */ + if (msg->conn->state == NETCONN_CONNECT) { + err = ERR_ALREADY; + } else if (msg->conn->state != NETCONN_NONE) { + err = ERR_ISCONN; + } else { + setup_tcp(msg->conn); + err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), + msg->msg.bc.port, lwip_netconn_do_connected); + if (err == ERR_OK) { + u8_t non_blocking = netconn_is_nonblocking(msg->conn); + msg->conn->state = NETCONN_CONNECT; + SET_NONBLOCKING_CONNECT(msg->conn, non_blocking); + if (non_blocking) { + err = ERR_INPROGRESS; + } else { + msg->conn->current_msg = msg; + /* sys_sem_signal() is called from lwip_netconn_do_connected (or err_tcp()), + when the connection is established! */ #if LWIP_TCPIP_CORE_LOCKING - LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT); - UNLOCK_TCPIP_CORE(); - sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); - LOCK_TCPIP_CORE(); - LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT); + LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT); + UNLOCK_TCPIP_CORE(); + sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); + LOCK_TCPIP_CORE(); + LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT); #endif /* LWIP_TCPIP_CORE_LOCKING */ - return; + return; + } } } - } - break; + break; #endif /* LWIP_TCP */ - default: - LWIP_ERROR("Invalid netconn type", 0, do{ msg->err = ERR_VAL; }while(0)); - break; + default: + LWIP_ERROR("Invalid netconn type", 0, do { + err = ERR_VAL; + } while (0)); + break; } } - /* For all other protocols, netconn_connect() calls TCPIP_APIMSG(), + msg->err = err; + /* For all other protocols, netconn_connect() calls netconn_apimsg(), so use TCPIP_APIMSG_ACK() here. */ TCPIP_APIMSG_ACK(msg); } @@ -1277,12 +1422,12 @@ lwip_netconn_do_connect(void *m) * Only used for UDP netconns. * Called from netconn_disconnect. * - * @param m the api_msg_msg pointing to the connection to disconnect + * @param m the api_msg pointing to the connection to disconnect */ void lwip_netconn_do_disconnect(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; #if LWIP_UDP if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { @@ -1301,82 +1446,81 @@ lwip_netconn_do_disconnect(void *m) * Set a TCP pcb contained in a netconn into listen mode * Called from netconn_listen. * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_listen(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; + err_t err; - if (ERR_IS_FATAL(msg->conn->last_err)) { - msg->err = msg->conn->last_err; - } else { - msg->err = ERR_CONN; - if (msg->conn->pcb.tcp != NULL) { - if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) { - if (msg->conn->state == NETCONN_NONE) { - struct tcp_pcb* lpcb; - if (msg->conn->pcb.tcp->state != CLOSED) { - /* connection is not closed, cannot listen */ - msg->err = ERR_VAL; - } else { - err_t err; - u8_t backlog; + if (msg->conn->pcb.tcp != NULL) { + if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) { + if (msg->conn->state == NETCONN_NONE) { + struct tcp_pcb *lpcb; + if (msg->conn->pcb.tcp->state != CLOSED) { + /* connection is not closed, cannot listen */ + err = ERR_VAL; + } else { + u8_t backlog; #if TCP_LISTEN_BACKLOG - backlog = msg->msg.lb.backlog; + backlog = msg->msg.lb.backlog; #else /* TCP_LISTEN_BACKLOG */ - backlog = TCP_DEFAULT_LISTEN_BACKLOG; + backlog = TCP_DEFAULT_LISTEN_BACKLOG; #endif /* TCP_LISTEN_BACKLOG */ #if LWIP_IPV4 && LWIP_IPV6 - /* "Socket API like" dual-stack support: If IP to listen to is IP6_ADDR_ANY, - * and NETCONN_FLAG_IPV6_V6ONLY is NOT set, use IP_ANY_TYPE to listen - */ - if (ip_addr_cmp(&msg->conn->pcb.ip->local_ip, IP6_ADDR_ANY) && - (netconn_get_ipv6only(msg->conn) == 0)) { - /* change PCB type to IPADDR_TYPE_ANY */ - IP_SET_TYPE_VAL(msg->conn->pcb.tcp->local_ip, IPADDR_TYPE_ANY); - IP_SET_TYPE_VAL(msg->conn->pcb.tcp->remote_ip, IPADDR_TYPE_ANY); - } + /* "Socket API like" dual-stack support: If IP to listen to is IP6_ADDR_ANY, + * and NETCONN_FLAG_IPV6_V6ONLY is NOT set, use IP_ANY_TYPE to listen + */ + if (ip_addr_cmp(&msg->conn->pcb.ip->local_ip, IP6_ADDR_ANY) && + (netconn_get_ipv6only(msg->conn) == 0)) { + /* change PCB type to IPADDR_TYPE_ANY */ + IP_SET_TYPE_VAL(msg->conn->pcb.tcp->local_ip, IPADDR_TYPE_ANY); + IP_SET_TYPE_VAL(msg->conn->pcb.tcp->remote_ip, IPADDR_TYPE_ANY); + } #endif /* LWIP_IPV4 && LWIP_IPV6 */ - lpcb = tcp_listen_with_backlog_and_err(msg->conn->pcb.tcp, backlog, &err); + lpcb = tcp_listen_with_backlog_and_err(msg->conn->pcb.tcp, backlog, &err); - if (lpcb == NULL) { - /* in this case, the old pcb is still allocated */ - msg->err = err; + if (lpcb == NULL) { + /* in this case, the old pcb is still allocated */ + } else { + /* delete the recvmbox and allocate the acceptmbox */ + if (sys_mbox_valid(&msg->conn->recvmbox)) { + /** @todo: should we drain the recvmbox here? */ + sys_mbox_free(&msg->conn->recvmbox); + sys_mbox_set_invalid(&msg->conn->recvmbox); + } + err = ERR_OK; + if (!sys_mbox_valid(&msg->conn->acceptmbox)) { + err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE); + } + if (err == ERR_OK) { + msg->conn->state = NETCONN_LISTEN; + msg->conn->pcb.tcp = lpcb; + tcp_arg(msg->conn->pcb.tcp, msg->conn); + tcp_accept(msg->conn->pcb.tcp, accept_function); } else { - /* delete the recvmbox and allocate the acceptmbox */ - if (sys_mbox_valid(&msg->conn->recvmbox)) { - /** @todo: should we drain the recvmbox here? */ - sys_mbox_free(&msg->conn->recvmbox); - sys_mbox_set_invalid(&msg->conn->recvmbox); - } - msg->err = ERR_OK; - if (!sys_mbox_valid(&msg->conn->acceptmbox)) { - msg->err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE); - } - if (msg->err == ERR_OK) { - msg->conn->state = NETCONN_LISTEN; - msg->conn->pcb.tcp = lpcb; - tcp_arg(msg->conn->pcb.tcp, msg->conn); - tcp_accept(msg->conn->pcb.tcp, accept_function); - } else { - /* since the old pcb is already deallocated, free lpcb now */ - tcp_close(lpcb); - msg->conn->pcb.tcp = NULL; - } + /* since the old pcb is already deallocated, free lpcb now */ + tcp_close(lpcb); + msg->conn->pcb.tcp = NULL; } } - } else if (msg->conn->state == NETCONN_LISTEN) { - /* already listening, allow updating of the backlog */ - msg->err = ERR_OK; - tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog); } + } else if (msg->conn->state == NETCONN_LISTEN) { + /* already listening, allow updating of the backlog */ + err = ERR_OK; + tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog); } else { - msg->err = ERR_ARG; + err = ERR_CONN; } + } else { + err = ERR_ARG; } + } else { + err = ERR_CONN; } + msg->err = err; TCPIP_APIMSG_ACK(msg); } #endif /* LWIP_TCP */ @@ -1385,53 +1529,55 @@ lwip_netconn_do_listen(void *m) * Send some data on a RAW or UDP pcb contained in a netconn * Called from netconn_send * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_send(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; - if (ERR_IS_FATAL(msg->conn->last_err)) { - msg->err = msg->conn->last_err; - } else { - msg->err = ERR_CONN; + err_t err = netconn_err(msg->conn); + if (err == ERR_OK) { if (msg->conn->pcb.tcp != NULL) { switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW - case NETCONN_RAW: - if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { - msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p); - } else { - msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr); - } - break; + case NETCONN_RAW: + if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { + err = raw_send(msg->conn->pcb.raw, msg->msg.b->p); + } else { + err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr); + } + break; #endif #if LWIP_UDP - case NETCONN_UDP: + case NETCONN_UDP: #if LWIP_CHECKSUM_ON_COPY - if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { - msg->err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p, - msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); - } else { - msg->err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p, - &msg->msg.b->addr, msg->msg.b->port, - msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); - } + if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { + err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p, + msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); + } else { + err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p, + &msg->msg.b->addr, msg->msg.b->port, + msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); + } #else /* LWIP_CHECKSUM_ON_COPY */ - if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { - msg->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p); - } else { - msg->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port); - } + if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) { + err = udp_send(msg->conn->pcb.udp, msg->msg.b->p); + } else { + err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port); + } #endif /* LWIP_CHECKSUM_ON_COPY */ - break; + break; #endif /* LWIP_UDP */ - default: - break; + default: + err = ERR_CONN; + break; } + } else { + err = ERR_CONN; } } + msg->err = err; TCPIP_APIMSG_ACK(msg); } @@ -1440,19 +1586,19 @@ lwip_netconn_do_send(void *m) * Indicate data has been received from a TCP pcb contained in a netconn * Called from netconn_recv * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_recv(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; msg->err = ERR_OK; if (msg->conn->pcb.tcp != NULL) { if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) { - u32_t remaining = msg->msg.r.len; + size_t remaining = msg->msg.r.len; do { - u16_t recved = (remaining > 0xffff) ? 0xffff : (u16_t)remaining; + u16_t recved = (u16_t)((remaining > 0xffff) ? 0xffff : remaining); tcp_recved(msg->conn->pcb.tcp, recved); remaining -= recved; } while (remaining != 0); @@ -1465,12 +1611,12 @@ lwip_netconn_do_recv(void *m) /** Indicate that a TCP pcb has been accepted * Called from netconn_accept * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_accepted(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; msg->err = ERR_OK; if (msg->conn->pcb.tcp != NULL) { @@ -1503,13 +1649,15 @@ lwip_netconn_do_writemore(struct netconn *conn WRITE_DELAYED_PARAM) size_t diff; u8_t dontblock; u8_t apiflags; + u8_t write_more; LWIP_ASSERT("conn != NULL", conn != NULL); LWIP_ASSERT("conn->state == NETCONN_WRITE", (conn->state == NETCONN_WRITE)); LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL); LWIP_ASSERT("conn->pcb.tcp != NULL", conn->pcb.tcp != NULL); - LWIP_ASSERT("conn->write_offset < conn->current_msg->msg.w.len", - conn->write_offset < conn->current_msg->msg.w.len); + LWIP_ASSERT("conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len", + conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len); + LWIP_ASSERT("conn->current_msg->msg.w.vector_cnt > 0", conn->current_msg->msg.w.vector_cnt > 0); apiflags = conn->current_msg->msg.w.apiflags; dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK); @@ -1518,75 +1666,96 @@ lwip_netconn_do_writemore(struct netconn *conn WRITE_DELAYED_PARAM) if ((conn->send_timeout != 0) && ((s32_t)(sys_now() - conn->current_msg->msg.w.time_started) >= conn->send_timeout)) { write_finished = 1; - if (conn->write_offset == 0) { + if (conn->current_msg->msg.w.offset == 0) { /* nothing has been written */ err = ERR_WOULDBLOCK; - conn->current_msg->msg.w.len = 0; } else { /* partial write */ err = ERR_OK; - conn->current_msg->msg.w.len = conn->write_offset; - conn->write_offset = 0; } } else #endif /* LWIP_SO_SNDTIMEO */ { - dataptr = (const u8_t*)conn->current_msg->msg.w.dataptr + conn->write_offset; - diff = conn->current_msg->msg.w.len - conn->write_offset; - if (diff > 0xffffUL) { /* max_u16_t */ - len = 0xffff; - apiflags |= TCP_WRITE_FLAG_MORE; - } else { - len = (u16_t)diff; - } - available = tcp_sndbuf(conn->pcb.tcp); - if (available < len) { - /* don't try to write more than sendbuf */ - len = available; - if (dontblock) { - if (!len) { - err = ERR_WOULDBLOCK; - goto err_mem; - } - } else { + do { + dataptr = (const u8_t *)conn->current_msg->msg.w.vector->ptr + conn->current_msg->msg.w.vector_off; + diff = conn->current_msg->msg.w.vector->len - conn->current_msg->msg.w.vector_off; + if (diff > 0xffffUL) { /* max_u16_t */ + len = 0xffff; apiflags |= TCP_WRITE_FLAG_MORE; + } else { + len = (u16_t)diff; } - } - LWIP_ASSERT("lwip_netconn_do_writemore: invalid length!", ((conn->write_offset + len) <= conn->current_msg->msg.w.len)); - err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags); + available = tcp_sndbuf(conn->pcb.tcp); + if (available < len) { + /* don't try to write more than sendbuf */ + len = available; + if (dontblock) { + if (!len) { + /* set error according to partial write or not */ + err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK; + goto err_mem; + } + } else { + apiflags |= TCP_WRITE_FLAG_MORE; + } + } + LWIP_ASSERT("lwip_netconn_do_writemore: invalid length!", + ((conn->current_msg->msg.w.vector_off + len) <= conn->current_msg->msg.w.vector->len)); + /* we should loop around for more sending in the following cases: + 1) We couldn't finish the current vector because of 16-bit size limitations. + tcp_write() and tcp_sndbuf() both are limited to 16-bit sizes + 2) We are sending the remainder of the current vector and have more */ + if ((len == 0xffff && diff > 0xffffUL) || + (len == (u16_t)diff && conn->current_msg->msg.w.vector_cnt > 1)) { + write_more = 1; + apiflags |= TCP_WRITE_FLAG_MORE; + } else { + write_more = 0; + } + err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags); + if (err == ERR_OK) { + conn->current_msg->msg.w.offset += len; + conn->current_msg->msg.w.vector_off += len; + /* check if current vector is finished */ + if (conn->current_msg->msg.w.vector_off == conn->current_msg->msg.w.vector->len) { + conn->current_msg->msg.w.vector_cnt--; + /* if we have additional vectors, move on to them */ + if (conn->current_msg->msg.w.vector_cnt > 0) { + conn->current_msg->msg.w.vector++; + conn->current_msg->msg.w.vector_off = 0; + } + } + } + } while (write_more && err == ERR_OK); /* if OK or memory error, check available space */ if ((err == ERR_OK) || (err == ERR_MEM)) { err_mem: - if (dontblock && (len < conn->current_msg->msg.w.len)) { + if (dontblock && (conn->current_msg->msg.w.offset < conn->current_msg->msg.w.len)) { /* non-blocking write did not write everything: mark the pcb non-writable and let poll_tcp check writable space to mark the pcb writable again */ - API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); + API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0); conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE; } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) || (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT)) { /* The queued byte- or pbuf-count exceeds the configured low-water limit, let select mark this pcb as non-writable. */ - API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); + API_EVENT(conn, NETCONN_EVT_SENDMINUS, 0); } } if (err == ERR_OK) { err_t out_err; - conn->write_offset += len; - if ((conn->write_offset == conn->current_msg->msg.w.len) || dontblock) { - /* return sent length */ - conn->current_msg->msg.w.len = conn->write_offset; - /* everything was written */ + if ((conn->current_msg->msg.w.offset == conn->current_msg->msg.w.len) || dontblock) { + /* return sent length (caller reads length from msg.w.offset) */ write_finished = 1; } out_err = tcp_output(conn->pcb.tcp); - if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) { - /* If tcp_output fails with fatal error or no route is found, + if (out_err == ERR_RTE) { + /* If tcp_output fails because no route is found, don't try writing any more but return the error to the application thread. */ err = out_err; write_finished = 1; - conn->current_msg->msg.w.len = 0; } } else if (err == ERR_MEM) { /* If ERR_MEM, we wait for sent_tcp or poll_tcp to be called. @@ -1596,35 +1765,31 @@ err_mem: /* tcp_write returned ERR_MEM, try tcp_output anyway */ err_t out_err = tcp_output(conn->pcb.tcp); - if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) { - /* If tcp_output fails with fatal error or no route is found, + if (out_err == ERR_RTE) { + /* If tcp_output fails because no route is found, don't try writing any more but return the error to the application thread. */ err = out_err; write_finished = 1; - conn->current_msg->msg.w.len = 0; } else if (dontblock) { - /* non-blocking write is done on ERR_MEM */ - err = ERR_WOULDBLOCK; + /* non-blocking write is done on ERR_MEM, set error according + to partial write or not */ + err = (conn->current_msg->msg.w.offset == 0) ? ERR_WOULDBLOCK : ERR_OK; write_finished = 1; - conn->current_msg->msg.w.len = 0; } } else { /* On errors != ERR_MEM, we don't try writing any more but return the error to the application thread. */ write_finished = 1; - conn->current_msg->msg.w.len = 0; } } if (write_finished) { /* everything was written: set back connection state and back to application task */ - sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg); + sys_sem_t *op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg); conn->current_msg->err = err; conn->current_msg = NULL; - conn->write_offset = 0; conn->state = NETCONN_NONE; - NETCONN_SET_SAFE_ERR(conn, err); #if LWIP_TCPIP_CORE_LOCKING if (delayed) #endif @@ -1645,29 +1810,26 @@ err_mem: * Send some data on a TCP pcb contained in a netconn * Called from netconn_write * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_write(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; - if (ERR_IS_FATAL(msg->conn->last_err)) { - msg->err = msg->conn->last_err; - } else { + err_t err = netconn_err(msg->conn); + if (err == ERR_OK) { if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) { #if LWIP_TCP if (msg->conn->state != NETCONN_NONE) { /* netconn is connecting, closing or in blocking write */ - msg->err = ERR_INPROGRESS; + err = ERR_INPROGRESS; } else if (msg->conn->pcb.tcp != NULL) { msg->conn->state = NETCONN_WRITE; /* set all the variables used by lwip_netconn_do_writemore */ - LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && - msg->conn->write_offset == 0); + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL); LWIP_ASSERT("msg->msg.w.len != 0", msg->msg.w.len != 0); msg->conn->current_msg = msg; - msg->conn->write_offset = 0; #if LWIP_TCPIP_CORE_LOCKING if (lwip_netconn_do_writemore(msg->conn, 0) != ERR_OK) { LWIP_ASSERT("state!", msg->conn->state == NETCONN_WRITE); @@ -1683,17 +1845,18 @@ lwip_netconn_do_write(void *m) since lwip_netconn_do_writemore ACKs it! */ return; } else { - msg->err = ERR_CONN; + err = ERR_CONN; } #else /* LWIP_TCP */ - msg->err = ERR_VAL; + err = ERR_VAL; #endif /* LWIP_TCP */ #if (LWIP_UDP || LWIP_RAW) } else { - msg->err = ERR_VAL; + err = ERR_VAL; #endif /* (LWIP_UDP || LWIP_RAW) */ } } + msg->err = err; TCPIP_APIMSG_ACK(msg); } @@ -1701,61 +1864,61 @@ lwip_netconn_do_write(void *m) * Return a connection's local or remote address * Called from netconn_getaddr * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_getaddr(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; if (msg->conn->pcb.ip != NULL) { if (msg->msg.ad.local) { ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr), - msg->conn->pcb.ip->local_ip); + msg->conn->pcb.ip->local_ip); } else { ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr), - msg->conn->pcb.ip->remote_ip); + msg->conn->pcb.ip->remote_ip); } msg->err = ERR_OK; switch (NETCONNTYPE_GROUP(msg->conn->type)) { #if LWIP_RAW - case NETCONN_RAW: - if (msg->msg.ad.local) { - API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.raw->protocol; - } else { - /* return an error as connecting is only a helper for upper layers */ - msg->err = ERR_CONN; - } - break; + case NETCONN_RAW: + if (msg->msg.ad.local) { + API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.raw->protocol; + } else { + /* return an error as connecting is only a helper for upper layers */ + msg->err = ERR_CONN; + } + break; #endif /* LWIP_RAW */ #if LWIP_UDP - case NETCONN_UDP: - if (msg->msg.ad.local) { - API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port; - } else { - if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) { - msg->err = ERR_CONN; + case NETCONN_UDP: + if (msg->msg.ad.local) { + API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port; } else { - API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port; + if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) { + msg->err = ERR_CONN; + } else { + API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port; + } } - } - break; + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case NETCONN_TCP: - if ((msg->msg.ad.local == 0) && - ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) { - /* pcb is not connected and remote name is requested */ - msg->err = ERR_CONN; - } else { - API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port); - } - break; + case NETCONN_TCP: + if ((msg->msg.ad.local == 0) && + ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) { + /* pcb is not connected and remote name is requested */ + msg->err = ERR_CONN; + } else { + API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port); + } + break; #endif /* LWIP_TCP */ - default: - LWIP_ASSERT("invalid netconn_type", 0); - break; + default: + LWIP_ASSERT("invalid netconn_type", 0); + break; } } else { msg->err = ERR_CONN; @@ -1768,12 +1931,12 @@ lwip_netconn_do_getaddr(void *m) * Called from netconn_close * In contrast to closing sockets, the netconn is not deallocated. * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_close(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; #if LWIP_TCP enum netconn_state state = msg->conn->state; @@ -1790,15 +1953,13 @@ lwip_netconn_do_close(void *m) #if LWIP_NETCONN_FULLDUPLEX if (msg->msg.sd.shut & NETCONN_SHUT_WR) { /* close requested, abort running write */ - sys_sem_t* write_completed_sem; + sys_sem_t *write_completed_sem; LWIP_ASSERT("msg->conn->current_msg != NULL", msg->conn->current_msg != NULL); write_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg); msg->conn->current_msg->err = ERR_CLSD; msg->conn->current_msg = NULL; - msg->conn->write_offset = 0; msg->conn->state = NETCONN_NONE; state = NETCONN_NONE; - NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD); sys_sem_signal(write_completed_sem); } else { LWIP_ASSERT("msg->msg.sd.shut == NETCONN_SHUT_RD", msg->msg.sd.shut == NETCONN_SHUT_RD); @@ -1813,11 +1974,14 @@ lwip_netconn_do_close(void *m) } else { #endif /* LWIP_NETCONN_FULLDUPLEX */ if (msg->msg.sd.shut & NETCONN_SHUT_RD) { - /* Drain and delete mboxes */ +#if LWIP_NETCONN_FULLDUPLEX + /* Mark mboxes invalid */ + netconn_mark_mbox_invalid(msg->conn); +#else /* LWIP_NETCONN_FULLDUPLEX */ netconn_drain(msg->conn); +#endif /* LWIP_NETCONN_FULLDUPLEX */ } - LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && - msg->conn->write_offset == 0); + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL); msg->conn->state = NETCONN_CLOSE; msg->conn->current_msg = msg; #if LWIP_TCPIP_CORE_LOCKING @@ -1847,54 +2011,103 @@ lwip_netconn_do_close(void *m) * Join multicast groups for UDP netconns. * Called from netconn_join_leave_group * - * @param m the api_msg_msg pointing to the connection + * @param m the api_msg pointing to the connection */ void lwip_netconn_do_join_leave_group(void *m) { - struct api_msg *msg = (struct api_msg*)m; + struct api_msg *msg = (struct api_msg *)m; - if (ERR_IS_FATAL(msg->conn->last_err)) { - msg->err = msg->conn->last_err; - } else { - if (msg->conn->pcb.tcp != NULL) { - if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { + msg->err = ERR_CONN; + if (msg->conn->pcb.tcp != NULL) { + if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { #if LWIP_UDP #if LWIP_IPV6 && LWIP_IPV6_MLD - if (NETCONNTYPE_ISIPV6(msg->conn->type)) { - if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { - msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)), - ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); - } else { - msg->err = mld6_leavegroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)), - ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); - } + if (NETCONNTYPE_ISIPV6(msg->conn->type)) { + if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { + msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)), + ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); + } else { + msg->err = mld6_leavegroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)), + ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); } - else + } else #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - { + { #if LWIP_IGMP - if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { - msg->err = igmp_joingroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)), - ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); - } else { - msg->err = igmp_leavegroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)), - ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); - } -#endif /* LWIP_IGMP */ + if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { + msg->err = igmp_joingroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)), + ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); + } else { + msg->err = igmp_leavegroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)), + ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); } +#endif /* LWIP_IGMP */ + } #endif /* LWIP_UDP */ #if (LWIP_TCP || LWIP_RAW) - } else { - msg->err = ERR_VAL; -#endif /* (LWIP_TCP || LWIP_RAW) */ - } } else { - msg->err = ERR_CONN; + msg->err = ERR_VAL; +#endif /* (LWIP_TCP || LWIP_RAW) */ } } TCPIP_APIMSG_ACK(msg); } +/** + * Join multicast groups for UDP netconns. + * Called from netconn_join_leave_group_netif + * + * @param m the api_msg pointing to the connection + */ +void +lwip_netconn_do_join_leave_group_netif(void *m) +{ + struct api_msg *msg = (struct api_msg *)m; + struct netif *netif; + + netif = netif_get_by_index(msg->msg.jl.if_idx); + if (netif == NULL) { + msg->err = ERR_IF; + goto done; + } + + msg->err = ERR_CONN; + if (msg->conn->pcb.tcp != NULL) { + if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { +#if LWIP_UDP +#if LWIP_IPV6 && LWIP_IPV6_MLD + if (NETCONNTYPE_ISIPV6(msg->conn->type)) { + if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { + msg->err = mld6_joingroup_netif(netif, + ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); + } else { + msg->err = mld6_leavegroup_netif(netif, + ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr))); + } + } else +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ + { +#if LWIP_IGMP + if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { + msg->err = igmp_joingroup_netif(netif, + ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); + } else { + msg->err = igmp_leavegroup_netif(netif, + ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr))); + } +#endif /* LWIP_IGMP */ + } +#endif /* LWIP_UDP */ +#if (LWIP_TCP || LWIP_RAW) + } else { + msg->err = ERR_VAL; +#endif /* (LWIP_TCP || LWIP_RAW) */ + } + } + +done: + TCPIP_APIMSG_ACK(msg); +} #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ #if LWIP_DNS @@ -1906,7 +2119,7 @@ lwip_netconn_do_join_leave_group(void *m) static void lwip_netconn_do_dns_found(const char *name, const ip_addr_t *ipaddr, void *arg) { - struct dns_api_msg *msg = (struct dns_api_msg*)arg; + struct dns_api_msg *msg = (struct dns_api_msg *)arg; /* we trust the internal implementation to be correct :-) */ LWIP_UNUSED_ARG(name); @@ -1932,7 +2145,7 @@ lwip_netconn_do_dns_found(const char *name, const ip_addr_t *ipaddr, void *arg) void lwip_netconn_do_gethostbyname(void *arg) { - struct dns_api_msg *msg = (struct dns_api_msg*)arg; + struct dns_api_msg *msg = (struct dns_api_msg *)arg; u8_t addrtype = #if LWIP_IPV4 && LWIP_IPV6 msg->dns_addrtype; @@ -1941,12 +2154,22 @@ lwip_netconn_do_gethostbyname(void *arg) #endif API_EXPR_DEREF(msg->err) = dns_gethostbyname_addrtype(msg->name, - API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype); + API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype); +#if LWIP_TCPIP_CORE_LOCKING + /* For core locking, only block if we need to wait for answer/timeout */ + if (API_EXPR_DEREF(msg->err) == ERR_INPROGRESS) { + UNLOCK_TCPIP_CORE(); + sys_sem_wait(API_EXPR_REF_SEM(msg->sem)); + LOCK_TCPIP_CORE(); + LWIP_ASSERT("do_gethostbyname still in progress!!", API_EXPR_DEREF(msg->err) != ERR_INPROGRESS); + } +#else /* LWIP_TCPIP_CORE_LOCKING */ if (API_EXPR_DEREF(msg->err) != ERR_INPROGRESS) { /* on error or immediate success, wake up the application * task waiting in netconn_gethostbyname */ sys_sem_signal(API_EXPR_REF_SEM(msg->sem)); } +#endif /* LWIP_TCPIP_CORE_LOCKING */ } #endif /* LWIP_DNS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/err.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/err.c similarity index 76% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/err.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/err.c index fb3f6ce..dd2b62d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/err.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/err.c @@ -35,10 +35,6 @@ * Author: Adam Dunkels * */ -#include -#include -#include -#include #include "lwip/err.h" #include "lwip/def.h" @@ -82,23 +78,23 @@ err_to_errno(err_t err) #ifdef LWIP_DEBUG static const char *err_strerr[] = { - "Ok.", /* ERR_OK 0 */ - "Out of memory error.", /* ERR_MEM -1 */ - "Buffer error.", /* ERR_BUF -2 */ - "Timeout.", /* ERR_TIMEOUT -3 */ - "Routing problem.", /* ERR_RTE -4 */ - "Operation in progress.", /* ERR_INPROGRESS -5 */ - "Illegal value.", /* ERR_VAL -6 */ - "Operation would block.", /* ERR_WOULDBLOCK -7 */ - "Address in use.", /* ERR_USE -8 */ - "Already connecting.", /* ERR_ALREADY -9 */ - "Already connected.", /* ERR_ISCONN -10 */ - "Not connected.", /* ERR_CONN -11 */ - "Low-level netif error.", /* ERR_IF -12 */ - "Connection aborted.", /* ERR_ABRT -13 */ - "Connection reset.", /* ERR_RST -14 */ - "Connection closed.", /* ERR_CLSD -15 */ - "Illegal argument." /* ERR_ARG -16 */ + "Ok.", /* ERR_OK 0 */ + "Out of memory error.", /* ERR_MEM -1 */ + "Buffer error.", /* ERR_BUF -2 */ + "Timeout.", /* ERR_TIMEOUT -3 */ + "Routing problem.", /* ERR_RTE -4 */ + "Operation in progress.", /* ERR_INPROGRESS -5 */ + "Illegal value.", /* ERR_VAL -6 */ + "Operation would block.", /* ERR_WOULDBLOCK -7 */ + "Address in use.", /* ERR_USE -8 */ + "Already connecting.", /* ERR_ALREADY -9 */ + "Already connected.", /* ERR_ISCONN -10 */ + "Not connected.", /* ERR_CONN -11 */ + "Low-level netif error.", /* ERR_IF -12 */ + "Connection aborted.", /* ERR_ABRT -13 */ + "Connection reset.", /* ERR_RST -14 */ + "Connection closed.", /* ERR_CLSD -15 */ + "Illegal argument." /* ERR_ARG -16 */ }; /** diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/if_api.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/if_api.c new file mode 100644 index 0000000..8e094d0 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/if_api.c @@ -0,0 +1,102 @@ +/** + * @file + * Interface Identification APIs from: + * RFC 3493: Basic Socket Interface Extensions for IPv6 + * Section 4: Interface Identification + * + * @defgroup if_api Interface Identification API + * @ingroup socket + */ + +/* + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Joel Cunningham + * + */ +#include "lwip/opt.h" + +#if LWIP_SOCKET + +#include "lwip/errno.h" +#include "lwip/if_api.h" +#include "lwip/netifapi.h" +#include "lwip/priv/sockets_priv.h" + +/** + * @ingroup if_api + * Maps an interface index to its corresponding name. + * @param ifindex interface index + * @param ifname shall point to a buffer of at least {IF_NAMESIZE} bytes + * @return If ifindex is an interface index, then the function shall return the + * value supplied in ifname, which points to a buffer now containing the interface name. + * Otherwise, the function shall return a NULL pointer. + */ +char * +lwip_if_indextoname(unsigned int ifindex, char *ifname) +{ +#if LWIP_NETIF_API + if (ifindex <= 0xff) { + err_t err = netifapi_netif_index_to_name((u8_t)ifindex, ifname); + if (!err && ifname[0] != '\0') { + return ifname; + } + } +#else /* LWIP_NETIF_API */ + LWIP_UNUSED_ARG(ifindex); + LWIP_UNUSED_ARG(ifname); +#endif /* LWIP_NETIF_API */ + set_errno(ENXIO); + return NULL; +} + +/** + * @ingroup if_api + * Returs the interface index corresponding to name ifname. + * @param ifname Interface name + * @return The corresponding index if ifname is the name of an interface; + * otherwise, zero. + */ +unsigned int +lwip_if_nametoindex(const char *ifname) +{ +#if LWIP_NETIF_API + err_t err; + u8_t idx; + + err = netifapi_netif_name_to_index(ifname, &idx); + if (!err) { + return idx; + } +#else /* LWIP_NETIF_API */ + LWIP_UNUSED_ARG(ifname); +#endif /* LWIP_NETIF_API */ + return 0; /* invalid index */ +} + +#endif /* LWIP_SOCKET */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netbuf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netbuf.c similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netbuf.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netbuf.c index eb25011..3b910de 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netbuf.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netbuf.c @@ -109,10 +109,10 @@ netbuf_alloc(struct netbuf *buf, u16_t size) } buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM); if (buf->p == NULL) { - return NULL; + return NULL; } LWIP_ASSERT("check that first pbuf can hold size", - (buf->p->len >= size)); + (buf->p->len >= size)); buf->ptr = buf->p; return buf->p->payload; } @@ -131,6 +131,10 @@ netbuf_free(struct netbuf *buf) pbuf_free(buf->p); } buf->p = buf->ptr = NULL; +#if LWIP_CHECKSUM_ON_COPY + buf->flags = 0; + buf->toport_chksum = 0; +#endif /* LWIP_CHECKSUM_ON_COPY */ } /** @@ -155,7 +159,7 @@ netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size) buf->ptr = NULL; return ERR_MEM; } - ((struct pbuf_rom*)buf->p)->payload = dataptr; + ((struct pbuf_rom *)buf->p)->payload = dataptr; buf->p->len = buf->p->tot_len = size; buf->ptr = buf->p; return ERR_OK; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netdb.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netdb.c similarity index 89% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netdb.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netdb.c index ccd9586..ee78297 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netdb.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netdb.c @@ -83,7 +83,7 @@ int h_errno; * @return an entry containing addresses of address family AF_INET * for the host with name name */ -struct hostent* +struct hostent * lwip_gethostbyname(const char *name) { err_t err; @@ -115,21 +115,20 @@ lwip_gethostbyname(const char *name) s_hostent.h_aliases = &s_aliases; s_hostent.h_addrtype = AF_INET; s_hostent.h_length = sizeof(ip_addr_t); - s_hostent.h_addr_list = (char**)&s_phostent_addr; + s_hostent.h_addr_list = (char **)&s_phostent_addr; #if DNS_DEBUG /* dump hostent */ LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_name == %s\n", s_hostent.h_name)); - LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases == %p\n", (void*)s_hostent.h_aliases)); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases == %p\n", (void *)s_hostent.h_aliases)); /* h_aliases are always empty */ LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addrtype == %d\n", s_hostent.h_addrtype)); LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_length == %d\n", s_hostent.h_length)); - LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list == %p\n", (void*)s_hostent.h_addr_list)); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list == %p\n", (void *)s_hostent.h_addr_list)); if (s_hostent.h_addr_list != NULL) { u8_t idx; - for (idx=0; s_hostent.h_addr_list[idx]; idx++) { - LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i] == %p\n", idx, s_hostent.h_addr_list[idx])); - LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ipaddr_ntoa((ip_addr_t*)s_hostent.h_addr_list[idx]))); + for (idx = 0; s_hostent.h_addr_list[idx]; idx++) { + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ipaddr_ntoa(s_phostent_addr[idx]))); } } #endif /* DNS_DEBUG */ @@ -160,7 +159,7 @@ lwip_gethostbyname(const char *name) */ int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, - size_t buflen, struct hostent **result, int *h_errnop) + size_t buflen, struct hostent **result, int *h_errnop) { err_t err; struct gethostbyname_r_helper *h; @@ -187,14 +186,14 @@ lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, } namelen = strlen(name); - if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) { + if (buflen < (sizeof(struct gethostbyname_r_helper) + LWIP_MEM_ALIGN_BUFFER(namelen + 1))) { /* buf can't hold the data needed + a copy of name */ *h_errnop = ERANGE; return -1; } - h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf); - hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper); + h = (struct gethostbyname_r_helper *)LWIP_MEM_ALIGN(buf); + hostname = ((char *)h) + sizeof(struct gethostbyname_r_helper); /* query host IP address */ err = netconn_gethostbyname(name, &h->addr); @@ -216,7 +215,7 @@ lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, ret->h_aliases = &h->aliases; ret->h_addrtype = AF_INET; ret->h_length = sizeof(ip_addr_t); - ret->h_addr_list = (char**)&h->addr_list; + ret->h_addr_list = (char **)&h->addr_list; /* set result != NULL */ *result = ret; @@ -267,7 +266,7 @@ lwip_freeaddrinfo(struct addrinfo *ai) */ int lwip_getaddrinfo(const char *nodename, const char *servname, - const struct addrinfo *hints, struct addrinfo **res) + const struct addrinfo *hints, struct addrinfo **res) { err_t err; ip_addr_t addr; @@ -290,12 +289,12 @@ lwip_getaddrinfo(const char *nodename, const char *servname, ai_family = hints->ai_family; if ((ai_family != AF_UNSPEC) #if LWIP_IPV4 - && (ai_family != AF_INET) + && (ai_family != AF_INET) #endif /* LWIP_IPV4 */ #if LWIP_IPV6 - && (ai_family != AF_INET6) + && (ai_family != AF_INET6) #endif /* LWIP_IPV6 */ - ) { + ) { return EAI_FAMILY; } } else { @@ -306,7 +305,11 @@ lwip_getaddrinfo(const char *nodename, const char *servname, /* service name specified: convert to port number * @todo?: currently, only ASCII integers (port numbers) are supported (AI_NUMERICSERV)! */ port_nr = atoi(servname); - if ((port_nr <= 0) || (port_nr > 0xffff)) { + if (port_nr == 0 && (servname[0] != '0')) { + /* atoi failed - service was not numeric */ + return EAI_SERVICE; + } + if ((port_nr < 0) || (port_nr > 0xffff)) { return EAI_SERVICE; } } @@ -342,9 +345,9 @@ lwip_getaddrinfo(const char *nodename, const char *servname, } else { /* service location specified, use loopback address */ if ((hints != NULL) && (hints->ai_flags & AI_PASSIVE)) { - ip_addr_set_any(ai_family == AF_INET6, &addr); + ip_addr_set_any_val(ai_family == AF_INET6, addr); } else { - ip_addr_set_loopback(ai_family == AF_INET6, &addr); + ip_addr_set_loopback_val(ai_family == AF_INET6, addr); } } @@ -360,27 +363,28 @@ lwip_getaddrinfo(const char *nodename, const char *servname, } /* If this fails, please report to lwip-devel! :-) */ LWIP_ASSERT("total_size <= NETDB_ELEM_SIZE: please report this!", - total_size <= NETDB_ELEM_SIZE); + total_size <= NETDB_ELEM_SIZE); ai = (struct addrinfo *)memp_malloc(MEMP_NETDB); if (ai == NULL) { return EAI_MEMORY; } memset(ai, 0, total_size); /* cast through void* to get rid of alignment warnings */ - sa = (struct sockaddr_storage *)(void*)((u8_t*)ai + sizeof(struct addrinfo)); + sa = (struct sockaddr_storage *)(void *)((u8_t *)ai + sizeof(struct addrinfo)); if (IP_IS_V6_VAL(addr)) { #if LWIP_IPV6 - struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa; + struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; /* set up sockaddr */ inet6_addr_from_ip6addr(&sa6->sin6_addr, ip_2_ip6(&addr)); sa6->sin6_family = AF_INET6; sa6->sin6_len = sizeof(struct sockaddr_in6); sa6->sin6_port = lwip_htons((u16_t)port_nr); + sa6->sin6_scope_id = ip6_addr_zone(ip_2_ip6(&addr)); ai->ai_family = AF_INET6; #endif /* LWIP_IPV6 */ } else { #if LWIP_IPV4 - struct sockaddr_in *sa4 = (struct sockaddr_in*)sa; + struct sockaddr_in *sa4 = (struct sockaddr_in *)sa; /* set up sockaddr */ inet_addr_from_ip4addr(&sa4->sin_addr, ip_2_ip4(&addr)); sa4->sin_family = AF_INET; @@ -398,12 +402,12 @@ lwip_getaddrinfo(const char *nodename, const char *servname, } if (nodename != NULL) { /* copy nodename to canonname if specified */ - ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage)); + ai->ai_canonname = ((char *)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage)); MEMCPY(ai->ai_canonname, nodename, namelen); ai->ai_canonname[namelen] = 0; } ai->ai_addrlen = sizeof(struct sockaddr_storage); - ai->ai_addr = (struct sockaddr*)sa; + ai->ai_addr = (struct sockaddr *)sa; *res = ai; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netifapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netifapi.c similarity index 57% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netifapi.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netifapi.c index fef05a3..25957cd 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/netifapi.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/netifapi.c @@ -5,10 +5,10 @@ * @defgroup netifapi NETIF API * @ingroup sequential_api * Thread-safe functions to be called from non-TCPIP threads - * + * * @defgroup netifapi_netif NETIF related * @ingroup netifapi - * To be called from non-TCPIP threads + * To be called from non-TCPIP threads */ /* @@ -42,10 +42,13 @@ #if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ +#include "lwip/etharp.h" #include "lwip/netifapi.h" #include "lwip/memp.h" #include "lwip/priv/tcpip_priv.h" +#include /* strncpy */ + #define NETIFAPI_VAR_REF(name) API_VAR_REF(name) #define NETIFAPI_VAR_DECLARE(name) API_VAR_DECLARE(struct netifapi_msg, name) #define NETIFAPI_VAR_ALLOC(name) API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name, ERR_MEM) @@ -57,10 +60,10 @@ static err_t netifapi_do_netif_add(struct tcpip_api_call_data *m) { - /* cast through void* to silence alignment warnings. + /* cast through void* to silence alignment warnings. * We know it works because the structs have been instantiated as struct netifapi_msg */ - struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m; - + struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m; + if (!netif_add( msg->netif, #if LWIP_IPV4 API_EXPR_REF(msg->msg.add.ipaddr), @@ -83,9 +86,9 @@ netifapi_do_netif_add(struct tcpip_api_call_data *m) static err_t netifapi_do_netif_set_addr(struct tcpip_api_call_data *m) { - /* cast through void* to silence alignment warnings. + /* cast through void* to silence alignment warnings. * We know it works because the structs have been instantiated as struct netifapi_msg */ - struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m; + struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m; netif_set_addr( msg->netif, API_EXPR_REF(msg->msg.add.ipaddr), @@ -95,6 +98,37 @@ netifapi_do_netif_set_addr(struct tcpip_api_call_data *m) } #endif /* LWIP_IPV4 */ +/** +* Call netif_name_to_index() inside the tcpip_thread context. +*/ +static err_t +netifapi_do_name_to_index(struct tcpip_api_call_data *m) +{ + /* cast through void* to silence alignment warnings. + * We know it works because the structs have been instantiated as struct netifapi_msg */ + struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m; + + msg->msg.ifs.index = netif_name_to_index(msg->msg.ifs.name); + return ERR_OK; +} + +/** +* Call netif_index_to_name() inside the tcpip_thread context. +*/ +static err_t +netifapi_do_index_to_name(struct tcpip_api_call_data *m) +{ + /* cast through void* to silence alignment warnings. + * We know it works because the structs have been instantiated as struct netifapi_msg */ + struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m; + + if (!netif_index_to_name(msg->msg.ifs.index, msg->msg.ifs.name)) { + /* return failure via empty name */ + msg->msg.ifs.name[0] = '\0'; + } + return ERR_OK; +} + /** * Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the * tcpip_thread context. @@ -102,9 +136,9 @@ netifapi_do_netif_set_addr(struct tcpip_api_call_data *m) static err_t netifapi_do_netif_common(struct tcpip_api_call_data *m) { - /* cast through void* to silence alignment warnings. + /* cast through void* to silence alignment warnings. * We know it works because the structs have been instantiated as struct netifapi_msg */ - struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m; + struct netifapi_msg *msg = (struct netifapi_msg *)(void *)m; if (msg->msg.common.errtfunc != NULL) { return msg->msg.common.errtfunc(msg->netif); @@ -114,6 +148,69 @@ netifapi_do_netif_common(struct tcpip_api_call_data *m) } } +#if LWIP_ARP && LWIP_IPV4 +/** + * @ingroup netifapi_arp + * Add or update an entry in the ARP cache. + * For an update, ipaddr is used to find the cache entry. + * + * @param ipaddr IPv4 address of cache entry + * @param ethaddr hardware address mapped to ipaddr + * @param type type of ARP cache entry + * @return ERR_OK: entry added/updated, else error from err_t + */ +err_t +netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type) +{ + err_t err; + + /* We only support permanent entries currently */ + LWIP_UNUSED_ARG(type); + +#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING + LOCK_TCPIP_CORE(); + err = etharp_add_static_entry(ipaddr, ethaddr); + UNLOCK_TCPIP_CORE(); +#else + /* @todo add new vars to struct netifapi_msg and create a 'do' func */ + LWIP_UNUSED_ARG(ipaddr); + LWIP_UNUSED_ARG(ethaddr); + err = ERR_VAL; +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING */ + + return err; +} + +/** + * @ingroup netifapi_arp + * Remove an entry in the ARP cache identified by ipaddr + * + * @param ipaddr IPv4 address of cache entry + * @param type type of ARP cache entry + * @return ERR_OK: entry removed, else error from err_t + */ +err_t +netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type) +{ + err_t err; + + /* We only support permanent entries currently */ + LWIP_UNUSED_ARG(type); + +#if ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING + LOCK_TCPIP_CORE(); + err = etharp_remove_static_entry(ipaddr); + UNLOCK_TCPIP_CORE(); +#else + /* @todo add new vars to struct netifapi_msg and create a 'do' func */ + LWIP_UNUSED_ARG(ipaddr); + err = ERR_VAL; +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES && LWIP_TCPIP_CORE_LOCKING */ + + return err; +} +#endif /* LWIP_ARP && LWIP_IPV4 */ + /** * @ingroup netifapi_netif * Call netif_add() in a thread-safe way by running that function inside the @@ -204,7 +301,7 @@ netifapi_netif_set_addr(struct netif *netif, */ err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, - netifapi_errt_fn errtfunc) + netifapi_errt_fn errtfunc) { err_t err; NETIFAPI_VAR_DECLARE(msg); @@ -218,4 +315,66 @@ netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, return err; } +/** +* @ingroup netifapi_netif +* Call netif_name_to_index() in a thread-safe way by running that function inside the +* tcpip_thread context. +* +* @param name the interface name of the netif +* @param idx output index of the found netif +*/ +err_t +netifapi_netif_name_to_index(const char *name, u8_t *idx) +{ + err_t err; + NETIFAPI_VAR_DECLARE(msg); + NETIFAPI_VAR_ALLOC(msg); + + *idx = 0; + +#if LWIP_MPU_COMPATIBLE + strncpy(NETIFAPI_VAR_REF(msg).msg.ifs.name, name, NETIF_NAMESIZE - 1); + NETIFAPI_VAR_REF(msg).msg.ifs.name[NETIF_NAMESIZE - 1] = '\0'; +#else + NETIFAPI_VAR_REF(msg).msg.ifs.name = LWIP_CONST_CAST(char *, name); +#endif /* LWIP_MPU_COMPATIBLE */ + err = tcpip_api_call(netifapi_do_name_to_index, &API_VAR_REF(msg).call); + if (!err) { + *idx = NETIFAPI_VAR_REF(msg).msg.ifs.index; + } + NETIFAPI_VAR_FREE(msg); + return err; +} + +/** +* @ingroup netifapi_netif +* Call netif_index_to_name() in a thread-safe way by running that function inside the +* tcpip_thread context. +* +* @param idx the interface index of the netif +* @param name output name of the found netif, empty '\0' string if netif not found. +* name should be of at least NETIF_NAMESIZE bytes +*/ +err_t +netifapi_netif_index_to_name(u8_t idx, char *name) +{ + err_t err; + NETIFAPI_VAR_DECLARE(msg); + NETIFAPI_VAR_ALLOC(msg); + + NETIFAPI_VAR_REF(msg).msg.ifs.index = idx; +#if !LWIP_MPU_COMPATIBLE + NETIFAPI_VAR_REF(msg).msg.ifs.name = name; +#endif /* LWIP_MPU_COMPATIBLE */ + err = tcpip_api_call(netifapi_do_index_to_name, &API_VAR_REF(msg).call); +#if LWIP_MPU_COMPATIBLE + if (!err) { + strncpy(name, NETIFAPI_VAR_REF(msg).msg.ifs.name, NETIF_NAMESIZE - 1); + name[NETIF_NAMESIZE - 1] = '\0'; + } +#endif /* LWIP_MPU_COMPATIBLE */ + NETIFAPI_VAR_FREE(msg); + return err; +} + #endif /* LWIP_NETIF_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/sockets.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/sockets.c new file mode 100644 index 0000000..7852635 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/sockets.c @@ -0,0 +1,4166 @@ +/** + * @file + * Sockets BSD-Like API module + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * Improved by Marc Boucher and David Haas + * + */ + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sockets.h" +#include "lwip/priv/sockets_priv.h" +#include "lwip/api.h" +#include "lwip/igmp.h" +#include "lwip/inet.h" +#include "lwip/tcp.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/priv/tcpip_priv.h" +#include "lwip/mld6.h" +#if LWIP_CHECKSUM_ON_COPY +#include "lwip/inet_chksum.h" +#endif + +#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES +#include +#endif + +#include + +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif + +/* If the netconn API is not required publicly, then we include the necessary + files here to get the implementation */ +#if !LWIP_NETCONN +#undef LWIP_NETCONN +#define LWIP_NETCONN 1 +#include "api_msg.c" +#include "api_lib.c" +#include "netbuf.c" +#undef LWIP_NETCONN +#define LWIP_NETCONN 0 +#endif + +#define API_SELECT_CB_VAR_REF(name) API_VAR_REF(name) +#define API_SELECT_CB_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_select_cb, name) +#define API_SELECT_CB_VAR_ALLOC(name, retblock) API_VAR_ALLOC_EXT(struct lwip_select_cb, MEMP_SELECT_CB, name, retblock) +#define API_SELECT_CB_VAR_FREE(name) API_VAR_FREE(MEMP_SELECT_CB, name) + +#if LWIP_IPV4 +#define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \ + (sin)->sin_len = sizeof(struct sockaddr_in); \ + (sin)->sin_family = AF_INET; \ + (sin)->sin_port = lwip_htons((port)); \ + inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \ + memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0) +#define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipaddr, port) do { \ + inet_addr_to_ip4addr(ip_2_ip4(ipaddr), &((sin)->sin_addr)); \ + (port) = lwip_ntohs((sin)->sin_port); }while(0) +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6 +#define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \ + (sin6)->sin6_len = sizeof(struct sockaddr_in6); \ + (sin6)->sin6_family = AF_INET6; \ + (sin6)->sin6_port = lwip_htons((port)); \ + (sin6)->sin6_flowinfo = 0; \ + inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \ + (sin6)->sin6_scope_id = ip6_addr_zone(ipaddr); }while(0) +#define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \ + inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \ + if (ip6_addr_has_scope(ip_2_ip6(ipaddr), IP6_UNKNOWN)) { \ + ip6_addr_set_zone(ip_2_ip6(ipaddr), (u8_t)((sin6)->sin6_scope_id)); \ + } \ + (port) = lwip_ntohs((sin6)->sin6_port); }while(0) +#endif /* LWIP_IPV6 */ + +#if LWIP_IPV4 && LWIP_IPV6 +static void sockaddr_to_ipaddr_port(const struct sockaddr *sockaddr, ip_addr_t *ipaddr, u16_t *port); + +#define IS_SOCK_ADDR_LEN_VALID(namelen) (((namelen) == sizeof(struct sockaddr_in)) || \ + ((namelen) == sizeof(struct sockaddr_in6))) +#define IS_SOCK_ADDR_TYPE_VALID(name) (((name)->sa_family == AF_INET) || \ + ((name)->sa_family == AF_INET6)) +#define SOCK_ADDR_TYPE_MATCH(name, sock) \ + ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \ + (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type)))) +#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) do { \ + if (IP_IS_ANY_TYPE_VAL(*ipaddr) || IP_IS_V6_VAL(*ipaddr)) { \ + IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port); \ + } else { \ + IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port); \ + } } while(0) +#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) sockaddr_to_ipaddr_port(sockaddr, ipaddr, &(port)) +#define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? \ + (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6)) +#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */ +#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in6)) +#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET6) +#define SOCK_ADDR_TYPE_MATCH(name, sock) 1 +#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \ + IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port) +#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \ + SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, port) +#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type) +#else /*-> LWIP_IPV4: LWIP_IPV4 && LWIP_IPV6 */ +#define IS_SOCK_ADDR_LEN_VALID(namelen) ((namelen) == sizeof(struct sockaddr_in)) +#define IS_SOCK_ADDR_TYPE_VALID(name) ((name)->sa_family == AF_INET) +#define SOCK_ADDR_TYPE_MATCH(name, sock) 1 +#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \ + IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port) +#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \ + SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, port) +#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type) +#endif /* LWIP_IPV6 */ + +#define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) (((name)->sa_family == AF_UNSPEC) || \ + IS_SOCK_ADDR_TYPE_VALID(name)) +#define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \ + SOCK_ADDR_TYPE_MATCH(name, sock)) +#define IS_SOCK_ADDR_ALIGNED(name) ((((mem_ptr_t)(name)) % 4) == 0) + + +#define LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype) do { if ((optlen) < sizeof(opttype)) { done_socket(sock); return EINVAL; }}while(0) +#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \ + LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \ + if ((sock)->conn == NULL) { done_socket(sock); return EINVAL; } }while(0) +#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \ + LWIP_SOCKOPT_CHECK_OPTLEN(sock, optlen, opttype); \ + if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { done_socket(sock); return EINVAL; } }while(0) +#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \ + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \ + if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { done_socket(sock); return ENOPROTOOPT; } }while(0) + + +#define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name) API_VAR_REF(name) +#define LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_setgetsockopt_data, name) +#define LWIP_SETGETSOCKOPT_DATA_VAR_FREE(name) API_VAR_FREE(MEMP_SOCKET_SETGETSOCKOPT_DATA, name) +#if LWIP_MPU_COMPATIBLE +#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \ + name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \ + if (name == NULL) { \ + sock_set_errno(sock, ENOMEM); \ + done_socket(sock); \ + return -1; \ + } }while(0) +#else /* LWIP_MPU_COMPATIBLE */ +#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) +#endif /* LWIP_MPU_COMPATIBLE */ + +#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD +#define LWIP_SO_SNDRCVTIMEO_OPTTYPE int +#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) (*(int *)(optval) = (val)) +#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((long)*(const int*)(optval)) +#else +#define LWIP_SO_SNDRCVTIMEO_OPTTYPE struct timeval +#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) do { \ + u32_t loc = (val); \ + ((struct timeval *)(optval))->tv_sec = (long)((loc) / 1000U); \ + ((struct timeval *)(optval))->tv_usec = (long)(((loc) % 1000U) * 1000U); }while(0) +#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000) + (((const struct timeval *)(optval))->tv_usec / 1000)) +#endif + + +/** A struct sockaddr replacement that has the same alignment as sockaddr_in/ + * sockaddr_in6 if instantiated. + */ +union sockaddr_aligned { + struct sockaddr sa; +#if LWIP_IPV6 + struct sockaddr_in6 sin6; +#endif /* LWIP_IPV6 */ +#if LWIP_IPV4 + struct sockaddr_in sin; +#endif /* LWIP_IPV4 */ +}; + +/* Define the number of IPv4 multicast memberships, default is one per socket */ +#ifndef LWIP_SOCKET_MAX_MEMBERSHIPS +#define LWIP_SOCKET_MAX_MEMBERSHIPS NUM_SOCKETS +#endif + +#if LWIP_IGMP +/* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when + a socket is closed */ +struct lwip_socket_multicast_pair { + /** the socket */ + struct lwip_sock *sock; + /** the interface address */ + ip4_addr_t if_addr; + /** the group address */ + ip4_addr_t multi_addr; +}; + +static struct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS]; + +static int lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr); +static void lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr); +static void lwip_socket_drop_registered_memberships(int s); +#endif /* LWIP_IGMP */ + +#if LWIP_IPV6_MLD +/* This is to keep track of IP_JOIN_GROUP calls to drop the membership when + a socket is closed */ +struct lwip_socket_multicast_mld6_pair { + /** the socket */ + struct lwip_sock *sock; + /** the interface index */ + u8_t if_idx; + /** the group address */ + ip6_addr_t multi_addr; +}; + +static struct lwip_socket_multicast_mld6_pair socket_ipv6_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS]; + +static int lwip_socket_register_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr); +static void lwip_socket_unregister_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr); +static void lwip_socket_drop_registered_mld6_memberships(int s); +#endif /* LWIP_IPV6_MLD */ + +/** The global array of available sockets */ +static struct lwip_sock sockets[NUM_SOCKETS]; + +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL +#if LWIP_TCPIP_CORE_LOCKING +/* protect the select_cb_list using core lock */ +#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev) +#define LWIP_SOCKET_SELECT_PROTECT(lev) LOCK_TCPIP_CORE() +#define LWIP_SOCKET_SELECT_UNPROTECT(lev) UNLOCK_TCPIP_CORE() +#else /* LWIP_TCPIP_CORE_LOCKING */ +/* protect the select_cb_list using SYS_LIGHTWEIGHT_PROT */ +#define LWIP_SOCKET_SELECT_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev) +#define LWIP_SOCKET_SELECT_PROTECT(lev) SYS_ARCH_PROTECT(lev) +#define LWIP_SOCKET_SELECT_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev) +/** This counter is increased from lwip_select when the list is changed + and checked in select_check_waiters to see if it has changed. */ +static volatile int select_cb_ctr; +#endif /* LWIP_TCPIP_CORE_LOCKING */ +/** The global list of tasks waiting for select */ +static struct lwip_select_cb *select_cb_list; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + +#define sock_set_errno(sk, e) do { \ + const int sockerr = (e); \ + set_errno(sockerr); \ +} while (0) + +/* Forward declaration of some functions */ +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL +static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len); +#define DEFAULT_SOCKET_EVENTCB event_callback +static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent); +#else +#define DEFAULT_SOCKET_EVENTCB NULL +#endif +#if !LWIP_TCPIP_CORE_LOCKING +static void lwip_getsockopt_callback(void *arg); +static void lwip_setsockopt_callback(void *arg); +#endif +static int lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen); +static int lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen); +static int free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn, + union lwip_sock_lastdata *lastdata); +static void free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_lastdata *lastdata); + +#if LWIP_IPV4 && LWIP_IPV6 +static void +sockaddr_to_ipaddr_port(const struct sockaddr *sockaddr, ip_addr_t *ipaddr, u16_t *port) +{ + if ((sockaddr->sa_family) == AF_INET6) { + SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6 *)(const void *)(sockaddr), ipaddr, *port); + ipaddr->type = IPADDR_TYPE_V6; + } else { + SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in *)(const void *)(sockaddr), ipaddr, *port); + ipaddr->type = IPADDR_TYPE_V4; + } +} +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + +/** LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */ +void +lwip_socket_thread_init(void) +{ + netconn_thread_init(); +} + +/** LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */ +void +lwip_socket_thread_cleanup(void) +{ + netconn_thread_cleanup(); +} + +#if LWIP_NETCONN_FULLDUPLEX +/* Thread-safe increment of sock->fd_used, with overflow check */ +static int +sock_inc_used(struct lwip_sock *sock) +{ + int ret; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_ASSERT("sock != NULL", sock != NULL); + + SYS_ARCH_PROTECT(lev); + if (sock->fd_free_pending) { + /* prevent new usage of this socket if free is pending */ + ret = 0; + } else { + ++sock->fd_used; + ret = 1; + LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0); + } + SYS_ARCH_UNPROTECT(lev); + return ret; +} + +/* Like sock_inc_used(), but called under SYS_ARCH_PROTECT lock. */ +static int +sock_inc_used_locked(struct lwip_sock *sock) +{ + LWIP_ASSERT("sock != NULL", sock != NULL); + + if (sock->fd_free_pending) { + LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0); + return 0; + } + + ++sock->fd_used; + LWIP_ASSERT("sock->fd_used != 0", sock->fd_used != 0); + return 1; +} + +/* In full-duplex mode,sock->fd_used != 0 prevents a socket descriptor from being + * released (and possibly reused) when used from more than one thread + * (e.g. read-while-write or close-while-write, etc) + * This function is called at the end of functions using (try)get_socket*(). + */ +static void +done_socket(struct lwip_sock *sock) +{ + int freed = 0; + int is_tcp = 0; + struct netconn *conn = NULL; + union lwip_sock_lastdata lastdata; + SYS_ARCH_DECL_PROTECT(lev); + LWIP_ASSERT("sock != NULL", sock != NULL); + + SYS_ARCH_PROTECT(lev); + LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0); + if (--sock->fd_used == 0) { + if (sock->fd_free_pending) { + /* free the socket */ + sock->fd_used = 1; + is_tcp = sock->fd_free_pending & LWIP_SOCK_FD_FREE_TCP; + freed = free_socket_locked(sock, is_tcp, &conn, &lastdata); + } + } + SYS_ARCH_UNPROTECT(lev); + + if (freed) { + free_socket_free_elements(is_tcp, conn, &lastdata); + } +} + +#else /* LWIP_NETCONN_FULLDUPLEX */ +#define sock_inc_used(sock) 1 +#define sock_inc_used_locked(sock) 1 +#define done_socket(sock) +#endif /* LWIP_NETCONN_FULLDUPLEX */ + +/* Translate a socket 'int' into a pointer (only fails if the index is invalid) */ +static struct lwip_sock * +tryget_socket_unconn_nouse(int fd) +{ + int s = fd - LWIP_SOCKET_OFFSET; + if ((s < 0) || (s >= NUM_SOCKETS)) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("tryget_socket_unconn(%d): invalid\n", fd)); + return NULL; + } + return &sockets[s]; +} + +struct lwip_sock * +lwip_socket_dbg_get_socket(int fd) +{ + return tryget_socket_unconn_nouse(fd); +} + +/* Translate a socket 'int' into a pointer (only fails if the index is invalid) */ +static struct lwip_sock * +tryget_socket_unconn(int fd) +{ + struct lwip_sock *ret = tryget_socket_unconn_nouse(fd); + if (ret != NULL) { + if (!sock_inc_used(ret)) { + return NULL; + } + } + return ret; +} + +/* Like tryget_socket_unconn(), but called under SYS_ARCH_PROTECT lock. */ +static struct lwip_sock * +tryget_socket_unconn_locked(int fd) +{ + struct lwip_sock *ret = tryget_socket_unconn_nouse(fd); + if (ret != NULL) { + if (!sock_inc_used_locked(ret)) { + return NULL; + } + } + return ret; +} + +/** + * Same as get_socket but doesn't set errno + * + * @param fd externally used socket index + * @return struct lwip_sock for the socket or NULL if not found + */ +static struct lwip_sock * +tryget_socket(int fd) +{ + struct lwip_sock *sock = tryget_socket_unconn(fd); + if (sock != NULL) { + if (sock->conn) { + return sock; + } + done_socket(sock); + } + return NULL; +} + +/** + * Map a externally used socket index to the internal socket representation. + * + * @param fd externally used socket index + * @return struct lwip_sock for the socket or NULL if not found + */ +static struct lwip_sock * +get_socket(int fd) +{ + struct lwip_sock *sock = tryget_socket(fd); + if (!sock) { + if ((fd < LWIP_SOCKET_OFFSET) || (fd >= (LWIP_SOCKET_OFFSET + NUM_SOCKETS))) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", fd)); + } + set_errno(EBADF); + return NULL; + } + return sock; +} + +/** + * Allocate a new socket for a given netconn. + * + * @param newconn the netconn for which to allocate a socket + * @param accepted 1 if socket has been created by accept(), + * 0 if socket has been created by socket() + * @return the index of the new socket; -1 on error + */ +static int +alloc_socket(struct netconn *newconn, int accepted) +{ + int i; + SYS_ARCH_DECL_PROTECT(lev); + LWIP_UNUSED_ARG(accepted); + + /* allocate a new socket identifier */ + for (i = 0; i < NUM_SOCKETS; ++i) { + /* Protect socket array */ + SYS_ARCH_PROTECT(lev); + if (!sockets[i].conn) { +#if LWIP_NETCONN_FULLDUPLEX + if (sockets[i].fd_used) { + SYS_ARCH_UNPROTECT(lev); + continue; + } + sockets[i].fd_used = 1; + sockets[i].fd_free_pending = 0; +#endif + sockets[i].conn = newconn; + /* The socket is not yet known to anyone, so no need to protect + after having marked it as used. */ + SYS_ARCH_UNPROTECT(lev); + sockets[i].lastdata.pbuf = NULL; +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL + LWIP_ASSERT("sockets[i].select_waiting == 0", sockets[i].select_waiting == 0); + sockets[i].rcvevent = 0; + /* TCP sendbuf is empty, but the socket is not yet writable until connected + * (unless it has been created by accept()). */ + sockets[i].sendevent = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1); + sockets[i].errevent = 0; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + return i + LWIP_SOCKET_OFFSET; + } + SYS_ARCH_UNPROTECT(lev); + } + return -1; +} + +/** Free a socket (under lock) + * + * @param sock the socket to free + * @param is_tcp != 0 for TCP sockets, used to free lastdata + * @param conn the socekt's netconn is stored here, must be freed externally + * @param lastdata lastdata is stored here, must be freed externally + */ +static int +free_socket_locked(struct lwip_sock *sock, int is_tcp, struct netconn **conn, + union lwip_sock_lastdata *lastdata) +{ +#if LWIP_NETCONN_FULLDUPLEX + LWIP_ASSERT("sock->fd_used > 0", sock->fd_used > 0); + sock->fd_used--; + if (sock->fd_used > 0) { + sock->fd_free_pending = LWIP_SOCK_FD_FREE_FREE | (is_tcp ? LWIP_SOCK_FD_FREE_TCP : 0); + return 0; + } +#else /* LWIP_NETCONN_FULLDUPLEX */ + LWIP_UNUSED_ARG(is_tcp); +#endif /* LWIP_NETCONN_FULLDUPLEX */ + + *lastdata = sock->lastdata; + sock->lastdata.pbuf = NULL; + *conn = sock->conn; + sock->conn = NULL; + return 1; +} + +/** Free a socket's leftover members. + */ +static void +free_socket_free_elements(int is_tcp, struct netconn *conn, union lwip_sock_lastdata *lastdata) +{ + if (lastdata->pbuf != NULL) { + if (is_tcp) { + pbuf_free(lastdata->pbuf); + } else { + netbuf_delete(lastdata->netbuf); + } + } + if (conn != NULL) { + /* netconn_prepare_delete() has already been called, here we only free the conn */ + netconn_delete(conn); + } +} + +/** Free a socket. The socket's netconn must have been + * delete before! + * + * @param sock the socket to free + * @param is_tcp != 0 for TCP sockets, used to free lastdata + */ +static void +free_socket(struct lwip_sock *sock, int is_tcp) +{ + int freed; + struct netconn *conn; + union lwip_sock_lastdata lastdata; + SYS_ARCH_DECL_PROTECT(lev); + + /* Protect socket array */ + SYS_ARCH_PROTECT(lev); + + freed = free_socket_locked(sock, is_tcp, &conn, &lastdata); + SYS_ARCH_UNPROTECT(lev); + /* don't use 'sock' after this line, as another task might have allocated it */ + + if (freed) { + free_socket_free_elements(is_tcp, conn, &lastdata); + } +} + +/* Below this, the well-known socket functions are implemented. + * Use google.com or opengroup.org to get a good description :-) + * + * Exceptions are documented! + */ + +int +lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + struct lwip_sock *sock, *nsock; + struct netconn *newconn; + ip_addr_t naddr; + u16_t port = 0; + int newsock; + err_t err; + int recvevent; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s)); + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* wait for a new connection */ + err = netconn_accept(sock->conn, &newconn); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err)); + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + } else if (err == ERR_CLSD) { + sock_set_errno(sock, EINVAL); + } else { + sock_set_errno(sock, err_to_errno(err)); + } + done_socket(sock); + return -1; + } + LWIP_ASSERT("newconn != NULL", newconn != NULL); + + newsock = alloc_socket(newconn, 1); + if (newsock == -1) { + netconn_delete(newconn); + sock_set_errno(sock, ENFILE); + done_socket(sock); + return -1; + } + LWIP_ASSERT("invalid socket index", (newsock >= LWIP_SOCKET_OFFSET) && (newsock < NUM_SOCKETS + LWIP_SOCKET_OFFSET)); + nsock = &sockets[newsock - LWIP_SOCKET_OFFSET]; + + /* See event_callback: If data comes in right away after an accept, even + * though the server task might not have created a new socket yet. + * In that case, newconn->socket is counted down (newconn->socket--), + * so nsock->rcvevent is >= 1 here! + */ + SYS_ARCH_PROTECT(lev); + recvevent = (s16_t)(-1 - newconn->socket); + newconn->socket = newsock; + SYS_ARCH_UNPROTECT(lev); + + if (newconn->callback) { + LOCK_TCPIP_CORE(); + while (recvevent > 0) { + recvevent--; + newconn->callback(newconn, NETCONN_EVT_RCVPLUS, 0); + } + UNLOCK_TCPIP_CORE(); + } + + /* Note that POSIX only requires us to check addr is non-NULL. addrlen must + * not be NULL if addr is valid. + */ + if ((addr != NULL) && (addrlen != NULL)) { + union sockaddr_aligned tempaddr; + /* get the IP address and port of the remote host */ + err = netconn_peer(newconn, &naddr, &port); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err)); + free_socket(nsock, 1); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + + IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port); + if (*addrlen > tempaddr.sa.sa_len) { + *addrlen = tempaddr.sa.sa_len; + } + MEMCPY(addr, &tempaddr, *addrlen); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock)); + ip_addr_debug_print_val(SOCKETS_DEBUG, naddr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port)); + } else { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d", s, newsock)); + } + + sock_set_errno(sock, 0); + done_socket(sock); + done_socket(nsock); + return newsock; +} + +int +lwip_bind(int s, const struct sockaddr *name, socklen_t namelen) +{ + struct lwip_sock *sock; + ip_addr_t local_addr; + u16_t local_port; + err_t err; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (!SOCK_ADDR_TYPE_MATCH(name, sock)) { + /* sockaddr does not match socket type (IPv4/IPv6) */ + sock_set_errno(sock, err_to_errno(ERR_VAL)); + done_socket(sock); + return -1; + } + + /* check size, family and alignment of 'name' */ + LWIP_ERROR("lwip_bind: invalid address", (IS_SOCK_ADDR_LEN_VALID(namelen) && + IS_SOCK_ADDR_TYPE_VALID(name) && IS_SOCK_ADDR_ALIGNED(name)), + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + LWIP_UNUSED_ARG(namelen); + + SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s)); + ip_addr_debug_print_val(SOCKETS_DEBUG, local_addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", local_port)); + +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ + if (IP_IS_V6_VAL(local_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&local_addr))) { + unmap_ipv4_mapped_ipv6(ip_2_ip4(&local_addr), ip_2_ip6(&local_addr)); + IP_SET_TYPE_VAL(local_addr, IPADDR_TYPE_V4); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + err = netconn_bind(sock->conn, &local_addr, local_port); + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err)); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s)); + sock_set_errno(sock, 0); + done_socket(sock); + return 0; +} + +int +lwip_close(int s) +{ + struct lwip_sock *sock; + int is_tcp = 0; + err_t err; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (sock->conn != NULL) { + is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP; + } else { + LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata.pbuf == NULL); + } + +#if LWIP_IGMP + /* drop all possibly joined IGMP memberships */ + lwip_socket_drop_registered_memberships(s); +#endif /* LWIP_IGMP */ +#if LWIP_IPV6_MLD + /* drop all possibly joined MLD6 memberships */ + lwip_socket_drop_registered_mld6_memberships(s); +#endif /* LWIP_IPV6_MLD */ + + err = netconn_prepare_delete(sock->conn); + if (err != ERR_OK) { + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + + free_socket(sock, is_tcp); + set_errno(0); + return 0; +} + +int +lwip_connect(int s, const struct sockaddr *name, socklen_t namelen) +{ + struct lwip_sock *sock; + err_t err; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock)) { + /* sockaddr does not match socket type (IPv4/IPv6) */ + sock_set_errno(sock, err_to_errno(ERR_VAL)); + done_socket(sock); + return -1; + } + + LWIP_UNUSED_ARG(namelen); + if (name->sa_family == AF_UNSPEC) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s)); + err = netconn_disconnect(sock->conn); + } else { + ip_addr_t remote_addr; + u16_t remote_port; + + /* check size, family and alignment of 'name' */ + LWIP_ERROR("lwip_connect: invalid address", IS_SOCK_ADDR_LEN_VALID(namelen) && + IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) && IS_SOCK_ADDR_ALIGNED(name), + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + + SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s)); + ip_addr_debug_print_val(SOCKETS_DEBUG, remote_addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", remote_port)); + +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ + if (IP_IS_V6_VAL(remote_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&remote_addr))) { + unmap_ipv4_mapped_ipv6(ip_2_ip4(&remote_addr), ip_2_ip6(&remote_addr)); + IP_SET_TYPE_VAL(remote_addr, IPADDR_TYPE_V4); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + err = netconn_connect(sock->conn, &remote_addr, remote_port); + } + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err)); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s)); + sock_set_errno(sock, 0); + done_socket(sock); + return 0; +} + +/** + * Set a socket into listen mode. + * The socket may not have been used for another connection previously. + * + * @param s the socket to set to listening mode + * @param backlog (ATTENTION: needs TCP_LISTEN_BACKLOG=1) + * @return 0 on success, non-zero on failure + */ +int +lwip_listen(int s, int backlog) +{ + struct lwip_sock *sock; + err_t err; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* limit the "backlog" parameter to fit in an u8_t */ + backlog = LWIP_MIN(LWIP_MAX(backlog, 0), 0xff); + + err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog); + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err)); + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + } else { + sock_set_errno(sock, err_to_errno(err)); + } + done_socket(sock); + return -1; + } + + sock_set_errno(sock, 0); + done_socket(sock); + return 0; +} + +#if LWIP_TCP +/* Helper function to loop over receiving pbufs from netconn + * until "len" bytes are received or we're otherwise done. + * Keeps sock->lastdata for peeking or partly copying. + */ +static ssize_t +lwip_recv_tcp(struct lwip_sock *sock, void *mem, size_t len, int flags) +{ + u8_t apiflags = NETCONN_NOAUTORCVD; + ssize_t recvd = 0; + ssize_t recv_left = (len <= SSIZE_MAX) ? (ssize_t)len : SSIZE_MAX; + + LWIP_ASSERT("no socket given", sock != NULL); + LWIP_ASSERT("this should be checked internally", NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP); + + if (flags & MSG_DONTWAIT) { + apiflags |= NETCONN_DONTBLOCK; + } + + do { + struct pbuf *p; + err_t err; + u16_t copylen; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: top while sock->lastdata=%p\n", (void *)sock->lastdata.pbuf)); + /* Check if there is data left from the last recv operation. */ + if (sock->lastdata.pbuf) { + p = sock->lastdata.pbuf; + } else { + /* No data was left from the previous operation, so we try to get + some from the network. */ + err = netconn_recv_tcp_pbuf_flags(sock->conn, &p, apiflags); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: netconn_recv err=%d, pbuf=%p\n", + err, (void *)p)); + + if (err != ERR_OK) { + if (recvd > 0) { + /* already received data, return that (this trusts in getting the same error from + netconn layer again next time netconn_recv is called) */ + goto lwip_recv_tcp_done; + } + /* We should really do some error checking here. */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: p == NULL, error is \"%s\"!\n", + lwip_strerr(err))); + sock_set_errno(sock, err_to_errno(err)); + if (err == ERR_CLSD) { + return 0; + } else { + return -1; + } + } + LWIP_ASSERT("p != NULL", p != NULL); + sock->lastdata.pbuf = p; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: buflen=%"U16_F" recv_left=%d off=%d\n", + p->tot_len, (int)recv_left, (int)recvd)); + + if (recv_left > p->tot_len) { + copylen = p->tot_len; + } else { + copylen = (u16_t)recv_left; + } + if (recvd + copylen < recvd) { + /* overflow */ + copylen = (u16_t)(SSIZE_MAX - recvd); + } + + /* copy the contents of the received buffer into + the supplied memory pointer mem */ + pbuf_copy_partial(p, (u8_t *)mem + recvd, copylen, 0); + + recvd += copylen; + + /* TCP combines multiple pbufs for one recv */ + LWIP_ASSERT("invalid copylen, len would underflow", recv_left >= copylen); + recv_left -= copylen; + + /* Unless we peek the incoming message... */ + if ((flags & MSG_PEEK) == 0) { + /* ... check if there is data left in the pbuf */ + LWIP_ASSERT("invalid copylen", p->tot_len >= copylen); + if (p->tot_len - copylen > 0) { + /* If so, it should be saved in the sock structure for the next recv call. + We store the pbuf but hide/free the consumed data: */ + sock->lastdata.pbuf = pbuf_free_header(p, copylen); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: lastdata now pbuf=%p\n", (void *)sock->lastdata.pbuf)); + } else { + sock->lastdata.pbuf = NULL; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recv_tcp: deleting pbuf=%p\n", (void *)p)); + pbuf_free(p); + } + } + /* once we have some data to return, only add more if we don't need to wait */ + apiflags |= NETCONN_DONTBLOCK | NETCONN_NOFIN; + /* @todo: do we need to support peeking more than one pbuf? */ + } while ((recv_left > 0) && !(flags & MSG_PEEK)); +lwip_recv_tcp_done: + if ((recvd > 0) && !(flags & MSG_PEEK)) { + /* ensure window update after copying all data */ + netconn_tcp_recvd(sock->conn, (size_t)recvd); + } + sock_set_errno(sock, 0); + return recvd; +} +#endif + +/* Convert a netbuf's address data to struct sockaddr */ +static int +lwip_sock_make_addr(struct netconn *conn, ip_addr_t *fromaddr, u16_t port, + struct sockaddr *from, socklen_t *fromlen) +{ + int truncated = 0; + union sockaddr_aligned saddr; + + LWIP_UNUSED_ARG(conn); + + LWIP_ASSERT("fromaddr != NULL", fromaddr != NULL); + LWIP_ASSERT("from != NULL", from != NULL); + LWIP_ASSERT("fromlen != NULL", fromlen != NULL); + +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */ + if (NETCONNTYPE_ISIPV6(netconn_type(conn)) && IP_IS_V4(fromaddr)) { + ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr)); + IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port); + if (*fromlen < saddr.sa.sa_len) { + truncated = 1; + } else if (*fromlen > saddr.sa.sa_len) { + *fromlen = saddr.sa.sa_len; + } + MEMCPY(from, &saddr, *fromlen); + return truncated; +} + +#if LWIP_TCP +/* Helper function to get a tcp socket's remote address info */ +static int +lwip_recv_tcp_from(struct lwip_sock *sock, struct sockaddr *from, socklen_t *fromlen, const char *dbg_fn, int dbg_s, ssize_t dbg_ret) +{ + if (sock == NULL) { + return 0; + } + LWIP_UNUSED_ARG(dbg_fn); + LWIP_UNUSED_ARG(dbg_s); + LWIP_UNUSED_ARG(dbg_ret); + +#if !SOCKETS_DEBUG + if (from && fromlen) +#endif /* !SOCKETS_DEBUG */ + { + /* get remote addr/port from tcp_pcb */ + u16_t port; + ip_addr_t tmpaddr; + netconn_getaddr(sock->conn, &tmpaddr, &port, 0); + LWIP_DEBUGF(SOCKETS_DEBUG, ("%s(%d): addr=", dbg_fn, dbg_s)); + ip_addr_debug_print_val(SOCKETS_DEBUG, tmpaddr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, (int)dbg_ret)); + if (from && fromlen) { + return lwip_sock_make_addr(sock->conn, &tmpaddr, port, from, fromlen); + } + } + return 0; +} +#endif + +/* Helper function to receive a netbuf from a udp or raw netconn. + * Keeps sock->lastdata for peeking. + */ +static err_t +lwip_recvfrom_udp_raw(struct lwip_sock *sock, int flags, struct msghdr *msg, u16_t *datagram_len, int dbg_s) +{ + struct netbuf *buf; + u8_t apiflags; + err_t err; + u16_t buflen, copylen, copied; + int i; + + LWIP_UNUSED_ARG(dbg_s); + LWIP_ERROR("lwip_recvfrom_udp_raw: invalid arguments", (msg->msg_iov != NULL) || (msg->msg_iovlen <= 0), return ERR_ARG;); + + if (flags & MSG_DONTWAIT) { + apiflags = NETCONN_DONTBLOCK; + } else { + apiflags = 0; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: top sock->lastdata=%p\n", (void *)sock->lastdata.netbuf)); + /* Check if there is data left from the last recv operation. */ + buf = sock->lastdata.netbuf; + if (buf == NULL) { + /* No data was left from the previous operation, so we try to get + some from the network. */ + err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &buf, apiflags); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw[UDP/RAW]: netconn_recv err=%d, netbuf=%p\n", + err, (void *)buf)); + + if (err != ERR_OK) { + return err; + } + LWIP_ASSERT("buf != NULL", buf != NULL); + sock->lastdata.netbuf = buf; + } + buflen = buf->p->tot_len; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw: buflen=%"U16_F"\n", buflen)); + + copied = 0; + /* copy the pbuf payload into the iovs */ + for (i = 0; (i < msg->msg_iovlen) && (copied < buflen); i++) { + u16_t len_left = (u16_t)(buflen - copied); + if (msg->msg_iov[i].iov_len > len_left) { + copylen = len_left; + } else { + copylen = (u16_t)msg->msg_iov[i].iov_len; + } + + /* copy the contents of the received buffer into + the supplied memory buffer */ + pbuf_copy_partial(buf->p, (u8_t *)msg->msg_iov[i].iov_base, copylen, copied); + copied = (u16_t)(copied + copylen); + } + + /* Check to see from where the data was.*/ +#if !SOCKETS_DEBUG + if (msg->msg_name && msg->msg_namelen) +#endif /* !SOCKETS_DEBUG */ + { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom_udp_raw(%d): addr=", dbg_s)); + ip_addr_debug_print_val(SOCKETS_DEBUG, *netbuf_fromaddr(buf)); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", netbuf_fromport(buf), copied)); + if (msg->msg_name && msg->msg_namelen) { + lwip_sock_make_addr(sock->conn, netbuf_fromaddr(buf), netbuf_fromport(buf), + (struct sockaddr *)msg->msg_name, &msg->msg_namelen); + } + } + + /* Initialize flag output */ + msg->msg_flags = 0; + + if (msg->msg_control) { + u8_t wrote_msg = 0; +#if LWIP_NETBUF_RECVINFO + /* Check if packet info was recorded */ + if (buf->flags & NETBUF_FLAG_DESTADDR) { + if (IP_IS_V4(&buf->toaddr)) { +#if LWIP_IPV4 + if (msg->msg_controllen >= CMSG_SPACE(sizeof(struct in_pktinfo))) { + struct cmsghdr *chdr = CMSG_FIRSTHDR(msg); /* This will always return a header!! */ + struct in_pktinfo *pkti = (struct in_pktinfo *)CMSG_DATA(chdr); + chdr->cmsg_level = IPPROTO_IP; + chdr->cmsg_type = IP_PKTINFO; + chdr->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); + pkti->ipi_ifindex = buf->p->if_idx; + inet_addr_from_ip4addr(&pkti->ipi_addr, ip_2_ip4(netbuf_destaddr(buf))); + msg->msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo)); + wrote_msg = 1; + } else { + msg->msg_flags |= MSG_CTRUNC; + } +#endif /* LWIP_IPV4 */ + } + } +#endif /* LWIP_NETBUF_RECVINFO */ + + if (!wrote_msg) { + msg->msg_controllen = 0; + } + } + + /* If we don't peek the incoming message: zero lastdata pointer and free the netbuf */ + if ((flags & MSG_PEEK) == 0) { + sock->lastdata.netbuf = NULL; + netbuf_delete(buf); + } + if (datagram_len) { + *datagram_len = buflen; + } + return ERR_OK; +} + +ssize_t +lwip_recvfrom(int s, void *mem, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) +{ + struct lwip_sock *sock; + ssize_t ret; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags)); + sock = get_socket(s); + if (!sock) { + return -1; + } +#if LWIP_TCP + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { + ret = lwip_recv_tcp(sock, mem, len, flags); + lwip_recv_tcp_from(sock, from, fromlen, "lwip_recvfrom", s, ret); + done_socket(sock); + return ret; + } else +#endif + { + u16_t datagram_len = 0; + struct iovec vec; + struct msghdr msg; + err_t err; + vec.iov_base = mem; + vec.iov_len = len; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = 0; + msg.msg_iov = &vec; + msg.msg_iovlen = 1; + msg.msg_name = from; + msg.msg_namelen = (fromlen ? *fromlen : 0); + err = lwip_recvfrom_udp_raw(sock, flags, &msg, &datagram_len, s); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom[UDP/RAW](%d): buf == NULL, error is \"%s\"!\n", + s, lwip_strerr(err))); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + ret = (ssize_t)LWIP_MIN(LWIP_MIN(len, datagram_len), SSIZE_MAX); + if (fromlen) { + *fromlen = msg.msg_namelen; + } + } + + sock_set_errno(sock, 0); + done_socket(sock); + return ret; +} + +ssize_t +lwip_read(int s, void *mem, size_t len) +{ + return lwip_recvfrom(s, mem, len, 0, NULL, NULL); +} + +ssize_t +lwip_readv(int s, const struct iovec *iov, int iovcnt) +{ + struct msghdr msg; + + msg.msg_name = NULL; + msg.msg_namelen = 0; + /* Hack: we have to cast via number to cast from 'const' pointer to non-const. + Blame the opengroup standard for this inconsistency. */ + msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov); + msg.msg_iovlen = iovcnt; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = 0; + return lwip_recvmsg(s, &msg, 0); +} + +ssize_t +lwip_recv(int s, void *mem, size_t len, int flags) +{ + return lwip_recvfrom(s, mem, len, flags, NULL, NULL); +} + +ssize_t +lwip_recvmsg(int s, struct msghdr *message, int flags) +{ + struct lwip_sock *sock; + int i; + ssize_t buflen; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvmsg(%d, message=%p, flags=0x%x)\n", s, (void *)message, flags)); + LWIP_ERROR("lwip_recvmsg: invalid message pointer", message != NULL, return ERR_ARG;); + LWIP_ERROR("lwip_recvmsg: unsupported flags", (flags & ~(MSG_PEEK|MSG_DONTWAIT)) == 0, + set_errno(EOPNOTSUPP); return -1;); + + if ((message->msg_iovlen <= 0) || (message->msg_iovlen > IOV_MAX)) { + set_errno(EMSGSIZE); + return -1; + } + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* check for valid vectors */ + buflen = 0; + for (i = 0; i < message->msg_iovlen; i++) { + if ((message->msg_iov[i].iov_base == NULL) || ((ssize_t)message->msg_iov[i].iov_len <= 0) || + ((size_t)(ssize_t)message->msg_iov[i].iov_len != message->msg_iov[i].iov_len) || + ((ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len) <= 0)) { + sock_set_errno(sock, err_to_errno(ERR_VAL)); + done_socket(sock); + return -1; + } + buflen = (ssize_t)(buflen + (ssize_t)message->msg_iov[i].iov_len); + } + + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { +#if LWIP_TCP + int recv_flags = flags; + message->msg_flags = 0; + /* recv the data */ + buflen = 0; + for (i = 0; i < message->msg_iovlen; i++) { + /* try to receive into this vector's buffer */ + ssize_t recvd_local = lwip_recv_tcp(sock, message->msg_iov[i].iov_base, message->msg_iov[i].iov_len, recv_flags); + if (recvd_local > 0) { + /* sum up received bytes */ + buflen += recvd_local; + } + if ((recvd_local < 0) || (recvd_local < (int)message->msg_iov[i].iov_len) || + (flags & MSG_PEEK)) { + /* returned prematurely (or peeking, which might actually be limitated to the first iov) */ + if (buflen <= 0) { + /* nothing received at all, propagate the error */ + buflen = recvd_local; + } + break; + } + /* pass MSG_DONTWAIT to lwip_recv_tcp() to prevent waiting for more data */ + recv_flags |= MSG_DONTWAIT; + } + if (buflen > 0) { + /* reset socket error since we have received something */ + sock_set_errno(sock, 0); + } + /* " If the socket is connected, the msg_name and msg_namelen members shall be ignored." */ + done_socket(sock); + return buflen; +#else /* LWIP_TCP */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* LWIP_TCP */ + } + /* else, UDP and RAW NETCONNs */ +#if LWIP_UDP || LWIP_RAW + { + u16_t datagram_len = 0; + err_t err; + err = lwip_recvfrom_udp_raw(sock, flags, message, &datagram_len, s); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvmsg[UDP/RAW](%d): buf == NULL, error is \"%s\"!\n", + s, lwip_strerr(err))); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + if (datagram_len > buflen) { + message->msg_flags |= MSG_TRUNC; + } + + sock_set_errno(sock, 0); + done_socket(sock); + return (int)datagram_len; + } +#else /* LWIP_UDP || LWIP_RAW */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* LWIP_UDP || LWIP_RAW */ +} + +ssize_t +lwip_send(int s, const void *data, size_t size, int flags) +{ + struct lwip_sock *sock; + err_t err; + u8_t write_flags; + size_t written; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n", + s, data, size, flags)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { +#if (LWIP_UDP || LWIP_RAW) + done_socket(sock); + return lwip_sendto(s, data, size, flags, NULL, 0); +#else /* (LWIP_UDP || LWIP_RAW) */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* (LWIP_UDP || LWIP_RAW) */ + } + + write_flags = (u8_t)(NETCONN_COPY | + ((flags & MSG_MORE) ? NETCONN_MORE : 0) | + ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0)); + written = 0; + err = netconn_write_partly(sock->conn, data, size, write_flags, &written); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written)); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */ + return (err == ERR_OK ? (ssize_t)written : -1); +} + +ssize_t +lwip_sendmsg(int s, const struct msghdr *msg, int flags) +{ + struct lwip_sock *sock; +#if LWIP_TCP + u8_t write_flags; + size_t written; +#endif + err_t err = ERR_OK; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + LWIP_ERROR("lwip_sendmsg: invalid msghdr", msg != NULL, + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + LWIP_ERROR("lwip_sendmsg: invalid msghdr iov", msg->msg_iov != NULL, + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + LWIP_ERROR("lwip_sendmsg: maximum iovs exceeded", (msg->msg_iovlen > 0) && (msg->msg_iovlen <= IOV_MAX), + sock_set_errno(sock, EMSGSIZE); done_socket(sock); return -1;); + LWIP_ERROR("lwip_sendmsg: unsupported flags", (flags & ~(MSG_DONTWAIT | MSG_MORE)) == 0, + sock_set_errno(sock, EOPNOTSUPP); done_socket(sock); return -1;); + + LWIP_UNUSED_ARG(msg->msg_control); + LWIP_UNUSED_ARG(msg->msg_controllen); + LWIP_UNUSED_ARG(msg->msg_flags); + + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { +#if LWIP_TCP + write_flags = (u8_t)(NETCONN_COPY | + ((flags & MSG_MORE) ? NETCONN_MORE : 0) | + ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0)); + + written = 0; + err = netconn_write_vectors_partly(sock->conn, (struct netvector *)msg->msg_iov, (u16_t)msg->msg_iovlen, write_flags, &written); + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + /* casting 'written' to ssize_t is OK here since the netconn API limits it to SSIZE_MAX */ + return (err == ERR_OK ? (ssize_t)written : -1); +#else /* LWIP_TCP */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* LWIP_TCP */ + } + /* else, UDP and RAW NETCONNs */ +#if LWIP_UDP || LWIP_RAW + { + struct netbuf chain_buf; + int i; + ssize_t size = 0; + + LWIP_UNUSED_ARG(flags); + LWIP_ERROR("lwip_sendmsg: invalid msghdr name", (((msg->msg_name == NULL) && (msg->msg_namelen == 0)) || + IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)), + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + + /* initialize chain buffer with destination */ + memset(&chain_buf, 0, sizeof(struct netbuf)); + if (msg->msg_name) { + u16_t remote_port; + SOCKADDR_TO_IPADDR_PORT((const struct sockaddr *)msg->msg_name, &chain_buf.addr, remote_port); + netbuf_fromport(&chain_buf) = remote_port; + } +#if LWIP_NETIF_TX_SINGLE_PBUF + for (i = 0; i < msg->msg_iovlen; i++) { + size += msg->msg_iov[i].iov_len; + if ((msg->msg_iov[i].iov_len > INT_MAX) || (size < (int)msg->msg_iov[i].iov_len)) { + /* overflow */ + goto sendmsg_emsgsize; + } + } + if (size > 0xFFFF) { + /* overflow */ + goto sendmsg_emsgsize; + } + /* Allocate a new netbuf and copy the data into it. */ + if (netbuf_alloc(&chain_buf, (u16_t)size) == NULL) { + err = ERR_MEM; + } else { + /* flatten the IO vectors */ + size_t offset = 0; + for (i = 0; i < msg->msg_iovlen; i++) { + MEMCPY(&((u8_t *)chain_buf.p->payload)[offset], msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len); + offset += msg->msg_iov[i].iov_len; + } +#if LWIP_CHECKSUM_ON_COPY + { + /* This can be improved by using LWIP_CHKSUM_COPY() and aggregating the checksum for each IO vector */ + u16_t chksum = ~inet_chksum_pbuf(chain_buf.p); + netbuf_set_chksum(&chain_buf, chksum); + } +#endif /* LWIP_CHECKSUM_ON_COPY */ + err = ERR_OK; + } +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + /* create a chained netbuf from the IO vectors. NOTE: we assemble a pbuf chain + manually to avoid having to allocate, chain, and delete a netbuf for each iov */ + for (i = 0; i < msg->msg_iovlen; i++) { + struct pbuf *p; + if (msg->msg_iov[i].iov_len > 0xFFFF) { + /* overflow */ + goto sendmsg_emsgsize; + } + p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF); + if (p == NULL) { + err = ERR_MEM; /* let netbuf_delete() cleanup chain_buf */ + break; + } + p->payload = msg->msg_iov[i].iov_base; + p->len = p->tot_len = (u16_t)msg->msg_iov[i].iov_len; + /* netbuf empty, add new pbuf */ + if (chain_buf.p == NULL) { + chain_buf.p = chain_buf.ptr = p; + /* add pbuf to existing pbuf chain */ + } else { + if (chain_buf.p->tot_len + p->len > 0xffff) { + /* overflow */ + pbuf_free(p); + goto sendmsg_emsgsize; + } + pbuf_cat(chain_buf.p, p); + } + } + /* save size of total chain */ + if (err == ERR_OK) { + size = netbuf_len(&chain_buf); + } +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + + if (err == ERR_OK) { +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ + if (IP_IS_V6_VAL(chain_buf.addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&chain_buf.addr))) { + unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf.addr), ip_2_ip6(&chain_buf.addr)); + IP_SET_TYPE_VAL(chain_buf.addr, IPADDR_TYPE_V4); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + /* send the data */ + err = netconn_send(sock->conn, &chain_buf); + } + + /* deallocated the buffer */ + netbuf_free(&chain_buf); + + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return (err == ERR_OK ? size : -1); +sendmsg_emsgsize: + sock_set_errno(sock, EMSGSIZE); + netbuf_free(&chain_buf); + done_socket(sock); + return -1; + } +#else /* LWIP_UDP || LWIP_RAW */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* LWIP_UDP || LWIP_RAW */ +} + +ssize_t +lwip_sendto(int s, const void *data, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen) +{ + struct lwip_sock *sock; + err_t err; + u16_t short_size; + u16_t remote_port; + struct netbuf buf; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { +#if LWIP_TCP + done_socket(sock); + return lwip_send(s, data, size, flags); +#else /* LWIP_TCP */ + LWIP_UNUSED_ARG(flags); + sock_set_errno(sock, err_to_errno(ERR_ARG)); + done_socket(sock); + return -1; +#endif /* LWIP_TCP */ + } + + if (size > LWIP_MIN(0xFFFF, SSIZE_MAX)) { + /* cannot fit into one datagram (at least for us) */ + sock_set_errno(sock, EMSGSIZE); + done_socket(sock); + return -1; + } + short_size = (u16_t)size; + LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) || + (IS_SOCK_ADDR_LEN_VALID(tolen) && + ((to != NULL) && (IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))))), + sock_set_errno(sock, err_to_errno(ERR_ARG)); done_socket(sock); return -1;); + LWIP_UNUSED_ARG(tolen); + + /* initialize a buffer */ + buf.p = buf.ptr = NULL; +#if LWIP_CHECKSUM_ON_COPY + buf.flags = 0; +#endif /* LWIP_CHECKSUM_ON_COPY */ + if (to) { + SOCKADDR_TO_IPADDR_PORT(to, &buf.addr, remote_port); + } else { + remote_port = 0; + ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr); + } + netbuf_fromport(&buf) = remote_port; + + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, short_size=%"U16_F", flags=0x%x to=", + s, data, short_size, flags)); + ip_addr_debug_print_val(SOCKETS_DEBUG, buf.addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port)); + + /* make the buffer point to the data that should be sent */ +#if LWIP_NETIF_TX_SINGLE_PBUF + /* Allocate a new netbuf and copy the data into it. */ + if (netbuf_alloc(&buf, short_size) == NULL) { + err = ERR_MEM; + } else { +#if LWIP_CHECKSUM_ON_COPY + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_RAW) { + u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size); + netbuf_set_chksum(&buf, chksum); + } else +#endif /* LWIP_CHECKSUM_ON_COPY */ + { + MEMCPY(buf.p->payload, data, short_size); + } + err = ERR_OK; + } +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + err = netbuf_ref(&buf, data, short_size); +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + if (err == ERR_OK) { +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */ + if (IP_IS_V6_VAL(buf.addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&buf.addr))) { + unmap_ipv4_mapped_ipv6(ip_2_ip4(&buf.addr), ip_2_ip6(&buf.addr)); + IP_SET_TYPE_VAL(buf.addr, IPADDR_TYPE_V4); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + /* send the data */ + err = netconn_send(sock->conn, &buf); + } + + /* deallocated the buffer */ + netbuf_free(&buf); + + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return (err == ERR_OK ? short_size : -1); +} + +int +lwip_socket(int domain, int type, int protocol) +{ + struct netconn *conn; + int i; + + LWIP_UNUSED_ARG(domain); /* @todo: check this */ + + /* create a netconn */ + switch (type) { + case SOCK_RAW: + conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW), + (u8_t)protocol, DEFAULT_SOCKET_EVENTCB); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); + break; + case SOCK_DGRAM: + conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, + ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)), + DEFAULT_SOCKET_EVENTCB); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); +#if LWIP_NETBUF_RECVINFO + if (conn) { + /* netconn layer enables pktinfo by default, sockets default to off */ + conn->flags &= ~NETCONN_FLAG_PKTINFO; + } +#endif /* LWIP_NETBUF_RECVINFO */ + break; + case SOCK_STREAM: + conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), DEFAULT_SOCKET_EVENTCB); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", + domain, type, protocol)); + set_errno(EINVAL); + return -1; + } + + if (!conn) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); + set_errno(ENOBUFS); + return -1; + } + + i = alloc_socket(conn, 0); + + if (i == -1) { + netconn_delete(conn); + set_errno(ENFILE); + return -1; + } + conn->socket = i; + done_socket(&sockets[i - LWIP_SOCKET_OFFSET]); + LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); + set_errno(0); + return i; +} + +ssize_t +lwip_write(int s, const void *data, size_t size) +{ + return lwip_send(s, data, size, 0); +} + +ssize_t +lwip_writev(int s, const struct iovec *iov, int iovcnt) +{ + struct msghdr msg; + + msg.msg_name = NULL; + msg.msg_namelen = 0; + /* Hack: we have to cast via number to cast from 'const' pointer to non-const. + Blame the opengroup standard for this inconsistency. */ + msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov); + msg.msg_iovlen = iovcnt; + msg.msg_control = NULL; + msg.msg_controllen = 0; + msg.msg_flags = 0; + return lwip_sendmsg(s, &msg, 0); +} + +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL +/* Add select_cb to select_cb_list. */ +static void +lwip_link_select_cb(struct lwip_select_cb *select_cb) +{ + LWIP_SOCKET_SELECT_DECL_PROTECT(lev); + + /* Protect the select_cb_list */ + LWIP_SOCKET_SELECT_PROTECT(lev); + + /* Put this select_cb on top of list */ + select_cb->next = select_cb_list; + if (select_cb_list != NULL) { + select_cb_list->prev = select_cb; + } + select_cb_list = select_cb; +#if !LWIP_TCPIP_CORE_LOCKING + /* Increasing this counter tells select_check_waiters that the list has changed. */ + select_cb_ctr++; +#endif + + /* Now we can safely unprotect */ + LWIP_SOCKET_SELECT_UNPROTECT(lev); +} + +/* Remove select_cb from select_cb_list. */ +static void +lwip_unlink_select_cb(struct lwip_select_cb *select_cb) +{ + LWIP_SOCKET_SELECT_DECL_PROTECT(lev); + + /* Take us off the list */ + LWIP_SOCKET_SELECT_PROTECT(lev); + if (select_cb->next != NULL) { + select_cb->next->prev = select_cb->prev; + } + if (select_cb_list == select_cb) { + LWIP_ASSERT("select_cb->prev == NULL", select_cb->prev == NULL); + select_cb_list = select_cb->next; + } else { + LWIP_ASSERT("select_cb->prev != NULL", select_cb->prev != NULL); + select_cb->prev->next = select_cb->next; + } +#if !LWIP_TCPIP_CORE_LOCKING + /* Increasing this counter tells select_check_waiters that the list has changed. */ + select_cb_ctr++; +#endif + LWIP_SOCKET_SELECT_UNPROTECT(lev); +} +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + +#if LWIP_SOCKET_SELECT +/** + * Go through the readset and writeset lists and see which socket of the sockets + * set in the sets has events. On return, readset, writeset and exceptset have + * the sockets enabled that had events. + * + * @param maxfdp1 the highest socket index in the sets + * @param readset_in set of sockets to check for read events + * @param writeset_in set of sockets to check for write events + * @param exceptset_in set of sockets to check for error events + * @param readset_out set of sockets that had read events + * @param writeset_out set of sockets that had write events + * @param exceptset_out set os sockets that had error events + * @return number of sockets that had events (read/write/exception) (>= 0) + */ +static int +lwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in, + fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out) +{ + int i, nready = 0; + fd_set lreadset, lwriteset, lexceptset; + struct lwip_sock *sock; + SYS_ARCH_DECL_PROTECT(lev); + + FD_ZERO(&lreadset); + FD_ZERO(&lwriteset); + FD_ZERO(&lexceptset); + + /* Go through each socket in each list to count number of sockets which + currently match */ + for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) { + /* if this FD is not in the set, continue */ + if (!(readset_in && FD_ISSET(i, readset_in)) && + !(writeset_in && FD_ISSET(i, writeset_in)) && + !(exceptset_in && FD_ISSET(i, exceptset_in))) { + continue; + } + /* First get the socket's status (protected)... */ + SYS_ARCH_PROTECT(lev); + sock = tryget_socket_unconn_locked(i); + if (sock != NULL) { + void *lastdata = sock->lastdata.pbuf; + s16_t rcvevent = sock->rcvevent; + u16_t sendevent = sock->sendevent; + u16_t errevent = sock->errevent; + SYS_ARCH_UNPROTECT(lev); + + /* ... then examine it: */ + /* See if netconn of this socket is ready for read */ + if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) { + FD_SET(i, &lreadset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i)); + nready++; + } + /* See if netconn of this socket is ready for write */ + if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) { + FD_SET(i, &lwriteset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i)); + nready++; + } + /* See if netconn of this socket had an error */ + if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) { + FD_SET(i, &lexceptset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i)); + nready++; + } + done_socket(sock); + } else { + SYS_ARCH_UNPROTECT(lev); + /* no a valid open socket */ + return -1; + } + } + /* copy local sets to the ones provided as arguments */ + *readset_out = lreadset; + *writeset_out = lwriteset; + *exceptset_out = lexceptset; + + LWIP_ASSERT("nready >= 0", nready >= 0); + return nready; +} + +#if LWIP_NETCONN_FULLDUPLEX +/* Mark all of the set sockets in one of the three fdsets passed to select as used. + * All sockets are marked (and later unmarked), whether they are open or not. + * This is OK as lwip_selscan aborts select when non-open sockets are found. + */ +static void +lwip_select_inc_sockets_used_set(int maxfdp, fd_set *fdset, fd_set *used_sockets) +{ + SYS_ARCH_DECL_PROTECT(lev); + if (fdset) { + int i; + for (i = LWIP_SOCKET_OFFSET; i < maxfdp; i++) { + /* if this FD is in the set, lock it (unless already done) */ + if (FD_ISSET(i, fdset) && !FD_ISSET(i, used_sockets)) { + struct lwip_sock *sock; + SYS_ARCH_PROTECT(lev); + sock = tryget_socket_unconn_locked(i); + if (sock != NULL) { + /* leave the socket used until released by lwip_select_dec_sockets_used */ + FD_SET(i, used_sockets); + } + SYS_ARCH_UNPROTECT(lev); + } + } + } +} + +/* Mark all sockets passed to select as used to prevent them from being freed + * from other threads while select is running. + * Marked sockets are added to 'used_sockets' to mark them only once an be able + * to unmark them correctly. + */ +static void +lwip_select_inc_sockets_used(int maxfdp, fd_set *fdset1, fd_set *fdset2, fd_set *fdset3, fd_set *used_sockets) +{ + FD_ZERO(used_sockets); + lwip_select_inc_sockets_used_set(maxfdp, fdset1, used_sockets); + lwip_select_inc_sockets_used_set(maxfdp, fdset2, used_sockets); + lwip_select_inc_sockets_used_set(maxfdp, fdset3, used_sockets); +} + +/* Let go all sockets that were marked as used when starting select */ +static void +lwip_select_dec_sockets_used(int maxfdp, fd_set *used_sockets) +{ + int i; + for (i = LWIP_SOCKET_OFFSET; i < maxfdp; i++) { + /* if this FD is not in the set, continue */ + if (FD_ISSET(i, used_sockets)) { + struct lwip_sock *sock = tryget_socket_unconn_nouse(i); + LWIP_ASSERT("socket gone at the end of select", sock != NULL); + if (sock != NULL) { + done_socket(sock); + } + } + } +} +#else /* LWIP_NETCONN_FULLDUPLEX */ +#define lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, used_sockets) +#define lwip_select_dec_sockets_used(maxfdp1, used_sockets) +#endif /* LWIP_NETCONN_FULLDUPLEX */ + +int +lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + struct timeval *timeout) +{ + u32_t waitres = 0; + int nready; + fd_set lreadset, lwriteset, lexceptset; + u32_t msectimeout; + int i; + int maxfdp2; +#if LWIP_NETCONN_SEM_PER_THREAD + int waited = 0; +#endif +#if LWIP_NETCONN_FULLDUPLEX + fd_set used_sockets; +#endif + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%"S32_F" tvusec=%"S32_F")\n", + maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, + timeout ? (s32_t)timeout->tv_sec : (s32_t) - 1, + timeout ? (s32_t)timeout->tv_usec : (s32_t) - 1)); + + if ((maxfdp1 < 0) || (maxfdp1 > LWIP_SELECT_MAXNFDS)) { + set_errno(EINVAL); + return -1; + } + + lwip_select_inc_sockets_used(maxfdp1, readset, writeset, exceptset, &used_sockets); + + /* Go through each socket in each list to count number of sockets which + currently match */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + + if (nready < 0) { + /* one of the sockets in one of the fd_sets was invalid */ + set_errno(EBADF); + lwip_select_dec_sockets_used(maxfdp1, &used_sockets); + return -1; + } else if (nready > 0) { + /* one or more sockets are set, no need to wait */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready)); + } else { + /* If we don't have any current events, then suspend if we are supposed to */ + if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n")); + /* This is OK as the local fdsets are empty and nready is zero, + or we would have returned earlier. */ + } else { + /* None ready: add our semaphore to list: + We don't actually need any dynamic memory. Our entry on the + list is only valid while we are in this function, so it's ok + to use local variables (unless we're running in MPU compatible + mode). */ + API_SELECT_CB_VAR_DECLARE(select_cb); + API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(ENOMEM); lwip_select_dec_sockets_used(maxfdp1, &used_sockets); return -1); + memset(&API_SELECT_CB_VAR_REF(select_cb), 0, sizeof(struct lwip_select_cb)); + + API_SELECT_CB_VAR_REF(select_cb).readset = readset; + API_SELECT_CB_VAR_REF(select_cb).writeset = writeset; + API_SELECT_CB_VAR_REF(select_cb).exceptset = exceptset; +#if LWIP_NETCONN_SEM_PER_THREAD + API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET(); +#else /* LWIP_NETCONN_SEM_PER_THREAD */ + if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) { + /* failed to create semaphore */ + set_errno(ENOMEM); + lwip_select_dec_sockets_used(maxfdp1, &used_sockets); + API_SELECT_CB_VAR_FREE(select_cb); + return -1; + } +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + + lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb)); + + /* Increase select_waiting for each socket we are interested in */ + maxfdp2 = maxfdp1; + for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) { + if ((readset && FD_ISSET(i, readset)) || + (writeset && FD_ISSET(i, writeset)) || + (exceptset && FD_ISSET(i, exceptset))) { + struct lwip_sock *sock; + SYS_ARCH_PROTECT(lev); + sock = tryget_socket_unconn_locked(i); + if (sock != NULL) { + sock->select_waiting++; + if (sock->select_waiting == 0) { + /* overflow - too many threads waiting */ + sock->select_waiting--; + nready = -1; + maxfdp2 = i; + SYS_ARCH_UNPROTECT(lev); + done_socket(sock); + set_errno(EBUSY); + break; + } + SYS_ARCH_UNPROTECT(lev); + done_socket(sock); + } else { + /* Not a valid socket */ + nready = -1; + maxfdp2 = i; + SYS_ARCH_UNPROTECT(lev); + set_errno(EBADF); + break; + } + } + } + + if (nready >= 0) { + /* Call lwip_selscan again: there could have been events between + the last scan (without us on the list) and putting us on the list! */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + if (nready < 0) { + set_errno(EBADF); + } else if (!nready) { + /* Still none ready, just wait to be woken */ + if (timeout == 0) { + /* Wait forever */ + msectimeout = 0; + } else { + long msecs_long = ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500) / 1000)); + if (msecs_long <= 0) { + /* Wait 1ms at least (0 means wait forever) */ + msectimeout = 1; + } else { + msectimeout = (u32_t)msecs_long; + } + } + + waitres = sys_arch_sem_wait(SELECT_SEM_PTR(API_SELECT_CB_VAR_REF(select_cb).sem), msectimeout); +#if LWIP_NETCONN_SEM_PER_THREAD + waited = 1; +#endif + } + } + + /* Decrease select_waiting for each socket we are interested in */ + for (i = LWIP_SOCKET_OFFSET; i < maxfdp2; i++) { + if ((readset && FD_ISSET(i, readset)) || + (writeset && FD_ISSET(i, writeset)) || + (exceptset && FD_ISSET(i, exceptset))) { + struct lwip_sock *sock; + SYS_ARCH_PROTECT(lev); + sock = tryget_socket_unconn_nouse(i); + LWIP_ASSERT("socket gone at the end of select", sock != NULL); + if (sock != NULL) { + /* for now, handle select_waiting==0... */ + LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); + if (sock->select_waiting > 0) { + sock->select_waiting--; + } + SYS_ARCH_UNPROTECT(lev); + } else { + SYS_ARCH_UNPROTECT(lev); + /* Not a valid socket */ + nready = -1; + set_errno(EBADF); + } + } + } + + lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb)); + +#if LWIP_NETCONN_SEM_PER_THREAD + if (API_SELECT_CB_VAR_REF(select_cb).sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) { + /* don't leave the thread-local semaphore signalled */ + sys_arch_sem_wait(API_SELECT_CB_VAR_REF(select_cb).sem, 1); + } +#else /* LWIP_NETCONN_SEM_PER_THREAD */ + sys_sem_free(&API_SELECT_CB_VAR_REF(select_cb).sem); +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + API_SELECT_CB_VAR_FREE(select_cb); + + if (nready < 0) { + /* This happens when a socket got closed while waiting */ + lwip_select_dec_sockets_used(maxfdp1, &used_sockets); + return -1; + } + + if (waitres == SYS_ARCH_TIMEOUT) { + /* Timeout */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n")); + /* This is OK as the local fdsets are empty and nready is zero, + or we would have returned earlier. */ + } else { + /* See what's set now after waiting */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready)); + if (nready < 0) { + set_errno(EBADF); + lwip_select_dec_sockets_used(maxfdp1, &used_sockets); + return -1; + } + } + } + } + + lwip_select_dec_sockets_used(maxfdp1, &used_sockets); + set_errno(0); + if (readset) { + *readset = lreadset; + } + if (writeset) { + *writeset = lwriteset; + } + if (exceptset) { + *exceptset = lexceptset; + } + return nready; +} +#endif /* LWIP_SOCKET_SELECT */ + +#if LWIP_SOCKET_POLL +/** Options for the lwip_pollscan function. */ +enum lwip_pollscan_opts +{ + /** Clear revents in each struct pollfd. */ + LWIP_POLLSCAN_CLEAR = 1, + + /** Increment select_waiting in each struct lwip_sock. */ + LWIP_POLLSCAN_INC_WAIT = 2, + + /** Decrement select_waiting in each struct lwip_sock. */ + LWIP_POLLSCAN_DEC_WAIT = 4 +}; + +/** + * Update revents in each struct pollfd. + * Optionally update select_waiting in struct lwip_sock. + * + * @param fds array of structures to update + * @param nfds number of structures in fds + * @param opts what to update and how + * @return number of structures that have revents != 0 + */ +static int +lwip_pollscan(struct pollfd *fds, nfds_t nfds, enum lwip_pollscan_opts opts) +{ + int nready = 0; + nfds_t fdi; + struct lwip_sock *sock; + SYS_ARCH_DECL_PROTECT(lev); + + /* Go through each struct pollfd in the array. */ + for (fdi = 0; fdi < nfds; fdi++) { + if ((opts & LWIP_POLLSCAN_CLEAR) != 0) { + fds[fdi].revents = 0; + } + + /* Negative fd means the caller wants us to ignore this struct. + POLLNVAL means we already detected that the fd is invalid; + if another thread has since opened a new socket with that fd, + we must not use that socket. */ + if (fds[fdi].fd >= 0 && (fds[fdi].revents & POLLNVAL) == 0) { + /* First get the socket's status (protected)... */ + SYS_ARCH_PROTECT(lev); + sock = tryget_socket_unconn_locked(fds[fdi].fd); + if (sock != NULL) { + void* lastdata = sock->lastdata.pbuf; + s16_t rcvevent = sock->rcvevent; + u16_t sendevent = sock->sendevent; + u16_t errevent = sock->errevent; + + if ((opts & LWIP_POLLSCAN_INC_WAIT) != 0) { + sock->select_waiting++; + if (sock->select_waiting == 0) { + /* overflow - too many threads waiting */ + sock->select_waiting--; + nready = -1; + SYS_ARCH_UNPROTECT(lev); + done_socket(sock); + break; + } + } else if ((opts & LWIP_POLLSCAN_DEC_WAIT) != 0) { + /* for now, handle select_waiting==0... */ + LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); + if (sock->select_waiting > 0) { + sock->select_waiting--; + } + } + SYS_ARCH_UNPROTECT(lev); + done_socket(sock); + + /* ... then examine it: */ + /* See if netconn of this socket is ready for read */ + if ((fds[fdi].events & POLLIN) != 0 && ((lastdata != NULL) || (rcvevent > 0))) { + fds[fdi].revents |= POLLIN; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for reading\n", fds[fdi].fd)); + } + /* See if netconn of this socket is ready for write */ + if ((fds[fdi].events & POLLOUT) != 0 && (sendevent != 0)) { + fds[fdi].revents |= POLLOUT; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for writing\n", fds[fdi].fd)); + } + /* See if netconn of this socket had an error */ + if (errevent != 0) { + /* POLLERR is output only. */ + fds[fdi].revents |= POLLERR; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_pollscan: fd=%d ready for exception\n", fds[fdi].fd)); + } + } else { + /* Not a valid socket */ + SYS_ARCH_UNPROTECT(lev); + /* POLLNVAL is output only. */ + fds[fdi].revents |= POLLNVAL; + return -1; + } + } + + /* Will return the number of structures that have events, + not the number of events. */ + if (fds[fdi].revents != 0) { + nready++; + } + } + + LWIP_ASSERT("nready >= 0", nready >= 0); + return nready; +} + +#if LWIP_NETCONN_FULLDUPLEX +/* Mark all sockets as used. + * + * All sockets are marked (and later unmarked), whether they are open or not. + * This is OK as lwip_pollscan aborts select when non-open sockets are found. + */ +static void +lwip_poll_inc_sockets_used(struct pollfd *fds, nfds_t nfds) +{ + nfds_t fdi; + + if(fds) { + /* Go through each struct pollfd in the array. */ + for (fdi = 0; fdi < nfds; fdi++) { + /* Increase the reference counter */ + tryget_socket_unconn(fds[fdi].fd); + } + } +} + +/* Let go all sockets that were marked as used when starting poll */ +static void +lwip_poll_dec_sockets_used(struct pollfd *fds, nfds_t nfds) +{ + nfds_t fdi; + + if(fds) { + /* Go through each struct pollfd in the array. */ + for (fdi = 0; fdi < nfds; fdi++) { + struct lwip_sock *sock = tryget_socket_unconn_nouse(fds[fdi].fd); + if (sock != NULL) { + done_socket(sock); + } + } + } +} +#else /* LWIP_NETCONN_FULLDUPLEX */ +#define lwip_poll_inc_sockets_used(fds, nfds) +#define lwip_poll_dec_sockets_used(fds, nfds) +#endif /* LWIP_NETCONN_FULLDUPLEX */ + +int +lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout) +{ + u32_t waitres = 0; + int nready; + u32_t msectimeout; +#if LWIP_NETCONN_SEM_PER_THREAD + int waited = 0; +#endif + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll(%p, %d, %d)\n", + (void*)fds, (int)nfds, timeout)); + LWIP_ERROR("lwip_poll: invalid fds", ((fds != NULL && nfds > 0) || (fds == NULL && nfds == 0)), + set_errno(EINVAL); return -1;); + + lwip_poll_inc_sockets_used(fds, nfds); + + /* Go through each struct pollfd to count number of structures + which currently match */ + nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_CLEAR); + + if (nready < 0) { + lwip_poll_dec_sockets_used(fds, nfds); + return -1; + } + + /* If we don't have any current events, then suspend if we are supposed to */ + if (!nready) { + API_SELECT_CB_VAR_DECLARE(select_cb); + + if (timeout == 0) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: no timeout, returning 0\n")); + goto return_success; + } + API_SELECT_CB_VAR_ALLOC(select_cb, set_errno(EAGAIN); lwip_poll_dec_sockets_used(fds, nfds); return -1); + memset(&API_SELECT_CB_VAR_REF(select_cb), 0, sizeof(struct lwip_select_cb)); + + /* None ready: add our semaphore to list: + We don't actually need any dynamic memory. Our entry on the + list is only valid while we are in this function, so it's ok + to use local variables. */ + + API_SELECT_CB_VAR_REF(select_cb).poll_fds = fds; + API_SELECT_CB_VAR_REF(select_cb).poll_nfds = nfds; +#if LWIP_NETCONN_SEM_PER_THREAD + API_SELECT_CB_VAR_REF(select_cb).sem = LWIP_NETCONN_THREAD_SEM_GET(); +#else /* LWIP_NETCONN_SEM_PER_THREAD */ + if (sys_sem_new(&API_SELECT_CB_VAR_REF(select_cb).sem, 0) != ERR_OK) { + /* failed to create semaphore */ + set_errno(EAGAIN); + lwip_poll_dec_sockets_used(fds, nfds); + API_SELECT_CB_VAR_FREE(select_cb); + return -1; + } +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + + lwip_link_select_cb(&API_SELECT_CB_VAR_REF(select_cb)); + + /* Increase select_waiting for each socket we are interested in. + Also, check for events again: there could have been events between + the last scan (without us on the list) and putting us on the list! */ + nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_INC_WAIT); + + if (!nready) { + /* Still none ready, just wait to be woken */ + if (timeout < 0) { + /* Wait forever */ + msectimeout = 0; + } else { + /* timeout == 0 would have been handled earlier. */ + LWIP_ASSERT("timeout > 0", timeout > 0); + msectimeout = timeout; + } + waitres = sys_arch_sem_wait(SELECT_SEM_PTR(API_SELECT_CB_VAR_REF(select_cb).sem), msectimeout); +#if LWIP_NETCONN_SEM_PER_THREAD + waited = 1; +#endif + } + + /* Decrease select_waiting for each socket we are interested in, + and check which events occurred while we waited. */ + nready = lwip_pollscan(fds, nfds, LWIP_POLLSCAN_DEC_WAIT); + + lwip_unlink_select_cb(&API_SELECT_CB_VAR_REF(select_cb)); + +#if LWIP_NETCONN_SEM_PER_THREAD + if (select_cb.sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) { + /* don't leave the thread-local semaphore signalled */ + sys_arch_sem_wait(API_SELECT_CB_VAR_REF(select_cb).sem, 1); + } +#else /* LWIP_NETCONN_SEM_PER_THREAD */ + sys_sem_free(&API_SELECT_CB_VAR_REF(select_cb).sem); +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + API_SELECT_CB_VAR_FREE(select_cb); + + if (nready < 0) { + /* This happens when a socket got closed while waiting */ + lwip_poll_dec_sockets_used(fds, nfds); + return -1; + } + + if (waitres == SYS_ARCH_TIMEOUT) { + /* Timeout */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: timeout expired\n")); + goto return_success; + } + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_poll: nready=%d\n", nready)); +return_success: + lwip_poll_dec_sockets_used(fds, nfds); + set_errno(0); + return nready; +} + +/** + * Check whether event_callback should wake up a thread waiting in + * lwip_poll. + */ +static int +lwip_poll_should_wake(const struct lwip_select_cb *scb, int fd, int has_recvevent, int has_sendevent, int has_errevent) +{ + nfds_t fdi; + for (fdi = 0; fdi < scb->poll_nfds; fdi++) { + const struct pollfd *pollfd = &scb->poll_fds[fdi]; + if (pollfd->fd == fd) { + /* Do not update pollfd->revents right here; + that would be a data race because lwip_pollscan + accesses revents without protecting. */ + if (has_recvevent && (pollfd->events & POLLIN) != 0) { + return 1; + } + if (has_sendevent && (pollfd->events & POLLOUT) != 0) { + return 1; + } + if (has_errevent) { + /* POLLERR is output only. */ + return 1; + } + } + } + return 0; +} +#endif /* LWIP_SOCKET_POLL */ + +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL +/** + * Callback registered in the netconn layer for each socket-netconn. + * Processes recvevent (data available) and wakes up tasks waiting for select. + * + * @note for LWIP_TCPIP_CORE_LOCKING any caller of this function + * must have the core lock held when signaling the following events + * as they might cause select_list_cb to be checked: + * NETCONN_EVT_RCVPLUS + * NETCONN_EVT_SENDPLUS + * NETCONN_EVT_ERROR + * This requirement will be asserted in select_check_waiters() + */ +static void +event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) +{ + int s, check_waiters; + struct lwip_sock *sock; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_UNUSED_ARG(len); + + /* Get socket */ + if (conn) { + s = conn->socket; + if (s < 0) { + /* Data comes in right away after an accept, even though + * the server task might not have created a new socket yet. + * Just count down (or up) if that's the case and we + * will use the data later. Note that only receive events + * can happen before the new socket is set up. */ + SYS_ARCH_PROTECT(lev); + if (conn->socket < 0) { + if (evt == NETCONN_EVT_RCVPLUS) { + /* conn->socket is -1 on initialization + lwip_accept adjusts sock->recvevent if conn->socket < -1 */ + conn->socket--; + } + SYS_ARCH_UNPROTECT(lev); + return; + } + s = conn->socket; + SYS_ARCH_UNPROTECT(lev); + } + + sock = get_socket(s); + if (!sock) { + return; + } + } else { + return; + } + + check_waiters = 1; + SYS_ARCH_PROTECT(lev); + /* Set event as required */ + switch (evt) { + case NETCONN_EVT_RCVPLUS: + sock->rcvevent++; + if (sock->rcvevent > 1) { + check_waiters = 0; + } + break; + case NETCONN_EVT_RCVMINUS: + sock->rcvevent--; + check_waiters = 0; + break; + case NETCONN_EVT_SENDPLUS: + if (sock->sendevent) { + check_waiters = 0; + } + sock->sendevent = 1; + break; + case NETCONN_EVT_SENDMINUS: + sock->sendevent = 0; + check_waiters = 0; + break; + case NETCONN_EVT_ERROR: + sock->errevent = 1; + break; + default: + LWIP_ASSERT("unknown event", 0); + break; + } + + if (sock->select_waiting && check_waiters) { + /* Save which events are active */ + int has_recvevent, has_sendevent, has_errevent; + has_recvevent = sock->rcvevent > 0; + has_sendevent = sock->sendevent != 0; + has_errevent = sock->errevent != 0; + SYS_ARCH_UNPROTECT(lev); + /* Check any select calls waiting on this socket */ + select_check_waiters(s, has_recvevent, has_sendevent, has_errevent); + } else { + SYS_ARCH_UNPROTECT(lev); + } + done_socket(sock); +} + +/** + * Check if any select waiters are waiting on this socket and its events + * + * @note on synchronization of select_cb_list: + * LWIP_TCPIP_CORE_LOCKING: the select_cb_list must only be accessed while holding + * the core lock. We do a single pass through the list and signal any waiters. + * Core lock should already be held when calling here!!!! + + * !LWIP_TCPIP_CORE_LOCKING: we use SYS_ARCH_PROTECT but unlock on each iteration + * of the loop, thus creating a possibility where a thread could modify the + * select_cb_list during our UNPROTECT/PROTECT. We use a generational counter to + * detect this change and restart the list walk. The list is expected to be small + */ +static void select_check_waiters(int s, int has_recvevent, int has_sendevent, int has_errevent) +{ + struct lwip_select_cb *scb; +#if !LWIP_TCPIP_CORE_LOCKING + int last_select_cb_ctr; + SYS_ARCH_DECL_PROTECT(lev); +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + + LWIP_ASSERT_CORE_LOCKED(); + +#if !LWIP_TCPIP_CORE_LOCKING + SYS_ARCH_PROTECT(lev); +again: + /* remember the state of select_cb_list to detect changes */ + last_select_cb_ctr = select_cb_ctr; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + for (scb = select_cb_list; scb != NULL; scb = scb->next) { + if (scb->sem_signalled == 0) { + /* semaphore not signalled yet */ + int do_signal = 0; +#if LWIP_SOCKET_POLL + if (scb->poll_fds != NULL) { + do_signal = lwip_poll_should_wake(scb, s, has_recvevent, has_sendevent, has_errevent); + } +#endif /* LWIP_SOCKET_POLL */ +#if LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL + else +#endif /* LWIP_SOCKET_SELECT && LWIP_SOCKET_POLL */ +#if LWIP_SOCKET_SELECT + { + /* Test this select call for our socket */ + if (has_recvevent) { + if (scb->readset && FD_ISSET(s, scb->readset)) { + do_signal = 1; + } + } + if (has_sendevent) { + if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) { + do_signal = 1; + } + } + if (has_errevent) { + if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) { + do_signal = 1; + } + } + } +#endif /* LWIP_SOCKET_SELECT */ + if (do_signal) { + scb->sem_signalled = 1; + /* For !LWIP_TCPIP_CORE_LOCKING, we don't call SYS_ARCH_UNPROTECT() before signaling + the semaphore, as this might lead to the select thread taking itself off the list, + invalidating the semaphore. */ + sys_sem_signal(SELECT_SEM_PTR(scb->sem)); + } + } +#if LWIP_TCPIP_CORE_LOCKING + } +#else + /* unlock interrupts with each step */ + SYS_ARCH_UNPROTECT(lev); + /* this makes sure interrupt protection time is short */ + SYS_ARCH_PROTECT(lev); + if (last_select_cb_ctr != select_cb_ctr) { + /* someone has changed select_cb_list, restart at the beginning */ + goto again; + } + /* remember the state of select_cb_list to detect changes */ + last_select_cb_ctr = select_cb_ctr; + } + SYS_ARCH_UNPROTECT(lev); +#endif +} +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + +/** + * Close one end of a full-duplex connection. + */ +int +lwip_shutdown(int s, int how) +{ + struct lwip_sock *sock; + err_t err; + u8_t shut_rx = 0, shut_tx = 0; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (sock->conn != NULL) { + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + done_socket(sock); + return -1; + } + } else { + sock_set_errno(sock, ENOTCONN); + done_socket(sock); + return -1; + } + + if (how == SHUT_RD) { + shut_rx = 1; + } else if (how == SHUT_WR) { + shut_tx = 1; + } else if (how == SHUT_RDWR) { + shut_rx = 1; + shut_tx = 1; + } else { + sock_set_errno(sock, EINVAL); + done_socket(sock); + return -1; + } + err = netconn_shutdown(sock->conn, shut_rx, shut_tx); + + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return (err == ERR_OK ? 0 : -1); +} + +static int +lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local) +{ + struct lwip_sock *sock; + union sockaddr_aligned saddr; + ip_addr_t naddr; + u16_t port; + err_t err; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* get the IP address and port */ + err = netconn_getaddr(sock->conn, &naddr, &port, local); + if (err != ERR_OK) { + sock_set_errno(sock, err_to_errno(err)); + done_socket(sock); + return -1; + } + +#if LWIP_IPV4 && LWIP_IPV6 + /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */ + if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) && + IP_IS_V4_VAL(naddr)) { + ip4_2_ipv4_mapped_ipv6(ip_2_ip6(&naddr), ip_2_ip4(&naddr)); + IP_SET_TYPE_VAL(naddr, IPADDR_TYPE_V6); + } +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + + IPADDR_PORT_TO_SOCKADDR(&saddr, &naddr, port); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getaddrname(%d, addr=", s)); + ip_addr_debug_print_val(SOCKETS_DEBUG, naddr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", port)); + + if (*namelen > saddr.sa.sa_len) { + *namelen = saddr.sa.sa_len; + } + MEMCPY(name, &saddr, *namelen); + + sock_set_errno(sock, 0); + done_socket(sock); + return 0; +} + +int +lwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen) +{ + return lwip_getaddrname(s, name, namelen, 0); +} + +int +lwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen) +{ + return lwip_getaddrname(s, name, namelen, 1); +} + +int +lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) +{ + int err; + struct lwip_sock *sock = get_socket(s); +#if !LWIP_TCPIP_CORE_LOCKING + err_t cberr; + LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data); +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + + if (!sock) { + return -1; + } + + if ((NULL == optval) || (NULL == optlen)) { + sock_set_errno(sock, EFAULT); + done_socket(sock); + return -1; + } + +#if LWIP_TCPIP_CORE_LOCKING + /* core-locking can just call the -impl function */ + LOCK_TCPIP_CORE(); + err = lwip_getsockopt_impl(s, level, optname, optval, optlen); + UNLOCK_TCPIP_CORE(); + +#else /* LWIP_TCPIP_CORE_LOCKING */ + +#if LWIP_MPU_COMPATIBLE + /* MPU_COMPATIBLE copies the optval data, so check for max size here */ + if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) { + sock_set_errno(sock, ENOBUFS); + done_socket(sock); + return -1; + } +#endif /* LWIP_MPU_COMPATIBLE */ + + LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock); + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = *optlen; +#if !LWIP_MPU_COMPATIBLE + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.p = optval; +#endif /* !LWIP_MPU_COMPATIBLE */ + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0; +#if LWIP_NETCONN_SEM_PER_THREAD + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET(); +#else + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed; +#endif + cberr = tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data)); + if (cberr != ERR_OK) { + LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); + sock_set_errno(sock, err_to_errno(cberr)); + done_socket(sock); + return -1; + } + sys_arch_sem_wait((sys_sem_t *)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0); + + /* write back optlen and optval */ + *optlen = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen; +#if LWIP_MPU_COMPATIBLE + MEMCPY(optval, LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen); +#endif /* LWIP_MPU_COMPATIBLE */ + + /* maybe lwip_getsockopt_internal has changed err */ + err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err; + LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); +#endif /* LWIP_TCPIP_CORE_LOCKING */ + + sock_set_errno(sock, err); + done_socket(sock); + return err ? -1 : 0; +} + +#if !LWIP_TCPIP_CORE_LOCKING +/** lwip_getsockopt_callback: only used without CORE_LOCKING + * to get into the tcpip_thread + */ +static void +lwip_getsockopt_callback(void *arg) +{ + struct lwip_setgetsockopt_data *data; + LWIP_ASSERT("arg != NULL", arg != NULL); + data = (struct lwip_setgetsockopt_data *)arg; + + data->err = lwip_getsockopt_impl(data->s, data->level, data->optname, +#if LWIP_MPU_COMPATIBLE + data->optval, +#else /* LWIP_MPU_COMPATIBLE */ + data->optval.p, +#endif /* LWIP_MPU_COMPATIBLE */ + &data->optlen); + + sys_sem_signal((sys_sem_t *)(data->completed_sem)); +} +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +static int +lwip_sockopt_to_ipopt(int optname) +{ + /* Map SO_* values to our internal SOF_* values + * We should not rely on #defines in socket.h + * being in sync with ip.h. + */ + switch (optname) { + case SO_BROADCAST: + return SOF_BROADCAST; + case SO_KEEPALIVE: + return SOF_KEEPALIVE; + case SO_REUSEADDR: + return SOF_REUSEADDR; + default: + LWIP_ASSERT("Unknown socket option", 0); + return 0; + } +} + +/** lwip_getsockopt_impl: the actual implementation of getsockopt: + * same argument as lwip_getsockopt, either called directly or through callback + */ +static int +lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen) +{ + int err = 0; + struct lwip_sock *sock = tryget_socket(s); + if (!sock) { + return EBADF; + } + +#ifdef LWIP_HOOK_SOCKETS_GETSOCKOPT + if (LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) { + return err; + } +#endif + + switch (level) { + + /* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + +#if LWIP_TCP + case SO_ACCEPTCONN: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) { + done_socket(sock); + return ENOPROTOOPT; + } + if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) { + *(int *)optval = 1; + } else { + *(int *)optval = 0; + } + break; +#endif /* LWIP_TCP */ + + /* The option flags */ + case SO_BROADCAST: + case SO_KEEPALIVE: +#if SO_REUSE + case SO_REUSEADDR: +#endif /* SO_REUSE */ + if ((optname == SO_BROADCAST) && + (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) { + done_socket(sock); + return ENOPROTOOPT; + } + + optname = lwip_sockopt_to_ipopt(optname); + + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); + *(int *)optval = ip_get_option(sock->conn->pcb.ip, optname); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", + s, optname, (*(int *)optval ? "on" : "off"))); + break; + + case SO_TYPE: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); + switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) { + case NETCONN_RAW: + *(int *)optval = SOCK_RAW; + break; + case NETCONN_TCP: + *(int *)optval = SOCK_STREAM; + break; + case NETCONN_UDP: + *(int *)optval = SOCK_DGRAM; + break; + default: /* unrecognized socket type */ + *(int *)optval = netconn_type(sock->conn); + LWIP_DEBUGF(SOCKETS_DEBUG, + ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n", + s, *(int *)optval)); + } /* switch (netconn_type(sock->conn)) */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n", + s, *(int *)optval)); + break; + + case SO_ERROR: + LWIP_SOCKOPT_CHECK_OPTLEN(sock, *optlen, int); + *(int *)optval = err_to_errno(netconn_err(sock->conn)); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", + s, *(int *)optval)); + break; + +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); + LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn)); + break; +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); + LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn)); + break; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); + *(int *)optval = netconn_get_recvbufsize(sock->conn); + break; +#endif /* LWIP_SO_RCVBUF */ +#if LWIP_SO_LINGER + case SO_LINGER: { + s16_t conn_linger; + struct linger *linger = (struct linger *)optval; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger); + conn_linger = sock->conn->linger; + if (conn_linger >= 0) { + linger->l_onoff = 1; + linger->l_linger = (int)conn_linger; + } else { + linger->l_onoff = 0; + linger->l_linger = 0; + } + } + break; +#endif /* LWIP_SO_LINGER */ +#if LWIP_UDP + case SO_NO_CHECK: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP); +#if LWIP_UDPLITE + if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) { + /* this flag is only available for UDP, not for UDP lite */ + done_socket(sock); + return EAFNOSUPPORT; + } +#endif /* LWIP_UDPLITE */ + *(int *)optval = udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM) ? 1 : 0; + break; +#endif /* LWIP_UDP*/ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + + /* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + case IP_TTL: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); + *(int *)optval = sock->conn->pcb.ip->ttl; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n", + s, *(int *)optval)); + break; + case IP_TOS: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); + *(int *)optval = sock->conn->pcb.ip->tos; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n", + s, *(int *)optval)); + break; +#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP + case IP_MULTICAST_TTL: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t); + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) { + done_socket(sock); + return ENOPROTOOPT; + } + *(u8_t *)optval = udp_get_multicast_ttl(sock->conn->pcb.udp); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n", + s, *(int *)optval)); + break; + case IP_MULTICAST_IF: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr); + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) { + done_socket(sock); + return ENOPROTOOPT; + } + inet_addr_from_ip4addr((struct in_addr *)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp)); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%"X32_F"\n", + s, *(u32_t *)optval)); + break; + case IP_MULTICAST_LOOP: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t); + if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) { + *(u8_t *)optval = 1; + } else { + *(u8_t *)optval = 0; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + +#if LWIP_TCP + /* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + /* Special case: all IPPROTO_TCP option take an int */ + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP); + if (sock->conn->pcb.tcp->state == LISTEN) { + done_socket(sock); + return EINVAL; + } + switch (optname) { + case TCP_NODELAY: + *(int *)optval = tcp_nagle_disabled(sock->conn->pcb.tcp); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n", + s, (*(int *)optval) ? "on" : "off") ); + break; + case TCP_KEEPALIVE: + *(int *)optval = (int)sock->conn->pcb.tcp->keep_idle; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\n", + s, *(int *)optval)); + break; + +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + *(int *)optval = (int)(sock->conn->pcb.tcp->keep_idle / 1000); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) = %d\n", + s, *(int *)optval)); + break; + case TCP_KEEPINTVL: + *(int *)optval = (int)(sock->conn->pcb.tcp->keep_intvl / 1000); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) = %d\n", + s, *(int *)optval)); + break; + case TCP_KEEPCNT: + *(int *)optval = (int)sock->conn->pcb.tcp->keep_cnt; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) = %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_TCP_KEEPALIVE */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP */ + +#if LWIP_IPV6 + /* Level: IPPROTO_IPV6 */ + case IPPROTO_IPV6: + switch (optname) { + case IPV6_V6ONLY: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int); + *(int *)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\n", + s, *(int *)optval)); + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_IPV6 */ + +#if LWIP_UDP && LWIP_UDPLITE + /* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + /* Special case: all IPPROTO_UDPLITE option take an int */ + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int); + /* If this is no UDP lite socket, ignore any options. */ + if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) { + done_socket(sock); + return ENOPROTOOPT; + } + switch (optname) { + case UDPLITE_SEND_CSCOV: + *(int *)optval = sock->conn->pcb.udp->chksum_len_tx; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n", + s, (*(int *)optval)) ); + break; + case UDPLITE_RECV_CSCOV: + *(int *)optval = sock->conn->pcb.udp->chksum_len_rx; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n", + s, (*(int *)optval)) ); + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP */ + /* Level: IPPROTO_RAW */ + case IPPROTO_RAW: + switch (optname) { +#if LWIP_IPV6 && LWIP_RAW + case IPV6_CHECKSUM: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW); + if (sock->conn->pcb.raw->chksum_reqd == 0) { + *(int *)optval = -1; + } else { + *(int *)optval = sock->conn->pcb.raw->chksum_offset; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\n", + s, (*(int *)optval)) ); + break; +#endif /* LWIP_IPV6 && LWIP_RAW */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", + s, level, optname)); + err = ENOPROTOOPT; + break; + } /* switch (level) */ + + done_socket(sock); + return err; +} + +int +lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) +{ + int err = 0; + struct lwip_sock *sock = get_socket(s); +#if !LWIP_TCPIP_CORE_LOCKING + err_t cberr; + LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data); +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + + if (!sock) { + return -1; + } + + if (NULL == optval) { + sock_set_errno(sock, EFAULT); + done_socket(sock); + return -1; + } + +#if LWIP_TCPIP_CORE_LOCKING + /* core-locking can just call the -impl function */ + LOCK_TCPIP_CORE(); + err = lwip_setsockopt_impl(s, level, optname, optval, optlen); + UNLOCK_TCPIP_CORE(); + +#else /* LWIP_TCPIP_CORE_LOCKING */ + +#if LWIP_MPU_COMPATIBLE + /* MPU_COMPATIBLE copies the optval data, so check for max size here */ + if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) { + sock_set_errno(sock, ENOBUFS); + done_socket(sock); + return -1; + } +#endif /* LWIP_MPU_COMPATIBLE */ + + LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock); + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname; + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = optlen; +#if LWIP_MPU_COMPATIBLE + MEMCPY(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, optval, optlen); +#else /* LWIP_MPU_COMPATIBLE */ + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.pc = (const void *)optval; +#endif /* LWIP_MPU_COMPATIBLE */ + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0; +#if LWIP_NETCONN_SEM_PER_THREAD + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET(); +#else + LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed; +#endif + cberr = tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data)); + if (cberr != ERR_OK) { + LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); + sock_set_errno(sock, err_to_errno(cberr)); + done_socket(sock); + return -1; + } + sys_arch_sem_wait((sys_sem_t *)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0); + + /* maybe lwip_getsockopt_internal has changed err */ + err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err; + LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data); +#endif /* LWIP_TCPIP_CORE_LOCKING */ + + sock_set_errno(sock, err); + done_socket(sock); + return err ? -1 : 0; +} + +#if !LWIP_TCPIP_CORE_LOCKING +/** lwip_setsockopt_callback: only used without CORE_LOCKING + * to get into the tcpip_thread + */ +static void +lwip_setsockopt_callback(void *arg) +{ + struct lwip_setgetsockopt_data *data; + LWIP_ASSERT("arg != NULL", arg != NULL); + data = (struct lwip_setgetsockopt_data *)arg; + + data->err = lwip_setsockopt_impl(data->s, data->level, data->optname, +#if LWIP_MPU_COMPATIBLE + data->optval, +#else /* LWIP_MPU_COMPATIBLE */ + data->optval.pc, +#endif /* LWIP_MPU_COMPATIBLE */ + data->optlen); + + sys_sem_signal((sys_sem_t *)(data->completed_sem)); +} +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +/** lwip_setsockopt_impl: the actual implementation of setsockopt: + * same argument as lwip_setsockopt, either called directly or through callback + */ +static int +lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen) +{ + int err = 0; + struct lwip_sock *sock = tryget_socket(s); + if (!sock) { + return EBADF; + } + +#ifdef LWIP_HOOK_SOCKETS_SETSOCKOPT + if (LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, &err)) { + return err; + } +#endif + + switch (level) { + + /* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + + /* SO_ACCEPTCONN is get-only */ + + /* The option flags */ + case SO_BROADCAST: + case SO_KEEPALIVE: +#if SO_REUSE + case SO_REUSEADDR: +#endif /* SO_REUSE */ + if ((optname == SO_BROADCAST) && + (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP)) { + done_socket(sock); + return ENOPROTOOPT; + } + + optname = lwip_sockopt_to_ipopt(optname); + + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); + if (*(const int *)optval) { + ip_set_option(sock->conn->pcb.ip, optname); + } else { + ip_reset_option(sock->conn->pcb.ip, optname); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n", + s, optname, (*(const int *)optval ? "on" : "off"))); + break; + + /* SO_TYPE is get-only */ + /* SO_ERROR is get-only */ + +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: { + long ms_long; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); + ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval); + if (ms_long < 0) { + done_socket(sock); + return EINVAL; + } + netconn_set_sendtimeout(sock->conn, ms_long); + break; + } +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: { + long ms_long; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE); + ms_long = LWIP_SO_SNDRCVTIMEO_GET_MS(optval); + if (ms_long < 0) { + done_socket(sock); + return EINVAL; + } + netconn_set_recvtimeout(sock->conn, (u32_t)ms_long); + break; + } +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int); + netconn_set_recvbufsize(sock->conn, *(const int *)optval); + break; +#endif /* LWIP_SO_RCVBUF */ +#if LWIP_SO_LINGER + case SO_LINGER: { + const struct linger *linger = (const struct linger *)optval; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger); + if (linger->l_onoff) { + int lingersec = linger->l_linger; + if (lingersec < 0) { + done_socket(sock); + return EINVAL; + } + if (lingersec > 0xFFFF) { + lingersec = 0xFFFF; + } + sock->conn->linger = (s16_t)lingersec; + } else { + sock->conn->linger = -1; + } + } + break; +#endif /* LWIP_SO_LINGER */ +#if LWIP_UDP + case SO_NO_CHECK: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP); +#if LWIP_UDPLITE + if (udp_is_flag_set(sock->conn->pcb.udp, UDP_FLAGS_UDPLITE)) { + /* this flag is only available for UDP, not for UDP lite */ + done_socket(sock); + return EAFNOSUPPORT; + } +#endif /* LWIP_UDPLITE */ + if (*(const int *)optval) { + udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM); + } else { + udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_NOCHKSUM); + } + break; +#endif /* LWIP_UDP */ + case SO_BINDTODEVICE: { + const struct ifreq *iface; + struct netif *n = NULL; + + LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct ifreq); + + iface = (const struct ifreq *)optval; + if (iface->ifr_name[0] != 0) { + n = netif_find(iface->ifr_name); + if (n == NULL) { + done_socket(sock); + return ENODEV; + } + } + + switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) { +#if LWIP_TCP + case NETCONN_TCP: + tcp_bind_netif(sock->conn->pcb.tcp, n); + break; +#endif +#if LWIP_UDP + case NETCONN_UDP: + udp_bind_netif(sock->conn->pcb.udp, n); + break; +#endif +#if LWIP_RAW + case NETCONN_RAW: + raw_bind_netif(sock->conn->pcb.raw, n); + break; +#endif + default: + LWIP_ASSERT("Unhandled netconn type in SO_BINDTODEVICE", 0); + break; + } + } + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + + /* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + case IP_TTL: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); + sock->conn->pcb.ip->ttl = (u8_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\n", + s, sock->conn->pcb.ip->ttl)); + break; + case IP_TOS: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); + sock->conn->pcb.ip->tos = (u8_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\n", + s, sock->conn->pcb.ip->tos)); + break; +#if LWIP_NETBUF_RECVINFO + case IP_PKTINFO: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP); + if (*(const int *)optval) { + sock->conn->flags |= NETCONN_FLAG_PKTINFO; + } else { + sock->conn->flags &= ~NETCONN_FLAG_PKTINFO; + } + break; +#endif /* LWIP_NETBUF_RECVINFO */ +#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP + case IP_MULTICAST_TTL: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP); + udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t *)optval)); + break; + case IP_MULTICAST_IF: { + ip4_addr_t if_addr; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP); + inet_addr_to_ip4addr(&if_addr, (const struct in_addr *)optval); + udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr); + } + break; + case IP_MULTICAST_LOOP: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP); + if (*(const u8_t *)optval) { + udp_set_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP); + } else { + udp_clear_flags(sock->conn->pcb.udp, UDP_FLAGS_MULTICAST_LOOP); + } + break; +#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS && LWIP_UDP */ +#if LWIP_IGMP + case IP_ADD_MEMBERSHIP: + case IP_DROP_MEMBERSHIP: { + /* If this is a TCP or a RAW socket, ignore these options. */ + err_t igmp_err; + const struct ip_mreq *imr = (const struct ip_mreq *)optval; + ip4_addr_t if_addr; + ip4_addr_t multi_addr; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP); + inet_addr_to_ip4addr(&if_addr, &imr->imr_interface); + inet_addr_to_ip4addr(&multi_addr, &imr->imr_multiaddr); + if (optname == IP_ADD_MEMBERSHIP) { + if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) { + /* cannot track membership (out of memory) */ + err = ENOMEM; + igmp_err = ERR_OK; + } else { + igmp_err = igmp_joingroup(&if_addr, &multi_addr); + } + } else { + igmp_err = igmp_leavegroup(&if_addr, &multi_addr); + lwip_socket_unregister_membership(s, &if_addr, &multi_addr); + } + if (igmp_err != ERR_OK) { + err = EADDRNOTAVAIL; + } + } + break; +#endif /* LWIP_IGMP */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + +#if LWIP_TCP + /* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + /* Special case: all IPPROTO_TCP option take an int */ + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP); + if (sock->conn->pcb.tcp->state == LISTEN) { + done_socket(sock); + return EINVAL; + } + switch (optname) { + case TCP_NODELAY: + if (*(const int *)optval) { + tcp_nagle_disable(sock->conn->pcb.tcp); + } else { + tcp_nagle_enable(sock->conn->pcb.tcp); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n", + s, (*(const int *)optval) ? "on" : "off") ); + break; + case TCP_KEEPALIVE: + sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_idle)); + break; + +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + sock->conn->pcb.tcp->keep_idle = 1000 * (u32_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_idle)); + break; + case TCP_KEEPINTVL: + sock->conn->pcb.tcp->keep_intvl = 1000 * (u32_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_intvl)); + break; + case TCP_KEEPCNT: + sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int *)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_cnt)); + break; +#endif /* LWIP_TCP_KEEPALIVE */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP*/ + +#if LWIP_IPV6 + /* Level: IPPROTO_IPV6 */ + case IPPROTO_IPV6: + switch (optname) { + case IPV6_V6ONLY: + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); + if (*(const int *)optval) { + netconn_set_ipv6only(sock->conn, 1); + } else { + netconn_set_ipv6only(sock->conn, 0); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\n", + s, (netconn_get_ipv6only(sock->conn) ? 1 : 0))); + break; +#if LWIP_IPV6_MLD + case IPV6_JOIN_GROUP: + case IPV6_LEAVE_GROUP: { + /* If this is a TCP or a RAW socket, ignore these options. */ + err_t mld6_err; + struct netif *netif; + ip6_addr_t multi_addr; + const struct ipv6_mreq *imr = (const struct ipv6_mreq *)optval; + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ipv6_mreq, NETCONN_UDP); + inet6_addr_to_ip6addr(&multi_addr, &imr->ipv6mr_multiaddr); + LWIP_ASSERT("Invalid netif index", imr->ipv6mr_interface <= 0xFFu); + netif = netif_get_by_index((u8_t)imr->ipv6mr_interface); + if (netif == NULL) { + err = EADDRNOTAVAIL; + break; + } + + if (optname == IPV6_JOIN_GROUP) { + if (!lwip_socket_register_mld6_membership(s, imr->ipv6mr_interface, &multi_addr)) { + /* cannot track membership (out of memory) */ + err = ENOMEM; + mld6_err = ERR_OK; + } else { + mld6_err = mld6_joingroup_netif(netif, &multi_addr); + } + } else { + mld6_err = mld6_leavegroup_netif(netif, &multi_addr); + lwip_socket_unregister_mld6_membership(s, imr->ipv6mr_interface, &multi_addr); + } + if (mld6_err != ERR_OK) { + err = EADDRNOTAVAIL; + } + } + break; +#endif /* LWIP_IPV6_MLD */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_IPV6 */ + +#if LWIP_UDP && LWIP_UDPLITE + /* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + /* Special case: all IPPROTO_UDPLITE option take an int */ + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int); + /* If this is no UDP lite socket, ignore any options. */ + if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) { + done_socket(sock); + return ENOPROTOOPT; + } + switch (optname) { + case UDPLITE_SEND_CSCOV: + if ((*(const int *)optval != 0) && ((*(const int *)optval < 8) || (*(const int *)optval > 0xffff))) { + /* don't allow illegal values! */ + sock->conn->pcb.udp->chksum_len_tx = 8; + } else { + sock->conn->pcb.udp->chksum_len_tx = (u16_t) * (const int *)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\n", + s, (*(const int *)optval)) ); + break; + case UDPLITE_RECV_CSCOV: + if ((*(const int *)optval != 0) && ((*(const int *)optval < 8) || (*(const int *)optval > 0xffff))) { + /* don't allow illegal values! */ + sock->conn->pcb.udp->chksum_len_rx = 8; + } else { + sock->conn->pcb.udp->chksum_len_rx = (u16_t) * (const int *)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n", + s, (*(const int *)optval)) ); + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP */ + /* Level: IPPROTO_RAW */ + case IPPROTO_RAW: + switch (optname) { +#if LWIP_IPV6 && LWIP_RAW + case IPV6_CHECKSUM: + /* It should not be possible to disable the checksum generation with ICMPv6 + * as per RFC 3542 chapter 3.1 */ + if (sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) { + done_socket(sock); + return EINVAL; + } + + LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW); + if (*(const int *)optval < 0) { + sock->conn->pcb.raw->chksum_reqd = 0; + } else if (*(const int *)optval & 1) { + /* Per RFC3542, odd offsets are not allowed */ + done_socket(sock); + return EINVAL; + } else { + sock->conn->pcb.raw->chksum_reqd = 1; + sock->conn->pcb.raw->chksum_offset = (u16_t) * (const int *)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\n", + s, sock->conn->pcb.raw->chksum_reqd)); + break; +#endif /* LWIP_IPV6 && LWIP_RAW */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + break; + } /* switch (optname) */ + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", + s, level, optname)); + err = ENOPROTOOPT; + break; + } /* switch (level) */ + + done_socket(sock); + return err; +} + +int +lwip_ioctl(int s, long cmd, void *argp) +{ + struct lwip_sock *sock = get_socket(s); + u8_t val; +#if LWIP_SO_RCVBUF + int recv_avail; +#endif /* LWIP_SO_RCVBUF */ + + if (!sock) { + return -1; + } + + switch (cmd) { +#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE + case FIONREAD: + if (!argp) { + sock_set_errno(sock, EINVAL); + done_socket(sock); + return -1; + } +#if LWIP_FIONREAD_LINUXMODE + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) { + struct netbuf *nb; + if (sock->lastdata.netbuf) { + nb = sock->lastdata.netbuf; + *((int *)argp) = nb->p->tot_len; + } else { + struct netbuf *rxbuf; + err_t err = netconn_recv_udp_raw_netbuf_flags(sock->conn, &rxbuf, NETCONN_DONTBLOCK); + if (err != ERR_OK) { + *((int *)argp) = 0; + } else { + sock->lastdata.netbuf = rxbuf; + *((int *)argp) = rxbuf->p->tot_len; + } + } + done_socket(sock); + return 0; + } +#endif /* LWIP_FIONREAD_LINUXMODE */ + +#if LWIP_SO_RCVBUF + /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */ + SYS_ARCH_GET(sock->conn->recv_avail, recv_avail); + if (recv_avail < 0) { + recv_avail = 0; + } + + /* Check if there is data left from the last recv operation. /maq 041215 */ + if (sock->lastdata.netbuf) { + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { + recv_avail += sock->lastdata.pbuf->tot_len; + } else { + recv_avail += sock->lastdata.netbuf->p->tot_len; + } + } + *((int *)argp) = recv_avail; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t *)argp))); + sock_set_errno(sock, 0); + done_socket(sock); + return 0; +#else /* LWIP_SO_RCVBUF */ + break; +#endif /* LWIP_SO_RCVBUF */ +#endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */ + + case (long)FIONBIO: + val = 0; + if (argp && *(int *)argp) { + val = 1; + } + netconn_set_nonblocking(sock->conn, val); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val)); + sock_set_errno(sock, 0); + done_socket(sock); + return 0; + + default: + break; + } /* switch (cmd) */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp)); + sock_set_errno(sock, ENOSYS); /* not yet implemented */ + done_socket(sock); + return -1; +} + +/** A minimal implementation of fcntl. + * Currently only the commands F_GETFL and F_SETFL are implemented. + * The flag O_NONBLOCK and access modes are supported for F_GETFL, only + * the flag O_NONBLOCK is implemented for F_SETFL. + */ +int +lwip_fcntl(int s, int cmd, int val) +{ + struct lwip_sock *sock = get_socket(s); + int ret = -1; + int op_mode = 0; + + if (!sock) { + return -1; + } + + switch (cmd) { + case F_GETFL: + ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0; + sock_set_errno(sock, 0); + + if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) { +#if LWIP_TCPIP_CORE_LOCKING + LOCK_TCPIP_CORE(); +#else + SYS_ARCH_DECL_PROTECT(lev); + /* the proper thing to do here would be to get into the tcpip_thread, + but locking should be OK as well since we only *read* some flags */ + SYS_ARCH_PROTECT(lev); +#endif +#if LWIP_TCP + if (sock->conn->pcb.tcp) { + if (!(sock->conn->pcb.tcp->flags & TF_RXCLOSED)) { + op_mode |= O_RDONLY; + } + if (!(sock->conn->pcb.tcp->flags & TF_FIN)) { + op_mode |= O_WRONLY; + } + } +#endif +#if LWIP_TCPIP_CORE_LOCKING + UNLOCK_TCPIP_CORE(); +#else + SYS_ARCH_UNPROTECT(lev); +#endif + } else { + op_mode |= O_RDWR; + } + + /* ensure O_RDWR for (O_RDONLY|O_WRONLY) != O_RDWR cases */ + ret |= (op_mode == (O_RDONLY | O_WRONLY)) ? O_RDWR : op_mode; + + break; + case F_SETFL: + /* Bits corresponding to the file access mode and the file creation flags [..] that are set in arg shall be ignored */ + val &= ~(O_RDONLY | O_WRONLY | O_RDWR); + if ((val & ~O_NONBLOCK) == 0) { + /* only O_NONBLOCK, all other bits are zero */ + netconn_set_nonblocking(sock->conn, val & O_NONBLOCK); + ret = 0; + sock_set_errno(sock, 0); + } else { + sock_set_errno(sock, ENOSYS); /* not yet implemented */ + } + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_fcntl(%d, UNIMPL: %d, %d)\n", s, cmd, val)); + sock_set_errno(sock, ENOSYS); /* not yet implemented */ + break; + } + done_socket(sock); + return ret; +} + +#if LWIP_COMPAT_SOCKETS == 2 && LWIP_POSIX_SOCKETS_IO_NAMES +int +fcntl(int s, int cmd, ...) +{ + va_list ap; + int val; + + va_start(ap, cmd); + val = va_arg(ap, int); + va_end(ap); + return lwip_fcntl(s, cmd, val); +} +#endif + +const char * +lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size) +{ + const char *ret = NULL; + int size_int = (int)size; + if (size_int < 0) { + set_errno(ENOSPC); + return NULL; + } + switch (af) { +#if LWIP_IPV4 + case AF_INET: + ret = ip4addr_ntoa_r((const ip4_addr_t *)src, dst, size_int); + if (ret == NULL) { + set_errno(ENOSPC); + } + break; +#endif +#if LWIP_IPV6 + case AF_INET6: + ret = ip6addr_ntoa_r((const ip6_addr_t *)src, dst, size_int); + if (ret == NULL) { + set_errno(ENOSPC); + } + break; +#endif + default: + set_errno(EAFNOSUPPORT); + break; + } + return ret; +} + +int +lwip_inet_pton(int af, const char *src, void *dst) +{ + int err; + switch (af) { +#if LWIP_IPV4 + case AF_INET: + err = ip4addr_aton(src, (ip4_addr_t *)dst); + break; +#endif +#if LWIP_IPV6 + case AF_INET6: { + /* convert into temporary variable since ip6_addr_t might be larger + than in6_addr when scopes are enabled */ + ip6_addr_t addr; + err = ip6addr_aton(src, &addr); + if (err) { + memcpy(dst, &addr.addr, sizeof(addr.addr)); + } + break; + } +#endif + default: + err = -1; + set_errno(EAFNOSUPPORT); + break; + } + return err; +} + +#if LWIP_IGMP +/** Register a new IGMP membership. On socket close, the membership is dropped automatically. + * + * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). + * + * @return 1 on success, 0 on failure + */ +static int +lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return 0; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if (socket_ipv4_multicast_memberships[i].sock == NULL) { + socket_ipv4_multicast_memberships[i].sock = sock; + ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr); + ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr); + done_socket(sock); + return 1; + } + } + done_socket(sock); + return 0; +} + +/** Unregister a previously registered membership. This prevents dropping the membership + * on socket close. + * + * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). + */ +static void +lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if ((socket_ipv4_multicast_memberships[i].sock == sock) && + ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) && + ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) { + socket_ipv4_multicast_memberships[i].sock = NULL; + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); + break; + } + } + done_socket(sock); +} + +/** Drop all memberships of a socket that were not dropped explicitly via setsockopt. + * + * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK). + */ +static void +lwip_socket_drop_registered_memberships(int s) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if (socket_ipv4_multicast_memberships[i].sock == sock) { + ip_addr_t multi_addr, if_addr; + ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr); + ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[i].if_addr); + socket_ipv4_multicast_memberships[i].sock = NULL; + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr); + ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr); + + netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE); + } + } + done_socket(sock); +} +#endif /* LWIP_IGMP */ + +#if LWIP_IPV6_MLD +/** Register a new MLD6 membership. On socket close, the membership is dropped automatically. + * + * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). + * + * @return 1 on success, 0 on failure + */ +static int +lwip_socket_register_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return 0; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if (socket_ipv6_multicast_memberships[i].sock == NULL) { + socket_ipv6_multicast_memberships[i].sock = sock; + socket_ipv6_multicast_memberships[i].if_idx = (u8_t)if_idx; + ip6_addr_copy(socket_ipv6_multicast_memberships[i].multi_addr, *multi_addr); + done_socket(sock); + return 1; + } + } + done_socket(sock); + return 0; +} + +/** Unregister a previously registered MLD6 membership. This prevents dropping the membership + * on socket close. + * + * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK). + */ +static void +lwip_socket_unregister_mld6_membership(int s, unsigned int if_idx, const ip6_addr_t *multi_addr) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if ((socket_ipv6_multicast_memberships[i].sock == sock) && + (socket_ipv6_multicast_memberships[i].if_idx == if_idx) && + ip6_addr_cmp(&socket_ipv6_multicast_memberships[i].multi_addr, multi_addr)) { + socket_ipv6_multicast_memberships[i].sock = NULL; + socket_ipv6_multicast_memberships[i].if_idx = NETIF_NO_INDEX; + ip6_addr_set_zero(&socket_ipv6_multicast_memberships[i].multi_addr); + break; + } + } + done_socket(sock); +} + +/** Drop all MLD6 memberships of a socket that were not dropped explicitly via setsockopt. + * + * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK). + */ +static void +lwip_socket_drop_registered_mld6_memberships(int s) +{ + struct lwip_sock *sock = get_socket(s); + int i; + + if (!sock) { + return; + } + + for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) { + if (socket_ipv6_multicast_memberships[i].sock == sock) { + ip_addr_t multi_addr; + u8_t if_idx; + + ip_addr_copy_from_ip6(multi_addr, socket_ipv6_multicast_memberships[i].multi_addr); + if_idx = socket_ipv6_multicast_memberships[i].if_idx; + + socket_ipv6_multicast_memberships[i].sock = NULL; + socket_ipv6_multicast_memberships[i].if_idx = NETIF_NO_INDEX; + ip6_addr_set_zero(&socket_ipv6_multicast_memberships[i].multi_addr); + + netconn_join_leave_group_netif(sock->conn, &multi_addr, if_idx, NETCONN_LEAVE); + } + } + done_socket(sock); +} +#endif /* LWIP_IPV6_MLD */ + +#endif /* LWIP_SOCKET */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/tcpip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/tcpip.c similarity index 71% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/tcpip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/tcpip.c index 5acdc30..989b1db 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/api/tcpip.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/api/tcpip.c @@ -58,20 +58,60 @@ /* global variables */ static tcpip_init_done_fn tcpip_init_done; static void *tcpip_init_done_arg; -static sys_mbox_t mbox; +static sys_mbox_t tcpip_mbox; #if LWIP_TCPIP_CORE_LOCKING /** The global semaphore to lock the stack. */ sys_mutex_t lock_tcpip_core; #endif /* LWIP_TCPIP_CORE_LOCKING */ -#if LWIP_TIMERS -/* wait for a message, timeouts are processed while waiting */ -#define TCPIP_MBOX_FETCH(mbox, msg) sys_timeouts_mbox_fetch(mbox, msg) -#else /* LWIP_TIMERS */ +static void tcpip_thread_handle_msg(struct tcpip_msg *msg); + +#if !LWIP_TIMERS /* wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */ #define TCPIP_MBOX_FETCH(mbox, msg) sys_mbox_fetch(mbox, msg) -#endif /* LWIP_TIMERS */ +#else /* !LWIP_TIMERS */ +/* wait for a message, timeouts are processed while waiting */ +#define TCPIP_MBOX_FETCH(mbox, msg) tcpip_timeouts_mbox_fetch(mbox, msg) +/** + * Wait (forever) for a message to arrive in an mbox. + * While waiting, timeouts are processed. + * + * @param mbox the mbox to fetch the message from + * @param msg the place to store the message + */ +static void +tcpip_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg) +{ + u32_t sleeptime, res; + +again: + LWIP_ASSERT_CORE_LOCKED(); + + sleeptime = sys_timeouts_sleeptime(); + if (sleeptime == SYS_TIMEOUTS_SLEEPTIME_INFINITE) { + UNLOCK_TCPIP_CORE(); + sys_arch_mbox_fetch(mbox, msg, 0); + LOCK_TCPIP_CORE(); + return; + } else if (sleeptime == 0) { + sys_check_timeouts(); + /* We try again to fetch a message from the mbox. */ + goto again; + } + + UNLOCK_TCPIP_CORE(); + res = sys_arch_mbox_fetch(mbox, msg, sleeptime); + LOCK_TCPIP_CORE(); + if (res == SYS_ARCH_TIMEOUT) { + /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred + before a message could be fetched. */ + sys_check_timeouts(); + /* We try again to fetch a message from the mbox. */ + goto again; + } +} +#endif /* !LWIP_TIMERS */ /** * The main lwIP thread. This thread has exclusive access to lwIP core functions @@ -89,24 +129,33 @@ tcpip_thread(void *arg) struct tcpip_msg *msg; LWIP_UNUSED_ARG(arg); + LWIP_MARK_TCPIP_THREAD(); + + LOCK_TCPIP_CORE(); if (tcpip_init_done != NULL) { tcpip_init_done(tcpip_init_done_arg); } - LOCK_TCPIP_CORE(); while (1) { /* MAIN Loop */ - UNLOCK_TCPIP_CORE(); LWIP_TCPIP_THREAD_ALIVE(); /* wait for a message, timeouts are processed while waiting */ - TCPIP_MBOX_FETCH(&mbox, (void **)&msg); - LOCK_TCPIP_CORE(); -// __set_PSR(__get_PSR() | PSR_MM_Msk); + TCPIP_MBOX_FETCH(&tcpip_mbox, (void **)&msg); if (msg == NULL) { LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: NULL\n")); LWIP_ASSERT("tcpip_thread: invalid message", 0); continue; } - switch (msg->type) { + tcpip_thread_handle_msg(msg); + } +} + +/* Handle a single tcpip_msg + * This is in its own function for access by tests only. + */ +static void +tcpip_thread_handle_msg(struct tcpip_msg *msg) +{ + switch (msg->type) { #if !LWIP_TCPIP_CORE_LOCKING case TCPIP_MSG_API: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg)); @@ -122,7 +171,9 @@ tcpip_thread(void *arg) #if !LWIP_TCPIP_CORE_LOCKING_INPUT case TCPIP_MSG_INPKT: LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg)); - msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif); + if (msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif) != ERR_OK) { + pbuf_free(msg->msg.inp.p); + } memp_free(MEMP_TCPIP_MSG_INPKT, msg); break; #endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ @@ -164,16 +215,16 @@ tcpip_thread(void *arg) LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type)); LWIP_ASSERT("tcpip_thread: invalid message", 0); break; - } } } + #if TLS_CONFIG_AP_OPT_FWD err_t tcpip_output(struct pbuf *p, struct netif *inp, ip_addr_t ipaddr) { struct tcpip_msg *msg; - if (!sys_mbox_valid(&mbox)) { + if (!sys_mbox_valid(&tcpip_mbox)) { return ERR_VAL; } msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); @@ -185,7 +236,7 @@ err_t tcpip_output(struct pbuf *p, struct netif *inp, ip_addr_t ipaddr) msg->msg.outp.p = p; msg->msg.outp.netif = inp; ip_addr_copy(msg->msg.outp.ipaddr, ipaddr); - if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { + if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) { memp_free(MEMP_TCPIP_MSG_API, msg); return ERR_MEM; } @@ -193,6 +244,26 @@ err_t tcpip_output(struct pbuf *p, struct netif *inp, ip_addr_t ipaddr) } #endif +#ifdef TCPIP_THREAD_TEST +/** Work on queued items in single-threaded test mode */ +int +tcpip_thread_poll_one(void) +{ + int ret = 0; + struct tcpip_msg *msg; + + if (sys_arch_mbox_tryfetch(&tcpip_mbox, (void **)&msg) != SYS_MBOX_EMPTY) { + LOCK_TCPIP_CORE(); + if (msg != NULL) { + tcpip_thread_handle_msg(msg); + ret = 1; + } + UNLOCK_TCPIP_CORE(); + } + return ret; +} +#endif + /** * Pass a received packet to tcpip_thread for input processing * @@ -213,7 +284,7 @@ tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn) #else /* LWIP_TCPIP_CORE_LOCKING_INPUT */ struct tcpip_msg *msg; - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT); if (msg == NULL) { @@ -224,7 +295,7 @@ tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn) msg->msg.inp.p = p; msg->msg.inp.netif = inp; msg->msg.inp.input_fn = input_fn; - if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { + if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) { memp_free(MEMP_TCPIP_MSG_INPKT, msg); return ERR_MEM; } @@ -251,26 +322,30 @@ tcpip_input(struct pbuf *p, struct netif *inp) return tcpip_inpkt(p, inp, ethernet_input); } else #endif /* LWIP_ETHERNET */ - return tcpip_inpkt(p, inp, ip_input); + return tcpip_inpkt(p, inp, ip_input); } /** + * @ingroup lwip_os * Call a specific function in the thread context of * tcpip_thread for easy access synchronization. * A function called in that way may access lwIP core code * without fearing concurrent access. + * Blocks until the request is posted. + * Must not be called from interrupt context! * * @param function the function to call * @param ctx parameter passed to f - * @param block 1 to block until the request is posted, 0 to non-blocking mode * @return ERR_OK if the function was called, another err_t if not + * + * @see tcpip_try_callback */ err_t -tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block) +tcpip_callback(tcpip_callback_fn function, void *ctx) { struct tcpip_msg *msg; - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); if (msg == NULL) { @@ -280,13 +355,46 @@ tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block) msg->type = TCPIP_MSG_CALLBACK; msg->msg.cb.function = function; msg->msg.cb.ctx = ctx; - if (block) { - sys_mbox_post(&mbox, msg); - } else { - if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { - memp_free(MEMP_TCPIP_MSG_API, msg); - return ERR_MEM; - } + + sys_mbox_post(&tcpip_mbox, msg); + return ERR_OK; +} + +/** + * @ingroup lwip_os + * Call a specific function in the thread context of + * tcpip_thread for easy access synchronization. + * A function called in that way may access lwIP core code + * without fearing concurrent access. + * Does NOT block when the request cannot be posted because the + * tcpip_mbox is full, but returns ERR_MEM instead. + * Can be called from interrupt context. + * + * @param function the function to call + * @param ctx parameter passed to f + * @return ERR_OK if the function was called, another err_t if not + * + * @see tcpip_callback + */ +err_t +tcpip_try_callback(tcpip_callback_fn function, void *ctx) +{ + struct tcpip_msg *msg; + + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); + + msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); + if (msg == NULL) { + return ERR_MEM; + } + + msg->type = TCPIP_MSG_CALLBACK; + msg->msg.cb.function = function; + msg->msg.cb.ctx = ctx; + + if (sys_mbox_trypost(&tcpip_mbox, msg) != ERR_OK) { + memp_free(MEMP_TCPIP_MSG_API, msg); + return ERR_MEM; } return ERR_OK; } @@ -305,7 +413,7 @@ tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg) { struct tcpip_msg *msg; - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); if (msg == NULL) { @@ -316,7 +424,7 @@ tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg) msg->msg.tmo.msecs = msecs; msg->msg.tmo.h = h; msg->msg.tmo.arg = arg; - sys_mbox_post(&mbox, msg); + sys_mbox_post(&tcpip_mbox, msg); return ERR_OK; } @@ -332,7 +440,7 @@ tcpip_untimeout(sys_timeout_handler h, void *arg) { struct tcpip_msg *msg; - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); if (msg == NULL) { @@ -342,7 +450,7 @@ tcpip_untimeout(sys_timeout_handler h, void *arg) msg->type = TCPIP_MSG_UNTIMEOUT; msg->msg.tmo.h = h; msg->msg.tmo.arg = arg; - sys_mbox_post(&mbox, msg); + sys_mbox_post(&tcpip_mbox, msg); return ERR_OK; } #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ @@ -361,7 +469,7 @@ tcpip_untimeout(sys_timeout_handler h, void *arg) * @return ERR_OK if the function was called, another err_t if not */ err_t -tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem) +tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t *sem) { #if LWIP_TCPIP_CORE_LOCKING LWIP_UNUSED_ARG(sem); @@ -373,13 +481,13 @@ tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem) TCPIP_MSG_VAR_DECLARE(msg); LWIP_ASSERT("semaphore not initialized", sys_sem_valid(sem)); - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); TCPIP_MSG_VAR_ALLOC(msg); TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API; TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn; TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg; - sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg)); + sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg)); sys_arch_sem_wait(sem, 0); TCPIP_MSG_VAR_FREE(msg); return ERR_OK; @@ -389,7 +497,7 @@ tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem) /** * Synchronously calls function in TCPIP thread and waits for its completion. * It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or - * LWIP_NETCONN_SEM_PER_THREAD. + * LWIP_NETCONN_SEM_PER_THREAD. * If not, a semaphore is created and destroyed on every call which is usually * an expensive/slow operation. * @param fn Function to call @@ -415,7 +523,7 @@ tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call) } #endif /* LWIP_NETCONN_SEM_PER_THREAD */ - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); TCPIP_MSG_VAR_ALLOC(msg); TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API_CALL; @@ -426,7 +534,7 @@ tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call) #else /* LWIP_NETCONN_SEM_PER_THREAD */ TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem; #endif /* LWIP_NETCONN_SEM_PER_THREAD */ - sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg)); + sys_mbox_post(&tcpip_mbox, &TCPIP_MSG_VAR_REF(msg)); sys_arch_sem_wait(TCPIP_MSG_VAR_REF(msg).msg.api_call.sem, 0); TCPIP_MSG_VAR_FREE(msg); @@ -439,14 +547,22 @@ tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call) } /** + * @ingroup lwip_os * Allocate a structure for a static callback message and initialize it. - * This is intended to be used to send "static" messages from interrupt context. - * + * The message has a special type such that lwIP never frees it. + * This is intended to be used to send "static" messages from interrupt context, + * e.g. the message is allocated once and posted several times from an IRQ + * using tcpip_callbackmsg_trycallback(). + * Example usage: Trigger execution of an ethernet IRQ DPC routine in lwIP thread context. + * * @param function the function to call * @param ctx parameter passed to function - * @return a struct pointer to pass to tcpip_trycallback(). + * @return a struct pointer to pass to tcpip_callbackmsg_trycallback(). + * + * @see tcpip_callbackmsg_trycallback() + * @see tcpip_callbackmsg_delete() */ -struct tcpip_callback_msg* +struct tcpip_callback_msg * tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx) { struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); @@ -456,32 +572,56 @@ tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx) msg->type = TCPIP_MSG_CALLBACK_STATIC; msg->msg.cb.function = function; msg->msg.cb.ctx = ctx; - return (struct tcpip_callback_msg*)msg; + return (struct tcpip_callback_msg *)msg; } /** + * @ingroup lwip_os * Free a callback message allocated by tcpip_callbackmsg_new(). * * @param msg the message to free + * + * @see tcpip_callbackmsg_new() */ void -tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg) +tcpip_callbackmsg_delete(struct tcpip_callback_msg *msg) { memp_free(MEMP_TCPIP_MSG_API, msg); } /** - * Try to post a callback-message to the tcpip_thread mbox - * This is intended to be used to send "static" messages from interrupt context. + * @ingroup lwip_os + * Try to post a callback-message to the tcpip_thread tcpip_mbox. * * @param msg pointer to the message to post * @return sys_mbox_trypost() return code + * + * @see tcpip_callbackmsg_new() */ err_t -tcpip_trycallback(struct tcpip_callback_msg* msg) +tcpip_callbackmsg_trycallback(struct tcpip_callback_msg *msg) { - LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(mbox)); - return sys_mbox_trypost(&mbox, msg); + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); + return sys_mbox_trypost(&tcpip_mbox, msg); +} + +/** + * @ingroup lwip_os + * Try to post a callback-message to the tcpip_thread mbox. + * Same as @ref tcpip_callbackmsg_trycallback but calls sys_mbox_trypost_fromisr(), + * mainly to help FreeRTOS, where calls differ between task level and ISR level. + * + * @param msg pointer to the message to post + * @return sys_mbox_trypost_fromisr() return code (without change, so this + * knowledge can be used to e.g. propagate "bool needs_scheduling") + * + * @see tcpip_callbackmsg_new() + */ +err_t +tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg *msg) +{ + LWIP_ASSERT("Invalid mbox", sys_mbox_valid_val(tcpip_mbox)); + return sys_mbox_trypost_fromisr(&tcpip_mbox, msg); } /** @@ -500,7 +640,7 @@ tcpip_init(tcpip_init_done_fn initfunc, void *arg) tcpip_init_done = initfunc; tcpip_init_done_arg = arg; - if (sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) { + if (sys_mbox_new(&tcpip_mbox, TCPIP_MBOX_SIZE) != ERR_OK) { LWIP_ASSERT("failed to create tcpip_thread mbox", 0); } #if LWIP_TCPIP_CORE_LOCKING @@ -534,7 +674,7 @@ pbuf_free_int(void *p) err_t pbuf_free_callback(struct pbuf *p) { - return tcpip_callback_with_block(pbuf_free_int, p, 0); + return tcpip_try_callback(pbuf_free_int, p); } /** @@ -547,7 +687,7 @@ pbuf_free_callback(struct pbuf *p) err_t mem_free_callback(void *m) { - return tcpip_callback_with_block(mem_free, m, 0); + return tcpip_try_callback(mem_free, m); } #endif /* !NO_SYS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls.c new file mode 100644 index 0000000..bb8e623 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls.c @@ -0,0 +1,1270 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * This file provides a TLS layer using mbedTLS + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + * Watch out: + * - 'sent' is always called with len==0 to the upper layer. This is because keeping + * track of the ratio of application data and TLS overhead would be too much. + * + * Mandatory security-related configuration: + * - ensure to add at least one strong entropy source to your mbedtls port (implement + * mbedtls_platform_entropy_poll or mbedtls_hardware_poll providing strong entropy) + * - define ALTCP_MBEDTLS_ENTROPY_PTR and ALTCP_MBEDTLS_ENTROPY_LEN to something providing + * GOOD custom entropy + * + * Missing things / @todo: + * - some unhandled/untested things migh be caught by LWIP_ASSERTs... + */ + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/apps/altcp_tls_mbedtls_opts.h" + +#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS + +#include "lwip/altcp.h" +#include "lwip/altcp_tls.h" +#include "lwip/priv/altcp_priv.h" + +#include "altcp_tls_mbedtls_structs.h" +#include "altcp_tls_mbedtls_mem.h" + +/* @todo: which includes are really needed? */ +#include "mbedtls/entropy.h" +#include "mbedtls/ctr_drbg.h" +#include "mbedtls/certs.h" +#include "mbedtls/x509.h" +#include "mbedtls/ssl.h" +#include "mbedtls/net.h" +#include "mbedtls/error.h" +#include "mbedtls/debug.h" +#include "mbedtls/platform.h" +#include "mbedtls/memory_buffer_alloc.h" +#include "mbedtls/ssl_cache.h" +#include "mbedtls/ssl_ticket.h" + +#include "mbedtls/ssl_internal.h" /* to call mbedtls_flush_output after ERR_MEM */ + +#include + +#ifndef ALTCP_MBEDTLS_ENTROPY_PTR +#define ALTCP_MBEDTLS_ENTROPY_PTR NULL +#endif +#ifndef ALTCP_MBEDTLS_ENTROPY_LEN +#define ALTCP_MBEDTLS_ENTROPY_LEN 0 +#endif + +/* Variable prototype, the actual declaration is at the end of this file + since it contains pointers to static functions declared here */ +extern const struct altcp_functions altcp_mbedtls_functions; + +/** Our global mbedTLS configuration (server-specific, not connection-specific) */ +struct altcp_tls_config { + mbedtls_ssl_config conf; + mbedtls_x509_crt *cert; + mbedtls_pk_context *pkey; + uint8_t cert_count; + uint8_t cert_max; + uint8_t pkey_count; + uint8_t pkey_max; + mbedtls_x509_crt *ca; +#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_USE_SESSION_CACHE + /** Inter-connection cache for fast connection startup */ + struct mbedtls_ssl_cache_context cache; +#endif +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && ALTCP_MBEDTLS_USE_SESSION_TICKETS + mbedtls_ssl_ticket_context ticket_ctx; +#endif +}; + +/** Entropy and random generator are shared by all mbedTLS configuration */ +struct altcp_tls_entropy_rng { + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + int ref; +}; +static struct altcp_tls_entropy_rng *altcp_tls_entropy_rng; + +static err_t altcp_mbedtls_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err); +static err_t altcp_mbedtls_setup(void *conf, struct altcp_pcb *conn, struct altcp_pcb *inner_conn); +static err_t altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbedtls_state_t *state); +static err_t altcp_mbedtls_handle_rx_appldata(struct altcp_pcb *conn, altcp_mbedtls_state_t *state); +static int altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size); + + +/* callback functions from inner/lower connection: */ + +/** Accept callback from lower connection (i.e. TCP) + * Allocate one of our structures, assign it to the new connection's 'state' and + * call the new connection's 'accepted' callback. If that succeeds, we wait + * to receive connection setup handshake bytes from the client. + */ +static err_t +altcp_mbedtls_lower_accept(void *arg, struct altcp_pcb *accepted_conn, err_t err) +{ + struct altcp_pcb *listen_conn = (struct altcp_pcb *)arg; + if (listen_conn && listen_conn->state && listen_conn->accept) { + err_t setup_err; + altcp_mbedtls_state_t *listen_state = (altcp_mbedtls_state_t *)listen_conn->state; + /* create a new altcp_conn to pass to the next 'accept' callback */ + struct altcp_pcb *new_conn = altcp_alloc(); + if (new_conn == NULL) { + return ERR_MEM; + } + setup_err = altcp_mbedtls_setup(listen_state->conf, new_conn, accepted_conn); + if (setup_err != ERR_OK) { + altcp_free(new_conn); + return setup_err; + } + return listen_conn->accept(listen_conn->arg, new_conn, err); + } + return ERR_ARG; +} + +/** Connected callback from lower connection (i.e. TCP). + * Not really implemented/tested yet... + */ +static err_t +altcp_mbedtls_lower_connected(void *arg, struct altcp_pcb *inner_conn, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + if (conn && conn->state) { + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + /* upper connected is called when handshake is done */ + if (err != ERR_OK) { + if (conn->connected) { + return conn->connected(conn->arg, conn, err); + } + } + return altcp_mbedtls_lower_recv_process(conn, (altcp_mbedtls_state_t *)conn->state); + } + return ERR_VAL; +} + +/* Call recved for possibly more than an u16_t */ +static void +altcp_mbedtls_lower_recved(struct altcp_pcb *inner_conn, int recvd_cnt) +{ + while (recvd_cnt > 0) { + u16_t recvd_part = (u16_t)LWIP_MIN(recvd_cnt, 0xFFFF); + altcp_recved(inner_conn, recvd_part); + recvd_cnt -= recvd_part; + } +} + +/** Recv callback from lower connection (i.e. TCP) + * This one mainly differs between connection setup/handshake (data is fed into mbedTLS only) + * and application phase (data is decoded by mbedTLS and passed on to the application). + */ +static err_t +altcp_mbedtls_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err) +{ + altcp_mbedtls_state_t *state; + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + + LWIP_ASSERT("no err expected", err == ERR_OK); + LWIP_UNUSED_ARG(err); + + if (!conn) { + /* no connection given as arg? should not happen, but prevent pbuf/conn leaks */ + if (p != NULL) { + pbuf_free(p); + } + altcp_close(inner_conn); + return ERR_CLSD; + } + state = (altcp_mbedtls_state_t *)conn->state; + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + if (!state) { + /* already closed */ + if (p != NULL) { + pbuf_free(p); + } + altcp_close(inner_conn); + return ERR_CLSD; + } + + /* handle NULL pbuf (inner connection closed) */ + if (p == NULL) { + /* remote host sent FIN, remember this (SSL state is destroyed + when both sides are closed only!) */ + if ((state->flags & (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) == + (ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE | ALTCP_MBEDTLS_FLAGS_UPPER_CALLED)) { + /* need to notify upper layer (e.g. 'accept' called or 'connect' succeeded) */ + if ((state->rx != NULL) || (state->rx_app != NULL)) { + state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED; + /* this is a normal close (FIN) but we have unprocessed data, so delay the FIN */ + altcp_mbedtls_handle_rx_appldata(conn, state); + return ERR_OK; + } + state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED; + if (conn->recv) { + return conn->recv(conn->arg, conn, NULL, ERR_OK); + } + } else { + /* before connection setup is done: call 'err' */ + if (conn->err) { + conn->err(conn->arg, ERR_CLSD); + } + altcp_close(conn); + } + return ERR_OK; + } + + /* If we come here, the connection is in good state (handshake phase or application data phase). + Queue up the pbuf for processing as handshake data or application data. */ + if (state->rx == NULL) { + state->rx = p; + } else { + LWIP_ASSERT("rx pbuf overflow", (int)p->tot_len + (int)p->len <= 0xFFFF); + pbuf_cat(state->rx, p); + } + return altcp_mbedtls_lower_recv_process(conn, state); +} + +static err_t +altcp_mbedtls_lower_recv_process(struct altcp_pcb *conn, altcp_mbedtls_state_t *state) +{ + if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + /* handle connection setup (handshake not done) */ + int ret = mbedtls_ssl_handshake(&state->ssl_context); + /* try to send data... */ + altcp_output(conn->inner_conn); + if (state->bio_bytes_read) { + /* acknowledge all bytes read */ + altcp_mbedtls_lower_recved(conn->inner_conn, state->bio_bytes_read); + state->bio_bytes_read = 0; + } + + if (ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE) { + /* handshake not done, wait for more recv calls */ + LWIP_ASSERT("in this state, the rx chain should be empty", state->rx == NULL); + return ERR_OK; + } + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_handshake failed: %d\n", ret)); + /* handshake failed, connection has to be closed */ + if (conn->err) { + conn->err(conn->arg, ERR_CLSD); + } + + if (altcp_close(conn) != ERR_OK) { + altcp_abort(conn); + } + return ERR_OK; + } + /* If we come here, handshake succeeded. */ + LWIP_ASSERT("state", state->bio_bytes_read == 0); + LWIP_ASSERT("state", state->bio_bytes_appl == 0); + state->flags |= ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE; + /* issue "connect" callback" to upper connection (this can only happen for active open) */ + if (conn->connected) { + err_t err; + err = conn->connected(conn->arg, conn, ERR_OK); + if (err != ERR_OK) { + return err; + } + } + if (state->rx == NULL) { + return ERR_OK; + } + } + /* handle application data */ + return altcp_mbedtls_handle_rx_appldata(conn, state); +} + +/* Pass queued decoded rx data to application */ +static err_t +altcp_mbedtls_pass_rx_data(struct altcp_pcb *conn, altcp_mbedtls_state_t *state) +{ + err_t err; + struct pbuf *buf; + LWIP_ASSERT("conn != NULL", conn != NULL); + LWIP_ASSERT("state != NULL", state != NULL); + buf = state->rx_app; + if (buf) { + state->rx_app = NULL; + if (conn->recv) { + u16_t tot_len = buf->tot_len; + /* this needs to be increased first because the 'recved' call may come nested */ + state->rx_passed_unrecved += tot_len; + state->flags |= ALTCP_MBEDTLS_FLAGS_UPPER_CALLED; + err = conn->recv(conn->arg, conn, buf, ERR_OK); + if (err != ERR_OK) { + if (err == ERR_ABRT) { + return ERR_ABRT; + } + /* not received, leave the pbuf(s) queued (and decrease 'unrecved' again) */ + LWIP_ASSERT("state == conn->state", state == conn->state); + state->rx_app = buf; + state->rx_passed_unrecved -= tot_len; + LWIP_ASSERT("state->rx_passed_unrecved >= 0", state->rx_passed_unrecved >= 0); + if (state->rx_passed_unrecved < 0) { + state->rx_passed_unrecved = 0; + } + return err; + } + } else { + pbuf_free(buf); + } + } else if ((state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) == + ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) { + state->flags |= ALTCP_MBEDTLS_FLAGS_RX_CLOSED; + if (conn->recv) { + return conn->recv(conn->arg, conn, NULL, ERR_OK); + } + } + + /* application may have close the connection */ + if (conn->state != state) { + /* return error code to ensure altcp_mbedtls_handle_rx_appldata() exits the loop */ + return ERR_CLSD; + } + return ERR_OK; +} + +/* Helper function that processes rx application data stored in rx pbuf chain */ +static err_t +altcp_mbedtls_handle_rx_appldata(struct altcp_pcb *conn, altcp_mbedtls_state_t *state) +{ + int ret; + LWIP_ASSERT("state != NULL", state != NULL); + if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + /* handshake not done yet */ + return ERR_VAL; + } + do { + /* allocate a full-sized unchained PBUF_POOL: this is for RX! */ + struct pbuf *buf = pbuf_alloc(PBUF_RAW, PBUF_POOL_BUFSIZE, PBUF_POOL); + if (buf == NULL) { + /* We're short on pbufs, try again later from 'poll' or 'recv' callbacks. + @todo: close on excessive allocation failures or leave this up to upper conn? */ + return ERR_OK; + } + + /* decrypt application data, this pulls encrypted RX data off state->rx pbuf chain */ + ret = mbedtls_ssl_read(&state->ssl_context, (unsigned char *)buf->payload, PBUF_POOL_BUFSIZE); + if (ret < 0) { + if (ret == MBEDTLS_ERR_SSL_CLIENT_RECONNECT) { + /* client is initiating a new connection using the same source port -> close connection or make handshake */ + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("new connection on same source port\n")); + LWIP_ASSERT("TODO: new connection on same source port, close this connection", 0); + } else if ((ret != MBEDTLS_ERR_SSL_WANT_READ) && (ret != MBEDTLS_ERR_SSL_WANT_WRITE)) { + if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("connection was closed gracefully\n")); + } else if (ret == MBEDTLS_ERR_NET_CONN_RESET) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("connection was reset by peer\n")); + } + pbuf_free(buf); + return ERR_OK; + } else { + pbuf_free(buf); + return ERR_OK; + } + pbuf_free(buf); + altcp_abort(conn); + return ERR_ABRT; + } else { + err_t err; + if (ret) { + LWIP_ASSERT("bogus receive length", ret <= PBUF_POOL_BUFSIZE); + /* trim pool pbuf to actually decoded length */ + pbuf_realloc(buf, (u16_t)ret); + + state->bio_bytes_appl += ret; + if (mbedtls_ssl_get_bytes_avail(&state->ssl_context) == 0) { + /* Record is done, now we know the share between application and protocol bytes + and can adjust the RX window by the protocol bytes. + The rest is 'recved' by the application calling our 'recved' fn. */ + int overhead_bytes; + LWIP_ASSERT("bogus byte counts", state->bio_bytes_read > state->bio_bytes_appl); + overhead_bytes = state->bio_bytes_read - state->bio_bytes_appl; + altcp_mbedtls_lower_recved(conn->inner_conn, overhead_bytes); + state->bio_bytes_read = 0; + state->bio_bytes_appl = 0; + } + + if (state->rx_app == NULL) { + state->rx_app = buf; + } else { + pbuf_cat(state->rx_app, buf); + } + } else { + pbuf_free(buf); + buf = NULL; + } + err = altcp_mbedtls_pass_rx_data(conn, state); + if (err != ERR_OK) { + if (err == ERR_ABRT) { + /* recv callback needs to return this as the pcb is deallocated */ + return ERR_ABRT; + } + /* we hide all other errors as we retry feeding the pbuf to the app later */ + return ERR_OK; + } + } + } while (ret > 0); + return ERR_OK; +} + +/** Receive callback function called from mbedtls (set via mbedtls_ssl_set_bio) + * This function mainly copies data from pbufs and frees the pbufs after copying. + */ +static int +altcp_mbedtls_bio_recv(void *ctx, unsigned char *buf, size_t len) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)ctx; + altcp_mbedtls_state_t *state; + struct pbuf *p; + u16_t ret; + u16_t copy_len; + err_t err; + + LWIP_UNUSED_ARG(err); /* for LWIP_NOASSERT */ + if ((conn == NULL) || (conn->state == NULL)) { + return MBEDTLS_ERR_NET_INVALID_CONTEXT; + } + state = (altcp_mbedtls_state_t *)conn->state; + LWIP_ASSERT("state != NULL", state != NULL); + p = state->rx; + + /* @todo: return MBEDTLS_ERR_NET_CONN_RESET/MBEDTLS_ERR_NET_RECV_FAILED? */ + + if ((p == NULL) || ((p->len == 0) && (p->next == NULL))) { + if (p) { + pbuf_free(p); + } + state->rx = NULL; + if ((state->flags & (ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED | ALTCP_MBEDTLS_FLAGS_RX_CLOSED)) == + ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED) { + /* close queued but not passed up yet */ + return 0; + } + return MBEDTLS_ERR_SSL_WANT_READ; + } + /* limit number of bytes again to copy from first pbuf in a chain only */ + copy_len = (u16_t)LWIP_MIN(len, p->len); + /* copy the data */ + ret = pbuf_copy_partial(p, buf, copy_len, 0); + LWIP_ASSERT("ret == copy_len", ret == copy_len); + /* hide the copied bytes from the pbuf */ + err = pbuf_remove_header(p, ret); + LWIP_ASSERT("error", err == ERR_OK); + if (p->len == 0) { + /* the first pbuf has been fully read, free it */ + state->rx = p->next; + p->next = NULL; + pbuf_free(p); + } + + state->bio_bytes_read += (int)ret; + return ret; +} + +/** Sent callback from lower connection (i.e. TCP) + * This only informs the upper layer to try to send more, not about + * the number of ACKed bytes. + */ +static err_t +altcp_mbedtls_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + LWIP_UNUSED_ARG(len); + if (conn) { + altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + if (!state || !(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + /* @todo: do something here? */ + return ERR_OK; + } + /* try to send more if we failed before */ + mbedtls_ssl_flush_output(&state->ssl_context); + /* call upper sent with len==0 if the application already sent data */ + if ((state->flags & ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT) && conn->sent) { + return conn->sent(conn->arg, conn, 0); + } + } + return ERR_OK; +} + +/** Poll callback from lower connection (i.e. TCP) + * Just pass this on to the application. + * @todo: retry sending? + */ +static err_t +altcp_mbedtls_lower_poll(void *arg, struct altcp_pcb *inner_conn) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + if (conn) { + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + /* check if there's unreceived rx data */ + if (conn->state) { + altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; + /* try to send more if we failed before */ + mbedtls_ssl_flush_output(&state->ssl_context); + if (altcp_mbedtls_handle_rx_appldata(conn, state) == ERR_ABRT) { + return ERR_ABRT; + } + } + if (conn->poll) { + return conn->poll(conn->arg, conn); + } + } + return ERR_OK; +} + +static void +altcp_mbedtls_lower_err(void *arg, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + conn->inner_conn = NULL; /* already freed */ + if (conn->err) { + conn->err(conn->arg, err); + } + altcp_free(conn); + } +} + +/* setup functions */ + +static void +altcp_mbedtls_remove_callbacks(struct altcp_pcb *inner_conn) +{ + altcp_arg(inner_conn, NULL); + altcp_recv(inner_conn, NULL); + altcp_sent(inner_conn, NULL); + altcp_err(inner_conn, NULL); + altcp_poll(inner_conn, NULL, inner_conn->pollinterval); +} + +static void +altcp_mbedtls_setup_callbacks(struct altcp_pcb *conn, struct altcp_pcb *inner_conn) +{ + altcp_arg(inner_conn, conn); + altcp_recv(inner_conn, altcp_mbedtls_lower_recv); + altcp_sent(inner_conn, altcp_mbedtls_lower_sent); + altcp_err(inner_conn, altcp_mbedtls_lower_err); + /* tcp_poll is set when interval is set by application */ + /* listen is set totally different :-) */ +} + +static err_t +altcp_mbedtls_setup(void *conf, struct altcp_pcb *conn, struct altcp_pcb *inner_conn) +{ + int ret; + struct altcp_tls_config *config = (struct altcp_tls_config *)conf; + altcp_mbedtls_state_t *state; + if (!conf) { + return ERR_ARG; + } + LWIP_ASSERT("invalid inner_conn", conn != inner_conn); + + /* allocate mbedtls context */ + state = altcp_mbedtls_alloc(conf); + if (state == NULL) { + return ERR_MEM; + } + /* initialize mbedtls context: */ + mbedtls_ssl_init(&state->ssl_context); + ret = mbedtls_ssl_setup(&state->ssl_context, &config->conf); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_setup failed\n")); + /* @todo: convert 'ret' to err_t */ + altcp_mbedtls_free(conf, state); + return ERR_MEM; + } + /* tell mbedtls about our I/O functions */ + mbedtls_ssl_set_bio(&state->ssl_context, conn, altcp_mbedtls_bio_send, altcp_mbedtls_bio_recv, NULL); + + altcp_mbedtls_setup_callbacks(conn, inner_conn); + conn->inner_conn = inner_conn; + conn->fns = &altcp_mbedtls_functions; + conn->state = state; + return ERR_OK; +} + +struct altcp_pcb * +altcp_tls_wrap(struct altcp_tls_config *config, struct altcp_pcb *inner_pcb) +{ + struct altcp_pcb *ret; + if (inner_pcb == NULL) { + return NULL; + } + ret = altcp_alloc(); + if (ret != NULL) { + if (altcp_mbedtls_setup(config, ret, inner_pcb) != ERR_OK) { + altcp_free(ret); + return NULL; + } + } + return ret; +} + +void * +altcp_tls_context(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; + return &state->ssl_context; + } + return NULL; +} + +#if ALTCP_MBEDTLS_LIB_DEBUG != LWIP_DBG_OFF +static void +altcp_mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str) +{ + LWIP_UNUSED_ARG(ctx); + LWIP_UNUSED_ARG(file); + LWIP_UNUSED_ARG(line); + LWIP_UNUSED_ARG(str); + + if (level >= ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN) { + LWIP_DEBUGF(ALTCP_MBEDTLS_LIB_DEBUG, ("%s:%04d: %s", file, line, str)); + } +} +#endif + +/** Create new TLS configuration + * ATTENTION: Server certificate and private key have to be added outside this function! + */ +static struct altcp_tls_config * +altcp_tls_create_config(int is_server, uint8_t cert_count, uint8_t pkey_count, int have_ca) +{ + size_t sz; + int ret; + struct altcp_tls_config *conf; + mbedtls_x509_crt *mem; + + if (TCP_WND < MBEDTLS_SSL_MAX_CONTENT_LEN) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG|LWIP_DBG_LEVEL_SERIOUS, + ("altcp_tls: TCP_WND is smaller than the RX decrypion buffer, connection RX might stall!\n")); + } + + altcp_mbedtls_mem_init(); + + sz = sizeof(struct altcp_tls_config); + if (cert_count > 0) { + sz += (cert_count * sizeof(mbedtls_x509_crt)); + } + if (have_ca) { + sz += sizeof(mbedtls_x509_crt); + } + if (pkey_count > 0) { + sz += (pkey_count * sizeof(mbedtls_pk_context)); + } + + conf = (struct altcp_tls_config *)altcp_mbedtls_alloc_config(sz); + if (conf == NULL) { + return NULL; + } + conf->cert_max = cert_count; + mem = (mbedtls_x509_crt *)(conf + 1); + if (cert_count > 0) { + conf->cert = mem; + mem += cert_count; + } + if (have_ca) { + conf->ca = mem; + mem++; + } + conf->pkey_max = pkey_count; + if (pkey_count > 0) { + conf->pkey = (mbedtls_pk_context *)mem; + } + + mbedtls_ssl_config_init(&conf->conf); + + if (!altcp_tls_entropy_rng) { + altcp_tls_entropy_rng = (struct altcp_tls_entropy_rng *)altcp_mbedtls_alloc_config(sizeof(struct altcp_tls_entropy_rng)); + if (altcp_tls_entropy_rng) { + altcp_tls_entropy_rng->ref = 1; + mbedtls_entropy_init(&altcp_tls_entropy_rng->entropy); + mbedtls_ctr_drbg_init(&altcp_tls_entropy_rng->ctr_drbg); + /* Seed the RNG, only once */ + ret = mbedtls_ctr_drbg_seed(&altcp_tls_entropy_rng->ctr_drbg, + mbedtls_entropy_func, &altcp_tls_entropy_rng->entropy, + ALTCP_MBEDTLS_ENTROPY_PTR, ALTCP_MBEDTLS_ENTROPY_LEN); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ctr_drbg_seed failed: %d\n", ret)); + mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg); + mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy); + altcp_mbedtls_free_config(altcp_tls_entropy_rng); + altcp_tls_entropy_rng = NULL; + altcp_mbedtls_free_config(conf); + return NULL; + } + } else { + altcp_mbedtls_free_config(conf); + return NULL; + } + } else { + altcp_tls_entropy_rng->ref++; + } + + /* Setup ssl context (@todo: what's different for a client here? -> might better be done on listen/connect) */ + ret = mbedtls_ssl_config_defaults(&conf->conf, is_server ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_config_defaults failed: %d\n", ret)); + if (altcp_tls_entropy_rng->ref == 1) { + mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg); + mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy); + altcp_mbedtls_free_config(altcp_tls_entropy_rng); + altcp_tls_entropy_rng = NULL; + } + altcp_mbedtls_free_config(conf); + return NULL; + } + mbedtls_ssl_conf_authmode(&conf->conf, MBEDTLS_SSL_VERIFY_OPTIONAL); + + mbedtls_ssl_conf_rng(&conf->conf, mbedtls_ctr_drbg_random, &altcp_tls_entropy_rng->ctr_drbg); +#if ALTCP_MBEDTLS_LIB_DEBUG != LWIP_DBG_OFF + mbedtls_ssl_conf_dbg(&conf->conf, altcp_mbedtls_debug, stdout); +#endif +#if defined(MBEDTLS_SSL_CACHE_C) && ALTCP_MBEDTLS_USE_SESSION_CACHE + mbedtls_ssl_conf_session_cache(&conf->conf, &conf->cache, mbedtls_ssl_cache_get, mbedtls_ssl_cache_set); + mbedtls_ssl_cache_set_timeout(&conf->cache, ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS); + mbedtls_ssl_cache_set_max_entries(&conf->cache, ALTCP_MBEDTLS_SESSION_CACHE_SIZE); +#endif + +#if defined(MBEDTLS_SSL_SESSION_TICKETS) && ALTCP_MBEDTLS_USE_SESSION_TICKETS + mbedtls_ssl_ticket_init(&conf->ticket_ctx); + + ret = mbedtls_ssl_ticket_setup(&conf->ticket_ctx, mbedtls_ctr_drbg_random, &altcp_tls_entropy_rng->ctr_drbg, + ALTCP_MBEDTLS_SESSION_TICKET_CIPHER, ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS); + if (ret) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_ticket_setup failed: %d\n", ret)); + altcp_mbedtls_free_config(conf); + return NULL; + } + + mbedtls_ssl_conf_session_tickets_cb(&conf->conf, mbedtls_ssl_ticket_write, mbedtls_ssl_ticket_parse, + &conf->ticket_ctx); +#endif + + return conf; +} + +struct altcp_tls_config *altcp_tls_create_config_server(uint8_t cert_count) +{ + struct altcp_tls_config *conf = altcp_tls_create_config(1, cert_count, cert_count, 0); + if (conf == NULL) { + return NULL; + } + + mbedtls_ssl_conf_ca_chain(&conf->conf, NULL, NULL); + return conf; +} + +err_t altcp_tls_config_server_add_privkey_cert(struct altcp_tls_config *config, + const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len) +{ + int ret; + mbedtls_x509_crt *srvcert; + mbedtls_pk_context *pkey; + + if (config->cert_count >= config->cert_max) { + return ERR_MEM; + } + if (config->pkey_count >= config->pkey_max) { + return ERR_MEM; + } + + srvcert = config->cert + config->cert_count; + mbedtls_x509_crt_init(srvcert); + + pkey = config->pkey + config->pkey_count; + mbedtls_pk_init(pkey); + + /* Load the certificates and private key */ + ret = mbedtls_x509_crt_parse(srvcert, cert, cert_len); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse failed: %d\n", ret)); + return ERR_VAL; + } + + ret = mbedtls_pk_parse_key(pkey, (const unsigned char *) privkey, privkey_len, privkey_pass, privkey_pass_len); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_pk_parse_public_key failed: %d\n", ret)); + mbedtls_x509_crt_free(srvcert); + return ERR_VAL; + } + + ret = mbedtls_ssl_conf_own_cert(&config->conf, srvcert, pkey); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_own_cert failed: %d\n", ret)); + mbedtls_x509_crt_free(srvcert); + mbedtls_pk_free(pkey); + return ERR_VAL; + } + + config->cert_count++; + config->pkey_count++; + return ERR_OK; +} + +/** Create new TLS configuration + * This is a suboptimal version that gets the encrypted private key and its password, + * as well as the server certificate. + */ +struct altcp_tls_config * +altcp_tls_create_config_server_privkey_cert(const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len) +{ + struct altcp_tls_config *conf = altcp_tls_create_config_server(1); + if (conf == NULL) { + return NULL; + } + + if (altcp_tls_config_server_add_privkey_cert(conf, privkey, privkey_len, + privkey_pass, privkey_pass_len, cert, cert_len) != ERR_OK) { + altcp_mbedtls_free_config(conf); + return NULL; + } + + return conf; +} + +static struct altcp_tls_config * +altcp_tls_create_config_client_common(const u8_t *ca, size_t ca_len, int is_2wayauth) +{ + int ret; + struct altcp_tls_config *conf = altcp_tls_create_config(0, (is_2wayauth) ? 1 : 0, (is_2wayauth) ? 1 : 0, ca != NULL); + if (conf == NULL) { + return NULL; + } + + /* Initialize the CA certificate if provided + * CA certificate is optional (to save memory) but recommended for production environment + * Without CA certificate, connection will be prone to man-in-the-middle attacks */ + if (ca) { + mbedtls_x509_crt_init(conf->ca); + ret = mbedtls_x509_crt_parse(conf->ca, ca, ca_len); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x", ret, -1*ret)); + altcp_mbedtls_free_config(conf); + return NULL; + } + + mbedtls_ssl_conf_ca_chain(&conf->conf, conf->ca, NULL); + } + return conf; +} + +struct altcp_tls_config * +altcp_tls_create_config_client(const u8_t *ca, size_t ca_len) +{ + return altcp_tls_create_config_client_common(ca, ca_len, 0); +} + +struct altcp_tls_config * +altcp_tls_create_config_client_2wayauth(const u8_t *ca, size_t ca_len, const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len) +{ + int ret; + struct altcp_tls_config *conf; + + if (!cert || !privkey) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("altcp_tls_create_config_client_2wayauth: certificate and priv key required")); + return NULL; + } + + conf = altcp_tls_create_config_client_common(ca, ca_len, 1); + if (conf == NULL) { + return NULL; + } + + /* Initialize the client certificate and corresponding private key */ + mbedtls_x509_crt_init(conf->cert); + ret = mbedtls_x509_crt_parse(conf->cert, cert, cert_len); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse cert failed: %d 0x%x", ret, -1*ret)); + altcp_mbedtls_free_config(conf->cert); + return NULL; + } + + mbedtls_pk_init(conf->pkey); + ret = mbedtls_pk_parse_key(conf->pkey, privkey, privkey_len, privkey_pass, privkey_pass_len); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_pk_parse_key failed: %d 0x%x", ret, -1*ret)); + altcp_mbedtls_free_config(conf); + return NULL; + } + + ret = mbedtls_ssl_conf_own_cert(&conf->conf, conf->cert, conf->pkey); + if (ret != 0) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_ssl_conf_own_cert failed: %d 0x%x", ret, -1*ret)); + altcp_mbedtls_free_config(conf); + return NULL; + } + + return conf; +} + +void +altcp_tls_free_config(struct altcp_tls_config *conf) +{ + if (conf->pkey) { + mbedtls_pk_free(conf->pkey); + } + if (conf->cert) { + mbedtls_x509_crt_free(conf->cert); + } + if (conf->ca) { + mbedtls_x509_crt_free(conf->ca); + } + altcp_mbedtls_free_config(conf); + if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref) + altcp_tls_entropy_rng->ref--; +} + +void +altcp_tls_free_entropy(void) +{ + if (altcp_tls_entropy_rng && altcp_tls_entropy_rng->ref == 0) { + mbedtls_ctr_drbg_free(&altcp_tls_entropy_rng->ctr_drbg); + mbedtls_entropy_free(&altcp_tls_entropy_rng->entropy); + altcp_mbedtls_free_config(altcp_tls_entropy_rng); + altcp_tls_entropy_rng = NULL; + } +} + +/* "virtual" functions */ +static void +altcp_mbedtls_set_poll(struct altcp_pcb *conn, u8_t interval) +{ + if (conn != NULL) { + altcp_poll(conn->inner_conn, altcp_mbedtls_lower_poll, interval); + } +} + +static void +altcp_mbedtls_recved(struct altcp_pcb *conn, u16_t len) +{ + u16_t lower_recved; + altcp_mbedtls_state_t *state; + if (conn == NULL) { + return; + } + state = (altcp_mbedtls_state_t *)conn->state; + if (state == NULL) { + return; + } + if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + return; + } + lower_recved = len; + if (lower_recved > state->rx_passed_unrecved) { + LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("bogus recved count (len > state->rx_passed_unrecved / %d / %d)", + len, state->rx_passed_unrecved)); + lower_recved = (u16_t)state->rx_passed_unrecved; + } + state->rx_passed_unrecved -= lower_recved; + + altcp_recved(conn->inner_conn, lower_recved); +} + +static err_t +altcp_mbedtls_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected) +{ + if (conn == NULL) { + return ERR_VAL; + } + conn->connected = connected; + return altcp_connect(conn->inner_conn, ipaddr, port, altcp_mbedtls_lower_connected); +} + +static struct altcp_pcb * +altcp_mbedtls_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err) +{ + struct altcp_pcb *lpcb; + if (conn == NULL) { + return NULL; + } + lpcb = altcp_listen_with_backlog_and_err(conn->inner_conn, backlog, err); + if (lpcb != NULL) { + altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; + /* Free members of the ssl context (not used on listening pcb). This + includes freeing input/output buffers, so saves ~32KByte by default */ + mbedtls_ssl_free(&state->ssl_context); + + conn->inner_conn = lpcb; + altcp_accept(lpcb, altcp_mbedtls_lower_accept); + return conn; + } + return NULL; +} + +static void +altcp_mbedtls_abort(struct altcp_pcb *conn) +{ + if (conn != NULL) { + altcp_abort(conn->inner_conn); + } +} + +static err_t +altcp_mbedtls_close(struct altcp_pcb *conn) +{ + struct altcp_pcb *inner_conn; + if (conn == NULL) { + return ERR_VAL; + } + inner_conn = conn->inner_conn; + if (inner_conn) { + err_t err; + altcp_poll_fn oldpoll = inner_conn->poll; + altcp_mbedtls_remove_callbacks(conn->inner_conn); + err = altcp_close(conn->inner_conn); + if (err != ERR_OK) { + /* not closed, set up all callbacks again */ + altcp_mbedtls_setup_callbacks(conn, inner_conn); + /* poll callback is not included in the above */ + altcp_poll(inner_conn, oldpoll, inner_conn->pollinterval); + return err; + } + conn->inner_conn = NULL; + } + altcp_free(conn); + return ERR_OK; +} + +/** Allow caller of altcp_write() to limit to negotiated chunk size + * or remaining sndbuf space of inner_conn. + */ +static u16_t +altcp_mbedtls_sndbuf(struct altcp_pcb *conn) +{ + if (conn) { + altcp_mbedtls_state_t *state; + state = (altcp_mbedtls_state_t*)conn->state; + if (!state || !(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + return 0; + } + if (conn->inner_conn) { + u16_t sndbuf = altcp_sndbuf(conn->inner_conn); + /* Take care of record header, IV, AuthTag */ + int ssl_expan = mbedtls_ssl_get_record_expansion(&state->ssl_context); + if (ssl_expan > 0) { + size_t ssl_added = (u16_t)LWIP_MIN(ssl_expan, 0xFFFF); + /* internal sndbuf smaller than our offset */ + if (ssl_added < sndbuf) { + size_t max_len = 0xFFFF; + size_t ret; +#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) + /* @todo: adjust ssl_added to real value related to negociated cipher */ + size_t max_frag_len = mbedtls_ssl_get_max_frag_len(&state->ssl_context); + max_len = LWIP_MIN(max_frag_len, max_len); +#endif + /* Adjust sndbuf of inner_conn with what added by SSL */ + ret = LWIP_MIN(sndbuf - ssl_added, max_len); + LWIP_ASSERT("sndbuf overflow", ret <= 0xFFFF); + return (u16_t)ret; + } + } + } + } + /* fallback: use sendbuf of the inner connection */ + return altcp_default_sndbuf(conn); +} + +/** Write data to a TLS connection. Calls into mbedTLS, which in turn calls into + * @ref altcp_mbedtls_bio_send() to send the encrypted data + */ +static err_t +altcp_mbedtls_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + int ret; + altcp_mbedtls_state_t *state; + + LWIP_UNUSED_ARG(apiflags); + + if (conn == NULL) { + return ERR_VAL; + } + + state = (altcp_mbedtls_state_t *)conn->state; + if (state == NULL) { + /* @todo: which error? */ + return ERR_CLSD; + } + if (!(state->flags & ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE)) { + /* @todo: which error? */ + return ERR_VAL; + } + + /* HACK: if thre is something left to send, try to flush it and only + allow sending more if this succeeded (this is a hack because neither + returning 0 nor MBEDTLS_ERR_SSL_WANT_WRITE worked for me) */ + if (state->ssl_context.out_left) { + mbedtls_ssl_flush_output(&state->ssl_context); + if (state->ssl_context.out_left) { + return ERR_MEM; + } + } + ret = mbedtls_ssl_write(&state->ssl_context, (const unsigned char *)dataptr, len); + /* try to send data... */ + altcp_output(conn->inner_conn); + if (ret >= 0) { + if (ret == len) { + state->flags |= ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT; + return ERR_OK; + } else { + /* @todo/@fixme: assumption: either everything sent or error */ + LWIP_ASSERT("ret <= 0", 0); + return ERR_MEM; + } + } else { + if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) { + /* @todo: convert error to err_t */ + return ERR_MEM; + } + LWIP_ASSERT("unhandled error", 0); + return ERR_VAL; + } +} + +/** Send callback function called from mbedtls (set via mbedtls_ssl_set_bio) + * This function is either called during handshake or when sending application + * data via @ref altcp_mbedtls_write (or altcp_write) + */ +static int +altcp_mbedtls_bio_send(void *ctx, const unsigned char *dataptr, size_t size) +{ + struct altcp_pcb *conn = (struct altcp_pcb *) ctx; + int written = 0; + size_t size_left = size; + u8_t apiflags = TCP_WRITE_FLAG_COPY; + + LWIP_ASSERT("conn != NULL", conn != NULL); + if ((conn == NULL) || (conn->inner_conn == NULL)) { + return MBEDTLS_ERR_NET_INVALID_CONTEXT; + } + + while (size_left) { + u16_t write_len = (u16_t)LWIP_MIN(size_left, 0xFFFF); + err_t err = altcp_write(conn->inner_conn, (const void *)dataptr, write_len, apiflags); + if (err == ERR_OK) { + written += write_len; + size_left -= write_len; + } else if (err == ERR_MEM) { + if (written) { + return written; + } + return 0; /* MBEDTLS_ERR_SSL_WANT_WRITE; */ + } else { + LWIP_ASSERT("tls_write, tcp_write: err != ERR MEM", 0); + /* @todo: return MBEDTLS_ERR_NET_CONN_RESET or MBEDTLS_ERR_NET_SEND_FAILED */ + return MBEDTLS_ERR_NET_SEND_FAILED; + } + } + return written; +} + +static u16_t +altcp_mbedtls_mss(struct altcp_pcb *conn) +{ + if (conn == NULL) { + return 0; + } + /* @todo: LWIP_MIN(mss, mbedtls_ssl_get_max_frag_len()) ? */ + return altcp_mss(conn->inner_conn); +} + +static void +altcp_mbedtls_dealloc(struct altcp_pcb *conn) +{ + /* clean up and free tls state */ + if (conn) { + altcp_mbedtls_state_t *state = (altcp_mbedtls_state_t *)conn->state; + if (state) { + mbedtls_ssl_free(&state->ssl_context); + state->flags = 0; + if (state->rx) { + /* free leftover (unhandled) rx pbufs */ + pbuf_free(state->rx); + state->rx = NULL; + } + altcp_mbedtls_free(state->conf, state); + conn->state = NULL; + } + } +} + +const struct altcp_functions altcp_mbedtls_functions = { + altcp_mbedtls_set_poll, + altcp_mbedtls_recved, + altcp_default_bind, + altcp_mbedtls_connect, + altcp_mbedtls_listen, + altcp_mbedtls_abort, + altcp_mbedtls_close, + altcp_default_shutdown, + altcp_mbedtls_write, + altcp_default_output, + altcp_mbedtls_mss, + altcp_mbedtls_sndbuf, + altcp_default_sndqueuelen, + altcp_default_nagle_disable, + altcp_default_nagle_enable, + altcp_default_nagle_disabled, + altcp_default_setprio, + altcp_mbedtls_dealloc, + altcp_default_get_tcp_addrinfo, + altcp_default_get_ip, + altcp_default_get_port +#if LWIP_TCP_KEEPALIVE + , altcp_default_keepalive_disable + , altcp_default_keepalive_enable +#endif +#ifdef LWIP_DEBUG + , altcp_default_dbg_get_tcp_state +#endif +}; + +#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */ +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.c new file mode 100644 index 0000000..04d47ae --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.c @@ -0,0 +1,210 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread) + * + * This file contains memory management functions for a TLS layer using mbedTLS. + * + * ATTENTION: For production usage, you might want to override this file with + * your own implementation since this implementation simply uses the + * lwIP heap without caring for fragmentation or leaving heap for + * other parts of lwIP! + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + * Missing things / @todo: + * - RX data is acknowledged after receiving (tcp_recved is called when enqueueing + * the pbuf for mbedTLS receive, not when processed by mbedTLS or the inner + * connection; altcp_recved() from inner connection does nothing) + * - TX data is marked as 'sent' (i.e. acknowledged; sent callback is called) right + * after enqueueing for transmission, not when actually ACKed be the remote host. + */ + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/apps/altcp_tls_mbedtls_opts.h" + +#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS + +#include "altcp_tls_mbedtls_mem.h" +#include "altcp_tls_mbedtls_structs.h" +#include "lwip/mem.h" + +#include "mbedtls/platform.h" + +#include + +#ifndef ALTCP_MBEDTLS_MEM_DEBUG +#define ALTCP_MBEDTLS_MEM_DEBUG LWIP_DBG_OFF +#endif + +#if defined(MBEDTLS_PLATFORM_MEMORY) && \ + (!defined(MBEDTLS_PLATFORM_FREE_MACRO) || \ + defined(MBEDTLS_PLATFORM_CALLOC_MACRO)) +#define ALTCP_MBEDTLS_PLATFORM_ALLOC 1 +#else +#define ALTCP_MBEDTLS_PLATFORM_ALLOC 0 +#endif + +#if ALTCP_MBEDTLS_PLATFORM_ALLOC + +#ifndef ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS +#define ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS 0 +#endif + +/* This is an example/debug implementation of alloc/free functions only */ +typedef struct altcp_mbedtls_malloc_helper_s { + size_t c; + size_t len; +} altcp_mbedtls_malloc_helper_t; + +#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS +typedef struct altcp_mbedtls_malloc_stats_s { + size_t allocedBytes; + size_t allocCnt; + size_t maxBytes; + size_t totalBytes; +} altcp_mbedtls_malloc_stats_t; +altcp_mbedtls_malloc_stats_t altcp_mbedtls_malloc_stats; +volatile int altcp_mbedtls_malloc_clear_stats; +#endif + +static void * +tls_malloc(size_t c, size_t len) +{ + altcp_mbedtls_malloc_helper_t *hlpr; + void *ret; + size_t alloc_size; +#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS + if (altcp_mbedtls_malloc_clear_stats) { + altcp_mbedtls_malloc_clear_stats = 0; + memset(&altcp_mbedtls_malloc_stats, 0, sizeof(altcp_mbedtls_malloc_stats)); + } +#endif + alloc_size = sizeof(altcp_mbedtls_malloc_helper_t) + (c * len); + /* check for maximum allocation size, mainly to prevent mem_size_t overflow */ + if (alloc_size > MEM_SIZE) { + LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls allocation too big: %c * %d bytes vs MEM_SIZE=%d", + (int)c, (int)len, (int)MEM_SIZE)); + return NULL; + } + hlpr = (altcp_mbedtls_malloc_helper_t *)mem_malloc((mem_size_t)alloc_size); + if (hlpr == NULL) { + LWIP_DEBUGF(ALTCP_MBEDTLS_MEM_DEBUG, ("mbedtls alloc callback failed for %c * %d bytes", (int)c, (int)len)); + return NULL; + } +#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS + altcp_mbedtls_malloc_stats.allocCnt++; + altcp_mbedtls_malloc_stats.allocedBytes += c * len; + if (altcp_mbedtls_malloc_stats.allocedBytes > altcp_mbedtls_malloc_stats.maxBytes) { + altcp_mbedtls_malloc_stats.maxBytes = altcp_mbedtls_malloc_stats.allocedBytes; + } + altcp_mbedtls_malloc_stats.totalBytes += c * len; +#endif + hlpr->c = c; + hlpr->len = len; + ret = hlpr + 1; + /* zeroing the allocated chunk is required by mbedTLS! */ + memset(ret, 0, c * len); + return ret; +} + +static void +tls_free(void *ptr) +{ + altcp_mbedtls_malloc_helper_t *hlpr; + if (ptr == NULL) { + /* this obviously happened in mbedtls... */ + return; + } + hlpr = ((altcp_mbedtls_malloc_helper_t *)ptr) - 1; +#if ALTCP_MBEDTLS_PLATFORM_ALLOC_STATS + if (!altcp_mbedtls_malloc_clear_stats) { + altcp_mbedtls_malloc_stats.allocedBytes -= hlpr->c * hlpr->len; + } +#endif + mem_free(hlpr); +} +#endif /* ALTCP_MBEDTLS_PLATFORM_ALLOC*/ + +void +altcp_mbedtls_mem_init(void) +{ + /* not much to do here when using the heap */ + +#if ALTCP_MBEDTLS_PLATFORM_ALLOC + /* set mbedtls allocation methods */ + mbedtls_platform_set_calloc_free(&tls_malloc, &tls_free); +#endif +} + +altcp_mbedtls_state_t * +altcp_mbedtls_alloc(void *conf) +{ + altcp_mbedtls_state_t *ret = (altcp_mbedtls_state_t *)mem_calloc(1, sizeof(altcp_mbedtls_state_t)); + if (ret != NULL) { + ret->conf = conf; + } + return ret; +} + +void +altcp_mbedtls_free(void *conf, altcp_mbedtls_state_t *state) +{ + LWIP_UNUSED_ARG(conf); + LWIP_ASSERT("state != NULL", state != NULL); + mem_free(state); +} + +void * +altcp_mbedtls_alloc_config(size_t size) +{ + void *ret; + size_t checked_size = (mem_size_t)size; + if (size != checked_size) { + /* allocation too big (mem_size_t overflow) */ + return NULL; + } + ret = (altcp_mbedtls_state_t *)mem_calloc(1, (mem_size_t)size); + return ret; +} + +void +altcp_mbedtls_free_config(void *item) +{ + LWIP_ASSERT("item != NULL", item != NULL); + mem_free(item); +} + +#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */ +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.h similarity index 58% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.h index 455336d..b391bf8 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_mem.h @@ -1,11 +1,16 @@ /** * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) * - * IPv6 address autoconfiguration as per RFC 4862. + * This file contains memory management function prototypes for a TLS layer using mbedTLS. + * + * Memory management contains: + * - allocating/freeing altcp_mbedtls_state_t + * - allocating/freeing memory used in the mbedTLS library */ /* - * Copyright (c) 2010 Inico Technologies Ltd. + * Copyright (c) 2017 Simon Goldschmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -32,27 +37,36 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Ivan Delamer + * Author: Simon Goldschmidt * - * IPv6 address autoconfiguration as per RFC 4862. - * - * Please coordinate changes and requests with Ivan Delamer - * */ - -#ifndef LWIP_HDR_IP6_DHCP6_H -#define LWIP_HDR_IP6_DHCP6_H +#ifndef LWIP_HDR_ALTCP_MBEDTLS_MEM_H +#define LWIP_HDR_ALTCP_MBEDTLS_MEM_H #include "lwip/opt.h" -#if LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ +#include "lwip/apps/altcp_tls_mbedtls_opts.h" -struct dhcp6 -{ - /*@todo: implement DHCP6*/ -}; +#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS -#endif /* LWIP_IPV6_DHCP6 */ +#include "altcp_tls_mbedtls_structs.h" -#endif /* LWIP_HDR_IP6_DHCP6_H */ +#ifdef __cplusplus +extern "C" { +#endif + +void altcp_mbedtls_mem_init(void); +altcp_mbedtls_state_t *altcp_mbedtls_alloc(void *conf); +void altcp_mbedtls_free(void *conf, altcp_mbedtls_state_t *state); +void *altcp_mbedtls_alloc_config(size_t size); +void altcp_mbedtls_free_config(void *item); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */ +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_ALTCP_MBEDTLS_MEM_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_structs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_structs.h new file mode 100644 index 0000000..17efaaf --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/altcp_tls/altcp_tls_mbedtls_structs.h @@ -0,0 +1,83 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * This file contains structure definitions for a TLS layer using mbedTLS. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_MBEDTLS_STRUCTS_H +#define LWIP_HDR_ALTCP_MBEDTLS_STRUCTS_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/apps/altcp_tls_mbedtls_opts.h" + +#if LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS + +#include "lwip/altcp.h" +#include "lwip/pbuf.h" + +#include "mbedtls/ssl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALTCP_MBEDTLS_FLAGS_HANDSHAKE_DONE 0x01 +#define ALTCP_MBEDTLS_FLAGS_UPPER_CALLED 0x02 +#define ALTCP_MBEDTLS_FLAGS_RX_CLOSE_QUEUED 0x04 +#define ALTCP_MBEDTLS_FLAGS_RX_CLOSED 0x08 +#define ALTCP_MBEDTLS_FLAGS_APPLDATA_SENT 0x10 + +typedef struct altcp_mbedtls_state_s { + void *conf; + mbedtls_ssl_context ssl_context; + /* chain of rx pbufs (before decryption) */ + struct pbuf *rx; + struct pbuf *rx_app; + u8_t flags; + int rx_passed_unrecved; + int bio_bytes_read; + int bio_bytes_appl; +} altcp_mbedtls_state_t; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP_TLS && LWIP_ALTCP_TLS_MBEDTLS */ +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_ALTCP_MBEDTLS_STRUCTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/altcp_proxyconnect.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/altcp_proxyconnect.c new file mode 100644 index 0000000..9a0b2ba --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/altcp_proxyconnect.c @@ -0,0 +1,584 @@ +/** + * @file + * Application layered TCP connection API that executes a proxy-connect. + * + * This file provides a starting layer that executes a proxy-connect e.g. to + * set up TLS connections through a http proxy. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/apps/altcp_proxyconnect.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/priv/altcp_priv.h" + +#include "lwip/altcp_tcp.h" +#include "lwip/altcp_tls.h" + +#include "lwip/mem.h" +#include "lwip/init.h" + +#include + +/** This string is passed in the HTTP header as "User-Agent: " */ +#ifndef ALTCP_PROXYCONNECT_CLIENT_AGENT +#define ALTCP_PROXYCONNECT_CLIENT_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)" +#endif + +#define ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED 0x01 +#define ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE 0x02 + +typedef struct altcp_proxyconnect_state_s +{ + ip_addr_t outer_addr; + u16_t outer_port; + struct altcp_proxyconnect_config *conf; + u8_t flags; +} altcp_proxyconnect_state_t; + +/* Variable prototype, the actual declaration is at the end of this file + since it contains pointers to static functions declared here */ +extern const struct altcp_functions altcp_proxyconnect_functions; + +/* memory management functions: */ + +static altcp_proxyconnect_state_t * +altcp_proxyconnect_state_alloc(void) +{ + altcp_proxyconnect_state_t *ret = (altcp_proxyconnect_state_t *)mem_calloc(1, sizeof(altcp_proxyconnect_state_t)); + return ret; +} + +static void +altcp_proxyconnect_state_free(altcp_proxyconnect_state_t *state) +{ + LWIP_ASSERT("state != NULL", state != NULL); + mem_free(state); +} + +/* helper functions */ + +#define PROXY_CONNECT "CONNECT %s:%d HTTP/1.1\r\n" /* HOST, PORT */ \ + "User-Agent: %s\r\n" /* User-Agent */\ + "Proxy-Connection: keep-alive\r\n" \ + "Connection: keep-alive\r\n" \ + "\r\n" +#define PROXY_CONNECT_FORMAT(host, port) PROXY_CONNECT, host, port, ALTCP_PROXYCONNECT_CLIENT_AGENT + +/* Format the http proxy connect request via snprintf */ +static int +altcp_proxyconnect_format_request(char *buffer, size_t bufsize, const char *host, int port) +{ + return snprintf(buffer, bufsize, PROXY_CONNECT_FORMAT(host, port)); +} + +/* Create and send the http proxy connect request */ +static err_t +altcp_proxyconnect_send_request(struct altcp_pcb *conn) +{ + int len, len2; + mem_size_t alloc_len; + char *buffer, *host; + altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state; + + if (!state) { + return ERR_VAL; + } + /* Use printf with zero length to get the required allocation size */ + len = altcp_proxyconnect_format_request(NULL, 0, "", state->outer_port); + if (len < 0) { + return ERR_VAL; + } + /* add allocation size for IP address strings */ +#if LWIP_IPV6 + len += 40; /* worst-case IPv6 address length */ +#else + len += 16; /* worst-case IPv4 address length */ +#endif + alloc_len = (mem_size_t)len; + if ((len < 0) || (int)alloc_len != len) { + /* overflow */ + return ERR_MEM; + } + /* Allocate a bufer for the request string */ + buffer = (char *)mem_malloc(alloc_len); + if (buffer == NULL) { + return ERR_MEM; + } + host = ipaddr_ntoa(&state->outer_addr); + len2 = altcp_proxyconnect_format_request(buffer, alloc_len, host, state->outer_port); + if ((len2 > 0) && (len2 <= len) && (len2 <= 0xFFFF)) { + err_t err = altcp_write(conn->inner_conn, buffer, (u16_t)len2, TCP_WRITE_FLAG_COPY); + if (err != ERR_OK) { + /* @todo: abort? */ + mem_free(buffer); + return err; + } + } + mem_free(buffer); + return ERR_OK; +} + +/* callback functions from inner/lower connection: */ + +/** Connected callback from lower connection (i.e. TCP). + * Not really implemented/tested yet... + */ +static err_t +altcp_proxyconnect_lower_connected(void *arg, struct altcp_pcb *inner_conn, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn && conn->state) { + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + /* upper connected is called when handshake is done */ + if (err != ERR_OK) { + if (conn->connected) { + if (conn->connected(conn->arg, conn, err) == ERR_ABRT) { + return ERR_ABRT; + } + return ERR_OK; + } + } + /* send proxy connect request here */ + return altcp_proxyconnect_send_request(conn); + } + return ERR_VAL; +} + +/** Recv callback from lower connection (i.e. TCP) + * This one mainly differs between connection setup (wait for proxy OK string) + * and application phase (data is passed on to the application). + */ +static err_t +altcp_proxyconnect_lower_recv(void *arg, struct altcp_pcb *inner_conn, struct pbuf *p, err_t err) +{ + altcp_proxyconnect_state_t *state; + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + + LWIP_ASSERT("no err expected", err == ERR_OK); + LWIP_UNUSED_ARG(err); + + if (!conn) { + /* no connection given as arg? should not happen, but prevent pbuf/conn leaks */ + if (p != NULL) { + pbuf_free(p); + } + altcp_close(inner_conn); + return ERR_CLSD; + } + state = (altcp_proxyconnect_state_t *)conn->state; + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + if (!state) { + /* already closed */ + if (p != NULL) { + pbuf_free(p); + } + altcp_close(inner_conn); + return ERR_CLSD; + } + if (state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE) { + /* application phase, just pass this through */ + if (conn->recv) { + return conn->recv(conn->arg, conn, p, err); + } + pbuf_free(p); + return ERR_OK; + } else { + /* setup phase */ + /* handle NULL pbuf (inner connection closed) */ + if (p == NULL) { + if (altcp_close(conn) != ERR_OK) { + altcp_abort(conn); + return ERR_ABRT; + } + return ERR_OK; + } else { + /* @todo: parse setup phase rx data + for now, we just wait for the end of the header... */ + u16_t idx = pbuf_memfind(p, "\r\n\r\n", 4, 0); + altcp_recved(inner_conn, p->tot_len); + pbuf_free(p); + if (idx != 0xFFFF) { + state->flags |= ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE; + if (conn->connected) { + return conn->connected(conn->arg, conn, ERR_OK); + } + } + return ERR_OK; + } + } +} + +/** Sent callback from lower connection (i.e. TCP) + * This only informs the upper layer to try to send more, not about + * the number of ACKed bytes. + */ +static err_t +altcp_proxyconnect_lower_sent(void *arg, struct altcp_pcb *inner_conn, u16_t len) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + LWIP_UNUSED_ARG(len); + if (conn) { + altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state; + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + if (!state || !(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) { + /* @todo: do something here? */ + return ERR_OK; + } + /* pass this on to upper sent */ + if (conn->sent) { + return conn->sent(conn->arg, conn, len); + } + } + return ERR_OK; +} + +/** Poll callback from lower connection (i.e. TCP) + * Just pass this on to the application. + * @todo: retry sending? + */ +static err_t +altcp_proxyconnect_lower_poll(void *arg, struct altcp_pcb *inner_conn) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + LWIP_ASSERT("pcb mismatch", conn->inner_conn == inner_conn); + LWIP_UNUSED_ARG(inner_conn); /* for LWIP_NOASSERT */ + if (conn->poll) { + return conn->poll(conn->arg, conn); + } + } + return ERR_OK; +} + +static void +altcp_proxyconnect_lower_err(void *arg, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + conn->inner_conn = NULL; /* already freed */ + if (conn->err) { + conn->err(conn->arg, err); + } + altcp_free(conn); + } +} + + +/* setup functions */ + +static void +altcp_proxyconnect_setup_callbacks(struct altcp_pcb *conn, struct altcp_pcb *inner_conn) +{ + altcp_arg(inner_conn, conn); + altcp_recv(inner_conn, altcp_proxyconnect_lower_recv); + altcp_sent(inner_conn, altcp_proxyconnect_lower_sent); + altcp_err(inner_conn, altcp_proxyconnect_lower_err); + /* tcp_poll is set when interval is set by application */ + /* listen is set totally different :-) */ +} + +static err_t +altcp_proxyconnect_setup(struct altcp_proxyconnect_config *config, struct altcp_pcb *conn, struct altcp_pcb *inner_conn) +{ + altcp_proxyconnect_state_t *state; + if (!config) { + return ERR_ARG; + } + LWIP_ASSERT("invalid inner_conn", conn != inner_conn); + + /* allocate proxyconnect context */ + state = altcp_proxyconnect_state_alloc(); + if (state == NULL) { + return ERR_MEM; + } + state->flags = 0; + state->conf = config; + altcp_proxyconnect_setup_callbacks(conn, inner_conn); + conn->inner_conn = inner_conn; + conn->fns = &altcp_proxyconnect_functions; + conn->state = state; + return ERR_OK; +} + +/** Allocate a new altcp layer connecting through a proxy. + * This function gets the inner pcb passed. + * + * @param config struct altcp_proxyconnect_config that contains the proxy settings + * @param inner_pcb pcb that makes the connection to the proxy (i.e. tcp pcb) + */ +struct altcp_pcb * +altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb) +{ + struct altcp_pcb *ret; + if (inner_pcb == NULL) { + return NULL; + } + ret = altcp_alloc(); + if (ret != NULL) { + if (altcp_proxyconnect_setup(config, ret, inner_pcb) != ERR_OK) { + altcp_free(ret); + return NULL; + } + } + return ret; +} + +/** Allocate a new altcp layer connecting through a proxy. + * This function allocates the inner pcb as tcp pcb, resulting in a direct tcp + * connection to the proxy. + * + * @param config struct altcp_proxyconnect_config that contains the proxy settings + * @param ip_type IP type of the connection (@ref lwip_ip_addr_type) + */ +struct altcp_pcb * +altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type) +{ + struct altcp_pcb *inner_pcb, *ret; + + /* inner pcb is tcp */ + inner_pcb = altcp_tcp_new_ip_type(ip_type); + if (inner_pcb == NULL) { + return NULL; + } + ret = altcp_proxyconnect_new(config, inner_pcb); + if (ret == NULL) { + altcp_close(inner_pcb); + } + return ret; +} + +/** Allocator function to allocate a proxy connect altcp pcb connecting directly + * via tcp to the proxy. + * + * The returned pcb is a chain: altcp_proxyconnect - altcp_tcp - tcp pcb + * + * This function is meant for use with @ref altcp_new. + * + * @param arg struct altcp_proxyconnect_config that contains the proxy settings + * @param ip_type IP type of the connection (@ref lwip_ip_addr_type) + */ +struct altcp_pcb * +altcp_proxyconnect_alloc(void *arg, u8_t ip_type) +{ + return altcp_proxyconnect_new_tcp((struct altcp_proxyconnect_config *)arg, ip_type); +} + + +#if LWIP_ALTCP_TLS + +/** Allocator function to allocate a TLS connection through a proxy. + * + * The returned pcb is a chain: altcp_tls - altcp_proxyconnect - altcp_tcp - tcp pcb + * + * This function is meant for use with @ref altcp_new. + * + * @param arg struct altcp_proxyconnect_tls_config that contains the proxy settings + * and tls settings + * @param ip_type IP type of the connection (@ref lwip_ip_addr_type) + */ +struct altcp_pcb * +altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type) +{ + struct altcp_proxyconnect_tls_config *cfg = (struct altcp_proxyconnect_tls_config *)arg; + struct altcp_pcb *proxy_pcb; + struct altcp_pcb *tls_pcb; + + proxy_pcb = altcp_proxyconnect_new_tcp(&cfg->proxy, ip_type); + tls_pcb = altcp_tls_wrap(cfg->tls_config, proxy_pcb); + + if (tls_pcb == NULL) { + altcp_close(proxy_pcb); + } + return tls_pcb; +} +#endif /* LWIP_ALTCP_TLS */ + +/* "virtual" functions */ +static void +altcp_proxyconnect_set_poll(struct altcp_pcb *conn, u8_t interval) +{ + if (conn != NULL) { + altcp_poll(conn->inner_conn, altcp_proxyconnect_lower_poll, interval); + } +} + +static void +altcp_proxyconnect_recved(struct altcp_pcb *conn, u16_t len) +{ + altcp_proxyconnect_state_t *state; + if (conn == NULL) { + return; + } + state = (altcp_proxyconnect_state_t *)conn->state; + if (state == NULL) { + return; + } + if (!(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) { + return; + } + altcp_recved(conn->inner_conn, len); +} + +static err_t +altcp_proxyconnect_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected) +{ + altcp_proxyconnect_state_t *state; + + if ((conn == NULL) || (ipaddr == NULL)) { + return ERR_VAL; + } + state = (altcp_proxyconnect_state_t *)conn->state; + if (state == NULL) { + return ERR_VAL; + } + if (state->flags & ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED) { + return ERR_VAL; + } + state->flags |= ALTCP_PROXYCONNECT_FLAGS_CONNECT_STARTED; + + conn->connected = connected; + /* connect to our proxy instead, but store the requested address and port */ + ip_addr_copy(state->outer_addr, *ipaddr); + state->outer_port = port; + + return altcp_connect(conn->inner_conn, &state->conf->proxy_addr, state->conf->proxy_port, altcp_proxyconnect_lower_connected); +} + +static struct altcp_pcb * +altcp_proxyconnect_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err) +{ + LWIP_UNUSED_ARG(conn); + LWIP_UNUSED_ARG(backlog); + LWIP_UNUSED_ARG(err); + /* listen not supported! */ + return NULL; +} + +static void +altcp_proxyconnect_abort(struct altcp_pcb *conn) +{ + if (conn != NULL) { + if (conn->inner_conn != NULL) { + altcp_abort(conn->inner_conn); + } + altcp_free(conn); + } +} + +static err_t +altcp_proxyconnect_close(struct altcp_pcb *conn) +{ + if (conn == NULL) { + return ERR_VAL; + } + if (conn->inner_conn != NULL) { + err_t err = altcp_close(conn->inner_conn); + if (err != ERR_OK) { + /* closing inner conn failed, return the error */ + return err; + } + } + /* no inner conn or closing it succeeded, deallocate myself */ + altcp_free(conn); + return ERR_OK; +} + +static err_t +altcp_proxyconnect_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + altcp_proxyconnect_state_t *state; + + LWIP_UNUSED_ARG(apiflags); + + if (conn == NULL) { + return ERR_VAL; + } + + state = (altcp_proxyconnect_state_t *)conn->state; + if (state == NULL) { + /* @todo: which error? */ + return ERR_CLSD; + } + if (!(state->flags & ALTCP_PROXYCONNECT_FLAGS_HANDSHAKE_DONE)) { + /* @todo: which error? */ + return ERR_VAL; + } + return altcp_write(conn->inner_conn, dataptr, len, apiflags); +} + +static void +altcp_proxyconnect_dealloc(struct altcp_pcb *conn) +{ + /* clean up and free tls state */ + if (conn) { + altcp_proxyconnect_state_t *state = (altcp_proxyconnect_state_t *)conn->state; + if (state) { + altcp_proxyconnect_state_free(state); + conn->state = NULL; + } + } +} +const struct altcp_functions altcp_proxyconnect_functions = { + altcp_proxyconnect_set_poll, + altcp_proxyconnect_recved, + altcp_default_bind, + altcp_proxyconnect_connect, + altcp_proxyconnect_listen, + altcp_proxyconnect_abort, + altcp_proxyconnect_close, + altcp_default_shutdown, + altcp_proxyconnect_write, + altcp_default_output, + altcp_default_mss, + altcp_default_sndbuf, + altcp_default_sndqueuelen, + altcp_default_nagle_disable, + altcp_default_nagle_enable, + altcp_default_nagle_disabled, + altcp_default_setprio, + altcp_proxyconnect_dealloc, + altcp_default_get_tcp_addrinfo, + altcp_default_get_ip, + altcp_default_get_port +#ifdef LWIP_DEBUG + , altcp_default_dbg_get_tcp_state +#endif +}; + +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs.c similarity index 92% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs.c index 35b5e31..f15a480 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs.c @@ -1,8 +1,8 @@ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, @@ -11,21 +11,21 @@ * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * derived from this software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. - * + * * Author: Adam Dunkels * */ @@ -33,15 +33,10 @@ #include "lwip/apps/httpd_opts.h" #include "lwip/def.h" #include "lwip/apps/fs.h" -#include "fsdata.h" #include -#if HTTPD_USE_CUSTOM_FSDATA -#include "fsdata_custom.c" -#else /* HTTPD_USE_CUSTOM_FSDATA */ -#include "fsdata.c" -#endif /* HTTPD_USE_CUSTOM_FSDATA */ +#include HTTPD_FSDATA_FILE /*-----------------------------------------------------------------------------------*/ @@ -64,7 +59,7 @@ fs_open(struct fs_file *file, const char *name) const struct fsdata_file *f; if ((file == NULL) || (name == NULL)) { - return ERR_ARG; + return ERR_ARG; } #if LWIP_HTTPD_CUSTOM_FILES @@ -121,7 +116,7 @@ fs_read(struct fs_file *file, char *buffer, int count) #endif /* LWIP_HTTPD_FS_ASYNC_READ */ { int read; - if(file->index == file->len) { + if (file->index == file->len) { return FS_READ_EOF; } #if LWIP_HTTPD_FS_ASYNC_READ @@ -139,14 +134,14 @@ fs_read(struct fs_file *file, char *buffer, int count) #endif /* LWIP_HTTPD_CUSTOM_FILES */ read = file->len - file->index; - if(read > count) { + if (read > count) { read = count; } MEMCPY(buffer, (file->data + file->index), read); file->index += read; - return(read); + return (read); } #endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */ /*-----------------------------------------------------------------------------------*/ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/404.html b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/404.html similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/404.html rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/404.html diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/img/sics.gif similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/img/sics.gif rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/img/sics.gif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/index.html b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/index.html similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fs/index.html rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fs/index.html diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.c similarity index 86% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.c index 6170ce6..ab9da7e 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.c @@ -1,13 +1,33 @@ #include "lwip/apps/fs.h" #include "lwip/def.h" -#include "fsdata.h" #define file_NULL (struct fsdata_file *) NULL +#ifndef FS_FILE_FLAGS_HEADER_INCLUDED +#define FS_FILE_FLAGS_HEADER_INCLUDED 1 +#endif +#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT +#define FS_FILE_FLAGS_HEADER_PERSISTENT 0 +#endif +/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */ +#ifndef FSDATA_FILE_ALIGNMENT +#define FSDATA_FILE_ALIGNMENT 0 +#endif +#ifndef FSDATA_ALIGN_PRE +#define FSDATA_ALIGN_PRE +#endif +#ifndef FSDATA_ALIGN_POST +#define FSDATA_ALIGN_POST +#endif +#if FSDATA_FILE_ALIGNMENT==2 +#include "fsdata_alignment.h" +#endif +#if FSDATA_FILE_ALIGNMENT==1 static const unsigned int dummy_align__img_sics_gif = 0; -static const unsigned char data__img_sics_gif[] = { +#endif +static const unsigned char FSDATA_ALIGN_PRE data__img_sics_gif[] FSDATA_ALIGN_POST = { /* /img/sics.gif (14 chars) */ 0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x00,0x00,0x00, @@ -16,16 +36,21 @@ static const unsigned char data__img_sics_gif[] = { " (17 bytes) */ 0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, 0x0a, -/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) -" (63 bytes) */ -0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, -0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, -0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, -0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, -/* "Content-type: image/gif +/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip) +" (64 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30, +0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61, +0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f, +0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, + +/* "Content-Length: 724 +" (18+ bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20, +0x37,0x32,0x34,0x0d,0x0a, +/* "Content-Type: image/gif " (27 bytes) */ -0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d, +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d, 0x61,0x67,0x65,0x2f,0x67,0x69,0x66,0x0d,0x0a,0x0d,0x0a, /* raw file data (724 bytes) */ 0x47,0x49,0x46,0x38,0x39,0x61,0x46,0x00,0x22,0x00,0xa5,0x00,0x00,0xd9,0x2b,0x39, @@ -75,8 +100,10 @@ static const unsigned char data__img_sics_gif[] = { 0x82,0x0c,0x36,0xe8,0xe0,0x83,0x10,0x46,0x28,0xe1,0x84,0x14,0x56,0x68,0xa1,0x10, 0x41,0x00,0x00,0x3b,}; +#if FSDATA_FILE_ALIGNMENT==1 static const unsigned int dummy_align__404_html = 1; -static const unsigned char data__404_html[] = { +#endif +static const unsigned char FSDATA_ALIGN_PRE data__404_html[] FSDATA_ALIGN_POST = { /* /404.html (10 chars) */ 0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00, @@ -85,16 +112,21 @@ static const unsigned char data__404_html[] = { " (29 bytes) */ 0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c, 0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a, -/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) -" (63 bytes) */ -0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, -0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, -0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, -0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, -/* "Content-type: text/html +/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip) +" (64 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30, +0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61, +0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f, +0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, + +/* "Content-Length: 565 +" (18+ bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20, +0x35,0x36,0x35,0x0d,0x0a, +/* "Content-Type: text/html " (27 bytes) */ -0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, 0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, /* raw file data (565 bytes) */ 0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, @@ -134,8 +166,10 @@ static const unsigned char data__404_html[] = { 0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74, 0x6d,0x6c,0x3e,0x0d,0x0a,}; +#if FSDATA_FILE_ALIGNMENT==1 static const unsigned int dummy_align__index_html = 2; -static const unsigned char data__index_html[] = { +#endif +static const unsigned char FSDATA_ALIGN_PRE data__index_html[] FSDATA_ALIGN_POST = { /* /index.html (12 chars) */ 0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00, @@ -144,16 +178,21 @@ static const unsigned char data__index_html[] = { " (17 bytes) */ 0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, 0x0a, -/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) -" (63 bytes) */ -0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, -0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, -0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, -0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, -/* "Content-type: text/html +/* "Server: lwIP/2.0.3d (http://savannah.nongnu.org/projects/lwip) +" (64 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x32,0x2e,0x30, +0x2e,0x33,0x64,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61, +0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f, +0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, + +/* "Content-Length: 1751 +" (18+ bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x4c,0x65,0x6e,0x67,0x74,0x68,0x3a,0x20, +0x31,0x37,0x35,0x31,0x0d,0x0a, +/* "Content-Type: text/html " (27 bytes) */ -0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x54,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, 0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, /* raw file data (1751 bytes) */ 0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, @@ -274,7 +313,7 @@ file_NULL, data__img_sics_gif, data__img_sics_gif + 16, sizeof(data__img_sics_gif) - 16, -1, +FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT, }}; const struct fsdata_file file__404_html[] = { { @@ -282,7 +321,7 @@ file__img_sics_gif, data__404_html, data__404_html + 12, sizeof(data__404_html) - 12, -1, +FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT, }}; const struct fsdata_file file__index_html[] = { { @@ -290,7 +329,7 @@ file__404_html, data__index_html, data__index_html + 12, sizeof(data__index_html) - 12, -1, +FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT, }}; #define FS_ROOT file__index_html diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.h similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.h index ac4548c..d31550d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/fsdata.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/fsdata.h @@ -1,8 +1,8 @@ /* * Copyright (c) 2001-2003 Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, @@ -11,21 +11,21 @@ * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * derived from this software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. - * + * * Author: Adam Dunkels * */ @@ -35,16 +35,7 @@ #include "lwip/apps/httpd_opts.h" #include "lwip/apps/fs.h" -struct fsdata_file { - const struct fsdata_file *next; - const unsigned char *name; - const unsigned char *data; - int len; - u8_t flags; -#if HTTPD_PRECALCULATED_CHECKSUM - u16_t chksum_count; - const struct fsdata_chksum *chksum; -#endif /* HTTPD_PRECALCULATED_CHECKSUM */ -}; +/* THIS FILE IS DEPRECATED AND WILL BE REMOVED IN THE FUTURE */ +/* content was moved to fs.h to simplify #include structure */ #endif /* LWIP_FSDATA_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/http_client.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/http_client.c new file mode 100644 index 0000000..82da60d --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/http_client.c @@ -0,0 +1,909 @@ +/** + * @file + * HTTP client + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + */ + +/** + * @defgroup httpc HTTP client + * @ingroup apps + * @todo: + * - persistent connections + * - select outgoing http version + * - optionally follow redirect + * - check request uri for invalid characters? (e.g. encode spaces) + * - IPv6 support + */ + +#include "lwip/apps/http_client.h" + +#include "lwip/altcp_tcp.h" +#include "lwip/dns.h" +#include "lwip/debug.h" +#include "lwip/mem.h" +#include "lwip/altcp_tls.h" +#include "lwip/init.h" + +#include +#include +#include + +#if LWIP_TCP && LWIP_CALLBACK_API + +/** + * HTTPC_DEBUG: Enable debugging for HTTP client. + */ +#ifndef HTTPC_DEBUG +#define HTTPC_DEBUG LWIP_DBG_OFF +#endif + +/** Set this to 1 to keep server name and uri in request state */ +#ifndef HTTPC_DEBUG_REQUEST +#define HTTPC_DEBUG_REQUEST 0 +#endif + +/** This string is passed in the HTTP header as "User-Agent: " */ +#ifndef HTTPC_CLIENT_AGENT +#define HTTPC_CLIENT_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)" +#endif + +/* the various debug levels for this file */ +#define HTTPC_DEBUG_TRACE (HTTPC_DEBUG | LWIP_DBG_TRACE) +#define HTTPC_DEBUG_STATE (HTTPC_DEBUG | LWIP_DBG_STATE) +#define HTTPC_DEBUG_WARN (HTTPC_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define HTTPC_DEBUG_WARN_STATE (HTTPC_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE) +#define HTTPC_DEBUG_SERIOUS (HTTPC_DEBUG | LWIP_DBG_LEVEL_SERIOUS) + +#define HTTPC_POLL_INTERVAL 1 +#define HTTPC_POLL_TIMEOUT 30 /* 15 seconds */ + +#define HTTPC_CONTENT_LEN_INVALID 0xFFFFFFFF + +/* GET request basic */ +#define HTTPC_REQ_11 "GET %s HTTP/1.1\r\n" /* URI */\ + "User-Agent: %s\r\n" /* User-Agent */ \ + "Accept: */*\r\n" \ + "Connection: Close\r\n" /* we don't support persistent connections, yet */ \ + "\r\n" +#define HTTPC_REQ_11_FORMAT(uri) HTTPC_REQ_11, uri, HTTPC_CLIENT_AGENT + +/* GET request with host */ +#define HTTPC_REQ_11_HOST "GET %s HTTP/1.1\r\n" /* URI */\ + "User-Agent: %s\r\n" /* User-Agent */ \ + "Accept: */*\r\n" \ + "Host: %s\r\n" /* server name */ \ + "Connection: Close\r\n" /* we don't support persistent connections, yet */ \ + "\r\n" +#define HTTPC_REQ_11_HOST_FORMAT(uri, srv_name) HTTPC_REQ_11_HOST, uri, HTTPC_CLIENT_AGENT, srv_name + +/* GET request with proxy */ +#define HTTPC_REQ_11_PROXY "GET http://%s%s HTTP/1.1\r\n" /* HOST, URI */\ + "User-Agent: %s\r\n" /* User-Agent */ \ + "Accept: */*\r\n" \ + "Host: %s\r\n" /* server name */ \ + "Connection: Close\r\n" /* we don't support persistent connections, yet */ \ + "\r\n" +#define HTTPC_REQ_11_PROXY_FORMAT(host, uri, srv_name) HTTPC_REQ_11_PROXY, host, uri, HTTPC_CLIENT_AGENT, srv_name + +/* GET request with proxy (non-default server port) */ +#define HTTPC_REQ_11_PROXY_PORT "GET http://%s:%d%s HTTP/1.1\r\n" /* HOST, host-port, URI */\ + "User-Agent: %s\r\n" /* User-Agent */ \ + "Accept: */*\r\n" \ + "Host: %s\r\n" /* server name */ \ + "Connection: Close\r\n" /* we don't support persistent connections, yet */ \ + "\r\n" +#define HTTPC_REQ_11_PROXY_PORT_FORMAT(host, host_port, uri, srv_name) HTTPC_REQ_11_PROXY_PORT, host, host_port, uri, HTTPC_CLIENT_AGENT, srv_name + +typedef enum ehttpc_parse_state { + HTTPC_PARSE_WAIT_FIRST_LINE = 0, + HTTPC_PARSE_WAIT_HEADERS, + HTTPC_PARSE_RX_DATA +} httpc_parse_state_t; + +typedef struct _httpc_state +{ + struct altcp_pcb* pcb; + ip_addr_t remote_addr; + u16_t remote_port; + int timeout_ticks; + struct pbuf *request; + struct pbuf *rx_hdrs; + u16_t rx_http_version; + u16_t rx_status; + altcp_recv_fn recv_fn; + const httpc_connection_t *conn_settings; + void* callback_arg; + u32_t rx_content_len; + u32_t hdr_content_len; + httpc_parse_state_t parse_state; +#if HTTPC_DEBUG_REQUEST + char* server_name; + char* uri; +#endif +} httpc_state_t; + +/** Free http client state and deallocate all resources within */ +static err_t +httpc_free_state(httpc_state_t* req) +{ + struct altcp_pcb* tpcb; + + if (req->request != NULL) { + pbuf_free(req->request); + req->request = NULL; + } + if (req->rx_hdrs != NULL) { + pbuf_free(req->rx_hdrs); + req->rx_hdrs = NULL; + } + + tpcb = req->pcb; + mem_free(req); + req = NULL; + + if (tpcb != NULL) { + err_t r; + altcp_arg(tpcb, NULL); + altcp_recv(tpcb, NULL); + altcp_err(tpcb, NULL); + altcp_poll(tpcb, NULL, 0); + altcp_sent(tpcb, NULL); + r = altcp_close(tpcb); + if (r != ERR_OK) { + altcp_abort(tpcb); + return ERR_ABRT; + } + } + return ERR_OK; +} + +/** Close the connection: call finished callback and free the state */ +static err_t +httpc_close(httpc_state_t* req, httpc_result_t result, u32_t server_response, err_t err) +{ + if (req != NULL) { + if (req->conn_settings != NULL) { + if (req->conn_settings->result_fn != NULL) { + req->conn_settings->result_fn(req->callback_arg, result, req->rx_content_len, server_response, err); + } + } + return httpc_free_state(req); + } + return ERR_OK; +} + +/** Parse http header response line 1 */ +static err_t +http_parse_response_status(struct pbuf *p, u16_t *http_version, u16_t *http_status, u16_t *http_status_str_offset) +{ + u16_t end1 = pbuf_memfind(p, "\r\n", 2, 0); + if (end1 != 0xFFFF) { + /* get parts of first line */ + u16_t space1, space2; + space1 = pbuf_memfind(p, " ", 1, 0); + if (space1 != 0xFFFF) { + if ((pbuf_memcmp(p, 0, "HTTP/", 5) == 0) && (pbuf_get_at(p, 6) == '.')) { + char status_num[10]; + size_t status_num_len; + /* parse http version */ + u16_t version = pbuf_get_at(p, 5) - '0'; + version <<= 8; + version |= pbuf_get_at(p, 7) - '0'; + *http_version = version; + + /* parse http status number */ + space2 = pbuf_memfind(p, " ", 1, space1 + 1); + if (space2 != 0xFFFF) { + *http_status_str_offset = space2 + 1; + status_num_len = space2 - space1 - 1; + } else { + status_num_len = end1 - space1 - 1; + } + memset(status_num, 0, sizeof(status_num)); + if (pbuf_copy_partial(p, status_num, (u16_t)status_num_len, space1 + 1) == status_num_len) { + int status = atoi(status_num); + if ((status > 0) && (status <= 0xFFFF)) { + *http_status = (u16_t)status; + return ERR_OK; + } + } + } + } + } + return ERR_VAL; +} + +/** Wait for all headers to be received, return its length and content-length (if available) */ +static err_t +http_wait_headers(struct pbuf *p, u32_t *content_length, u16_t *total_header_len) +{ + u16_t end1 = pbuf_memfind(p, "\r\n\r\n", 4, 0); + if (end1 < (0xFFFF - 2)) { + /* all headers received */ + /* check if we have a content length (@todo: case insensitive?) */ + u16_t content_len_hdr; + *content_length = HTTPC_CONTENT_LEN_INVALID; + *total_header_len = end1 + 4; + + content_len_hdr = pbuf_memfind(p, "Content-Length: ", 16, 0); + if (content_len_hdr != 0xFFFF) { + u16_t content_len_line_end = pbuf_memfind(p, "\r\n", 2, content_len_hdr); + if (content_len_line_end != 0xFFFF) { + char content_len_num[16]; + u16_t content_len_num_len = (u16_t)(content_len_line_end - content_len_hdr - 16); + memset(content_len_num, 0, sizeof(content_len_num)); + if (pbuf_copy_partial(p, content_len_num, content_len_num_len, content_len_hdr + 16) == content_len_num_len) { + int len = atoi(content_len_num); + if ((len >= 0) && ((u32_t)len < HTTPC_CONTENT_LEN_INVALID)) { + *content_length = (u32_t)len; + } + } + } + } + return ERR_OK; + } + return ERR_VAL; +} + +/** http client tcp recv callback */ +static err_t +httpc_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t r) +{ + httpc_state_t* req = (httpc_state_t*)arg; + LWIP_UNUSED_ARG(r); + + if (p == NULL) { + httpc_result_t result; + if (req->parse_state != HTTPC_PARSE_RX_DATA) { + /* did not get RX data yet */ + result = HTTPC_RESULT_ERR_CLOSED; + } else if ((req->hdr_content_len != HTTPC_CONTENT_LEN_INVALID) && + (req->hdr_content_len != req->rx_content_len)) { + /* header has been received with content length but not all data received */ + result = HTTPC_RESULT_ERR_CONTENT_LEN; + } else { + /* receiving data and either all data received or no content length header */ + result = HTTPC_RESULT_OK; + } + return httpc_close(req, result, req->rx_status, ERR_OK); + } + if (req->parse_state != HTTPC_PARSE_RX_DATA) { + if (req->rx_hdrs == NULL) { + req->rx_hdrs = p; + } else { + pbuf_cat(req->rx_hdrs, p); + } + if (req->parse_state == HTTPC_PARSE_WAIT_FIRST_LINE) { + u16_t status_str_off; + err_t err = http_parse_response_status(req->rx_hdrs, &req->rx_http_version, &req->rx_status, &status_str_off); + if (err == ERR_OK) { + /* don't care status string */ + req->parse_state = HTTPC_PARSE_WAIT_HEADERS; + } + } + if (req->parse_state == HTTPC_PARSE_WAIT_HEADERS) { + u16_t total_header_len; + err_t err = http_wait_headers(req->rx_hdrs, &req->hdr_content_len, &total_header_len); + if (err == ERR_OK) { + struct pbuf *q; + /* full header received, send window update for header bytes and call into client callback */ + altcp_recved(pcb, total_header_len); + if (req->conn_settings) { + if (req->conn_settings->headers_done_fn) { + err = req->conn_settings->headers_done_fn(req, req->callback_arg, req->rx_hdrs, total_header_len, req->hdr_content_len); + if (err != ERR_OK) { + return httpc_close(req, HTTPC_RESULT_LOCAL_ABORT, req->rx_status, err); + } + } + } + /* hide header bytes in pbuf */ + q = pbuf_free_header(req->rx_hdrs, total_header_len); + p = q; + req->rx_hdrs = NULL; + /* go on with data */ + req->parse_state = HTTPC_PARSE_RX_DATA; + } + } + } + if ((p != NULL) && (req->parse_state == HTTPC_PARSE_RX_DATA)) { + req->rx_content_len += p->tot_len; + if (req->recv_fn != NULL) { + /* directly return here: the connection migth already be aborted from the callback! */ + return req->recv_fn(req->callback_arg, pcb, p, r); + } else { + altcp_recved(pcb, p->tot_len); + pbuf_free(p); + } + } + return ERR_OK; +} + +/** http client tcp err callback */ +static void +httpc_tcp_err(void *arg, err_t err) +{ + httpc_state_t* req = (httpc_state_t*)arg; + if (req != NULL) { + /* pcb has already been deallocated */ + req->pcb = NULL; + httpc_close(req, HTTPC_RESULT_ERR_CLOSED, 0, err); + } +} + +/** http client tcp poll callback */ +static err_t +httpc_tcp_poll(void *arg, struct altcp_pcb *pcb) +{ + /* implement timeout */ + httpc_state_t* req = (httpc_state_t*)arg; + LWIP_UNUSED_ARG(pcb); + if (req != NULL) { + if (req->timeout_ticks) { + req->timeout_ticks--; + } + if (!req->timeout_ticks) { + return httpc_close(req, HTTPC_RESULT_ERR_TIMEOUT, 0, ERR_OK); + } + } + return ERR_OK; +} + +/** http client tcp sent callback */ +static err_t +httpc_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len) +{ + /* nothing to do here for now */ + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(len); + return ERR_OK; +} + +/** http client tcp connected callback */ +static err_t +httpc_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err) +{ + err_t r; + httpc_state_t* req = (httpc_state_t*)arg; + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(err); + + /* send request; last char is zero termination */ + r = altcp_write(req->pcb, req->request->payload, req->request->len - 1, TCP_WRITE_FLAG_COPY); + if (r != ERR_OK) { + /* could not write the single small request -> fail, don't retry */ + return httpc_close(req, HTTPC_RESULT_ERR_MEM, 0, r); + } + /* everything written, we can free the request */ + pbuf_free(req->request); + req->request = NULL; + + altcp_output(req->pcb); + return ERR_OK; +} + +/** Start the http request when the server IP addr is known */ +static err_t +httpc_get_internal_addr(httpc_state_t* req, const ip_addr_t *ipaddr) +{ + err_t err; + LWIP_ASSERT("req != NULL", req != NULL); + + if (&req->remote_addr != ipaddr) { + /* fill in remote addr if called externally */ + req->remote_addr = *ipaddr; + } + + err = altcp_connect(req->pcb, &req->remote_addr, req->remote_port, httpc_tcp_connected); + if (err == ERR_OK) { + return ERR_OK; + } + LWIP_DEBUGF(HTTPC_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err)); + return err; +} + +#if LWIP_DNS +/** DNS callback + * If ipaddr is non-NULL, resolving succeeded and the request can be sent, otherwise it failed. + */ +static void +httpc_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) +{ + httpc_state_t* req = (httpc_state_t*)arg; + err_t err; + httpc_result_t result; + + LWIP_UNUSED_ARG(hostname); + + if (ipaddr != NULL) { + err = httpc_get_internal_addr(req, ipaddr); + if (err == ERR_OK) { + return; + } + result = HTTPC_RESULT_ERR_CONNECT; + } else { + LWIP_DEBUGF(HTTPC_DEBUG_WARN_STATE, ("httpc_dns_found: failed to resolve hostname: %s\n", + hostname)); + result = HTTPC_RESULT_ERR_HOSTNAME; + err = ERR_ARG; + } + httpc_close(req, result, 0, err); +} +#endif /* LWIP_DNS */ + +/** Start the http request after converting 'server_name' to ip address (DNS or address string) */ +static err_t +httpc_get_internal_dns(httpc_state_t* req, const char* server_name) +{ + err_t err; + LWIP_ASSERT("req != NULL", req != NULL); + +#if LWIP_DNS + err = dns_gethostbyname(server_name, &req->remote_addr, httpc_dns_found, req); +#else + err = ipaddr_aton(server_name, &req->remote_addr) ? ERR_OK : ERR_ARG; +#endif + + if (err == ERR_OK) { + /* cached or IP-string */ + err = httpc_get_internal_addr(req, &req->remote_addr); + } else if (err == ERR_INPROGRESS) { + return ERR_OK; + } + return err; +} + +static int +httpc_create_request_string(const httpc_connection_t *settings, const char* server_name, int server_port, const char* uri, + int use_host, char *buffer, size_t buffer_size) +{ + if (settings->use_proxy) { + LWIP_ASSERT("server_name != NULL", server_name != NULL); + if (server_port != HTTP_DEFAULT_PORT) { + return snprintf(buffer, buffer_size, HTTPC_REQ_11_PROXY_PORT_FORMAT(server_name, server_port, uri, server_name)); + } else { + return snprintf(buffer, buffer_size, HTTPC_REQ_11_PROXY_FORMAT(server_name, uri, server_name)); + } + } else if (use_host) { + LWIP_ASSERT("server_name != NULL", server_name != NULL); + return snprintf(buffer, buffer_size, HTTPC_REQ_11_HOST_FORMAT(uri, server_name)); + } else { + return snprintf(buffer, buffer_size, HTTPC_REQ_11_FORMAT(uri)); + } +} + +/** Initialize the connection struct */ +static err_t +httpc_init_connection_common(httpc_state_t **connection, const httpc_connection_t *settings, const char* server_name, + u16_t server_port, const char* uri, altcp_recv_fn recv_fn, void* callback_arg, int use_host) +{ + size_t alloc_len; + mem_size_t mem_alloc_len; + int req_len, req_len2; + httpc_state_t *req; +#if HTTPC_DEBUG_REQUEST + size_t server_name_len, uri_len; +#endif + + LWIP_ASSERT("uri != NULL", uri != NULL); + + /* get request len */ + req_len = httpc_create_request_string(settings, server_name, server_port, uri, use_host, NULL, 0); + if ((req_len < 0) || (req_len > 0xFFFF)) { + return ERR_VAL; + } + /* alloc state and request in one block */ + alloc_len = sizeof(httpc_state_t); +#if HTTPC_DEBUG_REQUEST + server_name_len = server_name ? strlen(server_name) : 0; + uri_len = strlen(uri); + alloc_len += server_name_len + 1 + uri_len + 1; +#endif + mem_alloc_len = (mem_size_t)alloc_len; + if ((mem_alloc_len < alloc_len) || (req_len + 1 > 0xFFFF)) { + return ERR_VAL; + } + + req = (httpc_state_t*)mem_malloc((mem_size_t)alloc_len); + if(req == NULL) { + return ERR_MEM; + } + memset(req, 0, sizeof(httpc_state_t)); + req->timeout_ticks = HTTPC_POLL_TIMEOUT; + req->request = pbuf_alloc(PBUF_RAW, (u16_t)(req_len + 1), PBUF_RAM); + if (req->request == NULL) { + httpc_free_state(req); + return ERR_MEM; + } + if (req->request->next != NULL) { + /* need a pbuf in one piece */ + httpc_free_state(req); + return ERR_MEM; + } + req->hdr_content_len = HTTPC_CONTENT_LEN_INVALID; +#if HTTPC_DEBUG_REQUEST + req->server_name = (char*)(req + 1); + if (server_name) { + memcpy(req->server_name, server_name, server_name_len + 1); + } + req->uri = req->server_name + server_name_len + 1; + memcpy(req->uri, uri, uri_len + 1); +#endif + req->pcb = altcp_new(settings->altcp_allocator); + if(req->pcb == NULL) { + httpc_free_state(req); + return ERR_MEM; + } + req->remote_port = settings->use_proxy ? settings->proxy_port : server_port; + altcp_arg(req->pcb, req); + altcp_recv(req->pcb, httpc_tcp_recv); + altcp_err(req->pcb, httpc_tcp_err); + altcp_poll(req->pcb, httpc_tcp_poll, HTTPC_POLL_INTERVAL); + altcp_sent(req->pcb, httpc_tcp_sent); + + /* set up request buffer */ + req_len2 = httpc_create_request_string(settings, server_name, server_port, uri, use_host, + (char *)req->request->payload, req_len + 1); + if (req_len2 != req_len) { + httpc_free_state(req); + return ERR_VAL; + } + + req->recv_fn = recv_fn; + req->conn_settings = settings; + req->callback_arg = callback_arg; + + *connection = req; + return ERR_OK; +} + +/** + * Initialize the connection struct + */ +static err_t +httpc_init_connection(httpc_state_t **connection, const httpc_connection_t *settings, const char* server_name, + u16_t server_port, const char* uri, altcp_recv_fn recv_fn, void* callback_arg) +{ + return httpc_init_connection_common(connection, settings, server_name, server_port, uri, recv_fn, callback_arg, 1); +} + + +/** + * Initialize the connection struct (from IP address) + */ +static err_t +httpc_init_connection_addr(httpc_state_t **connection, const httpc_connection_t *settings, + const ip_addr_t* server_addr, u16_t server_port, const char* uri, + altcp_recv_fn recv_fn, void* callback_arg) +{ + char *server_addr_str = ipaddr_ntoa(server_addr); + if (server_addr_str == NULL) { + return ERR_VAL; + } + return httpc_init_connection_common(connection, settings, server_addr_str, server_port, uri, + recv_fn, callback_arg, 1); +} + +/** + * @ingroup httpc + * HTTP client API: get a file by passing server IP address + * + * @param server_addr IP address of the server to connect + * @param port tcp port of the server + * @param uri uri to get from the server, remember leading "/"! + * @param settings connection settings (callbacks, proxy, etc.) + * @param recv_fn the http body (not the headers) are passed to this callback + * @param callback_arg argument passed to all the callbacks + * @param connection retreives the connection handle (to match in callbacks) + * @return ERR_OK if starting the request succeeds (callback_fn will be called later) + * or an error code + */ +err_t +httpc_get_file(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection) +{ + err_t err; + httpc_state_t* req; + + LWIP_ERROR("invalid parameters", (server_addr != NULL) && (uri != NULL) && (recv_fn != NULL), return ERR_ARG;); + + err = httpc_init_connection_addr(&req, settings, server_addr, port, + uri, recv_fn, callback_arg); + if (err != ERR_OK) { + return err; + } + + if (settings->use_proxy) { + err = httpc_get_internal_addr(req, &settings->proxy_addr); + } else { + err = httpc_get_internal_addr(req, server_addr); + } + if(err != ERR_OK) { + httpc_free_state(req); + return err; + } + + if (connection != NULL) { + *connection = req; + } + return ERR_OK; +} + +/** + * @ingroup httpc + * HTTP client API: get a file by passing server name as string (DNS name or IP address string) + * + * @param server_name server name as string (DNS name or IP address string) + * @param port tcp port of the server + * @param uri uri to get from the server, remember leading "/"! + * @param settings connection settings (callbacks, proxy, etc.) + * @param recv_fn the http body (not the headers) are passed to this callback + * @param callback_arg argument passed to all the callbacks + * @param connection retreives the connection handle (to match in callbacks) + * @return ERR_OK if starting the request succeeds (callback_fn will be called later) + * or an error code + */ +err_t +httpc_get_file_dns(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection) +{ + err_t err; + httpc_state_t* req; + + LWIP_ERROR("invalid parameters", (server_name != NULL) && (uri != NULL) && (recv_fn != NULL), return ERR_ARG;); + + err = httpc_init_connection(&req, settings, server_name, port, uri, recv_fn, callback_arg); + if (err != ERR_OK) { + return err; + } + + if (settings->use_proxy) { + err = httpc_get_internal_addr(req, &settings->proxy_addr); + } else { + err = httpc_get_internal_dns(req, server_name); + } + if(err != ERR_OK) { + httpc_free_state(req); + return err; + } + + if (connection != NULL) { + *connection = req; + } + return ERR_OK; +} + +#if LWIP_HTTPC_HAVE_FILE_IO +/* Implementation to disk via fopen/fwrite/fclose follows */ + +typedef struct _httpc_filestate +{ + const char* local_file_name; + FILE *file; + httpc_connection_t settings; + const httpc_connection_t *client_settings; + void *callback_arg; +} httpc_filestate_t; + +static void httpc_fs_result(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, + u32_t srv_res, err_t err); + +/** Initalize http client state for download to file system */ +static err_t +httpc_fs_init(httpc_filestate_t **filestate_out, const char* local_file_name, + const httpc_connection_t *settings, void* callback_arg) +{ + httpc_filestate_t *filestate; + size_t file_len, alloc_len; + FILE *f; + + file_len = strlen(local_file_name); + alloc_len = sizeof(httpc_filestate_t) + file_len + 1; + + filestate = (httpc_filestate_t *)mem_malloc((mem_size_t)alloc_len); + if (filestate == NULL) { + return ERR_MEM; + } + memset(filestate, 0, sizeof(httpc_filestate_t)); + filestate->local_file_name = (const char *)(filestate + 1); + memcpy((char *)(filestate + 1), local_file_name, file_len + 1); + filestate->file = NULL; + filestate->client_settings = settings; + filestate->callback_arg = callback_arg; + /* copy client settings but override result callback */ + memcpy(&filestate->settings, settings, sizeof(httpc_connection_t)); + filestate->settings.result_fn = httpc_fs_result; + + f = fopen(local_file_name, "wb"); + if(f == NULL) { + /* could not open file */ + mem_free(filestate); + return ERR_VAL; + } + filestate->file = f; + *filestate_out = filestate; + return ERR_OK; +} + +/** Free http client state for download to file system */ +static void +httpc_fs_free(httpc_filestate_t *filestate) +{ + if (filestate != NULL) { + if (filestate->file != NULL) { + fclose(filestate->file); + filestate->file = NULL; + } + mem_free(filestate); + } +} + +/** Connection closed (success or error) */ +static void +httpc_fs_result(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, + u32_t srv_res, err_t err) +{ + httpc_filestate_t *filestate = (httpc_filestate_t *)arg; + if (filestate != NULL) { + if (filestate->client_settings->result_fn != NULL) { + filestate->client_settings->result_fn(filestate->callback_arg, httpc_result, rx_content_len, + srv_res, err); + } + httpc_fs_free(filestate); + } +} + +/** tcp recv callback */ +static err_t +httpc_fs_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) +{ + httpc_filestate_t *filestate = (httpc_filestate_t*)arg; + struct pbuf* q; + LWIP_UNUSED_ARG(err); + + LWIP_ASSERT("p != NULL", p != NULL); + + for (q = p; q != NULL; q = q->next) { + fwrite(q->payload, 1, q->len, filestate->file); + } + altcp_recved(pcb, p->tot_len); + pbuf_free(p); + return ERR_OK; +} + +/** + * @ingroup httpc + * HTTP client API: get a file to disk by passing server IP address + * + * @param server_addr IP address of the server to connect + * @param port tcp port of the server + * @param uri uri to get from the server, remember leading "/"! + * @param settings connection settings (callbacks, proxy, etc.) + * @param callback_arg argument passed to all the callbacks + * @param connection retreives the connection handle (to match in callbacks) + * @return ERR_OK if starting the request succeeds (callback_fn will be called later) + * or an error code + */ +err_t +httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection) +{ + err_t err; + httpc_state_t* req; + httpc_filestate_t *filestate; + + LWIP_ERROR("invalid parameters", (server_addr != NULL) && (uri != NULL) && (local_file_name != NULL), return ERR_ARG;); + + err = httpc_fs_init(&filestate, local_file_name, settings, callback_arg); + if (err != ERR_OK) { + return err; + } + + err = httpc_init_connection_addr(&req, &filestate->settings, server_addr, port, + uri, httpc_fs_tcp_recv, filestate); + if (err != ERR_OK) { + httpc_fs_free(filestate); + return err; + } + + if (settings->use_proxy) { + err = httpc_get_internal_addr(req, &settings->proxy_addr); + } else { + err = httpc_get_internal_addr(req, server_addr); + } + if(err != ERR_OK) { + httpc_fs_free(filestate); + httpc_free_state(req); + return err; + } + + if (connection != NULL) { + *connection = req; + } + return ERR_OK; +} + +/** + * @ingroup httpc + * HTTP client API: get a file to disk by passing server name as string (DNS name or IP address string) + * + * @param server_name server name as string (DNS name or IP address string) + * @param port tcp port of the server + * @param uri uri to get from the server, remember leading "/"! + * @param settings connection settings (callbacks, proxy, etc.) + * @param callback_arg argument passed to all the callbacks + * @param connection retreives the connection handle (to match in callbacks) + * @return ERR_OK if starting the request succeeds (callback_fn will be called later) + * or an error code + */ +err_t +httpc_get_file_dns_to_disk(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection) +{ + err_t err; + httpc_state_t* req; + httpc_filestate_t *filestate; + + LWIP_ERROR("invalid parameters", (server_name != NULL) && (uri != NULL) && (local_file_name != NULL), return ERR_ARG;); + + err = httpc_fs_init(&filestate, local_file_name, settings, callback_arg); + if (err != ERR_OK) { + return err; + } + + err = httpc_init_connection(&req, &filestate->settings, server_name, port, + uri, httpc_fs_tcp_recv, filestate); + if (err != ERR_OK) { + httpc_fs_free(filestate); + return err; + } + + if (settings->use_proxy) { + err = httpc_get_internal_addr(req, &settings->proxy_addr); + } else { + err = httpc_get_internal_dns(req, server_name); + } + if(err != ERR_OK) { + httpc_fs_free(filestate); + httpc_free_state(req); + return err; + } + + if (connection != NULL) { + *connection = req; + } + return ERR_OK; +} +#endif /* LWIP_HTTPC_HAVE_FILE_IO */ + +#endif /* LWIP_TCP && LWIP_CALLBACK_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd.c similarity index 79% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd.c index 43195d7..fc27e8e 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/httpd.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd.c @@ -95,8 +95,18 @@ #include "lwip/apps/fs.h" #include "httpd_structs.h" #include "lwip/def.h" -#include "lwip/ip.h" -#include "lwip/tcp.h" + +#include "lwip/altcp.h" +#include "lwip/altcp_tcp.h" +#if HTTPD_ENABLE_HTTPS +#include "lwip/altcp_tls.h" +#endif +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif +#if LWIP_HTTPD_TIMING +#include "lwip/sys.h" +#endif /* LWIP_HTTPD_TIMING */ #include /* memset */ #include /* atoi */ @@ -113,40 +123,35 @@ #define HTTP11_CONNECTIONKEEPALIVE2 "Connection: Keep-Alive" #endif -/** These defines check whether tcp_write has to copy data or not */ - -/** This was TI's check whether to let TCP copy data or not - * \#define HTTP_IS_DATA_VOLATILE(hs) ((hs->file < (char *)0x20000000) ? 0 : TCP_WRITE_FLAG_COPY) - */ -#ifndef HTTP_IS_DATA_VOLATILE -#if LWIP_HTTPD_SSI -/* Copy for SSI files, no copy for non-SSI files */ -#define HTTP_IS_DATA_VOLATILE(hs) ((hs)->ssi ? TCP_WRITE_FLAG_COPY : 0) -#else /* LWIP_HTTPD_SSI */ -/** Default: don't copy if the data is sent from file-system directly */ -#define HTTP_IS_DATA_VOLATILE(hs) (((hs->file != NULL) && (hs->handle != NULL) && (hs->file == \ - (const char*)hs->handle->data + hs->handle->len - hs->left)) \ - ? 0 : TCP_WRITE_FLAG_COPY) -#endif /* LWIP_HTTPD_SSI */ +#if LWIP_HTTPD_DYNAMIC_FILE_READ +#define HTTP_IS_DYNAMIC_FILE(hs) ((hs)->buf != NULL) +#else +#define HTTP_IS_DYNAMIC_FILE(hs) 0 #endif -/** Default: headers are sent from ROM */ +/* This defines checks whether tcp_write has to copy data or not */ + +#ifndef HTTP_IS_DATA_VOLATILE +/** tcp_write does not have to copy data when sent from rom-file-system directly */ +#define HTTP_IS_DATA_VOLATILE(hs) (HTTP_IS_DYNAMIC_FILE(hs) ? TCP_WRITE_FLAG_COPY : 0) +#endif +/** Default: dynamic headers are sent from ROM (non-dynamic headers are handled like file data) */ #ifndef HTTP_IS_HDR_VOLATILE -#define HTTP_IS_HDR_VOLATILE(hs, ptr) 0 +#define HTTP_IS_HDR_VOLATILE(hs, ptr) 0 #endif /* Return values for http_send_*() */ +#define HTTP_DATA_TO_SEND_FREED 3 #define HTTP_DATA_TO_SEND_BREAK 2 #define HTTP_DATA_TO_SEND_CONTINUE 1 #define HTTP_NO_DATA_TO_SEND 0 -typedef struct -{ +typedef struct { const char *name; u8_t shtml; } default_filename; -const default_filename g_psDefaultFilenames[] = { +static const default_filename httpd_default_filenames[] = { {"/index.shtml", 1 }, {"/index.ssi", 1 }, {"/index.shtm", 1 }, @@ -154,12 +159,11 @@ const default_filename g_psDefaultFilenames[] = { {"/index.htm", 0 } }; -#define NUM_DEFAULT_FILENAMES (sizeof(g_psDefaultFilenames) / \ - sizeof(default_filename)) +#define NUM_DEFAULT_FILENAMES LWIP_ARRAYSIZE(httpd_default_filenames) #if LWIP_HTTPD_SUPPORT_REQUESTLIST /** HTTP request is copied here from pbufs for simple parsing */ -static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH+1]; +static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH + 1]; #endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ #if LWIP_HTTPD_SUPPORT_POST @@ -173,7 +177,7 @@ static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH+1]; #if LWIP_HTTPD_URI_BUF_LEN /* Filename for response file to send when POST is finished or * search for default files when a directory is requested. */ -static char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN+1]; +static char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN + 1]; #endif #if LWIP_HTTPD_DYNAMIC_HEADERS @@ -181,11 +185,11 @@ static char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN+1]; * requested file. */ #define NUM_FILE_HDR_STRINGS 5 -#define HDR_STRINGS_IDX_HTTP_STATUS 0 /* e.g. "HTTP/1.0 200 OK\r\n" */ -#define HDR_STRINGS_IDX_SERVER_NAME 1 /* e.g. "Server: "HTTPD_SERVER_AGENT"\r\n" */ -#define HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE 2 /* e.g. "Content-Length: xy\r\n" and/or "Connection: keep-alive\r\n" */ -#define HDR_STRINGS_IDX_CONTENT_LEN_NR 3 /* the byte count, when content-length is used */ -#define HDR_STRINGS_IDX_CONTENT_TYPE 4 /* the content type (or default answer content type including default document) */ +#define HDR_STRINGS_IDX_HTTP_STATUS 0 /* e.g. "HTTP/1.0 200 OK\r\n" */ +#define HDR_STRINGS_IDX_SERVER_NAME 1 /* e.g. "Server: "HTTPD_SERVER_AGENT"\r\n" */ +#define HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE 2 /* e.g. "Content-Length: xy\r\n" and/or "Connection: keep-alive\r\n" */ +#define HDR_STRINGS_IDX_CONTENT_LEN_NR 3 /* the byte count, when content-length is used */ +#define HDR_STRINGS_IDX_CONTENT_TYPE 4 /* the content type (or default answer content type including default document) */ /* The dynamically generated Content-Length buffer needs space for CRLF + NULL */ #define LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET 3 @@ -220,11 +224,18 @@ struct http_ssi_state { #if LWIP_HTTPD_SSI_MULTIPART u16_t tag_part; /* Counter passed to and changed by tag insertion function to insert multiple times */ #endif /* LWIP_HTTPD_SSI_MULTIPART */ + u8_t tag_type; /* index into http_ssi_tag_desc array */ u8_t tag_name_len; /* Length of the tag name in string tag_name */ char tag_name[LWIP_HTTPD_MAX_TAG_NAME_LEN + 1]; /* Last tag name extracted */ char tag_insert[LWIP_HTTPD_MAX_TAG_INSERT_LEN + 1]; /* Insert string for tag_name */ enum tag_check_state tag_state; /* State of the tag processor */ }; + +struct http_ssi_tag_description { + const char *lead_in; + const char *lead_out; +}; + #endif /* LWIP_HTTPD_SSI */ struct http_state { @@ -235,7 +246,7 @@ struct http_state { struct fs_file *handle; const char *file; /* Pointer to first unsent byte in buf. */ - struct tcp_pcb *pcb; + struct altcp_pcb *pcb; #if LWIP_HTTPD_SUPPORT_REQUESTLIST struct pbuf *req; #endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ @@ -294,41 +305,44 @@ LWIP_MEMPOOL_DECLARE(HTTPD_SSI_STATE, MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS, sizeof( #endif /* LWIP_HTTPD_SSI */ #endif /* HTTPD_USE_MEM_POOL */ -static err_t http_close_conn(struct tcp_pcb *pcb, struct http_state *hs); -static err_t http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn); +static err_t http_close_conn(struct altcp_pcb *pcb, struct http_state *hs); +static err_t http_close_or_abort_conn(struct altcp_pcb *pcb, struct http_state *hs, u8_t abort_conn); static err_t http_find_file(struct http_state *hs, const char *uri, int is_09); -static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check, char* params); -static err_t http_poll(void *arg, struct tcp_pcb *pcb); -static u8_t http_check_eof(struct tcp_pcb *pcb, struct http_state *hs); +static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check, char *params); +static err_t http_poll(void *arg, struct altcp_pcb *pcb); +static u8_t http_check_eof(struct altcp_pcb *pcb, struct http_state *hs); #if LWIP_HTTPD_FS_ASYNC_READ static void http_continue(void *connection); #endif /* LWIP_HTTPD_FS_ASYNC_READ */ #if LWIP_HTTPD_SSI /* SSI insert handler function pointer. */ -tSSIHandler g_pfnSSIHandler; +static tSSIHandler httpd_ssi_handler; #if !LWIP_HTTPD_SSI_RAW -int g_iNumTags; -const char **g_ppcTags; +static int httpd_num_tags; +static const char **httpd_tags; #endif /* !LWIP_HTTPD_SSI_RAW */ -#define LEN_TAG_LEAD_IN 5 -const char * const g_pcTagLeadIn = ""}, + {"/*#", "*/"} +}; -#define LEN_TAG_LEAD_OUT 3 -const char * const g_pcTagLeadOut = "-->"; #endif /* LWIP_HTTPD_SSI */ #if LWIP_HTTPD_CGI /* CGI handler information */ -const tCGI *g_pCGIs; -int g_iNumCGIs; -int http_cgi_paramcount; +static const tCGI *httpd_cgis; +static int httpd_num_cgis; +static int http_cgi_paramcount; #define http_cgi_params hs->params #define http_cgi_param_vals hs->param_vals #elif LWIP_HTTPD_CGI_SSI -char *http_cgi_params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */ -char *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */ +static char *http_cgi_params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */ +static char *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */ #endif /* LWIP_HTTPD_CGI */ #if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED @@ -353,7 +367,7 @@ http_remove_connection(struct http_state *hs) http_connections = hs->next; } else { struct http_state *last; - for(last = http_connections; last->next != NULL; last = last->next) { + for (last = http_connections; last->next != NULL; last = last->next) { if (last->next == hs) { last->next = hs->next; break; @@ -368,7 +382,7 @@ http_kill_oldest_connection(u8_t ssi_required) { struct http_state *hs = http_connections; struct http_state *hs_free_next = NULL; - while(hs && hs->next) { + while (hs && hs->next) { #if LWIP_HTTPD_SSI if (ssi_required) { if (hs->next->ssi != NULL) { @@ -400,7 +414,7 @@ http_kill_oldest_connection(u8_t ssi_required) #if LWIP_HTTPD_SSI /** Allocate as struct http_ssi_state. */ -static struct http_ssi_state* +static struct http_ssi_state * http_ssi_state_alloc(void) { struct http_ssi_state *ret = HTTP_ALLOC_SSI_STATE(); @@ -429,7 +443,7 @@ http_ssi_state_free(struct http_ssi_state *ssi) /** Initialize a struct http_state. */ static void -http_state_init(struct http_state* hs) +http_state_init(struct http_state *hs) { /* Initialize the structure. */ memset(hs, 0, sizeof(struct http_state)); @@ -440,7 +454,7 @@ http_state_init(struct http_state* hs) } /** Allocate a struct http_state. */ -static struct http_state* +static struct http_state * http_state_alloc(void) { struct http_state *ret = HTTP_ALLOC_HTTP_STATE(); @@ -463,12 +477,12 @@ http_state_alloc(void) static void http_state_eof(struct http_state *hs) { - if(hs->handle) { + if (hs->handle) { #if LWIP_HTTPD_TIMING u32_t ms_needed = sys_now() - hs->time_started; - u32_t needed = LWIP_MAX(1, (ms_needed/100)); + u32_t needed = LWIP_MAX(1, (ms_needed / 100)); LWIP_DEBUGF(HTTPD_DEBUG_TIMING, ("httpd: needed %"U32_F" ms to send file of %d bytes -> %"U32_F" bytes/sec\n", - ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed))); + ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed))); #endif /* LWIP_HTTPD_TIMING */ fs_close(hs->handle); hs->handle = NULL; @@ -508,7 +522,7 @@ http_state_free(struct http_state *hs) /** Call tcp_write() in a loop trying smaller and smaller length * - * @param pcb tcp_pcb to send + * @param pcb altcp_pcb to send * @param ptr Data to send * @param length Length of data to send (in/out: on return, contains the * amount of data sent) @@ -516,7 +530,7 @@ http_state_free(struct http_state *hs) * @return the return value of tcp_write */ static err_t -http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) +http_write(struct altcp_pcb *pcb, const void *ptr, u16_t *length, u8_t apiflags) { u16_t len, max_len; err_t err; @@ -526,30 +540,30 @@ http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) return ERR_OK; } /* We cannot send more data than space available in the send buffer. */ - max_len = tcp_sndbuf(pcb); + max_len = altcp_sndbuf(pcb); if (max_len < len) { len = max_len; } #ifdef HTTPD_MAX_WRITE_LEN /* Additional limitation: e.g. don't enqueue more than 2*mss at once */ max_len = HTTPD_MAX_WRITE_LEN(pcb); - if(len > max_len) { + if (len > max_len) { len = max_len; } #endif /* HTTPD_MAX_WRITE_LEN */ do { - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying go send %d bytes\n", len)); - err = tcp_write(pcb, ptr, len, apiflags); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying to send %d bytes\n", len)); + err = altcp_write(pcb, ptr, len, apiflags); if (err == ERR_MEM) { - if ((tcp_sndbuf(pcb) == 0) || - (tcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) { - /* no need to try smaller sizes */ - len = 1; + if ((altcp_sndbuf(pcb) == 0) || + (altcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) { + /* no need to try smaller sizes */ + len = 1; } else { len /= 2; } - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, - ("Send failed, trying less (%d bytes)\n", len)); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, + ("Send failed, trying less (%d bytes)\n", len)); } } while ((err == ERR_MEM) && (len > 1)); @@ -562,10 +576,10 @@ http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) } #if LWIP_HTTPD_SUPPORT_11_KEEPALIVE - /* ensure nagle is normally enabled (only disabled for persistent connections - when all data has been enqueued but the connection stays open for the next - request */ - tcp_nagle_enable(pcb); + /* ensure nagle is normally enabled (only disabled for persistent connections + when all data has been enqueued but the connection stays open for the next + request */ + altcp_nagle_enable(pcb); #endif return err; @@ -579,16 +593,16 @@ http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) * @param hs connection state to free */ static err_t -http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn) +http_close_or_abort_conn(struct altcp_pcb *pcb, struct http_state *hs, u8_t abort_conn) { err_t err; - LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void*)pcb)); + LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void *)pcb)); #if LWIP_HTTPD_SUPPORT_POST if (hs != NULL) { if ((hs->post_content_len_left != 0) #if LWIP_HTTPD_POST_MANUAL_WND - || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0)) + || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0)) #endif /* LWIP_HTTPD_POST_MANUAL_WND */ ) { /* make sure the post code knows that the connection is closed */ @@ -599,24 +613,24 @@ http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_ #endif /* LWIP_HTTPD_SUPPORT_POST*/ - tcp_arg(pcb, NULL); - tcp_recv(pcb, NULL); - tcp_err(pcb, NULL); - tcp_poll(pcb, NULL, 0); - tcp_sent(pcb, NULL); + altcp_arg(pcb, NULL); + altcp_recv(pcb, NULL); + altcp_err(pcb, NULL); + altcp_poll(pcb, NULL, 0); + altcp_sent(pcb, NULL); if (hs != NULL) { http_state_free(hs); } if (abort_conn) { - tcp_abort(pcb); + altcp_abort(pcb); return ERR_OK; } - err = tcp_close(pcb); + err = altcp_close(pcb); if (err != ERR_OK) { - LWIP_DEBUGF(HTTPD_DEBUG, ("Error %d closing %p\n", err, (void*)pcb)); + LWIP_DEBUGF(HTTPD_DEBUG, ("Error %d closing %p\n", err, (void *)pcb)); /* error closing, try again later in poll */ - tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); + altcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); } return err; } @@ -629,16 +643,16 @@ http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_ * @param hs connection state to free */ static err_t -http_close_conn(struct tcp_pcb *pcb, struct http_state *hs) +http_close_conn(struct altcp_pcb *pcb, struct http_state *hs) { - return http_close_or_abort_conn(pcb, hs, 0); + return http_close_or_abort_conn(pcb, hs, 0); } /** End of file: either close the connection (Connection: close) or * close the file (Connection: keep-alive) */ static void -http_eof(struct tcp_pcb *pcb, struct http_state *hs) +http_eof(struct altcp_pcb *pcb, struct http_state *hs) { /* HTTP/1.1 persistent connection? (Not supported for SSI) */ #if LWIP_HTTPD_SUPPORT_11_KEEPALIVE @@ -652,7 +666,7 @@ http_eof(struct tcp_pcb *pcb, struct http_state *hs) hs->keepalive = 1; http_add_connection(hs); /* ensure nagle doesn't interfere with sending all data as fast as possible: */ - tcp_nagle_disable(pcb); + altcp_nagle_disable(pcb); } else #endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */ { @@ -680,8 +694,8 @@ extract_uri_parameters(struct http_state *hs, char *params) LWIP_UNUSED_ARG(hs); /* If we have no parameters at all, return immediately. */ - if(!params || (params[0] == '\0')) { - return(0); + if (!params || (params[0] == '\0')) { + return (0); } /* Get a pointer to our first parameter */ @@ -689,7 +703,7 @@ extract_uri_parameters(struct http_state *hs, char *params) /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ - for(loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) { + for (loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) { /* Save the name of the parameter */ http_cgi_params[loop] = pair; @@ -700,25 +714,25 @@ extract_uri_parameters(struct http_state *hs, char *params) /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, '&'); - if(pair) { + if (pair) { *pair = '\0'; pair++; } else { - /* We didn't find a new parameter so find the end of the URI and - * replace the space with a '\0' */ - pair = strchr(equals, ' '); - if(pair) { - *pair = '\0'; - } + /* We didn't find a new parameter so find the end of the URI and + * replace the space with a '\0' */ + pair = strchr(equals, ' '); + if (pair) { + *pair = '\0'; + } - /* Revert to NULL so that we exit the loop as expected. */ - pair = NULL; + /* Revert to NULL so that we exit the loop as expected. */ + pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, '='); - if(equals) { + if (equals) { *equals = '\0'; http_cgi_param_vals[loop] = equals + 1; } else { @@ -745,7 +759,7 @@ static void get_tag_insert(struct http_state *hs) { #if LWIP_HTTPD_SSI_RAW - const char* tag; + const char *tag; #else /* LWIP_HTTPD_SSI_RAW */ int tag; #endif /* LWIP_HTTPD_SSI_RAW */ @@ -766,9 +780,9 @@ get_tag_insert(struct http_state *hs) tag = ssi->tag_name; #endif - if(g_pfnSSIHandler + if (httpd_ssi_handler #if !LWIP_HTTPD_SSI_RAW - && g_ppcTags && g_iNumTags + && httpd_tags && httpd_num_tags #endif /* !LWIP_HTTPD_SSI_RAW */ ) { @@ -776,19 +790,19 @@ get_tag_insert(struct http_state *hs) #if LWIP_HTTPD_SSI_RAW { #else /* LWIP_HTTPD_SSI_RAW */ - for(tag = 0; tag < g_iNumTags; tag++) { - if(strcmp(ssi->tag_name, g_ppcTags[tag]) == 0) + for (tag = 0; tag < httpd_num_tags; tag++) { + if (strcmp(ssi->tag_name, httpd_tags[tag]) == 0) #endif /* LWIP_HTTPD_SSI_RAW */ { - ssi->tag_insert_len = g_pfnSSIHandler(tag, ssi->tag_insert, - LWIP_HTTPD_MAX_TAG_INSERT_LEN + ssi->tag_insert_len = httpd_ssi_handler(tag, ssi->tag_insert, + LWIP_HTTPD_MAX_TAG_INSERT_LEN #if LWIP_HTTPD_SSI_MULTIPART - , current_tag_part, &ssi->tag_part + , current_tag_part, &ssi->tag_part #endif /* LWIP_HTTPD_SSI_MULTIPART */ #if LWIP_HTTPD_FILE_STATE - , (hs->handle ? hs->handle->state : NULL) + , (hs->handle ? hs->handle->state : NULL) #endif /* LWIP_HTTPD_FILE_STATE */ - ); + ); #if LWIP_HTTPD_SSI_RAW if (ssi->tag_insert_len != HTTPD_SSI_TAG_UNKNOWN) #endif /* LWIP_HTTPD_SSI_RAW */ @@ -807,7 +821,7 @@ get_tag_insert(struct http_state *hs) #define UNKNOWN_TAG2_TEXT "***" #define UNKNOWN_TAG2_LEN 7 len = LWIP_MIN(sizeof(ssi->tag_name), LWIP_MIN(strlen(ssi->tag_name), - LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN))); + LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN))); MEMCPY(ssi->tag_insert, UNKNOWN_TAG1_TEXT, UNKNOWN_TAG1_LEN); MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN], ssi->tag_name, len); MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN + len], UNKNOWN_TAG2_TEXT, UNKNOWN_TAG2_LEN); @@ -831,12 +845,11 @@ get_http_headers(struct http_state *hs, const char *uri) char *tmp; char *ext; char *vars; - u8_t add_content_len; /* In all cases, the second header we send is the server identification so set it here. */ hs->hdrs[HDR_STRINGS_IDX_SERVER_NAME] = g_psHTTPHeaderStrings[HTTP_HDR_SERVER]; - hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = NULL; + hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = NULL; hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = NULL; /* Is this a normal file or the special case we use to send back the @@ -871,10 +884,10 @@ get_http_headers(struct http_state *hs, const char *uri) hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_OK]; } - /* Determine if the URI has any variables and, if so, temporarily remove + /* Determine if the URI has any variables and, if so, temporarily remove them. */ vars = strchr(uri, '?'); - if(vars) { + if (vars) { *vars = '\0'; } @@ -890,7 +903,7 @@ get_http_headers(struct http_state *hs, const char *uri) /* Now determine the content type and add the relevant header for that. */ for (content_type = 0; content_type < NUM_HTTP_HEADERS; content_type++) { /* Have we found a matching extension? */ - if(!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) { + if (!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) { break; } } @@ -914,9 +927,8 @@ get_http_headers(struct http_state *hs, const char *uri) return; } #endif /* LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI */ - add_content_len = 1; /* Did we find a matching extension? */ - if(content_type < NUM_HTTP_HEADERS) { + if (content_type < NUM_HTTP_HEADERS) { /* yes, store it */ hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaders[content_type].content_type; } else if (!ext) { @@ -926,23 +938,35 @@ get_http_headers(struct http_state *hs, const char *uri) /* No - use the default, plain text file type. */ hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_DEFAULT_TYPE; } - /* Add content-length header? */ + /* Set up to send the first header string. */ + hs->hdr_index = 0; + hs->hdr_pos = 0; +} + +/* Add content-length header? */ +static void +get_http_content_length(struct http_state *hs) +{ + u8_t add_content_len = 0; + + LWIP_ASSERT("already been here?", hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] == NULL); + + add_content_len = 0; #if LWIP_HTTPD_SSI - if (hs->ssi != NULL) { - add_content_len = 0; /* @todo: get maximum file length from SSI */ - } else + if (hs->ssi == NULL) /* @todo: get maximum file length from SSI */ #endif /* LWIP_HTTPD_SSI */ - if ((hs->handle == NULL) || - ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) { - add_content_len = 0; + { + if ((hs->handle != NULL) && (hs->handle->flags & FS_FILE_FLAGS_HEADER_PERSISTENT)) { + add_content_len = 1; + } } if (add_content_len) { size_t len; lwip_itoa(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE, - hs->handle->len); + hs->handle->len); len = strlen(hs->hdr_content_len); if (len <= LWIP_HTTPD_MAX_CONTENT_LEN_SIZE - LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET) { - SMEMCPY(&hs->hdr_content_len[len], CRLF "\0", 3); + SMEMCPY(&hs->hdr_content_len[len], CRLF, 3); hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = hs->hdr_content_len; } else { add_content_len = 0; @@ -950,19 +974,16 @@ get_http_headers(struct http_state *hs, const char *uri) } #if LWIP_HTTPD_SUPPORT_11_KEEPALIVE if (add_content_len) { - hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_KEEPALIVE_LEN]; + hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_KEEPALIVE_LEN]; } else { - hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE]; + hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE]; + hs->keepalive = 0; } #else /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */ if (add_content_len) { - hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH]; + hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH]; } #endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */ - - /* Set up to send the first header string. */ - hs->hdr_index = 0; - hs->hdr_pos = 0; } /** Sub-function of http_send(): send dynamic headers @@ -971,20 +992,26 @@ get_http_headers(struct http_state *hs, const char *uri) * - HTTP_DATA_TO_SEND_CONTINUE: continue with sending HTTP body * - HTTP_DATA_TO_SEND_BREAK: data has been enqueued, headers pending, * so don't send HTTP body yet + * - HTTP_DATA_TO_SEND_FREED: http_state and pcb are already freed */ static u8_t -http_send_headers(struct tcp_pcb *pcb, struct http_state *hs) +http_send_headers(struct altcp_pcb *pcb, struct http_state *hs) { err_t err; u16_t len; u8_t data_to_send = HTTP_NO_DATA_TO_SEND; u16_t hdrlen, sendlen; + if (hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEEPALIVE] == NULL) { + /* set up "content-length" and "connection:" headers */ + get_http_content_length(hs); + } + /* How much data can we send? */ - len = tcp_sndbuf(pcb); + len = altcp_sndbuf(pcb); sendlen = len; - while(len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) { + while (len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) { const void *ptr; u16_t old_sendlen; u8_t apiflags; @@ -1011,7 +1038,7 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs) /* Remember that we added some more data to be transmitted. */ data_to_send = HTTP_DATA_TO_SEND_CONTINUE; } else if (err != ERR_OK) { - /* special case: http_write does not try to send 1 byte */ + /* special case: http_write does not try to send 1 byte */ sendlen = 0; } @@ -1020,12 +1047,12 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs) len -= sendlen; /* Have we finished sending this string? */ - if(hs->hdr_pos == hdrlen) { + if (hs->hdr_pos == hdrlen) { /* Yes - move on to the next one */ hs->hdr_index++; /* skip headers that are NULL (not all headers are required) */ while ((hs->hdr_index < NUM_FILE_HDR_STRINGS) && - (hs->hdrs[hs->hdr_index] == NULL)) { + (hs->hdrs[hs->hdr_index] == NULL)) { hs->hdr_index++; } hs->hdr_pos = 0; @@ -1036,15 +1063,19 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs) /* When we are at the end of the headers, check for data to send * instead of waiting for ACK from remote side to continue * (which would happen when sending files from async read). */ - if(http_check_eof(pcb, hs)) { - data_to_send = HTTP_DATA_TO_SEND_CONTINUE; + if (http_check_eof(pcb, hs)) { + data_to_send = HTTP_DATA_TO_SEND_BREAK; + } else { + /* At this point, for non-keepalive connections, hs is deallocated an + pcb is closed. */ + return HTTP_DATA_TO_SEND_FREED; } } /* If we get here and there are still header bytes to send, we send * the header information we just wrote immediately. If there are no * more headers to send, but we do have file data to send, drop through * to try to send some file data too. */ - if((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) { + if ((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) { LWIP_DEBUGF(HTTPD_DEBUG, ("tcp_output\n")); return HTTP_DATA_TO_SEND_BREAK; } @@ -1059,7 +1090,7 @@ http_send_headers(struct tcp_pcb *pcb, struct http_state *hs) * 1 if the file is not finished and data has been read */ static u8_t -http_check_eof(struct tcp_pcb *pcb, struct http_state *hs) +http_check_eof(struct altcp_pcb *pcb, struct http_state *hs) { int bytes_left; #if LWIP_HTTPD_DYNAMIC_FILE_READ @@ -1084,13 +1115,13 @@ http_check_eof(struct tcp_pcb *pcb, struct http_state *hs) } #if LWIP_HTTPD_DYNAMIC_FILE_READ /* Do we already have a send buffer allocated? */ - if(hs->buf) { + if (hs->buf) { /* Yes - get the length of the buffer */ count = LWIP_MIN(hs->buf_len, bytes_left); } else { /* We don't have a send buffer so allocate one now */ - count = tcp_sndbuf(pcb); - if(bytes_left < count) { + count = altcp_sndbuf(pcb); + if (bytes_left < count) { count = bytes_left; } #ifdef HTTPD_MAX_WRITE_LEN @@ -1101,7 +1132,7 @@ http_check_eof(struct tcp_pcb *pcb, struct http_state *hs) } #endif /* HTTPD_MAX_WRITE_LEN */ do { - hs->buf = (char*)mem_malloc((mem_size_t)count); + hs->buf = (char *)mem_malloc((mem_size_t)count); if (hs->buf != NULL) { hs->buf_len = count; break; @@ -1158,7 +1189,7 @@ http_check_eof(struct tcp_pcb *pcb, struct http_state *hs) * - 0: no data has been written (no need to call tcp_output) */ static u8_t -http_send_data_nonssi(struct tcp_pcb *pcb, struct http_state *hs) +http_send_data_nonssi(struct altcp_pcb *pcb, struct http_state *hs) { err_t err; u16_t len; @@ -1185,11 +1216,12 @@ http_send_data_nonssi(struct tcp_pcb *pcb, struct http_state *hs) * - 0: no data has been written (no need to call tcp_output) */ static u8_t -http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) +http_send_data_ssi(struct altcp_pcb *pcb, struct http_state *hs) { err_t err = ERR_OK; u16_t len; u8_t data_to_send = 0; + u8_t tag_type; struct http_ssi_state *ssi = hs->ssi; LWIP_ASSERT("ssi != NULL", ssi != NULL); @@ -1199,10 +1231,10 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) * have to split the insert string between two tcp_write operations. */ /* How much data could we send? */ - len = tcp_sndbuf(pcb); + len = altcp_sndbuf(pcb); /* Do we have remaining data to send before parsing more? */ - if(ssi->parsed > hs->file) { + if (ssi->parsed > hs->file) { len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff); err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); @@ -1213,7 +1245,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) } /* If the send buffer is full, return now. */ - if(tcp_sndbuf(pcb) == 0) { + if (altcp_sndbuf(pcb) == 0) { return data_to_send; } } @@ -1222,22 +1254,26 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) /* We have sent all the data that was already parsed so continue parsing * the buffer contents looking for SSI tags. */ - while((ssi->parse_left) && (err == ERR_OK)) { + while (((ssi->tag_state == TAG_SENDING) || ssi->parse_left) && (err == ERR_OK)) { if (len == 0) { return data_to_send; } - switch(ssi->tag_state) { + switch (ssi->tag_state) { case TAG_NONE: /* We are not currently processing an SSI tag so scan for the * start of the lead-in marker. */ - if(*ssi->parsed == g_pcTagLeadIn[0]) { - /* We found what could be the lead-in for a new tag so change - * state appropriately. */ - ssi->tag_state = TAG_LEADIN; - ssi->tag_index = 1; -#if !LWIP_HTTPD_SSI_INCLUDE_TAG - ssi->tag_started = ssi->parsed; -#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */ + for (tag_type = 0; tag_type < LWIP_ARRAYSIZE(http_ssi_tag_desc); tag_type++) { + if (*ssi->parsed == http_ssi_tag_desc[tag_type].lead_in[0]) { + /* We found what could be the lead-in for a new tag so change + * state appropriately. */ + ssi->tag_type = tag_type; + ssi->tag_state = TAG_LEADIN; + ssi->tag_index = 1; + #if !LWIP_HTTPD_SSI_INCLUDE_TAG + ssi->tag_started = ssi->parsed; + #endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */ + break; + } } /* Move on to the next character in the buffer */ @@ -1250,12 +1286,12 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) * the tag name. */ /* Have we reached the end of the leadin? */ - if(ssi->tag_index == LEN_TAG_LEAD_IN) { + if (http_ssi_tag_desc[ssi->tag_type].lead_in[ssi->tag_index] == 0) { ssi->tag_index = 0; ssi->tag_state = TAG_FOUND; } else { /* Have we found the next character we expect for the tag leadin? */ - if(*ssi->parsed == g_pcTagLeadIn[ssi->tag_index]) { + if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_in[ssi->tag_index]) { /* Yes - move to the next one unless we have found the complete * leadin, in which case we start looking for the tag itself */ ssi->tag_index++; @@ -1265,6 +1301,22 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) ssi->tag_state = TAG_NONE; } +#if LWIP_HTTPD_DYNAMIC_FILE_READ && !LWIP_HTTPD_SSI_INCLUDE_TAG + if ((ssi->tag_state == TAG_NONE) && + (ssi->parsed - hs->file < ssi->tag_index)) { + for(u16_t i = 0;i < ssi->tag_index;i++) { + ssi->tag_insert[i] = http_ssi_tag_desc[ssi->tag_type].lead_in[i]; + } + ssi->tag_insert_len = ssi->tag_index; + hs->file += ssi->parsed - hs->file; + hs->left -= ssi->parsed - hs->file; + ssi->tag_end = hs->file; + ssi->tag_index = 0; + ssi->tag_state = TAG_SENDING; + break; + } +#endif + /* Move on to the next character in the buffer */ ssi->parse_left--; ssi->parsed++; @@ -1277,9 +1329,9 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) /* Remove leading whitespace between the tag leading and the first * tag name character. */ - if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') || - (*ssi->parsed == '\t') || (*ssi->parsed == '\n') || - (*ssi->parsed == '\r'))) { + if ((ssi->tag_index == 0) && ((*ssi->parsed == ' ') || + (*ssi->parsed == '\t') || (*ssi->parsed == '\n') || + (*ssi->parsed == '\r'))) { /* Move on to the next character in the buffer */ ssi->parse_left--; ssi->parsed++; @@ -1288,11 +1340,11 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) /* Have we found the end of the tag name? This is signalled by * us finding the first leadout character or whitespace */ - if((*ssi->parsed == g_pcTagLeadOut[0]) || - (*ssi->parsed == ' ') || (*ssi->parsed == '\t') || - (*ssi->parsed == '\n') || (*ssi->parsed == '\r')) { + if ((*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[0]) || + (*ssi->parsed == ' ') || (*ssi->parsed == '\t') || + (*ssi->parsed == '\n') || (*ssi->parsed == '\r')) { - if(ssi->tag_index == 0) { + if (ssi->tag_index == 0) { /* We read a zero length tag so ignore it. */ ssi->tag_state = TAG_NONE; } else { @@ -1302,7 +1354,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) LWIP_ASSERT("ssi->tag_index <= 0xff", ssi->tag_index <= 0xff); ssi->tag_name_len = (u8_t)ssi->tag_index; ssi->tag_name[ssi->tag_index] = '\0'; - if(*ssi->parsed == g_pcTagLeadOut[0]) { + if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[0]) { ssi->tag_index = 1; } else { ssi->tag_index = 0; @@ -1310,7 +1362,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) } } else { /* This character is part of the tag name so save it */ - if(ssi->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) { + if (ssi->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) { ssi->tag_name[ssi->tag_index++] = *ssi->parsed; } else { /* The tag was too long so ignore it. */ @@ -1328,9 +1380,9 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) case TAG_LEADOUT: /* Remove leading whitespace between the tag leading and the first * tag leadout character. */ - if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') || - (*ssi->parsed == '\t') || (*ssi->parsed == '\n') || - (*ssi->parsed == '\r'))) { + if ((ssi->tag_index == 0) && ((*ssi->parsed == ' ') || + (*ssi->parsed == '\t') || (*ssi->parsed == '\n') || + (*ssi->parsed == '\r'))) { /* Move on to the next character in the buffer */ ssi->parse_left--; ssi->parsed++; @@ -1338,7 +1390,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) } /* Have we found the next character we expect for the tag leadout? */ - if(*ssi->parsed == g_pcTagLeadOut[ssi->tag_index]) { + if (*ssi->parsed == http_ssi_tag_desc[ssi->tag_type].lead_out[ssi->tag_index]) { /* Yes - move to the next one unless we have found the complete * leadout, in which case we need to call the client to process * the tag. */ @@ -1346,8 +1398,9 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) /* Move on to the next character in the buffer */ ssi->parse_left--; ssi->parsed++; + ssi->tag_index++; - if(ssi->tag_index == (LEN_TAG_LEAD_OUT - 1)) { + if (http_ssi_tag_desc[ssi->tag_type].lead_out[ssi->tag_index] == 0) { /* Call the client to ask for the insert string for the * tag we just found. */ #if LWIP_HTTPD_SSI_MULTIPART @@ -1380,17 +1433,15 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) if (err == ERR_OK) { data_to_send = 1; #if !LWIP_HTTPD_SSI_INCLUDE_TAG - if(ssi->tag_started <= hs->file) { + if (ssi->tag_started <= hs->file) { /* pretend to have sent the tag, too */ - len += ssi->tag_end - ssi->tag_started; + len += (u16_t)(ssi->tag_end - ssi->tag_started); } #endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ hs->file += len; hs->left -= len; } } - } else { - ssi->tag_index++; } } else { /* We found an unexpected character so this is not a tag. Move @@ -1409,7 +1460,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) case TAG_SENDING: /* Do we have any remaining file data to send from the buffer prior * to the tag? */ - if(ssi->tag_end > hs->file) { + if (ssi->tag_end > hs->file) { /* How much of the data can we send? */ #if LWIP_HTTPD_SSI_INCLUDE_TAG len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff); @@ -1426,9 +1477,9 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) if (err == ERR_OK) { data_to_send = 1; #if !LWIP_HTTPD_SSI_INCLUDE_TAG - if(ssi->tag_started <= hs->file) { + if (ssi->tag_started <= hs->file) { /* pretend to have sent the tag, too */ - len += ssi->tag_end - ssi->tag_started; + len += (u16_t)(ssi->tag_end - ssi->tag_started); } #endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ hs->file += len; @@ -1436,7 +1487,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) } } else { #if LWIP_HTTPD_SSI_MULTIPART - if(ssi->tag_index >= ssi->tag_insert_len) { + if (ssi->tag_index >= ssi->tag_insert_len) { /* Did the last SSIHandler have more to send? */ if (ssi->tag_part != HTTPD_LAST_TAG_PART) { /* If so, call it again */ @@ -1447,7 +1498,7 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) #endif /* LWIP_HTTPD_SSI_MULTIPART */ /* Do we still have insert data left to send? */ - if(ssi->tag_index < ssi->tag_insert_len) { + if (ssi->tag_index < ssi->tag_insert_len) { /* We are sending the insert string itself. How much of the * insert can we send? */ len = (ssi->tag_insert_len - ssi->tag_index); @@ -1481,15 +1532,27 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) break; default: break; - } + } } } /* If we drop out of the end of the for loop, this implies we must have * file data to send so send it now. In TAG_SENDING state, we've already * handled this so skip the send if that's the case. */ - if((ssi->tag_state != TAG_SENDING) && (ssi->parsed > hs->file)) { - len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff); + if ((ssi->tag_state != TAG_SENDING) && (ssi->parsed > hs->file)) { +#if LWIP_HTTPD_DYNAMIC_FILE_READ && !LWIP_HTTPD_SSI_INCLUDE_TAG + if ((ssi->tag_state != TAG_NONE) && (ssi->tag_started > ssi->tag_end)) { + /* If we found tag on the edge of the read buffer: just throw away the first part + (we have copied/saved everything required for parsing on later). */ + len = (u16_t)(ssi->tag_started - hs->file); + hs->left -= (ssi->parsed - ssi->tag_started); + ssi->parsed = ssi->tag_started; + ssi->tag_started = hs->buf; + } else +#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ && !LWIP_HTTPD_SSI_INCLUDE_TAG */ + { + len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff); + } err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); if (err == ERR_OK) { @@ -1509,12 +1572,12 @@ http_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs) * @param hs connection state */ static u8_t -http_send(struct tcp_pcb *pcb, struct http_state *hs) +http_send(struct altcp_pcb *pcb, struct http_state *hs) { u8_t data_to_send = HTTP_NO_DATA_TO_SEND; - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_send: pcb=%p hs=%p left=%d\n", (void*)pcb, - (void*)hs, hs != NULL ? (int)hs->left : 0)); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_send: pcb=%p hs=%p left=%d\n", (void *)pcb, + (void *)hs, hs != NULL ? (int)hs->left : 0)); #if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND if (hs->unrecved_bytes != 0) { @@ -1539,8 +1602,9 @@ http_send(struct tcp_pcb *pcb, struct http_state *hs) /* Do we have any more header data to send for this file? */ if (hs->hdr_index < NUM_FILE_HDR_STRINGS) { data_to_send = http_send_headers(pcb, hs); - if ((data_to_send != HTTP_DATA_TO_SEND_CONTINUE) && - (hs->hdr_index < NUM_FILE_HDR_STRINGS)) { + if ((data_to_send == HTTP_DATA_TO_SEND_FREED) || + ((data_to_send != HTTP_DATA_TO_SEND_CONTINUE) && + (hs->hdr_index < NUM_FILE_HDR_STRINGS))) { return data_to_send; } } @@ -1555,7 +1619,7 @@ http_send(struct tcp_pcb *pcb, struct http_state *hs) } #if LWIP_HTTPD_SSI - if(hs->ssi) { + if (hs->ssi) { data_to_send = http_send_data_ssi(pcb, hs); } else #endif /* LWIP_HTTPD_SSI */ @@ -1563,7 +1627,7 @@ http_send(struct tcp_pcb *pcb, struct http_state *hs) data_to_send = http_send_data_nonssi(pcb, hs); } - if((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) { + if ((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) { /* We reached the end of the file so this request is done. * This adds the FIN flag right into the last data segment. */ LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n")); @@ -1585,8 +1649,7 @@ http_send(struct tcp_pcb *pcb, struct http_state *hs) static err_t http_find_error_file(struct http_state *hs, u16_t error_nr) { - const char *uri1, *uri2, *uri3; - err_t err; + const char *uri, *uri1, *uri2, *uri3; if (error_nr == 501) { uri1 = "/501.html"; @@ -1598,19 +1661,18 @@ http_find_error_file(struct http_state *hs, u16_t error_nr) uri2 = "/400.htm"; uri3 = "/400.shtml"; } - err = fs_open(&hs->file_handle, uri1); - if (err != ERR_OK) { - err = fs_open(&hs->file_handle, uri2); - if (err != ERR_OK) { - err = fs_open(&hs->file_handle, uri3); - if (err != ERR_OK) { - LWIP_DEBUGF(HTTPD_DEBUG, ("Error page for error %"U16_F" not found\n", - error_nr)); - return ERR_ARG; - } - } + if (fs_open(&hs->file_handle, uri1) == ERR_OK) { + uri = uri1; + } else if (fs_open(&hs->file_handle, uri2) == ERR_OK) { + uri = uri2; + } else if (fs_open(&hs->file_handle, uri3) == ERR_OK) { + uri = uri3; + } else { + LWIP_DEBUGF(HTTPD_DEBUG, ("Error page for error %"U16_F" not found\n", + error_nr)); + return ERR_ARG; } - return http_init_file(hs, &hs->file_handle, 0, NULL, 0, NULL); + return http_init_file(hs, &hs->file_handle, 0, uri, 0, NULL); } #else /* LWIP_HTTPD_SUPPORT_EXTSTATUS */ #define http_find_error_file(hs, error_nr) ERR_ARG @@ -1696,7 +1758,11 @@ http_post_rxpbuf(struct http_state *hs, struct pbuf *p) /* prevent connection being closed if httpd_post_data_recved() is called nested */ hs->unrecved_bytes++; #endif - err = httpd_post_receive_data(hs, p); + if (p != NULL) { + err = httpd_post_receive_data(hs, p); + } else { + err = ERR_OK; + } #if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND hs->unrecved_bytes--; #endif @@ -1707,7 +1773,7 @@ http_post_rxpbuf(struct http_state *hs, struct pbuf *p) if (hs->post_content_len_left == 0) { #if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND if (hs->unrecved_bytes != 0) { - return ERR_OK; + return ERR_OK; } #endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */ /* application error or POST finished */ @@ -1737,7 +1803,7 @@ http_post_request(struct pbuf *inp, struct http_state *hs, { err_t err; /* search for end-of-header (first double-CRLF) */ - char* crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data)); + char *crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data)); if (crlfcrlf != NULL) { /* search for "Content-Length: " */ @@ -1767,7 +1833,7 @@ http_post_request(struct pbuf *inp, struct http_state *hs, /* trim http header */ *crlfcrlf = 0; err = httpd_post_begin(hs, uri, hdr_start_after_uri, hdr_data_len, content_len, - http_uri_buf, LWIP_HTTPD_URI_BUF_LEN, &post_auto_wnd); + http_uri_buf, LWIP_HTTPD_URI_BUF_LEN, &post_auto_wnd); if (err == ERR_OK) { /* try to pass in data of the first pbuf(s) */ struct pbuf *q = inp; @@ -1779,13 +1845,13 @@ http_post_request(struct pbuf *inp, struct http_state *hs, hs->post_content_len_left = (u32_t)content_len; /* get to the pbuf where the body starts */ - while((q != NULL) && (q->len <= start_offset)) { + while ((q != NULL) && (q->len <= start_offset)) { start_offset -= q->len; q = q->next; } if (q != NULL) { /* hide the remaining HTTP header */ - pbuf_header(q, -(s16_t)start_offset); + pbuf_remove_header(q, start_offset); #if LWIP_HTTPD_POST_MANUAL_WND if (!post_auto_wnd) { /* already tcp_recved() this data... */ @@ -1806,7 +1872,7 @@ http_post_request(struct pbuf *inp, struct http_state *hs, } } else { LWIP_DEBUGF(HTTPD_DEBUG, ("POST received invalid Content-Length: %s\n", - content_len_num)); + content_len_num)); return ERR_ARG; } } @@ -1826,7 +1892,9 @@ http_post_request(struct pbuf *inp, struct http_state *hs, } #if LWIP_HTTPD_POST_MANUAL_WND -/** A POST implementation can call this function to update the TCP window. +/** + * @ingroup httpd + * A POST implementation can call this function to update the TCP window. * This can be used to throttle data reception (e.g. when received data is * programmed to flash and data is received faster than programmed). * @@ -1836,7 +1904,7 @@ http_post_request(struct pbuf *inp, struct http_state *hs, */ void httpd_post_data_recved(void *connection, u16_t recved_len) { - struct http_state *hs = (struct http_state*)connection; + struct http_state *hs = (struct http_state *)connection; if (hs != NULL) { if (hs->no_auto_wnd) { u16_t len = recved_len; @@ -1849,7 +1917,7 @@ void httpd_post_data_recved(void *connection, u16_t recved_len) } if (hs->pcb != NULL) { if (len != 0) { - tcp_recved(hs->pcb, len); + altcp_recved(hs->pcb, len); } if ((hs->post_content_len_left == 0) && (hs->unrecved_bytes == 0)) { /* finished handling POST */ @@ -1871,14 +1939,15 @@ void httpd_post_data_recved(void *connection, u16_t recved_len) static void http_continue(void *connection) { - struct http_state *hs = (struct http_state*)connection; + struct http_state *hs = (struct http_state *)connection; + LWIP_ASSERT_CORE_LOCKED(); if (hs && (hs->pcb) && (hs->handle)) { LWIP_ASSERT("hs->pcb != NULL", hs->pcb != NULL); LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("httpd_continue: try to send more data\n")); if (http_send(hs->pcb, hs)) { /* If we wrote anything to be sent, go ahead and send it now. */ LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n")); - tcp_output(hs->pcb); + altcp_output(hs->pcb); } } } @@ -1890,13 +1959,13 @@ http_continue(void *connection) * * @param inp the received pbuf * @param hs the connection state - * @param pcb the tcp_pcb which received this packet + * @param pcb the altcp_pcb which received this packet * @return ERR_OK if request was OK and hs has been initialized correctly * ERR_INPROGRESS if request was OK so far but not fully received * another err_t otherwise */ static err_t -http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb) +http_parse_request(struct pbuf *inp, struct http_state *hs, struct altcp_pcb *pcb) { char *data; char *crlf; @@ -1982,11 +2051,11 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb) data[4] = 0; /* unsupported method! */ LWIP_DEBUGF(HTTPD_DEBUG, ("Unsupported request method (not implemented): \"%s\"\n", - data)); + data)); return http_find_error_file(hs, 501); } /* if we come here, method is OK, parse URI */ - left_len = (u16_t)(data_len - ((sp1 +1) - data)); + left_len = (u16_t)(data_len - ((sp1 + 1) - data)); sp2 = lwip_strnstr(sp1 + 1, " ", left_len); #if LWIP_HTTPD_SUPPORT_V09 if (sp2 == NULL) { @@ -2010,7 +2079,7 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb) /* This is HTTP/1.0 compatible: for strict 1.1, a connection would always be persistent unless "close" was specified. */ if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) || - lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) { + lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) { hs->keepalive = 1; } else { hs->keepalive = 0; @@ -2020,7 +2089,7 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb) *sp1 = 0; uri[uri_len] = 0; LWIP_DEBUGF(HTTPD_DEBUG, ("Received \"%s\" request for URI: \"%s\"\n", - data, uri)); + data, uri)); #if LWIP_HTTPD_SUPPORT_POST if (is_post) { #if LWIP_HTTPD_SUPPORT_REQUESTLIST @@ -2054,7 +2123,7 @@ http_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb) #if LWIP_HTTPD_SUPPORT_REQUESTLIST clen = pbuf_clen(hs->req); if ((hs->req->tot_len <= LWIP_HTTPD_REQ_BUFSIZE) && - (clen <= LWIP_HTTPD_REQ_QUEUELEN)) { + (clen <= LWIP_HTTPD_REQ_QUEUELEN)) { /* request not fully received (too short or CRLF is missing) */ return ERR_INPROGRESS; } else @@ -2069,6 +2138,47 @@ badrequest: } } +#if LWIP_HTTPD_SSI && (LWIP_HTTPD_SSI_BY_FILE_EXTENSION == 1) +/* Check if SSI should be parsed for this file/URL + * (With LWIP_HTTPD_SSI_BY_FILE_EXTENSION == 2, this function can be + * overridden by an external implementation.) + * + * @return 1 for SSI, 0 for standard files + */ +static u8_t +http_uri_is_ssi(struct fs_file *file, const char *uri) +{ + size_t loop; + u8_t tag_check = 0; + if (file != NULL) { + /* See if we have been asked for an shtml file and, if so, + enable tag checking. */ + const char *ext = NULL, *sub; + char *param = (char *)strstr(uri, "?"); + if (param != NULL) { + /* separate uri from parameters for now, set back later */ + *param = 0; + } + sub = uri; + ext = uri; + for (sub = strstr(sub, "."); sub != NULL; sub = strstr(sub, ".")) { + ext = sub; + sub++; + } + for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { + if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) { + tag_check = 1; + break; + } + } + if (param != NULL) { + *param = '?'; + } + } + return tag_check; +} +#endif /* LWIP_HTTPD_SSI */ + /** Try to find the file specified by uri and, if found, initialize hs * accordingly. * @@ -2097,7 +2207,7 @@ http_find_file(struct http_state *hs, const char *uri, int is_09) /* Have we been asked for the default file (in root or a directory) ? */ #if LWIP_HTTPD_MAX_REQUEST_URI_LEN size_t uri_len = strlen(uri); - if ((uri_len > 0) && (uri[uri_len-1] == '/') && + if ((uri_len > 0) && (uri[uri_len - 1] == '/') && ((uri != http_uri_buf) || (uri_len == 1))) { size_t copy_len = LWIP_MIN(sizeof(http_uri_buf) - 1, uri_len - 1); if (copy_len > 0) { @@ -2110,29 +2220,30 @@ http_find_file(struct http_state *hs, const char *uri, int is_09) /* Try each of the configured default filenames until we find one that exists. */ for (loop = 0; loop < NUM_DEFAULT_FILENAMES; loop++) { - const char* file_name; + const char *file_name; #if LWIP_HTTPD_MAX_REQUEST_URI_LEN if (copy_len > 0) { size_t len_left = sizeof(http_uri_buf) - copy_len - 1; if (len_left > 0) { - size_t name_len = strlen(g_psDefaultFilenames[loop].name); + size_t name_len = strlen(httpd_default_filenames[loop].name); size_t name_copy_len = LWIP_MIN(len_left, name_len); - MEMCPY(&http_uri_buf[copy_len], g_psDefaultFilenames[loop].name, name_copy_len); + MEMCPY(&http_uri_buf[copy_len], httpd_default_filenames[loop].name, name_copy_len); + http_uri_buf[copy_len + name_copy_len] = 0; } file_name = http_uri_buf; } else #endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */ { - file_name = g_psDefaultFilenames[loop].name; + file_name = httpd_default_filenames[loop].name; } LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Looking for %s...\n", file_name)); err = fs_open(&hs->file_handle, file_name); - if(err == ERR_OK) { + if (err == ERR_OK) { uri = file_name; file = &hs->file_handle; LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opened.\n")); #if LWIP_HTTPD_SSI - tag_check = g_psDefaultFilenames[loop].shtml; + tag_check = httpd_default_filenames[loop].shtml; #endif /* LWIP_HTTPD_SSI */ break; } @@ -2151,17 +2262,17 @@ http_find_file(struct http_state *hs, const char *uri, int is_09) #if LWIP_HTTPD_CGI http_cgi_paramcount = -1; /* Does the base URI we have isolated correspond to a CGI handler? */ - if (g_iNumCGIs && g_pCGIs) { - for (i = 0; i < g_iNumCGIs; i++) { - if (strcmp(uri, g_pCGIs[i].pcCGIName) == 0) { + if (httpd_num_cgis && httpd_cgis) { + for (i = 0; i < httpd_num_cgis; i++) { + if (strcmp(uri, httpd_cgis[i].pcCGIName) == 0) { /* * We found a CGI that handles this URI so extract the * parameters and call the handler. */ - http_cgi_paramcount = extract_uri_parameters(hs, params); - uri = g_pCGIs[i].pfnCGIHandler(i, http_cgi_paramcount, hs->params, - hs->param_vals); - break; + http_cgi_paramcount = extract_uri_parameters(hs, params); + uri = httpd_cgis[i].pfnCGIHandler(i, http_cgi_paramcount, hs->params, + hs->param_vals); + break; } } } @@ -2171,36 +2282,18 @@ http_find_file(struct http_state *hs, const char *uri, int is_09) err = fs_open(&hs->file_handle, uri); if (err == ERR_OK) { - file = &hs->file_handle; + file = &hs->file_handle; } else { file = http_get_404_file(hs, &uri); } #if LWIP_HTTPD_SSI if (file != NULL) { - /* See if we have been asked for an shtml file and, if so, - enable tag checking. */ - const char* ext = NULL, *sub; - char* param = (char*)strstr(uri, "?"); - if (param != NULL) { - /* separate uri from parameters for now, set back later */ - *param = 0; - } - sub = uri; - ext = uri; - for (sub = strstr(sub, "."); sub != NULL; sub = strstr(sub, ".")) - { - ext = sub; - sub++; - } - tag_check = 0; - for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { - if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) { - tag_check = 1; - break; - } - } - if (param != NULL) { - *param = '?'; + if (file->flags & FS_FILE_FLAGS_SSI) { + tag_check = 1; + } else { +#if LWIP_HTTPD_SSI_BY_FILE_EXTENSION + tag_check = http_uri_is_ssi(file, uri); +#endif /* LWIP_HTTPD_SSI_BY_FILE_EXTENSION */ } } #endif /* LWIP_HTTPD_SSI */ @@ -2226,10 +2319,18 @@ http_find_file(struct http_state *hs, const char *uri, int is_09) */ static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, - u8_t tag_check, char* params) + u8_t tag_check, char *params) { +#if !LWIP_HTTPD_SUPPORT_V09 + LWIP_UNUSED_ARG(is_09); +#endif if (file != NULL) { /* file opened, initialise struct http_state */ +#if !LWIP_HTTPD_DYNAMIC_FILE_READ + /* If dynamic read is disabled, file data must be in one piece and available now */ + LWIP_ASSERT("file->data != NULL", file->data != NULL); +#endif + #if LWIP_HTTPD_SSI if (tag_check) { struct http_ssi_state *ssi = http_ssi_state_alloc(); @@ -2246,37 +2347,6 @@ http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const cha LWIP_UNUSED_ARG(tag_check); #endif /* LWIP_HTTPD_SSI */ hs->handle = file; - hs->file = file->data; - LWIP_ASSERT("File length must be positive!", (file->len >= 0)); -#if LWIP_HTTPD_CUSTOM_FILES - if (file->is_custom_file && (file->data == NULL)) { - /* custom file, need to read data first (via fs_read_custom) */ - hs->left = 0; - } else -#endif /* LWIP_HTTPD_CUSTOM_FILES */ - { - hs->left = file->len; - } - hs->retries = 0; -#if LWIP_HTTPD_TIMING - hs->time_started = sys_now(); -#endif /* LWIP_HTTPD_TIMING */ -#if !LWIP_HTTPD_DYNAMIC_HEADERS - LWIP_ASSERT("HTTP headers not included in file system", - (hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0); -#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */ -#if LWIP_HTTPD_SUPPORT_V09 - if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) { - /* HTTP/0.9 responses are sent without HTTP header, - search for the end of the header. */ - char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left); - if (file_start != NULL) { - size_t diff = file_start + 4 - hs->file; - hs->file += diff; - hs->left -= (u32_t)diff; - } - } -#endif /* LWIP_HTTPD_SUPPORT_V09*/ #if LWIP_HTTPD_CGI_SSI if (params != NULL) { /* URI contains parameters, call generic CGI handler */ @@ -2289,15 +2359,46 @@ http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const cha { count = extract_uri_parameters(hs, params); } - httpd_cgi_handler(uri, count, http_cgi_params, http_cgi_param_vals + httpd_cgi_handler(file, uri, count, http_cgi_params, http_cgi_param_vals #if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE - , hs->handle->state + , file->state #endif /* LWIP_HTTPD_FILE_STATE */ - ); + ); } #else /* LWIP_HTTPD_CGI_SSI */ LWIP_UNUSED_ARG(params); #endif /* LWIP_HTTPD_CGI_SSI */ + hs->file = file->data; + LWIP_ASSERT("File length must be positive!", (file->len >= 0)); +#if LWIP_HTTPD_CUSTOM_FILES + if (file->is_custom_file && (file->data == NULL)) { + /* custom file, need to read data first (via fs_read_custom) */ + hs->left = 0; + } else +#endif /* LWIP_HTTPD_CUSTOM_FILES */ + { + hs->left = (u32_t)file->len; + } + hs->retries = 0; +#if LWIP_HTTPD_TIMING + hs->time_started = sys_now(); +#endif /* LWIP_HTTPD_TIMING */ +#if !LWIP_HTTPD_DYNAMIC_HEADERS + LWIP_ASSERT("HTTP headers not included in file system", + (hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0); +#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */ +#if LWIP_HTTPD_SUPPORT_V09 + if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) { + /* HTTP/0.9 responses are sent without HTTP header, + search for the end of the header. */ + char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left); + if (file_start != NULL) { + int diff = file_start + 4 - hs->file; + hs->file += diff; + hs->left -= (u32_t)diff; + } + } +#endif /* LWIP_HTTPD_SUPPORT_V09*/ } else { hs->handle = NULL; hs->file = NULL; @@ -2316,16 +2417,16 @@ http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const cha #if LWIP_HTTPD_SUPPORT_11_KEEPALIVE if (hs->keepalive) { #if LWIP_HTTPD_SSI - if (hs->ssi != NULL) { - hs->keepalive = 0; - } else + if (hs->ssi != NULL) { + hs->keepalive = 0; + } else #endif /* LWIP_HTTPD_SSI */ - { - if ((hs->handle != NULL) && - ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) { - hs->keepalive = 0; - } - } + { + if ((hs->handle != NULL) && + ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) { + hs->keepalive = 0; + } + } } #endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */ return ERR_OK; @@ -2353,11 +2454,11 @@ http_err(void *arg, err_t err) * This means that more data can be sent. */ static err_t -http_sent(void *arg, struct tcp_pcb *pcb, u16_t len) +http_sent(void *arg, struct altcp_pcb *pcb, u16_t len) { struct http_state *hs = (struct http_state *)arg; - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_sent %p\n", (void*)pcb)); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_sent %p\n", (void *)pcb)); LWIP_UNUSED_ARG(len); @@ -2380,11 +2481,11 @@ http_sent(void *arg, struct tcp_pcb *pcb, u16_t len) * This could be increased, but we don't want to waste resources for bad connections. */ static err_t -http_poll(void *arg, struct tcp_pcb *pcb) +http_poll(void *arg, struct altcp_pcb *pcb) { struct http_state *hs = (struct http_state *)arg; LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: pcb=%p hs=%p pcb_state=%s\n", - (void*)pcb, (void*)hs, tcp_debug_state_str(pcb->state))); + (void *)pcb, (void *)hs, tcp_debug_state_str(altcp_dbg_get_tcp_state(pcb)))); if (hs == NULL) { err_t closed; @@ -2394,8 +2495,8 @@ http_poll(void *arg, struct tcp_pcb *pcb) LWIP_UNUSED_ARG(closed); #if LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR if (closed == ERR_MEM) { - tcp_abort(pcb); - return ERR_ABRT; + altcp_abort(pcb); + return ERR_ABRT; } #endif /* LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR */ return ERR_OK; @@ -2410,12 +2511,12 @@ http_poll(void *arg, struct tcp_pcb *pcb) /* If this connection has a file open, try to send some more data. If * it has not yet received a GET request, don't do this since it will * cause the connection to close immediately. */ - if(hs && (hs->handle)) { + if (hs->handle) { LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: try to send more data\n")); - if(http_send(pcb, hs)) { + if (http_send(pcb, hs)) { /* If we wrote anything to be sent, go ahead and send it now. */ LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n")); - tcp_output(pcb); + altcp_output(pcb); } } } @@ -2428,17 +2529,17 @@ http_poll(void *arg, struct tcp_pcb *pcb) * For HTTP 1.0, this should normally only happen once (if the request fits in one packet). */ static err_t -http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +http_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) { struct http_state *hs = (struct http_state *)arg; - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: pcb=%p pbuf=%p err=%s\n", (void*)pcb, - (void*)p, lwip_strerr(err))); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: pcb=%p pbuf=%p err=%s\n", (void *)pcb, + (void *)p, lwip_strerr(err))); if ((err != ERR_OK) || (p == NULL) || (hs == NULL)) { /* error or closed by other side? */ if (p != NULL) { /* Inform TCP that we have taken the data. */ - tcp_recved(pcb, p->tot_len); + altcp_recved(pcb, p->tot_len); pbuf_free(p); } if (hs == NULL) { @@ -2451,12 +2552,12 @@ http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) #if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND if (hs->no_auto_wnd) { - hs->unrecved_bytes += p->tot_len; + hs->unrecved_bytes += p->tot_len; } else #endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */ { /* Inform TCP that we have taken the data. */ - tcp_recved(pcb, p->tot_len); + altcp_recved(pcb, p->tot_len); } #if LWIP_HTTPD_SUPPORT_POST @@ -2477,7 +2578,7 @@ http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) if (hs->handle == NULL) { err_t parsed = http_parse_request(p, hs, pcb); LWIP_ASSERT("http_parse_request: unexpected return value", parsed == ERR_OK - || parsed == ERR_INPROGRESS ||parsed == ERR_ARG || parsed == ERR_USE); + || parsed == ERR_INPROGRESS || parsed == ERR_ARG || parsed == ERR_USE); #if LWIP_HTTPD_SUPPORT_REQUESTLIST if (parsed != ERR_INPROGRESS) { /* request fully parsed or error */ @@ -2490,10 +2591,10 @@ http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) pbuf_free(p); if (parsed == ERR_OK) { #if LWIP_HTTPD_SUPPORT_POST - if (hs->post_content_len_left == 0) + if (hs->post_content_len_left == 0) #endif /* LWIP_HTTPD_SUPPORT_POST */ { - LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: data %p len %"S32_F"\n", (const void*)hs->file, hs->left)); + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: data %p len %"S32_F"\n", (const void *)hs->file, hs->left)); http_send(pcb, hs); } } else if (parsed == ERR_ARG) { @@ -2513,19 +2614,19 @@ http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) * A new incoming connection has been accepted. */ static err_t -http_accept(void *arg, struct tcp_pcb *pcb, err_t err) +http_accept(void *arg, struct altcp_pcb *pcb, err_t err) { struct http_state *hs; LWIP_UNUSED_ARG(err); LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\n", (void*)pcb, arg)); + LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\n", (void *)pcb, arg)); if ((err != ERR_OK) || (pcb == NULL)) { return ERR_VAL; } /* Set priority */ - tcp_setprio(pcb, HTTPD_TCP_PRIO); + altcp_setprio(pcb, HTTPD_TCP_PRIO); /* Allocate memory for the structure that holds the state of the connection - initialized by that function. */ @@ -2538,17 +2639,34 @@ http_accept(void *arg, struct tcp_pcb *pcb, err_t err) /* Tell TCP that this is the structure we wish to be passed for our callbacks. */ - tcp_arg(pcb, hs); + altcp_arg(pcb, hs); /* Set up the various callback functions */ - tcp_recv(pcb, http_recv); - tcp_err(pcb, http_err); - tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); - tcp_sent(pcb, http_sent); + altcp_recv(pcb, http_recv); + altcp_err(pcb, http_err); + altcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); + altcp_sent(pcb, http_sent); return ERR_OK; } +static void +httpd_init_pcb(struct altcp_pcb *pcb, u16_t port) +{ + err_t err; + + if (pcb) { + altcp_setprio(pcb, HTTPD_TCP_PRIO); + /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */ + err = altcp_bind(pcb, IP_ANY_TYPE, port); + LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */ + LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK); + pcb = altcp_listen(pcb); + LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL); + altcp_accept(pcb, http_accept); + } +} + /** * @ingroup httpd * Initialize the httpd: set up a listening PCB and bind it to the defined port @@ -2556,8 +2674,7 @@ http_accept(void *arg, struct tcp_pcb *pcb, err_t err) void httpd_init(void) { - struct tcp_pcb *pcb; - err_t err; + struct altcp_pcb *pcb; #if HTTPD_USE_MEM_POOL LWIP_MEMPOOL_INIT(HTTPD_STATE); @@ -2567,20 +2684,35 @@ httpd_init(void) #endif LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n")); - pcb = tcp_new_ip_type(IPADDR_TYPE_ANY); + /* LWIP_ASSERT_CORE_LOCKED(); is checked by tcp_new() */ + + pcb = altcp_tcp_new_ip_type(IPADDR_TYPE_ANY); LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL); - tcp_setprio(pcb, HTTPD_TCP_PRIO); - /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */ - err = tcp_bind(pcb, IP_ANY_TYPE, HTTPD_SERVER_PORT); - LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */ - LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK); - pcb = tcp_listen(pcb); - LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL); - tcp_accept(pcb, http_accept); + httpd_init_pcb(pcb, HTTPD_SERVER_PORT); } +#if HTTPD_ENABLE_HTTPS +/** + * @ingroup httpd + * Initialize the httpd: set up a listening PCB and bind it to the defined port. + * Also set up TLS connection handling (HTTPS). + */ +void +httpd_inits(struct altcp_tls_config *conf) +{ +#if LWIP_ALTCP_TLS + struct altcp_pcb *pcb_tls = altcp_tls_new(conf, IPADDR_TYPE_ANY); + LWIP_ASSERT("httpd_init: altcp_tls_new failed", pcb_tls != NULL); + httpd_init_pcb(pcb_tls, HTTPD_SERVER_PORT_HTTPS); +#else /* LWIP_ALTCP_TLS */ + LWIP_UNUSED_ARG(conf); +#endif /* LWIP_ALTCP_TLS */ +} +#endif /* HTTPD_ENABLE_HTTPS */ + #if LWIP_HTTPD_SSI /** + * @ingroup httpd * Set the SSI handler function. * * @param ssi_handler the SSI handler function @@ -2593,7 +2725,7 @@ http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags) LWIP_DEBUGF(HTTPD_DEBUG, ("http_set_ssi_handler\n")); LWIP_ASSERT("no ssi_handler given", ssi_handler != NULL); - g_pfnSSIHandler = ssi_handler; + httpd_ssi_handler = ssi_handler; #if LWIP_HTTPD_SSI_RAW LWIP_UNUSED_ARG(tags); @@ -2602,14 +2734,15 @@ http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags) LWIP_ASSERT("no tags given", tags != NULL); LWIP_ASSERT("invalid number of tags", num_tags > 0); - g_ppcTags = tags; - g_iNumTags = num_tags; + httpd_tags = tags; + httpd_num_tags = num_tags; #endif /* !LWIP_HTTPD_SSI_RAW */ } #endif /* LWIP_HTTPD_SSI */ #if LWIP_HTTPD_CGI /** + * @ingroup httpd * Set an array of CGI filenames/handler functions * * @param cgis an array of CGI filenames/handler functions @@ -2621,8 +2754,8 @@ http_set_cgi_handlers(const tCGI *cgis, int num_handlers) LWIP_ASSERT("no cgis given", cgis != NULL); LWIP_ASSERT("invalid number of handlers", num_handlers > 0); - g_pCGIs = cgis; - g_iNumCGIs = num_handlers; + httpd_cgis = cgis; + httpd_num_cgis = num_handlers; } #endif /* LWIP_HTTPD_CGI */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd_structs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd_structs.h new file mode 100644 index 0000000..56b97a3 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/httpd_structs.h @@ -0,0 +1,123 @@ +#ifndef LWIP_HTTPD_STRUCTS_H +#define LWIP_HTTPD_STRUCTS_H + +#include "lwip/apps/httpd.h" + +#if LWIP_HTTPD_DYNAMIC_HEADERS +/** This struct is used for a list of HTTP header strings for various + * filename extensions. */ +typedef struct { + const char *extension; + const char *content_type; +} tHTTPHeader; + +/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and + * RFC 2616 HTTP/1.1 for header field definitions) */ +static const char *const g_psHTTPHeaderStrings[] = { + "HTTP/1.0 200 OK\r\n", + "HTTP/1.0 404 File not found\r\n", + "HTTP/1.0 400 Bad Request\r\n", + "HTTP/1.0 501 Not Implemented\r\n", + "HTTP/1.1 200 OK\r\n", + "HTTP/1.1 404 File not found\r\n", + "HTTP/1.1 400 Bad Request\r\n", + "HTTP/1.1 501 Not Implemented\r\n", + "Content-Length: ", + "Connection: Close\r\n", + "Connection: keep-alive\r\n", + "Connection: keep-alive\r\nContent-Length: ", + "Server: "HTTPD_SERVER_AGENT"\r\n", + "\r\n

404: The requested file cannot be found.

\r\n" +#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE + , "Connection: keep-alive\r\nContent-Length: 77\r\n\r\n

404: The requested file cannot be found.

\r\n" +#endif +}; + +/* Indexes into the g_psHTTPHeaderStrings array */ +#define HTTP_HDR_OK 0 /* 200 OK */ +#define HTTP_HDR_NOT_FOUND 1 /* 404 File not found */ +#define HTTP_HDR_BAD_REQUEST 2 /* 400 Bad request */ +#define HTTP_HDR_NOT_IMPL 3 /* 501 Not Implemented */ +#define HTTP_HDR_OK_11 4 /* 200 OK */ +#define HTTP_HDR_NOT_FOUND_11 5 /* 404 File not found */ +#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */ +#define HTTP_HDR_NOT_IMPL_11 7 /* 501 Not Implemented */ +#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/ +#define HTTP_HDR_CONN_CLOSE 9 /* Connection: Close (HTTP 1.1) */ +#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */ +#define HTTP_HDR_KEEPALIVE_LEN 11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/ +#define HTTP_HDR_SERVER 12 /* Server: HTTPD_SERVER_AGENT */ +#define DEFAULT_404_HTML 13 /* default 404 body */ +#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE +#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */ +#endif + +#define HTTP_CONTENT_TYPE(contenttype) "Content-Type: "contenttype"\r\n\r\n" +#define HTTP_CONTENT_TYPE_ENCODING(contenttype, encoding) "Content-Type: "contenttype"\r\nContent-Encoding: "encoding"\r\n\r\n" + +#define HTTP_HDR_HTML HTTP_CONTENT_TYPE("text/html") +#define HTTP_HDR_SSI HTTP_CONTENT_TYPE("text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache") +#define HTTP_HDR_GIF HTTP_CONTENT_TYPE("image/gif") +#define HTTP_HDR_PNG HTTP_CONTENT_TYPE("image/png") +#define HTTP_HDR_JPG HTTP_CONTENT_TYPE("image/jpeg") +#define HTTP_HDR_BMP HTTP_CONTENT_TYPE("image/bmp") +#define HTTP_HDR_ICO HTTP_CONTENT_TYPE("image/x-icon") +#define HTTP_HDR_APP HTTP_CONTENT_TYPE("application/octet-stream") +#define HTTP_HDR_JS HTTP_CONTENT_TYPE("application/javascript") +#define HTTP_HDR_RA HTTP_CONTENT_TYPE("application/javascript") +#define HTTP_HDR_CSS HTTP_CONTENT_TYPE("text/css") +#define HTTP_HDR_SWF HTTP_CONTENT_TYPE("application/x-shockwave-flash") +#define HTTP_HDR_XML HTTP_CONTENT_TYPE("text/xml") +#define HTTP_HDR_PDF HTTP_CONTENT_TYPE("application/pdf") +#define HTTP_HDR_JSON HTTP_CONTENT_TYPE("application/json") +#define HTTP_HDR_CSV HTTP_CONTENT_TYPE("text/csv") +#define HTTP_HDR_TSV HTTP_CONTENT_TYPE("text/tsv") +#define HTTP_HDR_SVG HTTP_CONTENT_TYPE("image/svg+xml") +#define HTTP_HDR_SVGZ HTTP_CONTENT_TYPE_ENCODING("image/svg+xml", "gzip") + +#define HTTP_HDR_DEFAULT_TYPE HTTP_CONTENT_TYPE("text/plain") + +/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES + * and http://www.iana.org/assignments/media-types for registered content types + * and subtypes) */ +static const tHTTPHeader g_psHTTPHeaders[] = { + { "html", HTTP_HDR_HTML}, + { "htm", HTTP_HDR_HTML}, + { "shtml", HTTP_HDR_SSI}, + { "shtm", HTTP_HDR_SSI}, + { "ssi", HTTP_HDR_SSI}, + { "gif", HTTP_HDR_GIF}, + { "png", HTTP_HDR_PNG}, + { "jpg", HTTP_HDR_JPG}, + { "bmp", HTTP_HDR_BMP}, + { "ico", HTTP_HDR_ICO}, + { "class", HTTP_HDR_APP}, + { "cls", HTTP_HDR_APP}, + { "js", HTTP_HDR_JS}, + { "ram", HTTP_HDR_RA}, + { "css", HTTP_HDR_CSS}, + { "swf", HTTP_HDR_SWF}, + { "xml", HTTP_HDR_XML}, + { "xsl", HTTP_HDR_XML}, + { "pdf", HTTP_HDR_PDF}, + { "json", HTTP_HDR_JSON} +#ifdef HTTPD_ADDITIONAL_CONTENT_TYPES + /* If you need to add content types not listed here: + * #define HTTPD_ADDITIONAL_CONTENT_TYPES {"ct1", HTTP_CONTENT_TYPE("text/ct1")}, {"exe", HTTP_CONTENT_TYPE("application/exe")} + */ + , HTTPD_ADDITIONAL_CONTENT_TYPES +#endif +}; + +#define NUM_HTTP_HEADERS LWIP_ARRAYSIZE(g_psHTTPHeaders) + +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + +#if LWIP_HTTPD_SSI +static const char *const g_pcSSIExtensions[] = { + ".shtml", ".shtm", ".ssi", ".xml", ".json" +}; +#define NUM_SHTML_EXTENSIONS LWIP_ARRAYSIZE(g_pcSSIExtensions) +#endif /* LWIP_HTTPD_SSI */ + +#endif /* LWIP_HTTPD_STRUCTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/makefsdata similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/makefsdata diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/makefsdata.c similarity index 64% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/makefsdata.c index 934e721..695e94f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/makefsdata.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/makefsdata.c @@ -13,17 +13,12 @@ #include #include -#ifdef WIN32 -#define WIN32_LEAN_AND_MEAN -#include "windows.h" -#else -#include -#endif -#include #include #include #include +#include "tinydir.h" + /** Makefsdata can generate *all* files deflate-compressed (where file size shrinks). * Since nearly all browsers support this, this is a good way to reduce ROM size. * To compress the files, "miniz.c" must be downloaded seperately. @@ -65,41 +60,22 @@ int deflate_level = 10; /* default compression level, can be changed via command #define USAGE_ARG_DEFLATE "" #endif /* MAKEFS_SUPPORT_DEFLATE */ -/* Compatibility defines Win32 vs. DOS */ #ifdef WIN32 -#define FIND_T WIN32_FIND_DATAA -#define FIND_T_FILENAME(fInfo) (fInfo.cFileName) -#define FIND_T_IS_DIR(fInfo) ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) -#define FIND_T_IS_FILE(fInfo) ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) -#define FIND_RET_T HANDLE -#define FINDFIRST_FILE(path, result) FindFirstFileA(path, result) -#define FINDFIRST_DIR(path, result) FindFirstFileA(path, result) -#define FINDNEXT(ff_res, result) FindNextFileA(ff_res, result) -#define FINDFIRST_SUCCEEDED(ret) (ret != INVALID_HANDLE_VALUE) -#define FINDNEXT_SUCCEEDED(ret) (ret == TRUE) - #define GETCWD(path, len) GetCurrentDirectoryA(len, path) #define CHDIR(path) SetCurrentDirectoryA(path) #define CHDIR_SUCCEEDED(ret) (ret == TRUE) -#else - -#define FIND_T struct ffblk -#define FIND_T_FILENAME(fInfo) (fInfo.ff_name) -#define FIND_T_IS_DIR(fInfo) ((fInfo.ff_attrib & FA_DIREC) == FA_DIREC) -#define FIND_T_IS_FILE(fInfo) (1) -#define FIND_RET_T int -#define FINDFIRST_FILE(path, result) findfirst(path, result, FA_ARCH) -#define FINDFIRST_DIR(path, result) findfirst(path, result, FA_DIREC) -#define FINDNEXT(ff_res, result) FindNextFileA(ff_res, result) -#define FINDFIRST_SUCCEEDED(ret) (ret == 0) -#define FINDNEXT_SUCCEEDED(ret) (ret == 0) +#elif __linux__ #define GETCWD(path, len) getcwd(path, len) #define CHDIR(path) chdir(path) #define CHDIR_SUCCEEDED(ret) (ret == 0) +#else + +#error makefsdata not supported on this platform + #endif #define NEWLINE "\r\n" @@ -131,10 +107,9 @@ static int payload_alingment_dummy_counter = 0; #define MAX_PATH_LEN 256 -struct file_entry -{ - struct file_entry* next; - const char* filename_c; +struct file_entry { + struct file_entry *next; + const char *filename_c; }; int process_sub(FILE *data_file, FILE *struct_file); @@ -144,7 +119,11 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i); int s_put_ascii(char *buf, const char *ascii_string, int len, int *i); void concat_files(const char *file1, const char *file2, const char *targetfile); -int check_path(char* path, size_t size); +int check_path(char *path, size_t size); +static int checkSsiByFilelist(const char* filename_listfile); +static int ext_in_list(const char* filename, const char *ext_list); +static int file_to_exclude(const char* filename); +static int file_can_be_compressed(const char* filename); /* 5 bytes per char + 3 bytes per line */ static char file_buffer_c[COPY_BUFSIZE * 5 + ((COPY_BUFSIZE / HEX_BYTES_PER_LINE) * 3)]; @@ -164,22 +143,31 @@ unsigned char deflateNonSsiFiles = 0; size_t deflatedBytesReduced = 0; size_t overallDataBytes = 0; #endif +const char *exclude_list = NULL; +const char *ncompress_list = NULL; -struct file_entry* first_file = NULL; -struct file_entry* last_file = NULL; +struct file_entry *first_file = NULL; +struct file_entry *last_file = NULL; + +static char *ssi_file_buffer; +static char **ssi_file_lines; +static size_t ssi_file_num_lines; static void print_usage(void) { - printf(" Usage: htmlgen [targetdir] [-s] [-e] [-i] [-11] [-nossi] [-c] [-f:] [-m] [-svr:]" USAGE_ARG_DEFLATE NEWLINE NEWLINE); + printf(" Usage: htmlgen [targetdir] [-s] [-e] [-11] [-nossi] [-ssi:] [-c] [-f:] [-m] [-svr:] [-x:] [-xc:" USAGE_ARG_DEFLATE NEWLINE NEWLINE); printf(" targetdir: relative or absolute path to files to convert" NEWLINE); printf(" switch -s: toggle processing of subdirectories (default is on)" NEWLINE); printf(" switch -e: exclude HTTP header from file (header is created at runtime, default is off)" NEWLINE); printf(" switch -11: include HTTP 1.1 header (1.0 is default)" NEWLINE); printf(" switch -nossi: no support for SSI (cannot calculate Content-Length for SSI)" NEWLINE); + printf(" switch -ssi: ssi filename (ssi support controlled by file list, not by extension)" NEWLINE); printf(" switch -c: precalculate checksums for all pages (default is off)" NEWLINE); printf(" switch -f: target filename (default is \"fsdata.c\")" NEWLINE); printf(" switch -m: include \"Last-Modified\" header based on file time" NEWLINE); printf(" switch -svr: server identifier sent in HTTP response header ('Server' field)" NEWLINE); + printf(" switch -x: comma separated list of extensions of files to exclude (e.g., -x:json,txt)" NEWLINE); + printf(" switch -xc: comma separated list of extensions of files to not compress (e.g., -xc:mp3,jpg)" NEWLINE); #if MAKEFS_SUPPORT_DEFLATE printf(" switch -defl: deflate-compress all non-SSI files (with opt. compr.-level, default=10)" NEWLINE); printf(" ATTENTION: browser has to support \"Content-Encoding: deflate\"!" NEWLINE); @@ -206,6 +194,8 @@ int main(int argc, char *argv[]) printf(" by Jim Pettinato - circa 2003 " NEWLINE); printf(" extended by Simon Goldschmidt - 2009 " NEWLINE NEWLINE); + LWIP_ASSERT("sizeof(hdr_buf) must fit into an u16_t", sizeof(hdr_buf) <= 0xffff); + strcpy(path, "fs"); for (i = 1; i < argc; i++) { if (argv[i] == NULL) { @@ -216,25 +206,32 @@ int main(int argc, char *argv[]) snprintf(serverIDBuffer, sizeof(serverIDBuffer), "Server: %s\r\n", &argv[i][5]); serverID = serverIDBuffer; printf("Using Server-ID: \"%s\"\n", serverID); - } else if (strstr(argv[i], "-s") == argv[i]) { + } else if (!strcmp(argv[i], "-s")) { processSubs = 0; - } else if (strstr(argv[i], "-e") == argv[i]) { + } else if (!strcmp(argv[i], "-e")) { includeHttpHeader = 0; - } else if (strstr(argv[i], "-11") == argv[i]) { + } else if (!strcmp(argv[i], "-11")) { useHttp11 = 1; - } else if (strstr(argv[i], "-nossi") == argv[i]) { + } else if (!strcmp(argv[i], "-nossi")) { supportSsi = 0; - } else if (strstr(argv[i], "-c") == argv[i]) { + } else if (strstr(argv[i], "-ssi:") == argv[i]) { + const char* ssi_list_filename = &argv[i][5]; + if (checkSsiByFilelist(ssi_list_filename)) { + printf("Reading list of SSI files from \"%s\"\n", ssi_list_filename); + } else { + printf("Failed to load list of SSI files from \"%s\"\n", ssi_list_filename); + } + } else if (!strcmp(argv[i], "-c")) { precalcChksum = 1; } else if (strstr(argv[i], "-f:") == argv[i]) { strncpy(targetfile, &argv[i][3], sizeof(targetfile) - 1); targetfile[sizeof(targetfile) - 1] = 0; printf("Writing to file \"%s\"\n", targetfile); - } else if (strstr(argv[i], "-m") == argv[i]) { + } else if (!strcmp(argv[i], "-m")) { includeLastModified = 1; - } else if (strstr(argv[i], "-defl") == argv[i]) { + } else if (!strcmp(argv[i], "-defl")) { #if MAKEFS_SUPPORT_DEFLATE - char* colon = strstr(argv[i], ":"); + char *colon = strstr(argv[i], ":"); if (colon) { if (colon[1] != 0) { int defl_level = atoi(&colon[1]); @@ -251,6 +248,12 @@ int main(int argc, char *argv[]) #else printf("WARNING: Deflate support is disabled\n"); #endif + } else if (strstr(argv[i], "-x:") == argv[i]) { + exclude_list = &argv[i][3]; + printf("Excluding files with extensions %s" NEWLINE, exclude_list); + } else if (strstr(argv[i], "-xc:") == argv[i]) { + ncompress_list = &argv[i][4]; + printf("Skipping compresion for files with extensions %s" NEWLINE, ncompress_list); } else if ((strstr(argv[i], "-?")) || (strstr(argv[i], "-h"))) { print_usage(); exit(0); @@ -259,8 +262,8 @@ int main(int argc, char *argv[]) print_usage(); exit(0); } else { - strncpy(path, argv[i], sizeof(path)-1); - path[sizeof(path)-1] = 0; + strncpy(path, argv[i], sizeof(path) - 1); + path[sizeof(path) - 1] = 0; } } @@ -280,10 +283,10 @@ int main(int argc, char *argv[]) CHDIR(appPath); printf("HTTP %sheader will %s statically included." NEWLINE, - (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""), - (includeHttpHeader ? "be" : "not be")); + (includeHttpHeader ? (useHttp11 ? "1.1 " : "1.0 ") : ""), + (includeHttpHeader ? "be" : "not be")); - sprintf(curSubdir, ""); /* start off in web page's root directory - relative paths */ + curSubdir[0] = '\0'; /* start off in web page's root directory - relative paths */ printf(" Processing all files in directory %s", path); if (processSubs) { printf(" and subdirectories..." NEWLINE NEWLINE); @@ -306,8 +309,7 @@ int main(int argc, char *argv[]) CHDIR(path); fprintf(data_file, "#include \"lwip/apps/fs.h\"" NEWLINE); - fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE); - fprintf(data_file, "#include \"fsdata.h\"" NEWLINE NEWLINE NEWLINE); + fprintf(data_file, "#include \"lwip/def.h\"" NEWLINE NEWLINE NEWLINE); fprintf(data_file, "#define file_NULL (struct fsdata_file *) NULL" NEWLINE NEWLINE NEWLINE); /* define FS_FILE_FLAGS_HEADER_INCLUDED to 1 if not defined (compatibility with older httpd/fs) */ @@ -355,21 +357,28 @@ int main(int argc, char *argv[]) #if MAKEFS_SUPPORT_DEFLATE if (deflateNonSsiFiles) { printf("(Deflated total byte reduction: %d bytes -> %d bytes (%.02f%%)" NEWLINE, - (int)overallDataBytes, (int)deflatedBytesReduced, (float)((deflatedBytesReduced*100.0)/overallDataBytes)); + (int)overallDataBytes, (int)deflatedBytesReduced, (float)((deflatedBytesReduced * 100.0) / overallDataBytes)); } #endif printf(NEWLINE); while (first_file != NULL) { - struct file_entry* fe = first_file; - first_file = fe->next; - free(fe); + struct file_entry *fe = first_file; + first_file = fe->next; + free(fe); + } + + if (ssi_file_buffer) { + free(ssi_file_buffer); + } + if (ssi_file_lines) { + free(ssi_file_lines); } return 0; } -int check_path(char* path, size_t size) +int check_path(char *path, size_t size) { size_t slen; if (path[0] == 0) { @@ -396,7 +405,7 @@ static void copy_file(const char *filename_in, FILE *fout) { FILE *fin; size_t len; - void* buf; + void *buf; fin = fopen(filename_in, "rb"); if (fin == NULL) { printf("Failed to open file \"%s\"\n", filename_in); @@ -425,66 +434,109 @@ void concat_files(const char *file1, const char *file2, const char *targetfile) int process_sub(FILE *data_file, FILE *struct_file) { - FIND_T fInfo; - FIND_RET_T fret; + tinydir_dir dir; int filesProcessed = 0; if (processSubs) { /* process subs recursively */ size_t sublen = strlen(curSubdir); size_t freelen = sizeof(curSubdir) - sublen - 1; + int ret; LWIP_ASSERT("sublen < sizeof(curSubdir)", sublen < sizeof(curSubdir)); - fret = FINDFIRST_DIR("*", &fInfo); - if (FINDFIRST_SUCCEEDED(fret)) { - do { - const char *curName = FIND_T_FILENAME(fInfo); - if ((curName[0] == '.') || (strcmp(curName, "CVS") == 0)) { - continue; + + ret = tinydir_open_sorted(&dir, TINYDIR_STRING(".")); + + if (ret == 0) { + unsigned int i; + for (i = 0; i < dir.n_files; i++) { + tinydir_file file; + + ret = tinydir_readfile_n(&dir, &file, i); + + if (ret == 0) { +#if (defined _MSC_VER || defined __MINGW32__) && (defined _UNICODE) + size_t num_char_converted; + char currName[256]; + wcstombs_s(&num_char_converted, currName, sizeof(currName), file.name, sizeof(currName)); +#else + const char *currName = file.name; +#endif + + if (currName[0] == '.') { + continue; + } + if (!file.is_dir) { + continue; + } + if (freelen > 0) { + CHDIR(currName); + strncat(curSubdir, "/", freelen); + strncat(curSubdir, currName, freelen - 1); + curSubdir[sizeof(curSubdir) - 1] = 0; + printf("processing subdirectory %s/..." NEWLINE, curSubdir); + filesProcessed += process_sub(data_file, struct_file); + CHDIR(".."); + curSubdir[sublen] = 0; + } else { + printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, currName); + } } - if (!FIND_T_IS_DIR(fInfo)) { - continue; + } + } + + ret = tinydir_open_sorted(&dir, TINYDIR_STRING(".")); + if (ret == 0) { + unsigned int i; + for (i = 0; i < dir.n_files; i++) { + tinydir_file file; + + ret = tinydir_readfile_n(&dir, &file, i); + + if (ret == 0) { + if (!file.is_dir) { +#if (defined _MSC_VER || defined __MINGW32__) && (defined _UNICODE) + size_t num_char_converted; + char curName[256]; + wcstombs_s(&num_char_converted, curName, sizeof(curName), file.name, sizeof(curName)); +#else + const char *curName = file.name; +#endif + + if (strcmp(curName, "fsdata.tmp") == 0) { + continue; + } + if (strcmp(curName, "fshdr.tmp") == 0) { + continue; + } + if (file_to_exclude(curName)) { + printf("skipping %s/%s by exclude list (-x option)..." NEWLINE, curSubdir, curName); + continue; + } + + printf("processing %s/%s..." NEWLINE, curSubdir, curName); + + if (process_file(data_file, struct_file, curName) < 0) { + printf(NEWLINE "Error... aborting" NEWLINE); + return -1; + } + filesProcessed++; + } } - if (freelen > 0) { - CHDIR(curName); - strncat(curSubdir, "/", freelen); - strncat(curSubdir, curName, freelen - 1); - curSubdir[sizeof(curSubdir) - 1] = 0; - printf("processing subdirectory %s/..." NEWLINE, curSubdir); - filesProcessed += process_sub(data_file, struct_file); - CHDIR(".."); - curSubdir[sublen] = 0; - } else { - printf("WARNING: cannot process sub due to path length restrictions: \"%s/%s\"\n", curSubdir, curName); - } - } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo))); + } } } - fret = FINDFIRST_FILE("*.*", &fInfo); - if (FINDFIRST_SUCCEEDED(fret)) { - /* at least one file in directory */ - do { - if (FIND_T_IS_FILE(fInfo)) { - const char *curName = FIND_T_FILENAME(fInfo); - printf("processing %s/%s..." NEWLINE, curSubdir, curName); - if (process_file(data_file, struct_file, curName) < 0) { - printf(NEWLINE "Error... aborting" NEWLINE); - return -1; - } - filesProcessed++; - } - } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo))); - } return filesProcessed; } -u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, int* is_compressed) +static u8_t *get_file_data(const char *filename, int *file_size, int can_be_compressed, int *is_compressed) { FILE *inFile; size_t fsize = 0; - u8_t* buf; + u8_t *buf; size_t r; int rs; + LWIP_UNUSED_ARG(r); /* for LWIP_NOASSERT */ inFile = fopen(filename, "rb"); if (inFile == NULL) { printf("Failed to open file \"%s\"\n", filename); @@ -493,14 +545,15 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, fseek(inFile, 0, SEEK_END); rs = ftell(inFile); if (rs < 0) { - printf("ftell failed with %d\n", errno); - exit(-1); + printf("ftell failed with %d\n", errno); + exit(-1); } fsize = (size_t)rs; fseek(inFile, 0, SEEK_SET); - buf = (u8_t*)malloc(fsize); + buf = (u8_t *)malloc(fsize); LWIP_ASSERT("buf != NULL", buf != NULL); r = fread(buf, 1, fsize, inFile); + LWIP_ASSERT("r == fsize", r == fsize); *file_size = fsize; *is_compressed = 0; #if MAKEFS_SUPPORT_DEFLATE @@ -508,7 +561,7 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, if (deflateNonSsiFiles) { if (can_be_compressed) { if (fsize < OUT_BUF_SIZE) { - u8_t* ret_buf; + u8_t *ret_buf; tdefl_status status; size_t in_bytes = fsize; size_t out_bytes = OUT_BUF_SIZE; @@ -532,7 +585,7 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, } LWIP_ASSERT("out_bytes <= COPY_BUFSIZE", out_bytes <= OUT_BUF_SIZE); if (out_bytes < fsize) { - ret_buf = (u8_t*)malloc(out_bytes); + ret_buf = (u8_t *)malloc(out_bytes); LWIP_ASSERT("ret_buf != NULL", ret_buf != NULL); memcpy(ret_buf, s_outbuf, out_bytes); { @@ -554,7 +607,7 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, free(buf); buf = ret_buf; *file_size = out_bytes; - printf(" - deflate: %d bytes -> %d bytes (%.02f%%)" NEWLINE, (int)fsize, (int)out_bytes, (float)((out_bytes*100.0)/fsize)); + printf(" - deflate: %d bytes -> %d bytes (%.02f%%)" NEWLINE, (int)fsize, (int)out_bytes, (float)((out_bytes * 100.0) / fsize)); deflatedBytesReduced += (size_t)(fsize - out_bytes); *is_compressed = 1; } else { @@ -564,7 +617,7 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, printf(" - uncompressed: (file is larger than deflate bufer)" NEWLINE); } } else { - printf(" - SSI file, cannot be compressed" NEWLINE); + printf(" - cannot be compressed" NEWLINE); } } #else @@ -574,14 +627,14 @@ u8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, return buf; } -void process_file_data(FILE* data_file, u8_t* file_data, size_t file_size) +static void process_file_data(FILE *data_file, u8_t *file_data, size_t file_size) { - size_t written, i, src_off=0; - + size_t written, i, src_off = 0; size_t off = 0; + LWIP_UNUSED_ARG(written); /* for LWIP_NOASSERT */ for (i = 0; i < file_size; i++) { LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - 5); - sprintf(&file_buffer_c[off], "0x%02.2x,", file_data[i]); + sprintf(&file_buffer_c[off], "0x%02x,", file_data[i]); off += 5; if ((++src_off % HEX_BYTES_PER_LINE) == 0) { LWIP_ASSERT("file_buffer_c overflow", off < sizeof(file_buffer_c) - NEWLINE_LEN); @@ -598,8 +651,8 @@ void process_file_data(FILE* data_file, u8_t* file_data, size_t file_size) LWIP_ASSERT("written == off", written == off); } -int write_checksums(FILE *struct_file, const char *varname, - u16_t hdr_len, u16_t hdr_chksum, const u8_t* file_data, size_t file_size) +static int write_checksums(FILE *struct_file, const char *varname, + u16_t hdr_len, u16_t hdr_chksum, const u8_t *file_data, size_t file_size) { int chunk_size = TCP_MSS; int offset, src_offset; @@ -621,14 +674,14 @@ int write_checksums(FILE *struct_file, const char *varname, src_offset = 0; for (offset = hdr_len; ; offset += len) { unsigned short chksum; - void* data = (void*)&file_data[src_offset]; + const void *data = (const void *)&file_data[src_offset]; len = LWIP_MIN(chunk_size, (int)file_size - src_offset); if (len == 0) { break; } chksum = ~inet_chksum(data, (u16_t)len); /* add checksum for data */ - fprintf(struct_file, "{%d, 0x%04x, %d}," NEWLINE, offset, chksum, len); + fprintf(struct_file, "{%d, 0x%04x, %"SZT_F"}," NEWLINE, offset, chksum, len); i++; } fprintf(struct_file, "};" NEWLINE); @@ -638,77 +691,217 @@ int write_checksums(FILE *struct_file, const char *varname, static int is_valid_char_for_c_var(char x) { - if (((x >= 'A') && (x <= 'Z')) || - ((x >= 'a') && (x <= 'z')) || - ((x >= '0') && (x <= '9')) || - (x == '_')) { - return 1; - } - return 0; + if (((x >= 'A') && (x <= 'Z')) || + ((x >= 'a') && (x <= 'z')) || + ((x >= '0') && (x <= '9')) || + (x == '_')) { + return 1; + } + return 0; } -static void fix_filename_for_c(char* qualifiedName, size_t max_len) +static void fix_filename_for_c(char *qualifiedName, size_t max_len) { - struct file_entry* f; - size_t len = strlen(qualifiedName); - char *new_name = (char*)malloc(len + 2); - int filename_ok; - int cnt = 0; - size_t i; - if (len + 3 == max_len) { - printf("File name too long: \"%s\"\n", qualifiedName); - exit(-1); - } - strcpy(new_name, qualifiedName); - for (i = 0; i < len; i++) { - if (!is_valid_char_for_c_var(new_name[i])) { - new_name[i] = '_'; + struct file_entry *f; + size_t len = strlen(qualifiedName); + char *new_name = (char *)malloc(len + 2); + int filename_ok; + int cnt = 0; + size_t i; + if (len + 3 == max_len) { + printf("File name too long: \"%s\"\n", qualifiedName); + exit(-1); + } + strcpy(new_name, qualifiedName); + for (i = 0; i < len; i++) { + if (!is_valid_char_for_c_var(new_name[i])) { + new_name[i] = '_'; + } + } + do { + filename_ok = 1; + for (f = first_file; f != NULL; f = f->next) { + if (!strcmp(f->filename_c, new_name)) { + filename_ok = 0; + cnt++; + /* try next unique file name */ + sprintf(&new_name[len], "%d", cnt); + break; } - } - do { - filename_ok = 1; - for (f = first_file; f != NULL; f = f->next) { - if (!strcmp(f->filename_c, new_name)) { - filename_ok = 0; - cnt++; - /* try next unique file name */ - sprintf(&new_name[len], "%d", cnt); - break; - } + } + } while (!filename_ok && (cnt < 999)); + if (!filename_ok) { + printf("Failed to get unique file name: \"%s\"\n", qualifiedName); + exit(-1); + } + strcpy(qualifiedName, new_name); + free(new_name); +} + +static void register_filename(const char *qualifiedName) +{ + struct file_entry *fe = (struct file_entry *)malloc(sizeof(struct file_entry)); + fe->filename_c = strdup(qualifiedName); + fe->next = NULL; + if (first_file == NULL) { + first_file = last_file = fe; + } else { + last_file->next = fe; + last_file = fe; + } +} + +static int checkSsiByFilelist(const char* filename_listfile) +{ + FILE *f = fopen(filename_listfile, "r"); + if (f != NULL) { + char *buf; + long rs; + size_t fsize, readcount; + size_t i, l, num_lines; + char **lines; + int state; + + fseek(f, 0, SEEK_END); + rs = ftell(f); + if (rs < 0) { + printf("ftell failed with %d\n", errno); + fclose(f); + return 0; + } + fsize = (size_t)rs; + fseek(f, 0, SEEK_SET); + buf = (char*)malloc(fsize); + if (!buf) { + printf("failed to allocate ssi file buffer\n"); + fclose(f); + return 0; + } + memset(buf, 0, fsize); + readcount = fread(buf, 1, fsize, f); + fclose(f); + if ((readcount > fsize) || !readcount) { + printf("failed to read data from ssi file\n"); + free(buf); + return 0; + } + + /* first pass: get the number of lines (and convert newlines to '0') */ + num_lines = 1; + for (i = 0; i < readcount; i++) { + if (buf[i] == '\n') { + num_lines++; + buf[i] = 0; + } else if (buf[i] == '\r') { + buf[i] = 0; } - } while (!filename_ok && (cnt < 999)); - if (!filename_ok) { - printf("Failed to get unique file name: \"%s\"\n", qualifiedName); - exit(-1); - } - strcpy(qualifiedName, new_name); - free(new_name); + } + /* allocate the line pointer array */ + lines = (char**)malloc(sizeof(char*) * num_lines); + if (!lines) { + printf("failed to allocate ssi line buffer\n"); + free(buf); + return 0; + } + memset(lines, 0, sizeof(char*) * num_lines); + l = 0; + state = 0; + for (i = 0; i < readcount; i++) { + if (state) { + /* waiting for null */ + if (buf[i] == 0) { + state = 0; + } + } else { + /* waiting for beginning of new string */ + if (buf[i] != 0) { + LWIP_ASSERT("lines array overflow", l < num_lines); + lines[l] = &buf[i]; + state = 1; + l++; + } + } + } + LWIP_ASSERT("lines array overflow", l < num_lines); + + ssi_file_buffer = buf; + ssi_file_lines = lines; + ssi_file_num_lines = l; + } + return 0; } -static void register_filename(const char* qualifiedName) +static int is_ssi_file(const char *filename) { - struct file_entry* fe = (struct file_entry*)malloc(sizeof(struct file_entry)); - fe->filename_c = strdup(qualifiedName); - fe->next = NULL; - if (first_file == NULL) { - first_file = last_file = fe; - } else { - last_file->next = fe; - last_file = fe; - } -} - -int is_ssi_file(const char* filename) -{ - size_t loop; - for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { - if (strstr(filename, g_pcSSIExtensions[loop])) { - return 1; + if (supportSsi) { + if (ssi_file_buffer) { + /* compare by list */ + size_t i; + int ret = 0; + /* build up the relative path to this file */ + size_t sublen = strlen(curSubdir); + size_t freelen = sizeof(curSubdir) - sublen - 1; + strncat(curSubdir, "/", freelen); + strncat(curSubdir, filename, freelen - 1); + curSubdir[sizeof(curSubdir) - 1] = 0; + for (i = 0; i < ssi_file_num_lines; i++) { + const char *listed_file = ssi_file_lines[i]; + /* compare without the leading '/' */ + if (!strcmp(&curSubdir[1], listed_file)) { + ret = 1; + } + } + curSubdir[sublen] = 0; + return ret; + } else { + /* check file extension */ + size_t loop; + for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { + if (strstr(filename, g_pcSSIExtensions[loop])) { + return 1; + } + } } } return 0; } +static int ext_in_list(const char* filename, const char *ext_list) +{ + int found = 0; + const char *ext = ext_list; + if (ext_list == NULL) { + return 0; + } + while(*ext != '\0') { + const char *comma = strchr(ext, ','); + size_t ext_size; + size_t filename_size = strlen(filename); + if (comma == NULL) { + comma = strchr(ext, '\0'); + } + ext_size = comma - ext; + if ((filename[filename_size - ext_size - 1] == '.') && + !strncmp(&filename[filename_size - ext_size], ext, ext_size)) { + found = 1; + break; + } + ext = comma + 1; + } + + return found; +} + +static int file_to_exclude(const char *filename) +{ + return (exclude_list != NULL) && ext_in_list(filename, exclude_list); +} + +static int file_can_be_compressed(const char *filename) +{ + return (ncompress_list == NULL) || !ext_in_list(filename, ncompress_list); +} + int process_file(FILE *data_file, FILE *struct_file, const char *filename) { char varname[MAX_PATH_LEN]; @@ -719,13 +912,15 @@ int process_file(FILE *data_file, FILE *struct_file, const char *filename) u16_t http_hdr_len = 0; int chksum_count = 0; u8_t flags = 0; - const char* flags_str; u8_t has_content_len; - u8_t* file_data; + u8_t *file_data; + int is_ssi; + int can_be_compressed; int is_compressed = 0; + int flags_printed; /* create qualified name (@todo: prepend slash or not?) */ - sprintf(qualifiedName,"%s/%s", curSubdir, filename); + sprintf(qualifiedName, "%s/%s", curSubdir, filename); /* create C variable name */ strcpy(varname, qualifiedName); /* convert slashes & dots to underscores */ @@ -739,24 +934,32 @@ int process_file(FILE *data_file, FILE *struct_file, const char *filename) #endif /* ALIGN_PAYLOAD */ fprintf(data_file, "static const unsigned char FSDATA_ALIGN_PRE data_%s[] FSDATA_ALIGN_POST = {" NEWLINE, varname); /* encode source file name (used by file system, not returned to browser) */ - fprintf(data_file, "/* %s (%d chars) */" NEWLINE, qualifiedName, strlen(qualifiedName)+1); - file_put_ascii(data_file, qualifiedName, strlen(qualifiedName)+1, &i); + fprintf(data_file, "/* %s (%"SZT_F" chars) */" NEWLINE, qualifiedName, strlen(qualifiedName) + 1); + file_put_ascii(data_file, qualifiedName, strlen(qualifiedName) + 1, &i); #if ALIGN_PAYLOAD /* pad to even number of bytes to assure payload is on aligned boundary */ - while(i % PAYLOAD_ALIGNMENT != 0) { - fprintf(data_file, "0x%02.2x,", 0); + while (i % PAYLOAD_ALIGNMENT != 0) { + fprintf(data_file, "0x%02x,", 0); i++; } #endif /* ALIGN_PAYLOAD */ fprintf(data_file, NEWLINE); - has_content_len = !is_ssi_file(filename); - file_data = get_file_data(filename, &file_size, includeHttpHeader && has_content_len, &is_compressed); + is_ssi = is_ssi_file(filename); + if (is_ssi) { + flags |= FS_FILE_FLAGS_SSI; + } + has_content_len = !is_ssi; + can_be_compressed = includeHttpHeader && !is_ssi && file_can_be_compressed(filename); + file_data = get_file_data(filename, &file_size, can_be_compressed, &is_compressed); if (includeHttpHeader) { file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum, has_content_len, is_compressed); - flags = FS_FILE_FLAGS_HEADER_INCLUDED; + flags |= FS_FILE_FLAGS_HEADER_INCLUDED; if (has_content_len) { flags |= FS_FILE_FLAGS_HEADER_PERSISTENT; + if (useHttp11) { + flags |= FS_FILE_FLAGS_HEADER_HTTPVER_1_1; + } } } if (precalcChksum) { @@ -769,22 +972,37 @@ int process_file(FILE *data_file, FILE *struct_file, const char *filename) fprintf(struct_file, "data_%s," NEWLINE, varname); fprintf(struct_file, "data_%s + %d," NEWLINE, varname, i); fprintf(struct_file, "sizeof(data_%s) - %d," NEWLINE, varname, i); - switch(flags) - { - case(FS_FILE_FLAGS_HEADER_INCLUDED): - flags_str = "FS_FILE_FLAGS_HEADER_INCLUDED"; - break; - case(FS_FILE_FLAGS_HEADER_PERSISTENT): - flags_str = "FS_FILE_FLAGS_HEADER_PERSISTENT"; - break; - case(FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT): - flags_str = "FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT"; - break; - default: - flags_str = "0"; - break; + + flags_printed = 0; + if (flags & FS_FILE_FLAGS_HEADER_INCLUDED) { + fputs("FS_FILE_FLAGS_HEADER_INCLUDED", struct_file); + flags_printed = 1; } - fprintf(struct_file, "%s," NEWLINE, flags_str); + if (flags & FS_FILE_FLAGS_HEADER_PERSISTENT) { + if (flags_printed) { + fputs(" | ", struct_file); + } + fputs("FS_FILE_FLAGS_HEADER_PERSISTENT", struct_file); + flags_printed = 1; + } + if (flags & FS_FILE_FLAGS_HEADER_HTTPVER_1_1) { + if (flags_printed) { + fputs(" | ", struct_file); + } + fputs("FS_FILE_FLAGS_HEADER_HTTPVER_1_1", struct_file); + flags_printed = 1; + } + if (flags & FS_FILE_FLAGS_SSI) { + if (flags_printed) { + fputs(" | ", struct_file); + } + fputs("FS_FILE_FLAGS_SSI", struct_file); + flags_printed = 1; + } + if (!flags_printed) { + fputs("0", struct_file); + } + fputs("," NEWLINE, struct_file); if (precalcChksum) { fprintf(struct_file, "#if HTTPD_PRECALCULATED_CHECKSUM" NEWLINE); fprintf(struct_file, "%d, chksums_%s," NEWLINE, chksum_count, varname); @@ -807,14 +1025,14 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, { int i = 0; int response_type = HTTP_HDR_OK; - const char* file_type; + const char *file_type; const char *cur_string; size_t cur_len; int written = 0; size_t hdr_len = 0; u16_t acc; const char *file_ext; - int j; + size_t j; u8_t provide_last_modified = includeLastModified; memset(hdr_buf, 0, sizeof(hdr_buf)); @@ -842,7 +1060,7 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, } cur_string = g_psHTTPHeaderStrings[response_type]; cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); + fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len); written += file_put_ascii(data_file, cur_string, cur_len, &i); i = 0; if (precalcChksum) { @@ -852,7 +1070,7 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, cur_string = serverID; cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); + fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len); written += file_put_ascii(data_file, cur_string, cur_len, &i); i = 0; if (precalcChksum) { @@ -862,7 +1080,7 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, file_ext = filename; if (file_ext != NULL) { - while(strstr(file_ext, ".") != NULL) { + while (strstr(file_ext, ".") != NULL) { file_ext = strstr(file_ext, "."); file_ext++; } @@ -893,14 +1111,14 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, memset(intbuf, 0, sizeof(intbuf)); cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH]; cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%d+ bytes) */" NEWLINE, cur_string, content_len, cur_len+2); + fprintf(data_file, NEWLINE "/* \"%s%d\r\n\" (%"SZT_F"+ bytes) */" NEWLINE, cur_string, content_len, cur_len + 2); written += file_put_ascii(data_file, cur_string, cur_len, &i); if (precalcChksum) { memcpy(&hdr_buf[hdr_len], cur_string, cur_len); hdr_len += cur_len; } - _itoa(content_len, intbuf, 10); + lwip_itoa(intbuf, sizeof(intbuf), content_len); strcat(intbuf, "\r\n"); cur_len = strlen(intbuf); written += file_put_ascii(data_file, intbuf, cur_len, &i); @@ -913,23 +1131,23 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, if (provide_last_modified) { char modbuf[256]; struct stat stat_data; - struct tm* t; + struct tm *t; memset(modbuf, 0, sizeof(modbuf)); memset(&stat_data, 0, sizeof(stat_data)); cur_string = modbuf; strcpy(modbuf, "Last-Modified: "); if (stat(filename, &stat_data) != 0) { - printf("stat(%s) failed with error %d\n", filename, errno); - exit(-1); + printf("stat(%s) failed with error %d\n", filename, errno); + exit(-1); } t = gmtime(&stat_data.st_mtime); if (t == NULL) { - printf("gmtime() failed with error %d\n", errno); - exit(-1); + printf("gmtime() failed with error %d\n", errno); + exit(-1); } - strftime(&modbuf[15], sizeof(modbuf)-15, "%a, %d %b %Y %H:%M:%S GMT", t); + strftime(&modbuf[15], sizeof(modbuf) - 15, "%a, %d %b %Y %H:%M:%S GMT", t); cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s\"\r\n\" (%d+ bytes) */" NEWLINE, cur_string, cur_len+2); + fprintf(data_file, NEWLINE "/* \"%s\"\r\n\" (%"SZT_F"+ bytes) */" NEWLINE, cur_string, cur_len + 2); written += file_put_ascii(data_file, cur_string, cur_len, &i); if (precalcChksum) { memcpy(&hdr_buf[hdr_len], cur_string, cur_len); @@ -957,7 +1175,7 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE]; } cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); + fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len); written += file_put_ascii(data_file, cur_string, cur_len, &i); i = 0; if (precalcChksum) { @@ -983,17 +1201,17 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, /* write content-type, ATTENTION: this includes the double-CRLF! */ cur_string = file_type; cur_len = strlen(cur_string); - fprintf(data_file, NEWLINE "/* \"%s\" (%d bytes) */" NEWLINE, cur_string, cur_len); + fprintf(data_file, NEWLINE "/* \"%s\" (%"SZT_F" bytes) */" NEWLINE, cur_string, cur_len); written += file_put_ascii(data_file, cur_string, cur_len, &i); i = 0; /* ATTENTION: headers are done now (double-CRLF has been written!) */ if (precalcChksum) { + LWIP_ASSERT("hdr_len + cur_len <= sizeof(hdr_buf)", hdr_len + cur_len <= sizeof(hdr_buf)); memcpy(&hdr_buf[hdr_len], cur_string, cur_len); hdr_len += cur_len; - LWIP_ASSERT("hdr_len <= 0xffff", hdr_len <= 0xffff); LWIP_ASSERT("strlen(hdr_buf) == hdr_len", strlen(hdr_buf) == hdr_len); acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len); *http_hdr_len = (u16_t)hdr_len; @@ -1003,12 +1221,12 @@ int file_write_http_header(FILE *data_file, const char *filename, int file_size, return written; } -int file_put_ascii(FILE *file, const char* ascii_string, int len, int *i) +int file_put_ascii(FILE *file, const char *ascii_string, int len, int *i) { int x; for (x = 0; x < len; x++) { unsigned char cur = ascii_string[x]; - fprintf(file, "0x%02.2x,", cur); + fprintf(file, "0x%02x,", cur); if ((++(*i) % HEX_BYTES_PER_LINE) == 0) { fprintf(file, NEWLINE); } @@ -1022,7 +1240,7 @@ int s_put_ascii(char *buf, const char *ascii_string, int len, int *i) int idx = 0; for (x = 0; x < len; x++) { unsigned char cur = ascii_string[x]; - sprintf(&buf[idx], "0x%02.2x,", cur); + sprintf(&buf[idx], "0x%02x,", cur); idx += 5; if ((++(*i) % HEX_BYTES_PER_LINE) == 0) { sprintf(&buf[idx], NEWLINE); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/readme.txt similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/httpd/makefsdata/readme.txt rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/readme.txt diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/tinydir.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/tinydir.h new file mode 100644 index 0000000..32ae5e8 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/http/makefsdata/tinydir.h @@ -0,0 +1,808 @@ +/* +Copyright (c) 2013-2017, tinydir authors: +- Cong Xu +- Lautis Sun +- Baudouin Feildel +- Andargor +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef TINYDIR_H +#define TINYDIR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if ((defined _UNICODE) && !(defined UNICODE)) +#define UNICODE +#endif + +#if ((defined UNICODE) && !(defined _UNICODE)) +#define _UNICODE +#endif + +#include +#include +#include +#ifdef _MSC_VER +# define WIN32_LEAN_AND_MEAN +# include +# include +# pragma warning(push) +# pragma warning (disable : 4996) +#else +# include +# include +# include +# include +#endif +#ifdef __MINGW32__ +# include +#endif + + +/* types */ + +/* Windows UNICODE wide character support */ +#if defined _MSC_VER || defined __MINGW32__ +#define _tinydir_char_t TCHAR +#define TINYDIR_STRING(s) _TEXT(s) +#define _tinydir_strlen _tcslen +#define _tinydir_strcpy _tcscpy +#define _tinydir_strcat _tcscat +#define _tinydir_strcmp _tcscmp +#define _tinydir_strrchr _tcsrchr +#define _tinydir_strncmp _tcsncmp +#else +#define _tinydir_char_t char +#define TINYDIR_STRING(s) s +#define _tinydir_strlen strlen +#define _tinydir_strcpy strcpy +#define _tinydir_strcat strcat +#define _tinydir_strcmp strcmp +#define _tinydir_strrchr strrchr +#define _tinydir_strncmp strncmp +#endif + +#if (defined _MSC_VER || defined __MINGW32__) +#include +#define _TINYDIR_PATH_MAX MAX_PATH +#elif defined __linux__ +#include +#define _TINYDIR_PATH_MAX PATH_MAX +#else +#define _TINYDIR_PATH_MAX 4096 +#endif + +#ifdef _MSC_VER +/* extra chars for the "\\*" mask */ +# define _TINYDIR_PATH_EXTRA 2 +#else +# define _TINYDIR_PATH_EXTRA 0 +#endif + +#define _TINYDIR_FILENAME_MAX 256 + +#if (defined _MSC_VER || defined __MINGW32__) +#define _TINYDIR_DRIVE_MAX 3 +#endif + +#ifdef _MSC_VER +# define _TINYDIR_FUNC static __inline +#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# define _TINYDIR_FUNC static __inline__ +#else +# define _TINYDIR_FUNC static inline +#endif + +/* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */ +#ifdef TINYDIR_USE_READDIR_R + +/* readdir_r is a POSIX-only function, and may not be available under various + * environments/settings, e.g. MinGW. Use readdir fallback */ +#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\ + _POSIX_SOURCE +# define _TINYDIR_HAS_READDIR_R +#endif +#if _POSIX_C_SOURCE >= 200112L +# define _TINYDIR_HAS_FPATHCONF +# include +#endif +#if _BSD_SOURCE || _SVID_SOURCE || \ + (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) +# define _TINYDIR_HAS_DIRFD +# include +#endif +#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\ + defined _PC_NAME_MAX +# define _TINYDIR_USE_FPATHCONF +#endif +#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\ + !(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX) +# define _TINYDIR_USE_READDIR +#endif + +/* Use readdir by default */ +#else +# define _TINYDIR_USE_READDIR +#endif + +/* MINGW32 has two versions of dirent, ASCII and UNICODE*/ +#ifndef _MSC_VER +#if (defined __MINGW32__) && (defined _UNICODE) +#define _TINYDIR_DIR _WDIR +#define _tinydir_dirent _wdirent +#define _tinydir_opendir _wopendir +#define _tinydir_readdir _wreaddir +#define _tinydir_closedir _wclosedir +#else +#define _TINYDIR_DIR DIR +#define _tinydir_dirent dirent +#define _tinydir_opendir opendir +#define _tinydir_readdir readdir +#define _tinydir_closedir closedir +#endif +#endif + +/* Allow user to use a custom allocator by defining _TINYDIR_MALLOC and _TINYDIR_FREE. */ +#if defined(_TINYDIR_MALLOC) && defined(_TINYDIR_FREE) +#elif !defined(_TINYDIR_MALLOC) && !defined(_TINYDIR_FREE) +#else +#error "Either define both alloc and free or none of them!" +#endif + +#if !defined(_TINYDIR_MALLOC) + #define _TINYDIR_MALLOC(_size) malloc(_size) + #define _TINYDIR_FREE(_ptr) free(_ptr) +#endif /* !defined(_TINYDIR_MALLOC) */ + +typedef struct tinydir_file +{ + _tinydir_char_t path[_TINYDIR_PATH_MAX]; + _tinydir_char_t name[_TINYDIR_FILENAME_MAX]; + _tinydir_char_t *extension; + int is_dir; + int is_reg; + +#ifndef _MSC_VER +#ifdef __MINGW32__ + struct _stat _s; +#else + struct stat _s; +#endif +#endif +} tinydir_file; + +typedef struct tinydir_dir +{ + _tinydir_char_t path[_TINYDIR_PATH_MAX]; + int has_next; + size_t n_files; + + tinydir_file *_files; +#ifdef _MSC_VER + HANDLE _h; + WIN32_FIND_DATA _f; +#else + _TINYDIR_DIR *_d; + struct _tinydir_dirent *_e; +#ifndef _TINYDIR_USE_READDIR + struct _tinydir_dirent *_ep; +#endif +#endif +} tinydir_dir; + + +/* declarations */ + +_TINYDIR_FUNC +int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path); +_TINYDIR_FUNC +int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path); +_TINYDIR_FUNC +void tinydir_close(tinydir_dir *dir); + +_TINYDIR_FUNC +int tinydir_next(tinydir_dir *dir); +_TINYDIR_FUNC +int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file); +_TINYDIR_FUNC +int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i); +_TINYDIR_FUNC +int tinydir_open_subdir_n(tinydir_dir *dir, size_t i); + +_TINYDIR_FUNC +int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path); +_TINYDIR_FUNC +void _tinydir_get_ext(tinydir_file *file); +_TINYDIR_FUNC +int _tinydir_file_cmp(const void *a, const void *b); +#ifndef _MSC_VER +#ifndef _TINYDIR_USE_READDIR +_TINYDIR_FUNC +size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp); +#endif +#endif + + +/* definitions*/ + +_TINYDIR_FUNC +int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path) +{ +#ifndef _MSC_VER +#ifndef _TINYDIR_USE_READDIR + int error; + int size; /* using int size */ +#endif +#else + _tinydir_char_t path_buf[_TINYDIR_PATH_MAX]; +#endif + _tinydir_char_t *pathp; + + if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0) + { + errno = EINVAL; + return -1; + } + if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) + { + errno = ENAMETOOLONG; + return -1; + } + + /* initialise dir */ + dir->_files = NULL; +#ifdef _MSC_VER + dir->_h = INVALID_HANDLE_VALUE; +#else + dir->_d = NULL; +#ifndef _TINYDIR_USE_READDIR + dir->_ep = NULL; +#endif +#endif + tinydir_close(dir); + + _tinydir_strcpy(dir->path, path); + /* Remove trailing slashes */ + pathp = &dir->path[_tinydir_strlen(dir->path) - 1]; + while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/'))) + { + *pathp = TINYDIR_STRING('\0'); + pathp++; + } +#ifdef _MSC_VER + _tinydir_strcpy(path_buf, dir->path); + _tinydir_strcat(path_buf, TINYDIR_STRING("\\*")); +#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP) + dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0); +#else + dir->_h = FindFirstFile(path_buf, &dir->_f); +#endif + if (dir->_h == INVALID_HANDLE_VALUE) + { + errno = ENOENT; +#else + dir->_d = _tinydir_opendir(path); + if (dir->_d == NULL) + { +#endif + goto bail; + } + + /* read first file */ + dir->has_next = 1; +#ifndef _MSC_VER +#ifdef _TINYDIR_USE_READDIR + dir->_e = _tinydir_readdir(dir->_d); +#else + /* allocate dirent buffer for readdir_r */ + size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */ + if (size == -1) return -1; + dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size); + if (dir->_ep == NULL) return -1; + + error = readdir_r(dir->_d, dir->_ep, &dir->_e); + if (error != 0) return -1; +#endif + if (dir->_e == NULL) + { + dir->has_next = 0; + } +#endif + + return 0; + +bail: + tinydir_close(dir); + return -1; +} + +_TINYDIR_FUNC +int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path) +{ + /* Count the number of files first, to pre-allocate the files array */ + size_t n_files = 0; + if (tinydir_open(dir, path) == -1) + { + return -1; + } + while (dir->has_next) + { + n_files++; + if (tinydir_next(dir) == -1) + { + goto bail; + } + } + tinydir_close(dir); + + if (tinydir_open(dir, path) == -1) + { + return -1; + } + + dir->n_files = 0; + dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files); + if (dir->_files == NULL) + { + goto bail; + } + while (dir->has_next) + { + tinydir_file *p_file; + dir->n_files++; + + p_file = &dir->_files[dir->n_files - 1]; + if (tinydir_readfile(dir, p_file) == -1) + { + goto bail; + } + + if (tinydir_next(dir) == -1) + { + goto bail; + } + + /* Just in case the number of files has changed between the first and + second reads, terminate without writing into unallocated memory */ + if (dir->n_files == n_files) + { + break; + } + } + + qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp); + + return 0; + +bail: + tinydir_close(dir); + return -1; +} + +_TINYDIR_FUNC +void tinydir_close(tinydir_dir *dir) +{ + if (dir == NULL) + { + return; + } + + memset(dir->path, 0, sizeof(dir->path)); + dir->has_next = 0; + dir->n_files = 0; + _TINYDIR_FREE(dir->_files); + dir->_files = NULL; +#ifdef _MSC_VER + if (dir->_h != INVALID_HANDLE_VALUE) + { + FindClose(dir->_h); + } + dir->_h = INVALID_HANDLE_VALUE; +#else + if (dir->_d) + { + _tinydir_closedir(dir->_d); + } + dir->_d = NULL; + dir->_e = NULL; +#ifndef _TINYDIR_USE_READDIR + _TINYDIR_FREE(dir->_ep); + dir->_ep = NULL; +#endif +#endif +} + +_TINYDIR_FUNC +int tinydir_next(tinydir_dir *dir) +{ + if (dir == NULL) + { + errno = EINVAL; + return -1; + } + if (!dir->has_next) + { + errno = ENOENT; + return -1; + } + +#ifdef _MSC_VER + if (FindNextFile(dir->_h, &dir->_f) == 0) +#else +#ifdef _TINYDIR_USE_READDIR + dir->_e = _tinydir_readdir(dir->_d); +#else + if (dir->_ep == NULL) + { + return -1; + } + if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0) + { + return -1; + } +#endif + if (dir->_e == NULL) +#endif + { + dir->has_next = 0; +#ifdef _MSC_VER + if (GetLastError() != ERROR_SUCCESS && + GetLastError() != ERROR_NO_MORE_FILES) + { + tinydir_close(dir); + errno = EIO; + return -1; + } +#endif + } + + return 0; +} + +_TINYDIR_FUNC +int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file) +{ + if (dir == NULL || file == NULL) + { + errno = EINVAL; + return -1; + } +#ifdef _MSC_VER + if (dir->_h == INVALID_HANDLE_VALUE) +#else + if (dir->_e == NULL) +#endif + { + errno = ENOENT; + return -1; + } + if (_tinydir_strlen(dir->path) + + _tinydir_strlen( +#ifdef _MSC_VER + dir->_f.cFileName +#else + dir->_e->d_name +#endif + ) + 1 + _TINYDIR_PATH_EXTRA >= + _TINYDIR_PATH_MAX) + { + /* the path for the file will be too long */ + errno = ENAMETOOLONG; + return -1; + } + if (_tinydir_strlen( +#ifdef _MSC_VER + dir->_f.cFileName +#else + dir->_e->d_name +#endif + ) >= _TINYDIR_FILENAME_MAX) + { + errno = ENAMETOOLONG; + return -1; + } + + _tinydir_strcpy(file->path, dir->path); + _tinydir_strcat(file->path, TINYDIR_STRING("/")); + _tinydir_strcpy(file->name, +#ifdef _MSC_VER + dir->_f.cFileName +#else + dir->_e->d_name +#endif + ); + _tinydir_strcat(file->path, file->name); +#ifndef _MSC_VER +#ifdef __MINGW32__ + if (_tstat( +#else + if (stat( +#endif + file->path, &file->_s) == -1) + { + return -1; + } +#endif + _tinydir_get_ext(file); + + file->is_dir = +#ifdef _MSC_VER + !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); +#else + S_ISDIR(file->_s.st_mode); +#endif + file->is_reg = +#ifdef _MSC_VER + !!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || + ( + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) && + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) && +#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) && +#endif +#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) && +#endif + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) && + !(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY)); +#else + S_ISREG(file->_s.st_mode); +#endif + + return 0; +} + +_TINYDIR_FUNC +int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i) +{ + if (dir == NULL || file == NULL) + { + errno = EINVAL; + return -1; + } + if (i >= dir->n_files) + { + errno = ENOENT; + return -1; + } + + memcpy(file, &dir->_files[i], sizeof(tinydir_file)); + _tinydir_get_ext(file); + + return 0; +} + +_TINYDIR_FUNC +int tinydir_open_subdir_n(tinydir_dir *dir, size_t i) +{ + _tinydir_char_t path[_TINYDIR_PATH_MAX]; + if (dir == NULL) + { + errno = EINVAL; + return -1; + } + if (i >= dir->n_files || !dir->_files[i].is_dir) + { + errno = ENOENT; + return -1; + } + + _tinydir_strcpy(path, dir->_files[i].path); + tinydir_close(dir); + if (tinydir_open_sorted(dir, path) == -1) + { + return -1; + } + + return 0; +} + +/* Open a single file given its path */ +_TINYDIR_FUNC +int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path) +{ + tinydir_dir dir; + int result = 0; + int found = 0; + _tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX]; + _tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX]; + _tinydir_char_t *dir_name; + _tinydir_char_t *base_name; +#if (defined _MSC_VER || defined __MINGW32__) + _tinydir_char_t drive_buf[_TINYDIR_PATH_MAX]; + _tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX]; +#endif + + if (file == NULL || path == NULL || _tinydir_strlen(path) == 0) + { + errno = EINVAL; + return -1; + } + if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX) + { + errno = ENAMETOOLONG; + return -1; + } + + /* Get the parent path */ +#if (defined _MSC_VER || defined __MINGW32__) +#if ((defined _MSC_VER) && (_MSC_VER >= 1400)) + _tsplitpath_s( + path, + drive_buf, _TINYDIR_DRIVE_MAX, + dir_name_buf, _TINYDIR_FILENAME_MAX, + file_name_buf, _TINYDIR_FILENAME_MAX, + ext_buf, _TINYDIR_FILENAME_MAX); +#else + _tsplitpath( + path, + drive_buf, + dir_name_buf, + file_name_buf, + ext_buf); +#endif + +/* _splitpath_s not work fine with only filename and widechar support */ +#ifdef _UNICODE + if (drive_buf[0] == L'\xFEFE') + drive_buf[0] = '\0'; + if (dir_name_buf[0] == L'\xFEFE') + dir_name_buf[0] = '\0'; +#endif + + if (errno) + { + errno = EINVAL; + return -1; + } + /* Emulate the behavior of dirname by returning "." for dir name if it's + empty */ + if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0') + { + _tinydir_strcpy(dir_name_buf, TINYDIR_STRING(".")); + } + /* Concatenate the drive letter and dir name to form full dir name */ + _tinydir_strcat(drive_buf, dir_name_buf); + dir_name = drive_buf; + /* Concatenate the file name and extension to form base name */ + _tinydir_strcat(file_name_buf, ext_buf); + base_name = file_name_buf; +#else + _tinydir_strcpy(dir_name_buf, path); + dir_name = dirname(dir_name_buf); + _tinydir_strcpy(file_name_buf, path); + base_name =basename(file_name_buf); +#endif + + /* Open the parent directory */ + if (tinydir_open(&dir, dir_name) == -1) + { + return -1; + } + + /* Read through the parent directory and look for the file */ + while (dir.has_next) + { + if (tinydir_readfile(&dir, file) == -1) + { + result = -1; + goto bail; + } + if (_tinydir_strcmp(file->name, base_name) == 0) + { + /* File found */ + found = 1; + break; + } + tinydir_next(&dir); + } + if (!found) + { + result = -1; + errno = ENOENT; + } + +bail: + tinydir_close(&dir); + return result; +} + +_TINYDIR_FUNC +void _tinydir_get_ext(tinydir_file *file) +{ + _tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.')); + if (period == NULL) + { + file->extension = &(file->name[_tinydir_strlen(file->name)]); + } + else + { + file->extension = period + 1; + } +} + +_TINYDIR_FUNC +int _tinydir_file_cmp(const void *a, const void *b) +{ + const tinydir_file *fa = (const tinydir_file *)a; + const tinydir_file *fb = (const tinydir_file *)b; + if (fa->is_dir != fb->is_dir) + { + return -(fa->is_dir - fb->is_dir); + } + return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX); +} + +#ifndef _MSC_VER +#ifndef _TINYDIR_USE_READDIR +/* +The following authored by Ben Hutchings +from https://womble.decadent.org.uk/readdir_r-advisory.html +*/ +/* Calculate the required buffer size (in bytes) for directory * +* entries read from the given directory handle. Return -1 if this * +* this cannot be done. * +* * +* This code does not trust values of NAME_MAX that are less than * +* 255, since some systems (including at least HP-UX) incorrectly * +* define it to be a smaller value. */ +_TINYDIR_FUNC +size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp) +{ + long name_max; + size_t name_end; + /* parameter may be unused */ + (void)dirp; + +#if defined _TINYDIR_USE_FPATHCONF + name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX); + if (name_max == -1) +#if defined(NAME_MAX) + name_max = (NAME_MAX > 255) ? NAME_MAX : 255; +#else + return (size_t)(-1); +#endif +#elif defined(NAME_MAX) + name_max = (NAME_MAX > 255) ? NAME_MAX : 255; +#else +#error "buffer size for readdir_r cannot be determined" +#endif + name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1; + return (name_end > sizeof(struct _tinydir_dirent) ? + name_end : sizeof(struct _tinydir_dirent)); +} +#endif +#endif + +#ifdef __cplusplus +} +#endif + +# if defined (_MSC_VER) +# pragma warning(pop) +# endif + +#endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/lwiperf/lwiperf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/lwiperf/lwiperf.c new file mode 100644 index 0000000..dbec4da --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/lwiperf/lwiperf.c @@ -0,0 +1,841 @@ +/** + * @file + * lwIP iPerf server implementation + */ + +/** + * @defgroup iperf Iperf server + * @ingroup apps + * + * This is a simple performance measuring client/server to check your bandwith using + * iPerf2 on a PC as server/client. + * It is currently a minimal implementation providing a TCP client/server only. + * + * @todo: + * - implement UDP mode + * - protect combined sessions handling (via 'related_master_state') against reallocation + * (this is a pointer address, currently, so if the same memory is allocated again, + * session pairs (tx/rx) can be confused on reallocation) + */ + +/* + * Copyright (c) 2014 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + */ + +#include "lwip/apps/lwiperf.h" + +#include "lwip/tcp.h" +#include "lwip/sys.h" + +#include + +/* Currently, only TCP is implemented */ +#if LWIP_TCP && LWIP_CALLBACK_API + +/** Specify the idle timeout (in seconds) after that the test fails */ +#ifndef LWIPERF_TCP_MAX_IDLE_SEC +#define LWIPERF_TCP_MAX_IDLE_SEC 10U +#endif +#if LWIPERF_TCP_MAX_IDLE_SEC > 255 +#error LWIPERF_TCP_MAX_IDLE_SEC must fit into an u8_t +#endif + +/** Change this if you don't want to lwiperf to listen to any IP version */ +#ifndef LWIPERF_SERVER_IP_TYPE +#define LWIPERF_SERVER_IP_TYPE IPADDR_TYPE_ANY +#endif + +/* File internal memory allocation (struct lwiperf_*): this defaults to + the heap */ +#ifndef LWIPERF_ALLOC +#define LWIPERF_ALLOC(type) mem_malloc(sizeof(type)) +#define LWIPERF_FREE(type, item) mem_free(item) +#endif + +/** If this is 1, check that received data has the correct format */ +#ifndef LWIPERF_CHECK_RX_DATA +#define LWIPERF_CHECK_RX_DATA 0 +#endif + +/** This is the Iperf settings struct sent from the client */ +typedef struct _lwiperf_settings { +#define LWIPERF_FLAGS_ANSWER_TEST 0x80000000 +#define LWIPERF_FLAGS_ANSWER_NOW 0x00000001 + u32_t flags; + u32_t num_threads; /* unused for now */ + u32_t remote_port; + u32_t buffer_len; /* unused for now */ + u32_t win_band; /* TCP window / UDP rate: unused for now */ + u32_t amount; /* pos. value: bytes?; neg. values: time (unit is 10ms: 1/100 second) */ +} lwiperf_settings_t; + +/** Basic connection handle */ +struct _lwiperf_state_base; +typedef struct _lwiperf_state_base lwiperf_state_base_t; +struct _lwiperf_state_base { + /* linked list */ + lwiperf_state_base_t *next; + /* 1=tcp, 0=udp */ + u8_t tcp; + /* 1=server, 0=client */ + u8_t server; + /* master state used to abort sessions (e.g. listener, main client) */ + lwiperf_state_base_t *related_master_state; +}; + +/** Connection handle for a TCP iperf session */ +typedef struct _lwiperf_state_tcp { + lwiperf_state_base_t base; + struct tcp_pcb *server_pcb; + struct tcp_pcb *conn_pcb; + u32_t time_started; + lwiperf_report_fn report_fn; + void *report_arg; + u8_t poll_count; + u8_t next_num; + /* 1=start server when client is closed */ + u8_t client_tradeoff_mode; + u32_t bytes_transferred; + lwiperf_settings_t settings; + u8_t have_settings_buf; + u8_t specific_remote; + ip_addr_t remote_addr; +} lwiperf_state_tcp_t; + +/** List of active iperf sessions */ +static lwiperf_state_base_t *lwiperf_all_connections; +/** A const buffer to send from: we want to measure sending, not copying! */ +static const u8_t lwiperf_txbuf_const[1600] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', +}; + +static err_t lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb); +static void lwiperf_tcp_err(void *arg, err_t err); +static err_t lwiperf_start_tcp_server_impl(const ip_addr_t *local_addr, u16_t local_port, + lwiperf_report_fn report_fn, void *report_arg, + lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **state); + + +/** Add an iperf session to the 'active' list */ +static void +lwiperf_list_add(lwiperf_state_base_t *item) +{ + item->next = lwiperf_all_connections; + lwiperf_all_connections = item; +} + +/** Remove an iperf session from the 'active' list */ +static void +lwiperf_list_remove(lwiperf_state_base_t *item) +{ + lwiperf_state_base_t *prev = NULL; + lwiperf_state_base_t *iter; + for (iter = lwiperf_all_connections; iter != NULL; prev = iter, iter = iter->next) { + if (iter == item) { + if (prev == NULL) { + lwiperf_all_connections = iter->next; + } else { + prev->next = iter->next; + } + /* @debug: ensure this item is listed only once */ + for (iter = iter->next; iter != NULL; iter = iter->next) { + LWIP_ASSERT("duplicate entry", iter != item); + } + break; + } + } +} + +static lwiperf_state_base_t * +lwiperf_list_find(lwiperf_state_base_t *item) +{ + lwiperf_state_base_t *iter; + for (iter = lwiperf_all_connections; iter != NULL; iter = iter->next) { + if (iter == item) { + return item; + } + } + return NULL; +} + +/** Call the report function of an iperf tcp session */ +static void +lwip_tcp_conn_report(lwiperf_state_tcp_t *conn, enum lwiperf_report_type report_type) +{ + if ((conn != NULL) && (conn->report_fn != NULL)) { + u32_t now, duration_ms, bandwidth_kbitpsec; + now = sys_now(); + duration_ms = now - conn->time_started; + if (duration_ms == 0) { + bandwidth_kbitpsec = 0; + } else { + bandwidth_kbitpsec = (conn->bytes_transferred / duration_ms) * 8U; + } + conn->report_fn(conn->report_arg, report_type, + &conn->conn_pcb->local_ip, conn->conn_pcb->local_port, + &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port, + conn->bytes_transferred, duration_ms, bandwidth_kbitpsec); + } +} + +/** Close an iperf tcp session */ +static void +lwiperf_tcp_close(lwiperf_state_tcp_t *conn, enum lwiperf_report_type report_type) +{ + err_t err; + + lwiperf_list_remove(&conn->base); + lwip_tcp_conn_report(conn, report_type); + if (conn->conn_pcb != NULL) { + tcp_arg(conn->conn_pcb, NULL); + tcp_poll(conn->conn_pcb, NULL, 0); + tcp_sent(conn->conn_pcb, NULL); + tcp_recv(conn->conn_pcb, NULL); + tcp_err(conn->conn_pcb, NULL); + err = tcp_close(conn->conn_pcb); + if (err != ERR_OK) { + /* don't want to wait for free memory here... */ + tcp_abort(conn->conn_pcb); + } + } else { + /* no conn pcb, this is the listener pcb */ + err = tcp_close(conn->server_pcb); + LWIP_ASSERT("error", err == ERR_OK); + } + LWIPERF_FREE(lwiperf_state_tcp_t, conn); +} + +/** Try to send more data on an iperf tcp session */ +static err_t +lwiperf_tcp_client_send_more(lwiperf_state_tcp_t *conn) +{ + int send_more; + err_t err; + u16_t txlen; + u16_t txlen_max; + void *txptr; + u8_t apiflags; + + LWIP_ASSERT("conn invalid", (conn != NULL) && conn->base.tcp && (conn->base.server == 0)); + + do { + send_more = 0; + if (conn->settings.amount & PP_HTONL(0x80000000)) { + /* this session is time-limited */ + u32_t now = sys_now(); + u32_t diff_ms = now - conn->time_started; + u32_t time = (u32_t) - (s32_t)lwip_htonl(conn->settings.amount); + u32_t time_ms = time * 10; + if (diff_ms >= time_ms) { + /* time specified by the client is over -> close the connection */ + lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT); + return ERR_OK; + } + } else { + /* this session is byte-limited */ + u32_t amount_bytes = lwip_htonl(conn->settings.amount); + /* @todo: this can send up to 1*MSS more than requested... */ + if (amount_bytes >= conn->bytes_transferred) { + /* all requested bytes transferred -> close the connection */ + lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT); + return ERR_OK; + } + } + + if (conn->bytes_transferred < 24) { + /* transmit the settings a first time */ + txptr = &((u8_t *)&conn->settings)[conn->bytes_transferred]; + txlen_max = (u16_t)(24 - conn->bytes_transferred); + apiflags = TCP_WRITE_FLAG_COPY; + } else if (conn->bytes_transferred < 48) { + /* transmit the settings a second time */ + txptr = &((u8_t *)&conn->settings)[conn->bytes_transferred - 24]; + txlen_max = (u16_t)(48 - conn->bytes_transferred); + apiflags = TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE; + send_more = 1; + } else { + /* transmit data */ + /* @todo: every x bytes, transmit the settings again */ + txptr = LWIP_CONST_CAST(void *, &lwiperf_txbuf_const[conn->bytes_transferred % 10]); + txlen_max = TCP_MSS; + if (conn->bytes_transferred == 48) { /* @todo: fix this for intermediate settings, too */ + txlen_max = TCP_MSS - 24; + } + apiflags = 0; /* no copying needed */ + send_more = 1; + } + txlen = txlen_max; + do { + err = tcp_write(conn->conn_pcb, txptr, txlen, apiflags); + if (err == ERR_MEM) { + txlen /= 2; + } + } while ((err == ERR_MEM) && (txlen >= (TCP_MSS / 2))); + + if (err == ERR_OK) { + conn->bytes_transferred += txlen; + } else { + send_more = 0; + } + } while (send_more); + + tcp_output(conn->conn_pcb); + return ERR_OK; +} + +/** TCP sent callback, try to send more data */ +static err_t +lwiperf_tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) +{ + lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg; + /* @todo: check 'len' (e.g. to time ACK of all data)? for now, we just send more... */ + LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb); + LWIP_UNUSED_ARG(tpcb); + LWIP_UNUSED_ARG(len); + + conn->poll_count = 0; + + return lwiperf_tcp_client_send_more(conn); +} + +/** TCP connected callback (active connection), send data now */ +static err_t +lwiperf_tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err) +{ + lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg; + LWIP_ASSERT("invalid conn", conn->conn_pcb == tpcb); + LWIP_UNUSED_ARG(tpcb); + if (err != ERR_OK) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); + return ERR_OK; + } + conn->poll_count = 0; + conn->time_started = sys_now(); + return lwiperf_tcp_client_send_more(conn); +} + +/** Start TCP connection back to the client (either parallel or after the + * receive test has finished. + */ +static err_t +lwiperf_tx_start_impl(const ip_addr_t *remote_ip, u16_t remote_port, lwiperf_settings_t *settings, lwiperf_report_fn report_fn, + void *report_arg, lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **new_conn) +{ + err_t err; + lwiperf_state_tcp_t *client_conn; + struct tcp_pcb *newpcb; + ip_addr_t remote_addr; + + LWIP_ASSERT("remote_ip != NULL", remote_ip != NULL); + LWIP_ASSERT("remote_ip != NULL", settings != NULL); + LWIP_ASSERT("new_conn != NULL", new_conn != NULL); + *new_conn = NULL; + + client_conn = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t); + if (client_conn == NULL) { + return ERR_MEM; + } + newpcb = tcp_new_ip_type(IP_GET_TYPE(remote_ip)); + if (newpcb == NULL) { + LWIPERF_FREE(lwiperf_state_tcp_t, client_conn); + return ERR_MEM; + } + memset(client_conn, 0, sizeof(lwiperf_state_tcp_t)); + client_conn->base.tcp = 1; + client_conn->base.related_master_state = related_master_state; + client_conn->conn_pcb = newpcb; + client_conn->time_started = sys_now(); /* @todo: set this again on 'connected' */ + client_conn->report_fn = report_fn; + client_conn->report_arg = report_arg; + client_conn->next_num = 4; /* initial nr is '4' since the header has 24 byte */ + client_conn->bytes_transferred = 0; + memcpy(&client_conn->settings, settings, sizeof(*settings)); + client_conn->have_settings_buf = 1; + + tcp_arg(newpcb, client_conn); + tcp_sent(newpcb, lwiperf_tcp_client_sent); + tcp_poll(newpcb, lwiperf_tcp_poll, 2U); + tcp_err(newpcb, lwiperf_tcp_err); + + ip_addr_copy(remote_addr, *remote_ip); + + err = tcp_connect(newpcb, &remote_addr, remote_port, lwiperf_tcp_client_connected); + if (err != ERR_OK) { + lwiperf_tcp_close(client_conn, LWIPERF_TCP_ABORTED_LOCAL); + return err; + } + lwiperf_list_add(&client_conn->base); + *new_conn = client_conn; + return ERR_OK; +} + +static err_t +lwiperf_tx_start_passive(lwiperf_state_tcp_t *conn) +{ + err_t ret; + lwiperf_state_tcp_t *new_conn = NULL; + u16_t remote_port = (u16_t)lwip_htonl(conn->settings.remote_port); + + ret = lwiperf_tx_start_impl(&conn->conn_pcb->remote_ip, remote_port, &conn->settings, conn->report_fn, conn->report_arg, + conn->base.related_master_state, &new_conn); + if (ret == ERR_OK) { + LWIP_ASSERT("new_conn != NULL", new_conn != NULL); + new_conn->settings.flags = 0; /* prevent the remote side starting back as client again */ + } + return ret; +} + +/** Receive data on an iperf tcp session */ +static err_t +lwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) +{ + u8_t tmp; + u16_t tot_len; + u32_t packet_idx; + struct pbuf *q; + lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg; + + LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb); + LWIP_UNUSED_ARG(tpcb); + + if (err != ERR_OK) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); + return ERR_OK; + } + if (p == NULL) { + /* connection closed -> test done */ + if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) { + if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_NOW)) == 0) { + /* client requested transmission after end of test */ + lwiperf_tx_start_passive(conn); + } + } + lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_SERVER); + return ERR_OK; + } + tot_len = p->tot_len; + + conn->poll_count = 0; + + if ((!conn->have_settings_buf) || ((conn->bytes_transferred - 24) % (1024 * 128) == 0)) { + /* wait for 24-byte header */ + if (p->tot_len < sizeof(lwiperf_settings_t)) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); + pbuf_free(p); + return ERR_OK; + } + if (!conn->have_settings_buf) { + if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL); + pbuf_free(p); + return ERR_OK; + } + conn->have_settings_buf = 1; + if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) { + if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_NOW)) { + /* client requested parallel transmission test */ + err_t err2 = lwiperf_tx_start_passive(conn); + if (err2 != ERR_OK) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR); + pbuf_free(p); + return ERR_OK; + } + } + } + } else { + if (conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) { + if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); + pbuf_free(p); + return ERR_OK; + } + } + } + conn->bytes_transferred += sizeof(lwiperf_settings_t); + if (conn->bytes_transferred <= 24) { + conn->time_started = sys_now(); + tcp_recved(tpcb, p->tot_len); + pbuf_free(p); + return ERR_OK; + } + conn->next_num = 4; /* 24 bytes received... */ + tmp = pbuf_remove_header(p, 24); + LWIP_ASSERT("pbuf_remove_header failed", tmp == 0); + LWIP_UNUSED_ARG(tmp); /* for LWIP_NOASSERT */ + } + + packet_idx = 0; + for (q = p; q != NULL; q = q->next) { +#if LWIPERF_CHECK_RX_DATA + const u8_t *payload = (const u8_t *)q->payload; + u16_t i; + for (i = 0; i < q->len; i++) { + u8_t val = payload[i]; + u8_t num = val - '0'; + if (num == conn->next_num) { + conn->next_num++; + if (conn->next_num == 10) { + conn->next_num = 0; + } + } else { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR); + pbuf_free(p); + return ERR_OK; + } + } +#endif + packet_idx += q->len; + } + LWIP_ASSERT("count mismatch", packet_idx == p->tot_len); + conn->bytes_transferred += packet_idx; + tcp_recved(tpcb, tot_len); + pbuf_free(p); + return ERR_OK; +} + +/** Error callback, iperf tcp session aborted */ +static void +lwiperf_tcp_err(void *arg, err_t err) +{ + lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg; + LWIP_UNUSED_ARG(err); + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE); +} + +/** TCP poll callback, try to send more data */ +static err_t +lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb) +{ + lwiperf_state_tcp_t *conn = (lwiperf_state_tcp_t *)arg; + LWIP_ASSERT("pcb mismatch", conn->conn_pcb == tpcb); + LWIP_UNUSED_ARG(tpcb); + if (++conn->poll_count >= LWIPERF_TCP_MAX_IDLE_SEC) { + lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL); + return ERR_OK; /* lwiperf_tcp_close frees conn */ + } + + if (!conn->base.server) { + lwiperf_tcp_client_send_more(conn); + } + + return ERR_OK; +} + +/** This is called when a new client connects for an iperf tcp session */ +static err_t +lwiperf_tcp_accept(void *arg, struct tcp_pcb *newpcb, err_t err) +{ + lwiperf_state_tcp_t *s, *conn; + if ((err != ERR_OK) || (newpcb == NULL) || (arg == NULL)) { + return ERR_VAL; + } + + s = (lwiperf_state_tcp_t *)arg; + LWIP_ASSERT("invalid session", s->base.server); + LWIP_ASSERT("invalid listen pcb", s->server_pcb != NULL); + LWIP_ASSERT("invalid conn pcb", s->conn_pcb == NULL); + if (s->specific_remote) { + LWIP_ASSERT("s->base.related_master_state != NULL", s->base.related_master_state != NULL); + if (!ip_addr_cmp(&newpcb->remote_ip, &s->remote_addr)) { + /* this listener belongs to a client session, and this is not the correct remote */ + return ERR_VAL; + } + } else { + LWIP_ASSERT("s->base.related_master_state == NULL", s->base.related_master_state == NULL); + } + + conn = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t); + if (conn == NULL) { + return ERR_MEM; + } + memset(conn, 0, sizeof(lwiperf_state_tcp_t)); + conn->base.tcp = 1; + conn->base.server = 1; + conn->base.related_master_state = &s->base; + conn->conn_pcb = newpcb; + conn->time_started = sys_now(); + conn->report_fn = s->report_fn; + conn->report_arg = s->report_arg; + + /* setup the tcp rx connection */ + tcp_arg(newpcb, conn); + tcp_recv(newpcb, lwiperf_tcp_recv); + tcp_poll(newpcb, lwiperf_tcp_poll, 2U); + tcp_err(conn->conn_pcb, lwiperf_tcp_err); + + if (s->specific_remote) { + /* this listener belongs to a client, so make the client the master of the newly created connection */ + conn->base.related_master_state = s->base.related_master_state; + /* if dual mode or (tradeoff mode AND client is done): close the listener */ + if (!s->client_tradeoff_mode || !lwiperf_list_find(s->base.related_master_state)) { + /* prevent report when closing: this is expected */ + s->report_fn = NULL; + lwiperf_tcp_close(s, LWIPERF_TCP_ABORTED_LOCAL); + } + } + lwiperf_list_add(&conn->base); + return ERR_OK; +} + +/** + * @ingroup iperf + * Start a TCP iperf server on the default TCP port (5001) and listen for + * incoming connections from iperf clients. + * + * @returns a connection handle that can be used to abort the server + * by calling @ref lwiperf_abort() + */ +void * +lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg) +{ + return lwiperf_start_tcp_server(IP_ADDR_ANY, LWIPERF_TCP_PORT_DEFAULT, + report_fn, report_arg); +} + +/** + * @ingroup iperf + * Start a TCP iperf server on a specific IP address and port and listen for + * incoming connections from iperf clients. + * + * @returns a connection handle that can be used to abort the server + * by calling @ref lwiperf_abort() + */ +void * +lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, + lwiperf_report_fn report_fn, void *report_arg) +{ + err_t err; + lwiperf_state_tcp_t *state = NULL; + + err = lwiperf_start_tcp_server_impl(local_addr, local_port, report_fn, report_arg, + NULL, &state); + if (err == ERR_OK) { + return state; + } + return NULL; +} + +static err_t lwiperf_start_tcp_server_impl(const ip_addr_t *local_addr, u16_t local_port, + lwiperf_report_fn report_fn, void *report_arg, + lwiperf_state_base_t *related_master_state, lwiperf_state_tcp_t **state) +{ + err_t err; + struct tcp_pcb *pcb; + lwiperf_state_tcp_t *s; + + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("state != NULL", state != NULL); + + if (local_addr == NULL) { + return ERR_ARG; + } + + s = (lwiperf_state_tcp_t *)LWIPERF_ALLOC(lwiperf_state_tcp_t); + if (s == NULL) { + return ERR_MEM; + } + memset(s, 0, sizeof(lwiperf_state_tcp_t)); + s->base.tcp = 1; + s->base.server = 1; + s->base.related_master_state = related_master_state; + s->report_fn = report_fn; + s->report_arg = report_arg; + + pcb = tcp_new_ip_type(LWIPERF_SERVER_IP_TYPE); + if (pcb == NULL) { + return ERR_MEM; + } + err = tcp_bind(pcb, local_addr, local_port); + if (err != ERR_OK) { + return err; + } + s->server_pcb = tcp_listen_with_backlog(pcb, 1); + if (s->server_pcb == NULL) { + if (pcb != NULL) { + tcp_close(pcb); + } + LWIPERF_FREE(lwiperf_state_tcp_t, s); + return ERR_MEM; + } + pcb = NULL; + + tcp_arg(s->server_pcb, s); + tcp_accept(s->server_pcb, lwiperf_tcp_accept); + + lwiperf_list_add(&s->base); + *state = s; + return ERR_OK; +} + +/** + * @ingroup iperf + * Start a TCP iperf client to the default TCP port (5001). + * + * @returns a connection handle that can be used to abort the client + * by calling @ref lwiperf_abort() + */ +void* lwiperf_start_tcp_client_default(const ip_addr_t* remote_addr, + lwiperf_report_fn report_fn, void* report_arg) +{ + return lwiperf_start_tcp_client(remote_addr, LWIPERF_TCP_PORT_DEFAULT, LWIPERF_CLIENT, + report_fn, report_arg); +} + +/** + * @ingroup iperf + * Start a TCP iperf client to a specific IP address and port. + * + * @returns a connection handle that can be used to abort the client + * by calling @ref lwiperf_abort() + */ +void* lwiperf_start_tcp_client(const ip_addr_t* remote_addr, u16_t remote_port, + enum lwiperf_client_type type, lwiperf_report_fn report_fn, void* report_arg) +{ + err_t ret; + lwiperf_settings_t settings; + lwiperf_state_tcp_t *state = NULL; + + memset(&settings, 0, sizeof(settings)); + switch (type) { + case LWIPERF_CLIENT: + /* Unidirectional tx only test */ + settings.flags = 0; + break; + case LWIPERF_DUAL: + /* Do a bidirectional test simultaneously */ + settings.flags = htonl(LWIPERF_FLAGS_ANSWER_TEST | LWIPERF_FLAGS_ANSWER_NOW); + break; + case LWIPERF_TRADEOFF: + /* Do a bidirectional test individually */ + settings.flags = htonl(LWIPERF_FLAGS_ANSWER_TEST); + break; + default: + /* invalid argument */ + return NULL; + } + settings.num_threads = htonl(1); + settings.remote_port = htonl(LWIPERF_TCP_PORT_DEFAULT); + /* TODO: implement passing duration/amount of bytes to transfer */ + settings.amount = htonl((u32_t)-1000); + + ret = lwiperf_tx_start_impl(remote_addr, remote_port, &settings, report_fn, report_arg, NULL, &state); + if (ret == ERR_OK) { + LWIP_ASSERT("state != NULL", state != NULL); + if (type != LWIPERF_CLIENT) { + /* start corresponding server now */ + lwiperf_state_tcp_t *server = NULL; + ret = lwiperf_start_tcp_server_impl(&state->conn_pcb->local_ip, LWIPERF_TCP_PORT_DEFAULT, + report_fn, report_arg, (lwiperf_state_base_t *)state, &server); + if (ret != ERR_OK) { + /* starting server failed, abort client */ + lwiperf_abort(state); + return NULL; + } + /* make this server accept one connection only */ + server->specific_remote = 1; + server->remote_addr = state->conn_pcb->remote_ip; + if (type == LWIPERF_TRADEOFF) { + /* tradeoff means that the remote host connects only after the client is done, + so keep the listen pcb open until the client is done */ + server->client_tradeoff_mode = 1; + } + } + return state; + } + return NULL; +} + +/** + * @ingroup iperf + * Abort an iperf session (handle returned by lwiperf_start_tcp_server*()) + */ +void +lwiperf_abort(void *lwiperf_session) +{ + lwiperf_state_base_t *i, *dealloc, *last = NULL; + + LWIP_ASSERT_CORE_LOCKED(); + + for (i = lwiperf_all_connections; i != NULL; ) { + if ((i == lwiperf_session) || (i->related_master_state == lwiperf_session)) { + dealloc = i; + i = i->next; + if (last != NULL) { + last->next = i; + } + LWIPERF_FREE(lwiperf_state_tcp_t, dealloc); /* @todo: type? */ + } else { + last = i; + i = i->next; + } + } +} + +#endif /* LWIP_TCP && LWIP_CALLBACK_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mdns/mdns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mdns/mdns.c similarity index 79% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mdns/mdns.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mdns/mdns.c index 14334fc..aad2728 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mdns/mdns.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mdns/mdns.c @@ -7,18 +7,17 @@ * * RFC 6762 - Multicast DNS\n * RFC 6763 - DNS-Based Service Discovery\n - * + * * @verbinclude mdns.txt - * + * * Things left to implement: * ------------------------- * - * - Probing/conflict resolution + * - Tiebreaking for simultaneous probing * - Sending goodbye messages (zero ttl) - shutdown, DHCP lease about to expire, DHCP turned off... * - Checking that source address of unicast requests are on the same network * - Limiting multicast responses to 1 per second per resource record * - Fragmenting replies if required - * - Subscribe to netif address/link change events and act on them (currently needs to be done manually) * - Handling multi-packet known answers * - Individual known answer detection for all local IPv6 addresses * - Dynamic size of outgoing packet @@ -63,19 +62,21 @@ #include "lwip/ip_addr.h" #include "lwip/mem.h" #include "lwip/prot/dns.h" +#include "lwip/prot/iana.h" +#include "lwip/timeouts.h" #include #if LWIP_MDNS_RESPONDER #if (LWIP_IPV4 && !LWIP_IGMP) - #error "If you want to use MDNS with IPv4, you have to define LWIP_IGMP=1 in your lwipopts.h" +#error "If you want to use MDNS with IPv4, you have to define LWIP_IGMP=1 in your lwipopts.h" #endif #if (LWIP_IPV6 && !LWIP_IPV6_MLD) #error "If you want to use MDNS with IPv6, you have to define LWIP_IPV6_MLD=1 in your lwipopts.h" #endif #if (!LWIP_UDP) - #error "If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h" +#error "If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if LWIP_IPV4 @@ -90,7 +91,6 @@ static const ip_addr_t v4group = DNS_MQUERY_IPV4_GROUP_INIT; static const ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT; #endif -#define MDNS_PORT 5353 #define MDNS_TTL 255 /* Stored offsets to beginning of domain names @@ -102,6 +102,10 @@ static const ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT; static u8_t mdns_netif_client_id; static struct udp_pcb *mdns_pcb; +#if MDNS_RESP_USENETIF_EXTCALLBACK +NETIF_DECLARE_EXT_CALLBACK(netif_callback) +#endif +static mdns_name_result_cb_t mdns_name_result_cb; #define NETIF_TO_HOST(netif) (struct mdns_host*)(netif_get_client_data(netif, mdns_netif_client_id)) @@ -135,9 +139,22 @@ static struct udp_pcb *mdns_pcb; /* Lookup for text info on service instance */ #define REPLY_SERVICE_TXT 0x80 +#define MDNS_PROBE_DELAY_MS 250 +#define MDNS_PROBE_COUNT 3 +#ifdef LWIP_RAND +/* first probe timeout SHOULD be random 0-250 ms*/ +#define MDNS_INITIAL_PROBE_DELAY_MS (LWIP_RAND() % MDNS_PROBE_DELAY_MS) +#else +#define MDNS_INITIAL_PROBE_DELAY_MS MDNS_PROBE_DELAY_MS +#endif + +#define MDNS_PROBING_NOT_STARTED 0 +#define MDNS_PROBING_ONGOING 1 +#define MDNS_PROBING_COMPLETE 2 + static const char *dnssd_protos[] = { - "_udp", /* DNSSD_PROTO_UDP */ - "_tcp", /* DNSSD_PROTO_TCP */ + "_udp", /* DNSSD_PROTO_UDP */ + "_tcp", /* DNSSD_PROTO_TCP */ }; /** Description of a service */ @@ -168,6 +185,10 @@ struct mdns_host { struct mdns_service *services[MDNS_MAX_SERVICES]; /** TTL in seconds of A/AAAA/PTR replies */ u32_t dns_ttl; + /** Number of probes sent for the current name */ + u8_t probes_sent; + /** State in probing sequence */ + u8_t probing_state; }; /** Information about received packet */ @@ -191,7 +212,7 @@ struct mdns_packet { /** Number of unparsed questions */ u16_t questions_left; /** Number of answers in packet, - * (sum of normal, authorative and additional answers) + * (sum of normal, authoritative and additional answers) * read from packet header */ u16_t answers; /** Number of unparsed answers */ @@ -215,6 +236,8 @@ struct mdns_outpacket { u16_t questions; /** Number of normal answers written */ u16_t answers; + /** Number of authoritative answers written */ + u16_t authoritative; /** Number of additional answers written */ u16_t additional; /** Offsets for written domain names in packet. @@ -261,15 +284,11 @@ struct mdns_answer { u16_t rd_offset; }; -/** - * Add a label part to a domain - * @param domain The domain to add a label to - * @param label The label to add, like <hostname>, 'local', 'com' or '' - * @param len The length of the label - * @return ERR_OK on success, an err_t otherwise if label too long - */ -err_t -mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len) +static err_t mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags); +static void mdns_probe(void* arg); + +static err_t +mdns_domain_add_label_base(struct mdns_domain *domain, u8_t len) { if (len > MDNS_LABEL_MAXLEN) { return ERR_VAL; @@ -283,6 +302,23 @@ mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len) } domain->name[domain->length] = len; domain->length++; + return ERR_OK; +} + +/** + * Add a label part to a domain + * @param domain The domain to add a label to + * @param label The label to add, like <hostname>, 'local', 'com' or '' + * @param len The length of the label + * @return ERR_OK on success, an err_t otherwise if label too long + */ +err_t +mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len) +{ + err_t err = mdns_domain_add_label_base(domain, len); + if (err != ERR_OK) { + return err; + } if (len) { MEMCPY(&domain->name[domain->length], label, len); domain->length += len; @@ -290,6 +326,27 @@ mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len) return ERR_OK; } +/** + * Add a label part to a domain (@see mdns_domain_add_label but copy directly from pbuf) + */ +static err_t +mdns_domain_add_label_pbuf(struct mdns_domain *domain, const struct pbuf *p, u16_t offset, u8_t len) +{ + err_t err = mdns_domain_add_label_base(domain, len); + if (err != ERR_OK) { + return err; + } + if (len) { + if (pbuf_copy_partial(p, &domain->name[domain->length], len, offset) != len) { + /* take back the ++ done before */ + domain->length--; + return ERR_ARG; + } + domain->length += len; + } + return ERR_OK; +} + /** * Internal readname function with max 6 levels of recursion following jumps * while decompressing name @@ -309,7 +366,7 @@ mdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, uns offset++; /* is this a compressed label? */ - if((c & 0xc0) == 0xc0) { + if ((c & 0xc0) == 0xc0) { u16_t jumpaddr; if (offset >= p->tot_len) { /* Make sure both jump bytes fit in the packet */ @@ -319,7 +376,7 @@ mdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, uns offset++; if (jumpaddr >= SIZEOF_DNS_HDR && jumpaddr < p->tot_len) { u16_t res; - /* Recursive call, maximum depth will be checked */ + /* Recursive call, maximum depth will be checked */ res = mdns_readname_loop(p, jumpaddr, domain, depth + 1); /* Dont return offset since new bytes were not read (jumped to somewhere in packet) */ if (res == MDNS_READNAME_ERROR) { @@ -333,22 +390,16 @@ mdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, uns /* normal label */ if (c <= MDNS_LABEL_MAXLEN) { - u8_t label[MDNS_LABEL_MAXLEN]; err_t res; if (c + domain->length >= MDNS_DOMAIN_MAXLEN) { return MDNS_READNAME_ERROR; } - if (c != 0) { - if (pbuf_copy_partial(p, label, c, offset) != c) { - return MDNS_READNAME_ERROR; - } - offset += c; - } - res = mdns_domain_add_label(domain, (char *) label, c); + res = mdns_domain_add_label_pbuf(domain, p, offset, c); if (res != ERR_OK) { return MDNS_READNAME_ERROR; } + offset += c; } else { /* bad length byte */ return MDNS_READNAME_ERROR; @@ -460,6 +511,8 @@ mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr) int i; err_t res; const u8_t *ptr; + + LWIP_UNUSED_ARG(res); if (!domain || !addr) { return ERR_ARG; } @@ -473,9 +526,9 @@ mdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr) res = mdns_domain_add_label(domain, buf, (u8_t)strlen(buf)); LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res); } - res = mdns_domain_add_label(domain, REVERSE_PTR_V4_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V4_DOMAIN)-1)); + res = mdns_domain_add_label(domain, REVERSE_PTR_V4_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V4_DOMAIN) - 1)); LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res); - res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN)-1)); + res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1)); LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res); res = mdns_domain_add_label(domain, NULL, 0); LWIP_ERROR("mdns_build_reverse_v4_domain: Failed to add label", (res == ERR_OK), return res); @@ -498,12 +551,13 @@ mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr) int i; err_t res; const u8_t *ptr; + LWIP_UNUSED_ARG(res); if (!domain || !addr) { return ERR_ARG; } memset(domain, 0, sizeof(struct mdns_domain)); ptr = (const u8_t *) addr; - for (i = sizeof(ip6_addr_t) - 1; i >= 0; i--) { + for (i = sizeof(ip6_addr_p_t) - 1; i >= 0; i--) { char buf; u8_t byte = ptr[i]; int j; @@ -518,9 +572,9 @@ mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr) byte >>= 4; } } - res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN)-1)); + res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN) - 1)); LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res); - res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN)-1)); + res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN) - 1)); LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res); res = mdns_domain_add_label(domain, NULL, 0); LWIP_ERROR("mdns_build_reverse_v6_domain: Failed to add label", (res == ERR_OK), return res); @@ -533,7 +587,8 @@ mdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr) static err_t mdns_add_dotlocal(struct mdns_domain *domain) { - err_t res = mdns_domain_add_label(domain, TOPDOMAIN_LOCAL, (u8_t)(sizeof(TOPDOMAIN_LOCAL)-1)); + err_t res = mdns_domain_add_label(domain, TOPDOMAIN_LOCAL, (u8_t)(sizeof(TOPDOMAIN_LOCAL) - 1)); + LWIP_UNUSED_ARG(res); LWIP_ERROR("mdns_add_dotlocal: Failed to add label", (res == ERR_OK), return res); return mdns_domain_add_label(domain, NULL, 0); } @@ -548,6 +603,7 @@ static err_t mdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns) { err_t res; + LWIP_UNUSED_ARG(res); memset(domain, 0, sizeof(struct mdns_domain)); LWIP_ERROR("mdns_build_host_domain: mdns != NULL", (mdns != NULL), return ERR_VAL); res = mdns_domain_add_label(domain, mdns->name, (u8_t)strlen(mdns->name)); @@ -564,10 +620,11 @@ static err_t mdns_build_dnssd_domain(struct mdns_domain *domain) { err_t res; + LWIP_UNUSED_ARG(res); memset(domain, 0, sizeof(struct mdns_domain)); - res = mdns_domain_add_label(domain, "_services", (u8_t)(sizeof("_services")-1)); + res = mdns_domain_add_label(domain, "_services", (u8_t)(sizeof("_services") - 1)); LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res); - res = mdns_domain_add_label(domain, "_dns-sd", (u8_t)(sizeof("_dns-sd")-1)); + res = mdns_domain_add_label(domain, "_dns-sd", (u8_t)(sizeof("_dns-sd") - 1)); LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res); res = mdns_domain_add_label(domain, dnssd_protos[DNSSD_PROTO_UDP], (u8_t)strlen(dnssd_protos[DNSSD_PROTO_UDP])); LWIP_ERROR("mdns_build_dnssd_domain: Failed to add label", (res == ERR_OK), return res); @@ -587,6 +644,7 @@ static err_t mdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name) { err_t res; + LWIP_UNUSED_ARG(res); memset(domain, 0, sizeof(struct mdns_domain)); if (include_name) { res = mdns_domain_add_label(domain, service->name, (u8_t)strlen(service->name)); @@ -785,7 +843,7 @@ mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain) u16_t jump; if (!domain->skip_compression) { - for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) { + for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) { u16_t offset = outpkt->domain_offsets[i]; if (offset) { u16_t len = mdns_compress_domain(outpkt->pbuf, &offset, domain); @@ -805,7 +863,7 @@ mdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain) } /* Store offset of this new domain */ - for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) { + for (i = 0; i < NUM_DOMAIN_OFFSETS; i++) { if (outpkt->domain_offsets[i] == 0) { outpkt->domain_offsets[i] = outpkt->write_offset; break; @@ -1138,7 +1196,7 @@ mdns_add_aaaa_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct net struct mdns_domain host; mdns_build_host_domain(&host, NETIF_TO_HOST(netif)); LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Responding with AAAA record\n")); - return mdns_add_answer(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip6_addr(netif, addrindex), sizeof(ip6_addr_t), NULL); + return mdns_add_answer(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip6_addr(netif, addrindex), sizeof(ip6_addr_p_t), NULL); } /** Write a x.y.z.ip6.arpa -> hostname.local PTR RR to outpacket */ @@ -1226,7 +1284,7 @@ mdns_init_outpacket(struct mdns_outpacket *out, struct mdns_packet *in) SMEMCPY(&out->dest_addr, &in->source_addr, sizeof(ip_addr_t)); out->dest_port = in->source_port; - if (in->source_port != MDNS_PORT) { + if (in->source_port != LWIP_IANA_PORT_MDNS) { out->unicast_reply = 1; out->cache_flush = 0; if (in->questions == 1) { @@ -1247,13 +1305,14 @@ mdns_init_outpacket(struct mdns_outpacket *out, struct mdns_packet *in) * Add additional answers based on the selected answers * Send the packet */ -static void -mdns_send_outpacket(struct mdns_outpacket *outpkt) +static err_t +mdns_send_outpacket(struct mdns_outpacket *outpkt, u8_t flags) { struct mdns_service *service; - err_t res; + err_t res = ERR_ARG; int i; - struct mdns_host* mdns = NETIF_TO_HOST(outpkt->netif); + struct mdns_host *mdns = NETIF_TO_HOST(outpkt->netif); + u16_t answers = 0; /* Write answers to host questions */ #if LWIP_IPV4 @@ -1262,26 +1321,26 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } if (outpkt->host_replies & REPLY_HOST_PTR_V4) { res = mdns_add_hostv4_ptr_answer(outpkt, outpkt->cache_flush, outpkt->netif); if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } #endif #if LWIP_IPV6 if (outpkt->host_replies & REPLY_HOST_AAAA) { int addrindex; - for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++addrindex) { + for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) { if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) { res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex); if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } } } @@ -1294,7 +1353,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } addrindex++; rev_addrs >>= 1; @@ -1303,7 +1362,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) #endif /* Write answers to service questions */ - for (i = 0; i < MDNS_MAX_SERVICES; ++i) { + for (i = 0; i < MDNS_MAX_SERVICES; i++) { service = mdns->services[i]; if (!service) { continue; @@ -1314,7 +1373,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) { @@ -1322,7 +1381,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } if (outpkt->serv_replies[i] & REPLY_SERVICE_SRV) { @@ -1330,7 +1389,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } if (outpkt->serv_replies[i] & REPLY_SERVICE_TXT) { @@ -1338,12 +1397,19 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) if (res != ERR_OK) { goto cleanup; } - outpkt->answers++; + answers++; } } + /* if this is a response, the data above is anwers, else this is a probe and the answers above goes into auth section */ + if (flags & DNS_FLAG1_RESPONSE) { + outpkt->answers += answers; + } else { + outpkt->authoritative += answers; + } + /* All answers written, add additional RRs */ - for (i = 0; i < MDNS_MAX_SERVICES; ++i) { + for (i = 0; i < MDNS_MAX_SERVICES; i++) { service = mdns->services[i]; if (!service) { continue; @@ -1377,7 +1443,7 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) #if LWIP_IPV6 if (!(outpkt->host_replies & REPLY_HOST_AAAA)) { int addrindex; - for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++addrindex) { + for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; addrindex++) { if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) { res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex); if (res != ERR_OK) { @@ -1389,7 +1455,8 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) } #endif #if LWIP_IPV4 - if (!(outpkt->host_replies & REPLY_HOST_A)) { + if (!(outpkt->host_replies & REPLY_HOST_A) && + !ip4_addr_isany_val(*netif_ip4_addr(outpkt->netif))) { res = mdns_add_a_answer(outpkt, outpkt->cache_flush, outpkt->netif); if (res != ERR_OK) { goto cleanup; @@ -1406,13 +1473,12 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) /* Write header */ memset(&hdr, 0, sizeof(hdr)); - hdr.flags1 = DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE; + hdr.flags1 = flags; + hdr.numquestions = lwip_htons(outpkt->questions); hdr.numanswers = lwip_htons(outpkt->answers); + hdr.numauthrr = lwip_htons(outpkt->authoritative); hdr.numextrarr = lwip_htons(outpkt->additional); - if (outpkt->legacy_query) { - hdr.numquestions = lwip_htons(1); - hdr.id = lwip_htons(outpkt->tx_id); - } + hdr.id = lwip_htons(outpkt->tx_id); pbuf_take(outpkt->pbuf, &hdr, sizeof(hdr)); /* Shrink packet */ @@ -1430,9 +1496,9 @@ mdns_send_outpacket(struct mdns_outpacket *outpkt) /* Send created packet */ LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Sending packet, len=%d, unicast=%d\n", outpkt->write_offset, outpkt->unicast_reply)); if (outpkt->unicast_reply) { - udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif); + res = udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif); } else { - udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, MDNS_PORT, outpkt->netif); + res = udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, LWIP_IANA_PORT_MDNS, outpkt->netif); } } @@ -1441,6 +1507,7 @@ cleanup: pbuf_free(outpkt->pbuf); outpkt->pbuf = NULL; } + return res; } /** @@ -1453,17 +1520,18 @@ mdns_announce(struct netif *netif, const ip_addr_t *destination) { struct mdns_outpacket announce; int i; - struct mdns_host* mdns = NETIF_TO_HOST(netif); + struct mdns_host *mdns = NETIF_TO_HOST(netif); memset(&announce, 0, sizeof(announce)); announce.netif = netif; announce.cache_flush = 1; #if LWIP_IPV4 - if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) + if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) { announce.host_replies = REPLY_HOST_A | REPLY_HOST_PTR_V4; + } #endif #if LWIP_IPV6 - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) { announce.host_replies |= REPLY_HOST_AAAA | REPLY_HOST_PTR_V6; announce.host_reverse_v6_replies |= (1 << i); @@ -1475,13 +1543,13 @@ mdns_announce(struct netif *netif, const ip_addr_t *destination) struct mdns_service *serv = mdns->services[i]; if (serv) { announce.serv_replies[i] = REPLY_SERVICE_TYPE_PTR | REPLY_SERVICE_NAME_PTR | - REPLY_SERVICE_SRV | REPLY_SERVICE_TXT; + REPLY_SERVICE_SRV | REPLY_SERVICE_TXT; } } - announce.dest_port = MDNS_PORT; + announce.dest_port = LWIP_IANA_PORT_MDNS; SMEMCPY(&announce.dest_addr, destination, sizeof(announce.dest_addr)); - mdns_send_outpacket(&announce); + mdns_send_outpacket(&announce, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE); } /** @@ -1498,7 +1566,13 @@ mdns_handle_question(struct mdns_packet *pkt) int replies = 0; int i; err_t res; - struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif); + struct mdns_host *mdns = NETIF_TO_HOST(pkt->netif); + + if (mdns->probing_state != MDNS_PROBING_COMPLETE) { + /* Don't answer questions until we've verified our domains via probing */ + /* @todo we should check incoming questions during probing for tiebreaking */ + return; + } mdns_init_outpacket(&reply, pkt); @@ -1523,7 +1597,7 @@ mdns_handle_question(struct mdns_packet *pkt) reply.host_replies |= check_host(pkt->netif, &q.info, &reply.host_reverse_v6_replies); replies |= reply.host_replies; - for (i = 0; i < MDNS_MAX_SERVICES; ++i) { + for (i = 0; i < MDNS_MAX_SERVICES; i++) { service = mdns->services[i]; if (!service) { continue; @@ -1535,6 +1609,7 @@ mdns_handle_question(struct mdns_packet *pkt) if (replies && reply.legacy_query) { /* Add question to reply packet (legacy packet only has 1 question) */ res = mdns_add_question(&reply, &q.info.domain, q.info.type, q.info.klass, 0); + reply.questions = 1; if (res != ERR_OK) { goto cleanup; } @@ -1579,17 +1654,17 @@ mdns_handle_question(struct mdns_packet *pkt) if (len != MDNS_READNAME_ERROR && res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) { #if LWIP_IPV4 if (match & REPLY_HOST_PTR_V4) { - LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v4 PTR\n")); - reply.host_replies &= ~REPLY_HOST_PTR_V4; + LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v4 PTR\n")); + reply.host_replies &= ~REPLY_HOST_PTR_V4; } #endif #if LWIP_IPV6 if (match & REPLY_HOST_PTR_V6) { - LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v6 PTR\n")); - reply.host_reverse_v6_replies &= ~rev_v6; - if (reply.host_reverse_v6_replies == 0) { - reply.host_replies &= ~REPLY_HOST_PTR_V6; - } + LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: v6 PTR\n")); + reply.host_reverse_v6_replies &= ~rev_v6; + if (reply.host_reverse_v6_replies == 0) { + reply.host_replies &= ~REPLY_HOST_PTR_V6; + } } #endif } @@ -1603,7 +1678,7 @@ mdns_handle_question(struct mdns_packet *pkt) #endif } else if (match & REPLY_HOST_AAAA) { #if LWIP_IPV6 - if (ans.rd_length == sizeof(ip6_addr_t) && + if (ans.rd_length == sizeof(ip6_addr_p_t) && /* TODO this clears all AAAA responses if first addr is set as known */ pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip6_addr(pkt->netif, 0), ans.rd_length) == 0) { LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Skipping known answer: AAAA\n")); @@ -1613,7 +1688,7 @@ mdns_handle_question(struct mdns_packet *pkt) } } - for (i = 0; i < MDNS_MAX_SERVICES; ++i) { + for (i = 0; i < MDNS_MAX_SERVICES; i++) { service = mdns->services[i]; if (!service) { continue; @@ -1690,7 +1765,7 @@ mdns_handle_question(struct mdns_packet *pkt) } } - mdns_send_outpacket(&reply); + mdns_send_outpacket(&reply, DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE); cleanup: if (reply.pbuf) { @@ -1707,6 +1782,8 @@ cleanup: static void mdns_handle_response(struct mdns_packet *pkt) { + struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif); + /* Ignore all questions */ while (pkt->questions_left) { struct mdns_question q; @@ -1732,6 +1809,39 @@ mdns_handle_response(struct mdns_packet *pkt) LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Answer for domain ")); mdns_domain_debug_print(&ans.info.domain); LWIP_DEBUGF(MDNS_DEBUG, (" type %d class %d\n", ans.info.type, ans.info.klass)); + + /*"Apparently conflicting Multicast DNS responses received *before* the first probe packet is sent MUST + be silently ignored" so drop answer if we haven't started probing yet*/ + if ((mdns->probing_state == MDNS_PROBING_ONGOING) && (mdns->probes_sent > 0)) { + struct mdns_domain domain; + u8_t i; + u8_t conflict = 0; + + res = mdns_build_host_domain(&domain, mdns); + if (res == ERR_OK && mdns_domain_eq(&ans.info.domain, &domain)) { + LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches host domain!")); + conflict = 1; + } + + for (i = 0; i < MDNS_MAX_SERVICES; i++) { + struct mdns_service* service = mdns->services[i]; + if (!service) { + continue; + } + res = mdns_build_service_domain(&domain, service, 1); + if ((res == ERR_OK) && mdns_domain_eq(&ans.info.domain, &domain)) { + LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Probe response matches service domain!")); + conflict = 1; + } + } + + if (conflict != 0) { + sys_untimeout(mdns_probe, pkt->netif); + if (mdns_name_result_cb != NULL) { + mdns_name_result_cb(pkt->netif, MDNS_PROBING_CONFLICT); + } + } + } } } @@ -1750,7 +1860,7 @@ mdns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(pcb); - LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Received IPv%d MDNS packet, len %d\n", IP_IS_V6(addr)? 6 : 4, p->tot_len)); + LWIP_DEBUGF(MDNS_DEBUG, ("MDNS: Received IPv%d MDNS packet, len %d\n", IP_IS_V6(addr) ? 6 : 4, p->tot_len)); if (NETIF_TO_HOST(recv_netif) == NULL) { /* From netif not configured for MDNS */ @@ -1780,7 +1890,8 @@ mdns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, #if LWIP_IPV6 if (IP_IS_V6(ip_current_dest_addr())) { - if (!ip_addr_cmp(ip_current_dest_addr(), &v6group)) { + /* instead of having one 'v6group' per netif, just compare zoneless here */ + if (!ip_addr_cmp_zoneless(ip_current_dest_addr(), &v6group)) { packet.recv_unicast = 1; } } @@ -1803,59 +1914,141 @@ dealloc: pbuf_free(p); } -/** - * @ingroup mdns - * Initiate MDNS responder. Will open UDP sockets on port 5353 - */ -void -mdns_resp_init(void) +#if LWIP_NETIF_EXT_STATUS_CALLBACK && MDNS_RESP_USENETIF_EXTCALLBACK +static void +mdns_netif_ext_status_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args) { - err_t res; - - mdns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY); - LWIP_ASSERT("Failed to allocate pcb", mdns_pcb != NULL); -#if LWIP_MULTICAST_TX_OPTIONS - udp_set_multicast_ttl(mdns_pcb, MDNS_TTL); -#else - mdns_pcb->ttl = MDNS_TTL; -#endif - res = udp_bind(mdns_pcb, IP_ANY_TYPE, MDNS_PORT); - LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */ - LWIP_ASSERT("Failed to bind pcb", res == ERR_OK); - udp_recv(mdns_pcb, mdns_recv, NULL); - - mdns_netif_client_id = netif_alloc_client_data_id(); -} - -/** - * @ingroup mdns - * Announce IP settings have changed on netif. - * Call this in your callback registered by netif_set_status_callback(). - * This function may go away in the future when netif supports registering - * multiple callback functions. - * @param netif The network interface where settings have changed. - */ -void -mdns_resp_netif_settings_changed(struct netif *netif) -{ - LWIP_ERROR("mdns_resp_netif_ip_changed: netif != NULL", (netif != NULL), return); + LWIP_UNUSED_ARG(args); + /* MDNS enabled on netif? */ if (NETIF_TO_HOST(netif) == NULL) { return; } - /* Announce on IPv6 and IPv4 */ -#if LWIP_IPV6 - mdns_announce(netif, IP6_ADDR_ANY); -#endif + if (reason & LWIP_NSC_STATUS_CHANGED) { + if (args->status_changed.state != 0) { + mdns_resp_restart(netif); + } + /* TODO: send goodbye message */ + } + if (reason & LWIP_NSC_LINK_CHANGED) { + if (args->link_changed.state != 0) { + mdns_resp_restart(netif); + } + } + if (reason & (LWIP_NSC_IPV4_ADDRESS_CHANGED | LWIP_NSC_IPV4_GATEWAY_CHANGED | + LWIP_NSC_IPV4_NETMASK_CHANGED | LWIP_NSC_IPV4_SETTINGS_CHANGED | + LWIP_NSC_IPV6_SET | LWIP_NSC_IPV6_ADDR_STATE_CHANGED)) { + mdns_resp_announce(netif); + } +} +#endif /* LWIP_NETIF_EXT_STATUS_CALLBACK && MDNS_RESP_USENETIF_EXTCALLBACK */ + +static err_t +mdns_send_probe(struct netif* netif, const ip_addr_t *destination) +{ + struct mdns_host* mdns; + struct mdns_outpacket pkt; + struct mdns_domain domain; + u8_t i; + err_t res; + + mdns = NETIF_TO_HOST(netif); + + memset(&pkt, 0, sizeof(pkt)); + pkt.netif = netif; + + /* Add unicast questions with rtype ANY for all our desired records */ + mdns_build_host_domain(&domain, mdns); + res = mdns_add_question(&pkt, &domain, DNS_RRTYPE_ANY, DNS_RRCLASS_IN, 1); + if (res != ERR_OK) { + goto cleanup; + } + pkt.questions++; + for (i = 0; i < MDNS_MAX_SERVICES; i++) { + struct mdns_service* service = mdns->services[i]; + if (!service) { + continue; + } + mdns_build_service_domain(&domain, service, 1); + res = mdns_add_question(&pkt, &domain, DNS_RRTYPE_ANY, DNS_RRCLASS_IN, 1); + if (res != ERR_OK) { + goto cleanup; + } + pkt.questions++; + } + + /* Add answers to the questions above into the authority section for tiebreaking */ #if LWIP_IPV4 - mdns_announce(netif, IP4_ADDR_ANY); + if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) { + pkt.host_replies = REPLY_HOST_A; + } #endif +#if LWIP_IPV6 + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) { + pkt.host_replies |= REPLY_HOST_AAAA; + } + } +#endif + + for (i = 0; i < MDNS_MAX_SERVICES; i++) { + struct mdns_service *serv = mdns->services[i]; + if (serv) { + pkt.serv_replies[i] = REPLY_SERVICE_SRV | REPLY_SERVICE_TXT; + } + } + + pkt.tx_id = 0; + pkt.dest_port = LWIP_IANA_PORT_MDNS; + SMEMCPY(&pkt.dest_addr, destination, sizeof(pkt.dest_addr)); + res = mdns_send_outpacket(&pkt, 0); + +cleanup: + if (pkt.pbuf) { + pbuf_free(pkt.pbuf); + pkt.pbuf = NULL; + } + return res; +} + +/** + * Timer callback for probing network. + */ +static void +mdns_probe(void* arg) +{ + struct netif *netif = (struct netif *)arg; + struct mdns_host* mdns = NETIF_TO_HOST(netif); + + if(mdns->probes_sent >= MDNS_PROBE_COUNT) { + /* probing successful, announce the new name */ + mdns->probing_state = MDNS_PROBING_COMPLETE; + mdns_resp_announce(netif); + if (mdns_name_result_cb != NULL) { + mdns_name_result_cb(netif, MDNS_PROBING_SUCCESSFUL); + } + } else { +#if LWIP_IPV4 + /*if ipv4 wait with probing until address is set*/ + if (!ip4_addr_isany_val(*netif_ip4_addr(netif)) && + mdns_send_probe(netif, IP4_ADDR_ANY) == ERR_OK) +#endif + { +#if LWIP_IPV6 + if (mdns_send_probe(netif, IP6_ADDR_ANY) == ERR_OK) +#endif + { + mdns->probes_sent++; + } + } + sys_timeout(MDNS_PROBE_DELAY_MS, mdns_probe, netif); + } } /** * @ingroup mdns - * Activate MDNS responder for a network interface and send announce packets. + * Activate MDNS responder for a network interface. * @param netif The network interface to activate. * @param hostname Name to use. Queries for <hostname>.local will be answered * with the IP addresses of the netif. The hostname will be copied, the @@ -1867,20 +2060,22 @@ err_t mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl) { err_t res; - struct mdns_host* mdns; + struct mdns_host *mdns; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ERROR("mdns_resp_add_netif: netif != NULL", (netif != NULL), return ERR_VAL); LWIP_ERROR("mdns_resp_add_netif: Hostname too long", (strlen(hostname) <= MDNS_LABEL_MAXLEN), return ERR_VAL); LWIP_ASSERT("mdns_resp_add_netif: Double add", NETIF_TO_HOST(netif) == NULL); - mdns = (struct mdns_host *) mem_malloc(sizeof(struct mdns_host)); + mdns = (struct mdns_host *) mem_calloc(1, sizeof(struct mdns_host)); LWIP_ERROR("mdns_resp_add_netif: Alloc failed", (mdns != NULL), return ERR_MEM); netif_set_client_data(netif, mdns_netif_client_id, mdns); - memset(mdns, 0, sizeof(struct mdns_host)); MEMCPY(&mdns->name, hostname, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(hostname))); mdns->dns_ttl = dns_ttl; + mdns->probes_sent = 0; + mdns->probing_state = MDNS_PROBING_NOT_STARTED; /* Join multicast groups */ #if LWIP_IPV4 @@ -1896,7 +2091,8 @@ mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl) } #endif - mdns_resp_netif_settings_changed(netif); + mdns_resp_restart(netif); + return ERR_OK; cleanup: @@ -1916,12 +2112,17 @@ err_t mdns_resp_remove_netif(struct netif *netif) { int i; - struct mdns_host* mdns; + struct mdns_host *mdns; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mdns_resp_remove_netif: Null pointer", netif); mdns = NETIF_TO_HOST(netif); LWIP_ERROR("mdns_resp_remove_netif: Not an active netif", (mdns != NULL), return ERR_VAL); + if (mdns->probing_state == MDNS_PROBING_ONGOING) { + sys_untimeout(mdns_probe, netif); + } + for (i = 0; i < MDNS_MAX_SERVICES; i++) { struct mdns_service *service = mdns->services[i]; if (service) { @@ -1942,6 +2143,36 @@ mdns_resp_remove_netif(struct netif *netif) return ERR_OK; } +/** + * @ingroup mdns + * Update MDNS hostname for a network interface. + * @param netif The network interface to activate. + * @param hostname Name to use. Queries for <hostname>.local will be answered + * with the IP addresses of the netif. The hostname will be copied, the + * given pointer can be on the stack. + * @return ERR_OK if name could be set on netif, an err_t otherwise + */ +err_t +mdns_resp_rename_netif(struct netif *netif, const char *hostname) +{ + struct mdns_host *mdns; + size_t len; + + LWIP_ASSERT_CORE_LOCKED(); + len = strlen(hostname); + LWIP_ERROR("mdns_resp_rename_netif: netif != NULL", (netif != NULL), return ERR_VAL); + LWIP_ERROR("mdns_resp_rename_netif: Hostname too long", (len <= MDNS_LABEL_MAXLEN), return ERR_VAL); + mdns = NETIF_TO_HOST(netif); + LWIP_ERROR("mdns_resp_rename_netif: Not an mdns netif", (mdns != NULL), return ERR_VAL); + + MEMCPY(&mdns->name, hostname, LWIP_MIN(MDNS_LABEL_MAXLEN, len)); + mdns->name[len] = '\0'; /* null termination in case new name is shorter than previous */ + + mdns_resp_restart(netif); + + return ERR_OK; +} + /** * @ingroup mdns * Add a service to the selected network interface. @@ -1955,16 +2186,17 @@ mdns_resp_remove_netif(struct netif *netif) * @param txt_fn Callback to get TXT data. Will be called each time a TXT reply is created to * allow dynamic replies. * @param txt_data Userdata pointer for txt_fn - * @return ERR_OK if the service was added to the netif, an err_t otherwise + * @return service_id if the service was added to the netif, an err_t otherwise */ -err_t +s8_t mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_data) { - int i; - int slot = -1; + s8_t i; + s8_t slot = -1; struct mdns_service *srv; - struct mdns_host* mdns; + struct mdns_host *mdns; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mdns_resp_add_service: netif != NULL", netif); mdns = NETIF_TO_HOST(netif); LWIP_ERROR("mdns_resp_add_service: Not an mdns netif", (mdns != NULL), return ERR_VAL); @@ -1981,11 +2213,9 @@ mdns_resp_add_service(struct netif *netif, const char *name, const char *service } LWIP_ERROR("mdns_resp_add_service: Service list full (increase MDNS_MAX_SERVICES)", (slot >= 0), return ERR_MEM); - srv = (struct mdns_service*)mem_malloc(sizeof(struct mdns_service)); + srv = (struct mdns_service *)mem_calloc(1, sizeof(struct mdns_service)); LWIP_ERROR("mdns_resp_add_service: Alloc failed", (srv != NULL), return ERR_MEM); - memset(srv, 0, sizeof(struct mdns_service)); - MEMCPY(&srv->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(name))); MEMCPY(&srv->service, service, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(service))); srv->txt_fn = txt_fn; @@ -1996,13 +2226,65 @@ mdns_resp_add_service(struct netif *netif, const char *name, const char *service mdns->services[slot] = srv; - /* Announce on IPv6 and IPv4 */ -#if LWIP_IPV6 - mdns_announce(netif, IP6_ADDR_ANY); -#endif -#if LWIP_IPV4 - mdns_announce(netif, IP4_ADDR_ANY); -#endif + mdns_resp_restart(netif); + + return slot; +} + +/** + * @ingroup mdns + * Delete a service on the selected network interface. + * @param netif The network interface on which service should be removed + * @param slot The service slot number returned by mdns_resp_add_service + * @return ERR_OK if the service was removed from the netif, an err_t otherwise + */ +err_t +mdns_resp_del_service(struct netif *netif, s8_t slot) +{ + struct mdns_host *mdns; + struct mdns_service *srv; + LWIP_ASSERT("mdns_resp_del_service: netif != NULL", netif); + mdns = NETIF_TO_HOST(netif); + LWIP_ERROR("mdns_resp_del_service: Not an mdns netif", (mdns != NULL), return ERR_VAL); + LWIP_ERROR("mdns_resp_del_service: Invalid Service ID", (slot >= 0) && (slot < MDNS_MAX_SERVICES), return ERR_VAL); + LWIP_ERROR("mdns_resp_del_service: Invalid Service ID", (mdns->services[slot] != NULL), return ERR_VAL); + + srv = mdns->services[slot]; + mdns->services[slot] = NULL; + mem_free(srv); + return ERR_OK; +} + +/** + * @ingroup mdns + * Update name for an MDNS service. + * @param netif The network interface to activate. + * @param slot The service slot number returned by mdns_resp_add_service + * @param name The new name for the service + * @return ERR_OK if name could be set on service, an err_t otherwise + */ +err_t +mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name) +{ + struct mdns_service *srv; + struct mdns_host *mdns; + size_t len; + + LWIP_ASSERT_CORE_LOCKED(); + len = strlen(name); + LWIP_ASSERT("mdns_resp_rename_service: netif != NULL", netif); + mdns = NETIF_TO_HOST(netif); + LWIP_ERROR("mdns_resp_rename_service: Not an mdns netif", (mdns != NULL), return ERR_VAL); + LWIP_ERROR("mdns_resp_rename_service: Name too long", (len <= MDNS_LABEL_MAXLEN), return ERR_VAL); + LWIP_ERROR("mdns_resp_rename_service: Invalid Service ID", (slot >= 0) && (slot < MDNS_MAX_SERVICES), return ERR_VAL); + LWIP_ERROR("mdns_resp_rename_service: Invalid Service ID", (mdns->services[slot] != NULL), return ERR_VAL); + + srv = mdns->services[slot]; + + MEMCPY(&srv->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, len)); + srv->name[len] = '\0'; /* null termination in case new name is shorter than previous */ + + mdns_resp_restart(netif); return ERR_OK; } @@ -2019,10 +2301,107 @@ mdns_resp_add_service(struct netif *netif, const char *name, const char *service err_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mdns_resp_add_service_txtitem: service != NULL", service); /* Use a mdns_domain struct to store txt chunks since it is the same encoding */ return mdns_domain_add_label(&service->txtdata, txt, txt_len); } +/** + * @ingroup mdns + * Send unsolicited answer containing all our known data + * @param netif The network interface to send on + */ +void +mdns_resp_announce(struct netif *netif) +{ + struct mdns_host* mdns; + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ERROR("mdns_resp_announce: netif != NULL", (netif != NULL), return); + + mdns = NETIF_TO_HOST(netif); + if (mdns == NULL) { + return; + } + + if (mdns->probing_state == MDNS_PROBING_COMPLETE) { + /* Announce on IPv6 and IPv4 */ +#if LWIP_IPV6 + mdns_announce(netif, IP6_ADDR_ANY); +#endif +#if LWIP_IPV4 + if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) { + mdns_announce(netif, IP4_ADDR_ANY); + } +#endif + } /* else: ip address changed while probing was ongoing? @todo reset counter to restart? */ +} + +/** Register a callback function that is called if probing is completed successfully + * or with a conflict. */ +void +mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb) +{ + mdns_name_result_cb = cb; +} + +/** + * @ingroup mdns + * Restart mdns responder. Call this when cable is connected after being disconnected or + * administrative interface is set up after being down + * @param netif The network interface to send on + */ +void +mdns_resp_restart(struct netif *netif) +{ + struct mdns_host* mdns; + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ERROR("mdns_resp_restart: netif != NULL", (netif != NULL), return); + + mdns = NETIF_TO_HOST(netif); + if (mdns == NULL) { + return; + } + + if (mdns->probing_state == MDNS_PROBING_ONGOING) { + sys_untimeout(mdns_probe, netif); + } + /* @todo if we've failed 15 times within a 10 second period we MUST wait 5 seconds (or wait 5 seconds every time except first)*/ + mdns->probes_sent = 0; + mdns->probing_state = MDNS_PROBING_ONGOING; + sys_timeout(MDNS_INITIAL_PROBE_DELAY_MS, mdns_probe, netif); +} + +/** + * @ingroup mdns + * Initiate MDNS responder. Will open UDP sockets on port 5353 + */ +void +mdns_resp_init(void) +{ + err_t res; + + /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */ + + mdns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY); + LWIP_ASSERT("Failed to allocate pcb", mdns_pcb != NULL); +#if LWIP_MULTICAST_TX_OPTIONS + udp_set_multicast_ttl(mdns_pcb, MDNS_TTL); +#else + mdns_pcb->ttl = MDNS_TTL; +#endif + res = udp_bind(mdns_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_MDNS); + LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */ + LWIP_ASSERT("Failed to bind pcb", res == ERR_OK); + udp_recv(mdns_pcb, mdns_recv, NULL); + + mdns_netif_client_id = netif_alloc_client_data_id(); + +#if MDNS_RESP_USENETIF_EXTCALLBACK + /* register for netif events when started on first netif */ + netif_add_ext_callback(&netif_callback, mdns_netif_ext_status_callback); +#endif +} + #endif /* LWIP_MDNS_RESPONDER */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mqtt/mqtt.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mqtt/mqtt.c similarity index 71% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mqtt/mqtt.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mqtt/mqtt.c index 899e2cb..595da77 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/mqtt/mqtt.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/mqtt/mqtt.c @@ -48,12 +48,15 @@ * */ #include "lwip/apps/mqtt.h" +#include "lwip/apps/mqtt_priv.h" #include "lwip/timeouts.h" #include "lwip/ip_addr.h" #include "lwip/mem.h" #include "lwip/err.h" #include "lwip/pbuf.h" -#include "lwip/tcp.h" +#include "lwip/altcp.h" +#include "lwip/altcp_tcp.h" +#include "lwip/altcp_tls.h" #include #if LWIP_TCP && LWIP_CALLBACK_API @@ -71,7 +74,7 @@ #define MQTT_DEBUG_WARN_STATE (MQTT_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE) #define MQTT_DEBUG_SERIOUS (MQTT_DEBUG | LWIP_DBG_LEVEL_SERIOUS) -static void mqtt_cyclic_timer(void *arg); + /** * MQTT client connection states @@ -119,9 +122,10 @@ enum mqtt_connect_flag { }; +static void mqtt_cyclic_timer(void *arg); + #if defined(LWIP_DEBUG) -static const char * const mqtt_message_type_str[15] = -{ +static const char *const mqtt_message_type_str[15] = { "UNDEFINED", "CONNECT", "CONNACK", @@ -142,7 +146,7 @@ static const char * const mqtt_message_type_str[15] = /** * Message type value to string * @param msg_type see enum mqtt_message_type - * + * * @return Control message type text string */ static const char * @@ -175,26 +179,51 @@ msg_generate_packet_id(mqtt_client_t *client) /*--------------------------------------------------------------------------------------------------------------------- */ /* Output ring buffer */ - -#define MQTT_RINGBUF_IDX_MASK ((MQTT_OUTPUT_RINGBUF_SIZE) - 1) - /** Add single item to ring buffer */ -#define mqtt_ringbuf_put(rb, item) ((rb)->buf)[(rb)->put++ & MQTT_RINGBUF_IDX_MASK] = (item) +static void +mqtt_ringbuf_put(struct mqtt_ringbuf_t *rb, u8_t item) +{ + rb->buf[rb->put] = item; + rb->put++; + if (rb->put >= MQTT_OUTPUT_RINGBUF_SIZE) { + rb->put = 0; + } +} + +/** Return pointer to ring buffer get position */ +static u8_t * +mqtt_ringbuf_get_ptr(struct mqtt_ringbuf_t *rb) +{ + return &rb->buf[rb->get]; +} + +static void +mqtt_ringbuf_advance_get_idx(struct mqtt_ringbuf_t *rb, u16_t len) +{ + LWIP_ASSERT("mqtt_ringbuf_advance_get_idx: len < MQTT_OUTPUT_RINGBUF_SIZE", len < MQTT_OUTPUT_RINGBUF_SIZE); + + rb->get += len; + if (rb->get >= MQTT_OUTPUT_RINGBUF_SIZE) { + rb->get = rb->get - MQTT_OUTPUT_RINGBUF_SIZE; + } +} /** Return number of bytes in ring buffer */ -#define mqtt_ringbuf_len(rb) ((u16_t)((rb)->put - (rb)->get)) +static u16_t +mqtt_ringbuf_len(struct mqtt_ringbuf_t *rb) +{ + u32_t len = rb->put - rb->get; + if (len > 0xFFFF) { + len += MQTT_OUTPUT_RINGBUF_SIZE; + } + return (u16_t)len; +} /** Return number of bytes free in ring buffer */ #define mqtt_ringbuf_free(rb) (MQTT_OUTPUT_RINGBUF_SIZE - mqtt_ringbuf_len(rb)) /** Return number of bytes possible to read without wrapping around */ -#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - ((rb)->get & MQTT_RINGBUF_IDX_MASK))) - -/** Return pointer to ring buffer get position */ -#define mqtt_ringbuf_get_ptr(rb) (&(rb)->buf[(rb)->get & MQTT_RINGBUF_IDX_MASK]) - -#define mqtt_ringbuf_advance_get_idx(rb, len) ((rb)->get += (len)) - +#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - (rb)->get)) /** * Try send as many bytes as possible from output ring buffer @@ -202,20 +231,20 @@ msg_generate_packet_id(mqtt_client_t *client) * @param tpcb TCP connection handle */ static void -mqtt_output_send(struct mqtt_ringbuf_t *rb, struct tcp_pcb *tpcb) +mqtt_output_send(struct mqtt_ringbuf_t *rb, struct altcp_pcb *tpcb) { err_t err; u8_t wrap = 0; u16_t ringbuf_lin_len = mqtt_ringbuf_linear_read_length(rb); - u16_t send_len = tcp_sndbuf(tpcb); + u16_t send_len = altcp_sndbuf(tpcb); LWIP_ASSERT("mqtt_output_send: tpcb != NULL", tpcb != NULL); if (send_len == 0 || ringbuf_lin_len == 0) { return; } - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_output_send: tcp_sndbuf: %d bytes, ringbuf_linear_available: %d, get %d, put %d\n", - send_len, ringbuf_lin_len, ((rb)->get & MQTT_RINGBUF_IDX_MASK), ((rb)->put & MQTT_RINGBUF_IDX_MASK))); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_output_send: tcp_sndbuf: %d bytes, ringbuf_linear_available: %d, get %d, put %d\n", + send_len, ringbuf_lin_len, rb->get, rb->put)); if (send_len > ringbuf_lin_len) { /* Space in TCP output buffer is larger than available in ring buffer linear portion */ @@ -223,18 +252,18 @@ mqtt_output_send(struct mqtt_ringbuf_t *rb, struct tcp_pcb *tpcb) /* Wrap around if more data in ring buffer after linear portion */ wrap = (mqtt_ringbuf_len(rb) > ringbuf_lin_len); } - err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY | (wrap ? TCP_WRITE_FLAG_MORE : 0)); + err = altcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY | (wrap ? TCP_WRITE_FLAG_MORE : 0)); if ((err == ERR_OK) && wrap) { mqtt_ringbuf_advance_get_idx(rb, send_len); /* Use the lesser one of ring buffer linear length and TCP send buffer size */ - send_len = LWIP_MIN(tcp_sndbuf(tpcb), mqtt_ringbuf_linear_read_length(rb)); - err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY); + send_len = LWIP_MIN(altcp_sndbuf(tpcb), mqtt_ringbuf_linear_read_length(rb)); + err = altcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY); } if (err == ERR_OK) { mqtt_ringbuf_advance_get_idx(rb, send_len); /* Flush */ - tcp_output(tpcb); + altcp_output(tpcb); } else { LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_output_send: Send failed with err %d (\"%s\")\n", err, lwip_strerr(err))); } @@ -248,18 +277,19 @@ mqtt_output_send(struct mqtt_ringbuf_t *rb, struct tcp_pcb *tpcb) /** * Create request item * @param r_objs Pointer to request objects + * @param r_objs_len Number of array entries * @param pkt_id Packet identifier of request * @param cb Packet callback to call when requests lifetime ends * @param arg Parameter following callback * @return Request or NULL if failed to create */ static struct mqtt_request_t * -mqtt_create_request(struct mqtt_request_t *r_objs, u16_t pkt_id, mqtt_request_cb_t cb, void *arg) +mqtt_create_request(struct mqtt_request_t *r_objs, size_t r_objs_len, u16_t pkt_id, mqtt_request_cb_t cb, void *arg) { struct mqtt_request_t *r = NULL; u8_t n; LWIP_ASSERT("mqtt_create_request: r_objs != NULL", r_objs != NULL); - for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) { + for (n = 0; n < r_objs_len; n++) { /* Item point to itself if not in use */ if (r_objs[n].next == &r_objs[n]) { r = &r_objs[n]; @@ -339,7 +369,7 @@ mqtt_take_request(struct mqtt_request_t **tail, u16_t pkt_id) if (iter != NULL) { /* unchain */ if (prev == NULL) { - *tail= iter->next; + *tail = iter->next; } else { prev->next = iter->next; } @@ -374,7 +404,7 @@ mqtt_request_time_elapsed(struct mqtt_request_t **tail, u8_t t) } mqtt_delete_request(r); /* Tail might be be modified in callback, so re-read it in every iteration */ - r = *(struct mqtt_request_t * const volatile *)tail; + r = *(struct mqtt_request_t *const volatile *)tail; } else { r->timeout_diff -= t; t = 0; @@ -400,13 +430,14 @@ mqtt_clear_requests(struct mqtt_request_t **tail) /** * Initialize all request items * @param r_objs Pointer to request objects + * @param r_objs_len Number of array entries */ static void -mqtt_init_requests(struct mqtt_request_t *r_objs) +mqtt_init_requests(struct mqtt_request_t *r_objs, size_t r_objs_len) { u8_t n; LWIP_ASSERT("mqtt_init_requests: r_objs != NULL", r_objs != NULL); - for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) { + for (n = 0; n < r_objs_len; n++) { /* Item pointing to itself indicates unused */ r_objs[n].next = &r_objs[n]; } @@ -453,18 +484,18 @@ mqtt_output_append_string(struct mqtt_ringbuf_t *rb, const char *str, u16_t leng * Append fixed header * @param rb Output ring buffer * @param msg_type see enum mqtt_message_type - * @param dup MQTT DUP flag - * @param qos MQTT QoS field - * @param retain MQTT retain flag + * @param fdup MQTT DUP flag + * @param fqos MQTT QoS field + * @param fretain MQTT retain flag * @param r_length Remaining length after fixed header */ static void -mqtt_output_append_fixed_header(struct mqtt_ringbuf_t *rb, u8_t msg_type, u8_t dup, - u8_t qos, u8_t retain, u16_t r_length) +mqtt_output_append_fixed_header(struct mqtt_ringbuf_t *rb, u8_t msg_type, u8_t fdup, + u8_t fqos, u8_t fretain, u16_t r_length) { /* Start with control byte */ - mqtt_output_append_u8(rb, (((msg_type & 0x0f) << 4) | ((dup & 1) << 3) | ((qos & 3) << 1) | (retain & 1))); + mqtt_output_append_u8(rb, (((msg_type & 0x0f) << 4) | ((fdup & 1) << 3) | ((fqos & 3) << 1) | (fretain & 1))); /* Encode remaining length field */ do { mqtt_output_append_u8(rb, (r_length & 0x7f) | (r_length >= 128 ? 0x80 : 0)); @@ -487,7 +518,7 @@ mqtt_output_check_space(struct mqtt_ringbuf_t *rb, u16_t r_length) LWIP_ASSERT("mqtt_output_check_space: rb != NULL", rb != NULL); - /* Calculate number of required bytes to contain the remaining bytes field and add to total*/ + /* Calculate number of required bytes to contain the remaining bytes field and add to total*/ do { total_len++; r_length >>= 7; @@ -510,13 +541,13 @@ mqtt_close(mqtt_client_t *client, mqtt_connection_status_t reason) /* Bring down TCP connection if not already done */ if (client->conn != NULL) { err_t res; - tcp_recv(client->conn, NULL); - tcp_err(client->conn, NULL); - tcp_sent(client->conn, NULL); - res = tcp_close(client->conn); + altcp_recv(client->conn, NULL); + altcp_err(client->conn, NULL); + altcp_sent(client->conn, NULL); + res = altcp_close(client->conn); if (res != ERR_OK) { - tcp_abort(client->conn); - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_close: Close err=%s\n", lwip_strerr(res))); + altcp_abort(client->conn); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_close: Close err=%s\n", lwip_strerr(res))); } client->conn = NULL; } @@ -551,7 +582,7 @@ mqtt_cyclic_timer(void *arg) if (client->conn_state == MQTT_CONNECTING) { client->cyclic_tick++; if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= MQTT_CONNECT_TIMOUT) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_cyclic_timer: CONNECT attempt to server timed out\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_cyclic_timer: CONNECT attempt to server timed out\n")); /* Disconnect TCP */ mqtt_close(client, MQTT_CONNECT_TIMEOUT); restart_timer = 0; @@ -565,15 +596,15 @@ mqtt_cyclic_timer(void *arg) client->server_watchdog++; /* If reception from server has been idle for 1.5*keep_alive time, server is considered unresponsive */ - if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive/2)) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_cyclic_timer: Server incoming keep-alive timeout\n")); + if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive / 2)) { + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_cyclic_timer: Server incoming keep-alive timeout\n")); mqtt_close(client, MQTT_CONNECT_TIMEOUT); restart_timer = 0; } /* If time for a keep alive message to be sent, transmission has been idle for keep_alive time */ if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= client->keep_alive) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_cyclic_timer: Sending keep-alive message to server\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_cyclic_timer: Sending keep-alive message to server\n")); if (mqtt_output_check_space(&client->output, 0) != 0) { mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PINGREQ, 0, 0, 0, 0); client->cyclic_tick = 0; @@ -583,11 +614,11 @@ mqtt_cyclic_timer(void *arg) } } } else { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_cyclic_timer: Timer should not be running in state %d\n", client->conn_state)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_cyclic_timer: Timer should not be running in state %d\n", client->conn_state)); restart_timer = 0; } if (restart_timer) { - sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, arg); + sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL * 1000, mqtt_cyclic_timer, arg); } } @@ -609,8 +640,8 @@ pub_ack_rec_rel_response(mqtt_client_t *client, u8_t msg, u16_t pkt_id, u8_t qos mqtt_output_append_u16(&client->output, pkt_id); mqtt_output_send(&client->output, client->conn); } else { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("pub_ack_rec_rel_response: OOM creating response: %s with pkt_id: %d\n", - mqtt_msg_type_to_str(msg), pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("pub_ack_rec_rel_response: OOM creating response: %s with pkt_id: %d\n", + mqtt_msg_type_to_str(msg), pkt_id)); err = ERR_MEM; } return err; @@ -633,26 +664,35 @@ mqtt_incomming_suback(struct mqtt_request_t *r, u8_t result) /** * Complete MQTT message received or buffer full * @param client MQTT client - * @param fixed_hdr_idx header index + * @param fixed_hdr_len length of fixed header * @param length length received part * @param remaining_length Remaining length of complete message */ static mqtt_connection_status_t - mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_idx, u16_t length, u32_t remaining_length) +mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_len, u16_t length, u32_t remaining_length) { mqtt_connection_status_t res = MQTT_CONNECT_ACCEPTED; - u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_idx; + u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_len; + size_t var_hdr_payload_bufsize = sizeof(client->rx_buffer) - fixed_hdr_len; /* Control packet type */ u8_t pkt_type = MQTT_CTL_PACKET_TYPE(client->rx_buffer[0]); u16_t pkt_id = 0; + LWIP_ASSERT("fixed_hdr_len <= client->msg_idx", fixed_hdr_len <= client->msg_idx); + LWIP_ERROR("buffer length mismatch", fixed_hdr_len + length <= MQTT_VAR_HEADER_BUFFER_LEN, + return MQTT_CONNECT_DISCONNECTED); + if (pkt_type == MQTT_MSG_TYPE_CONNACK) { if (client->conn_state == MQTT_CONNECTING) { + if (length < 2) { + LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short CONNACK message\n")); + goto out_disconnect; + } /* Get result code from CONNACK */ res = (mqtt_connection_status_t)var_hdr_payload[1]; - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: Connect response code %d\n", res)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: Connect response code %d\n", res)); if (res == MQTT_CONNECT_ACCEPTED) { /* Reset cyclic_tick when changing to connected state */ client->cyclic_tick = 0; @@ -663,10 +703,10 @@ static mqtt_connection_status_t } } } else { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Received CONNACK in connected state\n")); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Received CONNACK in connected state\n")); } } else if (pkt_type == MQTT_MSG_TYPE_PINGRESP) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,( "mqtt_message_received: Received PINGRESP from server\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ( "mqtt_message_received: Received PINGRESP from server\n")); } else if (pkt_type == MQTT_MSG_TYPE_PUBLISH) { u16_t payload_offset = 0; @@ -675,22 +715,37 @@ static mqtt_connection_status_t if (client->msg_idx <= MQTT_VAR_HEADER_BUFFER_LEN) { /* Should have topic and pkt id*/ - uint8_t *topic; - uint16_t after_topic; + u8_t *topic; + u16_t after_topic; u8_t bkp; - u16_t topic_len = var_hdr_payload[0]; + u16_t topic_len; + u16_t qos_len = (qos ? 2U : 0U); + if (length < 2 + qos_len) { + LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet\n")); + goto out_disconnect; + } + topic_len = var_hdr_payload[0]; topic_len = (topic_len << 8) + (u16_t)(var_hdr_payload[1]); + if ((topic_len > length - (2 + qos_len)) || + (topic_len > var_hdr_payload_bufsize - (2 + qos_len))) { + LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet (topic)\n")); + goto out_disconnect; + } topic = var_hdr_payload + 2; after_topic = 2 + topic_len; - /* Check length, add one byte even for QoS 0 so that zero termination will fit */ - if ((after_topic + (qos? 2 : 1)) > length) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Receive buffer can not fit topic + pkt_id\n")); + /* Check buffer length, add one byte even for QoS 0 so that zero termination will fit */ + if ((after_topic + (qos ? 2U : 1U)) > var_hdr_payload_bufsize) { + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Receive buffer can not fit topic + pkt_id\n")); goto out_disconnect; } /* id for QoS 1 and 2 */ if (qos > 0) { + if (length < after_topic + 2U) { + LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short PUBLISH packet (after_topic)\n")); + goto out_disconnect; + } client->inpub_pkt_id = ((u16_t)var_hdr_payload[after_topic] << 8) + (u16_t)var_hdr_payload[after_topic + 1]; after_topic += 2; } else { @@ -704,8 +759,8 @@ static mqtt_connection_status_t payload_length = length - after_topic; payload_offset = after_topic; - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_incomming_publish: Received message with QoS %d at topic: %s, payload length %d\n", - qos, topic, remaining_length + payload_length)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_publish: Received message with QoS %d at topic: %s, payload length %"U32_F"\n", + qos, topic, remaining_length + payload_length)); if (client->pub_cb != NULL) { client->pub_cb(client->inpub_arg, (const char *)topic, remaining_length + payload_length); } @@ -713,13 +768,19 @@ static mqtt_connection_status_t topic[topic_len] = bkp; } if (payload_length > 0 || remaining_length == 0) { - client->data_cb(client->inpub_arg, var_hdr_payload + payload_offset, payload_length, remaining_length == 0 ? MQTT_DATA_FLAG_LAST : 0); + if (length < (size_t)(payload_offset + payload_length)) { + LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received short packet (payload)\n")); + goto out_disconnect; + } + if (client->data_cb != NULL) { + client->data_cb(client->inpub_arg, var_hdr_payload + payload_offset, payload_length, remaining_length == 0 ? MQTT_DATA_FLAG_LAST : 0); + } /* Reply if QoS > 0 */ if (remaining_length == 0 && qos > 0) { /* Send PUBACK for QoS 1 or PUBREC for QoS 2 */ u8_t resp_msg = (qos == 1) ? MQTT_MSG_TYPE_PUBACK : MQTT_MSG_TYPE_PUBREC; - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_incomming_publish: Sending publish response: %s with pkt_id: %d\n", - mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_incomming_publish: Sending publish response: %s with pkt_id: %d\n", + mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id)); pub_ack_rec_rel_response(client, resp_msg, client->inpub_pkt_id, 0); } } @@ -728,25 +789,25 @@ static mqtt_connection_status_t pkt_id = (u16_t)var_hdr_payload[0] << 8; pkt_id |= (u16_t)var_hdr_payload[1]; if (pkt_id == 0) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: Got message with illegal packet identifier: 0\n")); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: Got message with illegal packet identifier: 0\n")); goto out_disconnect; } if (pkt_type == MQTT_MSG_TYPE_PUBREC) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: PUBREC, sending PUBREL with pkt_id: %d\n",pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: PUBREC, sending PUBREL with pkt_id: %d\n", pkt_id)); pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBREL, pkt_id, 1); } else if (pkt_type == MQTT_MSG_TYPE_PUBREL) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: PUBREL, sending PUBCOMP response with pkt_id: %d\n",pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: PUBREL, sending PUBCOMP response with pkt_id: %d\n", pkt_id)); pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBCOMP, pkt_id, 0); } else if (pkt_type == MQTT_MSG_TYPE_SUBACK || pkt_type == MQTT_MSG_TYPE_UNSUBACK || - pkt_type == MQTT_MSG_TYPE_PUBCOMP || pkt_type == MQTT_MSG_TYPE_PUBACK) { + pkt_type == MQTT_MSG_TYPE_PUBCOMP || pkt_type == MQTT_MSG_TYPE_PUBACK) { struct mqtt_request_t *r = mqtt_take_request(&client->pend_req_queue, pkt_id); if (r != NULL) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_message_received: %s response with id %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_message_received: %s response with id %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id)); if (pkt_type == MQTT_MSG_TYPE_SUBACK) { if (length < 3) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_message_received: To small SUBACK packet\n")); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_message_received: To small SUBACK packet\n")); goto out_disconnect; } else { mqtt_incomming_suback(r, var_hdr_payload[2]); @@ -756,10 +817,10 @@ static mqtt_connection_status_t } mqtt_delete_request(r); } else { - LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received %s reply, with wrong pkt_id: %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ( "mqtt_message_received: Received %s reply, with wrong pkt_id: %d\n", mqtt_msg_type_to_str(pkt_type), pkt_id)); } } else { - LWIP_DEBUGF(MQTT_DEBUG_WARN,( "mqtt_message_received: Received unknown message type: %d\n", pkt_type)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ( "mqtt_message_received: Received unknown message type: %d\n", pkt_type)); goto out_disconnect; } } @@ -780,59 +841,69 @@ mqtt_parse_incoming(mqtt_client_t *client, struct pbuf *p) { u16_t in_offset = 0; u32_t msg_rem_len = 0; - u8_t fixed_hdr_idx = 0; + u8_t fixed_hdr_len = 0; u8_t b = 0; while (p->tot_len > in_offset) { - if ((fixed_hdr_idx < 2) || ((b & 0x80) != 0)) { + /* We ALWAYS parse the header here first. Even if the header was not + included in this segment, we re-parse it here by buffering it in + client->rx_buffer. client->msg_idx keeps track of this. */ + if ((fixed_hdr_len < 2) || ((b & 0x80) != 0)) { - if (fixed_hdr_idx < client->msg_idx) { - b = client->rx_buffer[fixed_hdr_idx]; + if (fixed_hdr_len < client->msg_idx) { + /* parse header from old pbuf (buffered in client->rx_buffer) */ + b = client->rx_buffer[fixed_hdr_len]; } else { + /* parse header from this pbuf and save it in client->rx_buffer in case + it comes in segmented */ b = pbuf_get_at(p, in_offset++); client->rx_buffer[client->msg_idx++] = b; } - fixed_hdr_idx++; + fixed_hdr_len++; - if (fixed_hdr_idx >= 2) { - msg_rem_len |= (u32_t)(b & 0x7f) << ((fixed_hdr_idx - 2) * 7); + if (fixed_hdr_len >= 2) { + /* fixed header contains at least 2 bytes but can contain more, depending on + 'remaining length'. All bytes but the last of this have 0x80 set to + indicate more bytes are coming. */ + msg_rem_len |= (u32_t)(b & 0x7f) << ((fixed_hdr_len - 2) * 7); if ((b & 0x80) == 0) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_parse_incoming: Remaining length after fixed header: %d\n", msg_rem_len)); + /* fixed header is done */ + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_parse_incoming: Remaining length after fixed header: %"U32_F"\n", msg_rem_len)); if (msg_rem_len == 0) { /* Complete message with no extra headers of payload received */ - mqtt_message_received(client, fixed_hdr_idx, 0, 0); + mqtt_message_received(client, fixed_hdr_len, 0, 0); client->msg_idx = 0; - fixed_hdr_idx = 0; + fixed_hdr_len = 0; } else { - /* Bytes remaining in message */ - msg_rem_len = (msg_rem_len + fixed_hdr_idx) - client->msg_idx; + /* Bytes remaining in message (changes remaining length if this is + not the first segment of this message) */ + msg_rem_len = (msg_rem_len + fixed_hdr_len) - client->msg_idx; } } } } else { - u16_t cpy_len, cpy_start, buffer_space; - - cpy_start = (client->msg_idx - fixed_hdr_idx) % (MQTT_VAR_HEADER_BUFFER_LEN - fixed_hdr_idx) + fixed_hdr_idx; + /* Fixed header has been parsed, parse variable header */ + u16_t cpy_len, buffer_space; /* Allow to copy the lesser one of available length in input data or bytes remaining in message */ cpy_len = (u16_t)LWIP_MIN((u16_t)(p->tot_len - in_offset), msg_rem_len); /* Limit to available space in buffer */ - buffer_space = MQTT_VAR_HEADER_BUFFER_LEN - cpy_start; + buffer_space = MQTT_VAR_HEADER_BUFFER_LEN - fixed_hdr_len; if (cpy_len > buffer_space) { cpy_len = buffer_space; } - pbuf_copy_partial(p, client->rx_buffer+cpy_start, cpy_len, in_offset); + pbuf_copy_partial(p, client->rx_buffer + fixed_hdr_len, cpy_len, in_offset); /* Advance get and put indexes */ client->msg_idx += cpy_len; in_offset += cpy_len; msg_rem_len -= cpy_len; - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_parse_incoming: msg_idx: %d, cpy_len: %d, remaining %d\n", client->msg_idx, cpy_len, msg_rem_len)); - if (msg_rem_len == 0 || cpy_len == buffer_space) { + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_parse_incoming: msg_idx: %"U32_F", cpy_len: %"U16_F", remaining %"U32_F"\n", client->msg_idx, cpy_len, msg_rem_len)); + if ((msg_rem_len == 0) || (cpy_len == buffer_space)) { /* Whole message received or buffer is full */ - mqtt_connection_status_t res = mqtt_message_received(client, fixed_hdr_idx, (cpy_start + cpy_len) - fixed_hdr_idx, msg_rem_len); + mqtt_connection_status_t res = mqtt_message_received(client, fixed_hdr_len, cpy_len, msg_rem_len); if (res != MQTT_CONNECT_ACCEPTED) { return res; } @@ -840,7 +911,7 @@ mqtt_parse_incoming(mqtt_client_t *client, struct pbuf *p) /* Reset parser state */ client->msg_idx = 0; /* msg_tot_len = 0; */ - fixed_hdr_idx = 0; + fixed_hdr_len = 0; } } } @@ -857,25 +928,25 @@ mqtt_parse_incoming(mqtt_client_t *client, struct pbuf *p) * @return ERR_OK or err passed into callback */ static err_t -mqtt_tcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +mqtt_tcp_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) { mqtt_client_t *client = (mqtt_client_t *)arg; LWIP_ASSERT("mqtt_tcp_recv_cb: client != NULL", client != NULL); LWIP_ASSERT("mqtt_tcp_recv_cb: client->conn == pcb", client->conn == pcb); if (p == NULL) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_recv_cb: Recv pbuf=NULL, remote has closed connection\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_recv_cb: Recv pbuf=NULL, remote has closed connection\n")); mqtt_close(client, MQTT_CONNECT_DISCONNECTED); } else { mqtt_connection_status_t res; if (err != ERR_OK) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_tcp_recv_cb: Recv err=%d\n", err)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_tcp_recv_cb: Recv err=%d\n", err)); pbuf_free(p); return err; } /* Tell remote that data has been received */ - tcp_recved(pcb, p->tot_len); + altcp_recved(pcb, p->tot_len); res = mqtt_parse_incoming(client, p); pbuf_free(p); @@ -901,7 +972,7 @@ mqtt_tcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) * @return ERR_OK */ static err_t -mqtt_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb, u16_t len) +mqtt_tcp_sent_cb(void *arg, struct altcp_pcb *tpcb, u16_t len) { mqtt_client_t *client = (mqtt_client_t *)arg; @@ -916,7 +987,7 @@ mqtt_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb, u16_t len) client->server_watchdog = 0; /* QoS 0 publish has no response from server, so call its callbacks here */ while ((r = mqtt_take_request(&client->pend_req_queue, 0)) != NULL) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_sent_cb: Calling QoS 0 publish complete callback\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_sent_cb: Calling QoS 0 publish complete callback\n")); if (r->cb != NULL) { r->cb(r->arg, ERR_OK); } @@ -938,7 +1009,7 @@ mqtt_tcp_err_cb(void *arg, err_t err) { mqtt_client_t *client = (mqtt_client_t *)arg; LWIP_UNUSED_ARG(err); /* only used for debug output */ - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_err_cb: TCP error callback: error %d, arg: %p\n", err, arg)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_err_cb: TCP error callback: error %d, arg: %p\n", err, arg)); LWIP_ASSERT("mqtt_tcp_err_cb: client != NULL", client != NULL); /* Set conn to null before calling close as pcb is already deallocated*/ client->conn = 0; @@ -952,7 +1023,7 @@ mqtt_tcp_err_cb(void *arg, err_t err) * @return err ERR_OK */ static err_t -mqtt_tcp_poll_cb(void *arg, struct tcp_pcb *tpcb) +mqtt_tcp_poll_cb(void *arg, struct altcp_pcb *tpcb) { mqtt_client_t *client = (mqtt_client_t *)arg; if (client->conn_state == MQTT_CONNECTED) { @@ -969,12 +1040,12 @@ mqtt_tcp_poll_cb(void *arg, struct tcp_pcb *tpcb) * @return ERR_OK */ static err_t -mqtt_tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) +mqtt_tcp_connect_cb(void *arg, struct altcp_pcb *tpcb, err_t err) { - mqtt_client_t* client = (mqtt_client_t *)arg; + mqtt_client_t *client = (mqtt_client_t *)arg; if (err != ERR_OK) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_tcp_connect_cb: TCP connect error %d\n", err)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_tcp_connect_cb: TCP connect error %d\n", err)); return err; } @@ -982,16 +1053,16 @@ mqtt_tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) client->msg_idx = 0; /* Setup TCP callbacks */ - tcp_recv(tpcb, mqtt_tcp_recv_cb); - tcp_sent(tpcb, mqtt_tcp_sent_cb); - tcp_poll(tpcb, mqtt_tcp_poll_cb, 2); + altcp_recv(tpcb, mqtt_tcp_recv_cb); + altcp_sent(tpcb, mqtt_tcp_sent_cb); + altcp_poll(tpcb, mqtt_tcp_poll_cb, 2); - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_tcp_connect_cb: TCP connection established to server\n")); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_tcp_connect_cb: TCP connection established to server\n")); /* Enter MQTT connect state */ client->conn_state = MQTT_CONNECTING; /* Start cyclic timer */ - sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, client); + sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL * 1000, mqtt_cyclic_timer, client); client->cyclic_tick = 0; /* Start transmission from output queue, connect message is the first one out*/ @@ -1012,7 +1083,7 @@ mqtt_tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) * @param client MQTT client * @param topic Publish topic string * @param payload Data to publish (NULL is allowed) - * @param payload_length: Length of payload (0 is allowed) + * @param payload_length Length of payload (0 is allowed) * @param qos Quality of service, 0 1 or 2 * @param retain MQTT retain flag * @param cb Callback to call when publish is complete or has timed out @@ -1032,6 +1103,7 @@ mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_ u16_t topic_len; u16_t remaining_length; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_publish: client != NULL", client); LWIP_ASSERT("mqtt_publish: topic != NULL", topic); LWIP_ERROR("mqtt_publish: TCP disconnected", (client->conn_state != TCP_DISCONNECTED), return ERR_CONN); @@ -1040,21 +1112,21 @@ mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_ LWIP_ERROR("mqtt_publish: topic length overflow", (topic_strlen <= (0xFFFF - 2)), return ERR_ARG); topic_len = (u16_t)topic_strlen; total_len = 2 + topic_len + payload_length; - LWIP_ERROR("mqtt_publish: total length overflow", (total_len <= 0xFFFF), return ERR_ARG); - remaining_length = (u16_t)total_len; - - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_publish: Publish with payload length %d to topic \"%s\"\n", payload_length, topic)); if (qos > 0) { - remaining_length += 2; + total_len += 2; /* Generate pkt_id id for QoS1 and 2 */ pkt_id = msg_generate_packet_id(client); } else { /* Use reserved value pkt_id 0 for QoS 0 in request handle */ pkt_id = 0; } + LWIP_ERROR("mqtt_publish: total length overflow", (total_len <= 0xFFFF), return ERR_ARG); + remaining_length = (u16_t)total_len; - r = mqtt_create_request(client->req_list, pkt_id, cb, arg); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_publish: Publish with payload length %d to topic \"%s\"\n", payload_length, topic)); + + r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg); if (r == NULL) { return ERR_MEM; } @@ -1106,6 +1178,7 @@ mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_ u16_t pkt_id; struct mqtt_request_t *r; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_sub_unsub: client != NULL", client); LWIP_ASSERT("mqtt_sub_unsub: topic != NULL", topic); @@ -1119,12 +1192,12 @@ mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_ LWIP_ASSERT("mqtt_sub_unsub: qos < 3", qos < 3); if (client->conn_state == TCP_DISCONNECTED) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_sub_unsub: Can not (un)subscribe in disconnected state\n")); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_sub_unsub: Can not (un)subscribe in disconnected state\n")); return ERR_CONN; } pkt_id = msg_generate_packet_id(client); - r = mqtt_create_request(client->req_list, pkt_id, cb, arg); + r = mqtt_create_request(client->req_list, LWIP_ARRAYSIZE(client->req_list), pkt_id, cb, arg); if (r == NULL) { return ERR_MEM; } @@ -1134,7 +1207,7 @@ mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_ return ERR_MEM; } - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_sub_unsub: Client (un)subscribe to topic \"%s\", id: %d\n", topic, pkt_id)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_sub_unsub: Client (un)subscribe to topic \"%s\", id: %d\n", topic, pkt_id)); mqtt_output_append_fixed_header(&client->output, sub ? MQTT_MSG_TYPE_SUBSCRIBE : MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0, remaining_length); /* Packet id */ @@ -1162,8 +1235,9 @@ mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_ */ void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb, - mqtt_incoming_data_cb_t data_cb, void *arg) + mqtt_incoming_data_cb_t data_cb, void *arg) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_set_inpub_callback: client != NULL", client != NULL); client->data_cb = data_cb; client->pub_cb = pub_cb; @@ -1178,13 +1252,20 @@ mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb mqtt_client_t * mqtt_client_new(void) { - mqtt_client_t *client = (mqtt_client_t *)mem_malloc(sizeof(mqtt_client_t)); - if (client != NULL) { - memset(client, 0, sizeof(mqtt_client_t)); - } - return client; + LWIP_ASSERT_CORE_LOCKED(); + return (mqtt_client_t *)mem_calloc(1, sizeof(mqtt_client_t)); } +/** + * @ingroup mqtt + * Free MQTT client instance + * @param client Pointer to instance to be freed + */ +void +mqtt_client_free(mqtt_client_t *client) +{ + mem_free(client); +} /** * @ingroup mqtt @@ -1207,14 +1288,16 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, /* Length is the sum of 2+"MQTT", protocol level, flags and keep alive */ u16_t remaining_length = 2 + 4 + 1 + 1 + 2; u8_t flags = 0, will_topic_len = 0, will_msg_len = 0; + u16_t client_user_len = 0, client_pass_len = 0; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_client_connect: client != NULL", client != NULL); LWIP_ASSERT("mqtt_client_connect: ip_addr != NULL", ip_addr != NULL); LWIP_ASSERT("mqtt_client_connect: client_info != NULL", client_info != NULL); LWIP_ASSERT("mqtt_client_connect: client_info->client_id != NULL", client_info->client_id != NULL); if (client->conn_state != TCP_DISCONNECTED) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: Already connected\n")); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_client_connect: Already connected\n")); return ERR_ISCONN; } @@ -1223,7 +1306,7 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, client->connect_arg = arg; client->connect_cb = cb; client->keep_alive = client_info->keep_alive; - mqtt_init_requests(client->req_list); + mqtt_init_requests(client->req_list, LWIP_ARRAYSIZE(client->req_list)); /* Build connect message */ if (client_info->will_topic != NULL && client_info->will_msg != NULL) { @@ -1243,6 +1326,26 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL); remaining_length = (u16_t)len; } + if (client_info->client_user != NULL) { + flags |= MQTT_CONNECT_FLAG_USERNAME; + len = strlen(client_info->client_user); + LWIP_ERROR("mqtt_client_connect: client_info->client_user length overflow", len <= 0xFFFF, return ERR_VAL); + LWIP_ERROR("mqtt_client_connect: client_info->client_user length must be > 0", len > 0, return ERR_VAL); + client_user_len = (u16_t)len; + len = remaining_length + 2 + client_user_len; + LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL); + remaining_length = (u16_t)len; + } + if (client_info->client_pass != NULL) { + flags |= MQTT_CONNECT_FLAG_PASSWORD; + len = strlen(client_info->client_pass); + LWIP_ERROR("mqtt_client_connect: client_info->client_pass length overflow", len <= 0xFFFF, return ERR_VAL); + LWIP_ERROR("mqtt_client_connect: client_info->client_pass length must be > 0", len > 0, return ERR_VAL); + client_pass_len = (u16_t)len; + len = remaining_length + 2 + client_pass_len; + LWIP_ERROR("mqtt_client_connect: remaining_length overflow", len <= 0xFFFF, return ERR_VAL); + remaining_length = (u16_t)len; + } /* Don't complicate things, always connect using clean session */ flags |= MQTT_CONNECT_FLAG_CLEAN_SESSION; @@ -1258,29 +1361,36 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, return ERR_MEM; } - client->conn = tcp_new(); +#if LWIP_ALTCP && LWIP_ALTCP_TLS + if (client_info->tls_config) { + client->conn = altcp_tls_new(client_info->tls_config, IP_GET_TYPE(ip_addr)); + } else +#endif + { + client->conn = altcp_tcp_new_ip_type(IP_GET_TYPE(ip_addr)); + } if (client->conn == NULL) { return ERR_MEM; } /* Set arg pointer for callbacks */ - tcp_arg(client->conn, client); + altcp_arg(client->conn, client); /* Any local address, pick random local port number */ - err = tcp_bind(client->conn, IP_ADDR_ANY, 0); + err = altcp_bind(client->conn, IP_ADDR_ANY, 0); if (err != ERR_OK) { - LWIP_DEBUGF(MQTT_DEBUG_WARN,("mqtt_client_connect: Error binding to local ip/port, %d\n", err)); + LWIP_DEBUGF(MQTT_DEBUG_WARN, ("mqtt_client_connect: Error binding to local ip/port, %d\n", err)); goto tcp_fail; } - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: Connecting to host: %s at port:%"U16_F"\n", ipaddr_ntoa(ip_addr), port)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_client_connect: Connecting to host: %s at port:%"U16_F"\n", ipaddr_ntoa(ip_addr), port)); /* Connect to server */ - err = tcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb); + err = altcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb); if (err != ERR_OK) { - LWIP_DEBUGF(MQTT_DEBUG_TRACE,("mqtt_client_connect: Error connecting to remote ip/port, %d\n", err)); + LWIP_DEBUGF(MQTT_DEBUG_TRACE, ("mqtt_client_connect: Error connecting to remote ip/port, %d\n", err)); goto tcp_fail; } /* Set error callback */ - tcp_err(client->conn, mqtt_tcp_err_cb); + altcp_err(client->conn, mqtt_tcp_err_cb); client->conn_state = TCP_CONNECTING; /* Append fixed header */ @@ -1300,10 +1410,18 @@ mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_output_append_string(&client->output, client_info->will_topic, will_topic_len); mqtt_output_append_string(&client->output, client_info->will_msg, will_msg_len); } + /* Append user name if given */ + if ((flags & MQTT_CONNECT_FLAG_USERNAME) != 0) { + mqtt_output_append_string(&client->output, client_info->client_user, client_user_len); + } + /* Append password if given */ + if ((flags & MQTT_CONNECT_FLAG_PASSWORD) != 0) { + mqtt_output_append_string(&client->output, client_info->client_pass, client_pass_len); + } return ERR_OK; tcp_fail: - tcp_abort(client->conn); + altcp_abort(client->conn); client->conn = NULL; return err; } @@ -1317,6 +1435,7 @@ tcp_fail: void mqtt_disconnect(mqtt_client_t *client) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_disconnect: client != NULL", client); /* If connection in not already closed */ if (client->conn_state != TCP_DISCONNECTED) { @@ -1335,6 +1454,7 @@ mqtt_disconnect(mqtt_client_t *client) u8_t mqtt_client_is_connected(mqtt_client_t *client) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mqtt_client_is_connected: client != NULL", client); return client->conn_state == MQTT_CONNECTED; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/netbiosns/netbiosns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/netbiosns/netbiosns.c new file mode 100644 index 0000000..479c375 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/netbiosns/netbiosns.c @@ -0,0 +1,533 @@ + /** + * @file + * NetBIOS name service responder + */ + +/** + * @defgroup netbiosns NETBIOS responder + * @ingroup apps + * + * This is an example implementation of a NetBIOS name server. + * It responds to name queries for a configurable name. + * Name resolving is not supported. + * + * Note that the device doesn't broadcast it's own name so can't + * detect duplicate names! + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Modifications by Ray Abram to respond to NetBIOS name requests when Incoming name = * + * - based on code from "https://github.com/esp8266/Arduino/commit/1f7989b31d26d7df9776a08f36d685eae7ac8f99" + * - with permission to relicense to BSD from original author: + * http://www.xpablo.cz/?p=751#more-751 + */ + +#include "lwip/apps/netbiosns.h" + +#if LWIP_IPV4 && LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/udp.h" +#include "lwip/ip.h" +#include "lwip/netif.h" +#include "lwip/prot/iana.h" + +#include + +/** size of a NetBIOS name */ +#define NETBIOS_NAME_LEN 16 + +/** The Time-To-Live for NetBIOS name responds (in seconds) + * Default is 300000 seconds (3 days, 11 hours, 20 minutes) */ +#define NETBIOS_NAME_TTL 300000u + +/** NetBIOS header flags */ +#define NETB_HFLAG_RESPONSE 0x8000U +#define NETB_HFLAG_OPCODE 0x7800U +#define NETB_HFLAG_OPCODE_NAME_QUERY 0x0000U +#define NETB_HFLAG_AUTHORATIVE 0x0400U +#define NETB_HFLAG_TRUNCATED 0x0200U +#define NETB_HFLAG_RECURS_DESIRED 0x0100U +#define NETB_HFLAG_RECURS_AVAILABLE 0x0080U +#define NETB_HFLAG_BROADCAST 0x0010U +#define NETB_HFLAG_REPLYCODE 0x0008U +#define NETB_HFLAG_REPLYCODE_NOERROR 0x0000U + +/* NetBIOS question types */ +#define NETB_QTYPE_NB 0x0020U +#define NETB_QTYPE_NBSTAT 0x0021U + +/** NetBIOS name flags */ +#define NETB_NFLAG_UNIQUE 0x8000U +#define NETB_NFLAG_NODETYPE 0x6000U +#define NETB_NFLAG_NODETYPE_HNODE 0x6000U +#define NETB_NFLAG_NODETYPE_MNODE 0x4000U +#define NETB_NFLAG_NODETYPE_PNODE 0x2000U +#define NETB_NFLAG_NODETYPE_BNODE 0x0000U + +#define NETB_NFLAG_NAME_IN_CONFLICT 0x0800U /* 1=Yes, 0=No */ +#define NETB_NFLAG_NAME_IS_ACTIVE 0x0400U /* 1=Yes, 0=No */ +#define NETB_NFLAG_NAME_IS_PERMANENT 0x0200U /* 1=Yes (Name is Permanent Node Name), 0=No */ + +/** NetBIOS message header */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct netbios_hdr { + PACK_STRUCT_FIELD(u16_t trans_id); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FIELD(u16_t questions); + PACK_STRUCT_FIELD(u16_t answerRRs); + PACK_STRUCT_FIELD(u16_t authorityRRs); + PACK_STRUCT_FIELD(u16_t additionalRRs); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** NetBIOS message question part */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct netbios_question_hdr { + PACK_STRUCT_FLD_8(u8_t nametype); + PACK_STRUCT_FLD_8(u8_t encname[(NETBIOS_NAME_LEN * 2) + 1]); + PACK_STRUCT_FIELD(u16_t type); + PACK_STRUCT_FIELD(u16_t cls); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** NetBIOS message name part */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct netbios_name_hdr { + PACK_STRUCT_FLD_8(u8_t nametype); + PACK_STRUCT_FLD_8(u8_t encname[(NETBIOS_NAME_LEN * 2) + 1]); + PACK_STRUCT_FIELD(u16_t type); + PACK_STRUCT_FIELD(u16_t cls); + PACK_STRUCT_FIELD(u32_t ttl); + PACK_STRUCT_FIELD(u16_t datalen); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FLD_S(ip4_addr_p_t addr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** NetBIOS message */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct netbios_resp { + struct netbios_hdr resp_hdr; + struct netbios_name_hdr resp_name; +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** The NBNS Structure Responds to a Name Query */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct netbios_answer { + struct netbios_hdr answer_hdr; + /** the length of the next string */ + PACK_STRUCT_FIELD(u8_t name_size); + /** WARNING!!! this item may be of a different length (we use this struct for transmission) */ + PACK_STRUCT_FLD_8(u8_t query_name[(NETBIOS_NAME_LEN * 2) + 1]); + PACK_STRUCT_FIELD(u16_t packet_type); + PACK_STRUCT_FIELD(u16_t cls); + PACK_STRUCT_FIELD(u32_t ttl); + PACK_STRUCT_FIELD(u16_t data_length); +#define OFFSETOF_STRUCT_NETBIOS_ANSWER_NUMBER_OF_NAMES 56 + /** number of names */ + PACK_STRUCT_FLD_8(u8_t number_of_names); + /** node name */ + PACK_STRUCT_FLD_8(u8_t answer_name[NETBIOS_NAME_LEN]); + /** node flags */ + PACK_STRUCT_FIELD(u16_t answer_name_flags); + /** Unit ID */ + PACK_STRUCT_FLD_8(u8_t unit_id[6]); + /** Jumpers */ + PACK_STRUCT_FLD_8(u8_t jumpers); + /** Test result */ + PACK_STRUCT_FLD_8(u8_t test_result); + /** Version number */ + PACK_STRUCT_FIELD(u16_t version_number); + /** Period of statistics */ + PACK_STRUCT_FIELD(u16_t period_of_statistics); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_crcs); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_alignment_errors); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_collisions); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_send_aborts); + /** Statistics */ + PACK_STRUCT_FIELD(u32_t number_of_good_sends); + /** Statistics */ + PACK_STRUCT_FIELD(u32_t number_of_good_receives); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_retransmits); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_no_resource_condition); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_free_command_blocks); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t total_number_of_command_blocks); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t max_total_number_of_command_blocks); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t number_of_pending_sessions); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t max_number_of_pending_sessions); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t max_total_sessions_possible); + /** Statistics */ + PACK_STRUCT_FIELD(u16_t session_data_packet_size); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef NETBIOS_LWIP_NAME +#define NETBIOS_LOCAL_NAME NETBIOS_LWIP_NAME +#else +static char netbiosns_local_name[NETBIOS_NAME_LEN]; +#define NETBIOS_LOCAL_NAME netbiosns_local_name +#endif + +static struct udp_pcb *netbiosns_pcb; + +/** Decode a NetBIOS name (from packet to string) */ +static int +netbiosns_name_decode(const char *name_enc, char *name_dec, int name_dec_len) +{ + const char *pname; + char cname; + char cnbname; + int idx = 0; + + LWIP_UNUSED_ARG(name_dec_len); + + /* Start decoding netbios name. */ + pname = name_enc; + for (;;) { + /* Every two characters of the first level-encoded name + * turn into one character in the decoded name. */ + cname = *pname; + if (cname == '\0') { + break; /* no more characters */ + } + if (cname == '.') { + break; /* scope ID follows */ + } + if (!lwip_isupper(cname)) { + /* Not legal. */ + return -1; + } + cname -= 'A'; + cnbname = cname << 4; + pname++; + + cname = *pname; + if (!lwip_isupper(cname)) { + /* Not legal. */ + return -1; + } + cname -= 'A'; + cnbname |= cname; + pname++; + + /* Do we have room to store the character? */ + if (idx < NETBIOS_NAME_LEN) { + /* Yes - store the character. */ + name_dec[idx++] = (cnbname != ' ' ? cnbname : '\0'); + } + } + + return 0; +} + +#if 0 /* function currently unused */ +/** Encode a NetBIOS name (from string to packet) - currently unused because + we don't ask for names. */ +static int +netbiosns_name_encode(char *name_enc, char *name_dec, int name_dec_len) +{ + char *pname; + char cname; + unsigned char ucname; + int idx = 0; + + /* Start encoding netbios name. */ + pname = name_enc; + + for (;;) { + /* Every two characters of the first level-encoded name + * turn into one character in the decoded name. */ + cname = *pname; + if (cname == '\0') { + break; /* no more characters */ + } + if (cname == '.') { + break; /* scope ID follows */ + } + if ((cname < 'A' || cname > 'Z') && (cname < '0' || cname > '9')) { + /* Not legal. */ + return -1; + } + + /* Do we have room to store the character? */ + if (idx >= name_dec_len) { + return -1; + } + + /* Yes - store the character. */ + ucname = cname; + name_dec[idx++] = ('A' + ((ucname >> 4) & 0x0F)); + name_dec[idx++] = ('A' + ( ucname & 0x0F)); + pname++; + } + + /* Fill with "space" coding */ + for (; idx < name_dec_len - 1;) { + name_dec[idx++] = 'C'; + name_dec[idx++] = 'A'; + } + + /* Terminate string */ + name_dec[idx] = '\0'; + + return 0; +} +#endif /* 0 */ + +/** NetBIOS Name service recv callback */ +static void +netbiosns_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + LWIP_UNUSED_ARG(arg); + + /* if packet is valid */ + if (p != NULL) { + char netbios_name[NETBIOS_NAME_LEN + 1]; + struct netbios_hdr *netbios_hdr = (struct netbios_hdr *)p->payload; + struct netbios_question_hdr *netbios_question_hdr = (struct netbios_question_hdr *)(netbios_hdr + 1); + + /* is the packet long enough (we need the header in one piece) */ + if (p->len < (sizeof(struct netbios_hdr) + sizeof(struct netbios_question_hdr))) { + /* packet too short */ + pbuf_free(p); + return; + } + /* we only answer if we got a default interface */ + if (netif_default != NULL) { + /* @todo: do we need to check answerRRs/authorityRRs/additionalRRs? */ + /* if the packet is a NetBIOS name query question */ + if (((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_OPCODE)) == PP_NTOHS(NETB_HFLAG_OPCODE_NAME_QUERY)) && + ((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_RESPONSE)) == 0) && + (netbios_hdr->questions == PP_NTOHS(1))) { + /* decode the NetBIOS name */ + netbiosns_name_decode((char *)(netbios_question_hdr->encname), netbios_name, sizeof(netbios_name)); + /* check the request type */ + if (netbios_question_hdr->type == PP_HTONS(NETB_QTYPE_NB)) { + /* if the packet is for us */ + if (lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) == 0) { + struct pbuf *q; + struct netbios_resp *resp; + + q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM); + if (q != NULL) { + resp = (struct netbios_resp *)q->payload; + + /* prepare NetBIOS header response */ + resp->resp_hdr.trans_id = netbios_hdr->trans_id; + resp->resp_hdr.flags = PP_HTONS(NETB_HFLAG_RESPONSE | + NETB_HFLAG_OPCODE_NAME_QUERY | + NETB_HFLAG_AUTHORATIVE | + NETB_HFLAG_RECURS_DESIRED); + resp->resp_hdr.questions = 0; + resp->resp_hdr.answerRRs = PP_HTONS(1); + resp->resp_hdr.authorityRRs = 0; + resp->resp_hdr.additionalRRs = 0; + + /* prepare NetBIOS header datas */ + MEMCPY( resp->resp_name.encname, netbios_question_hdr->encname, sizeof(netbios_question_hdr->encname)); + resp->resp_name.nametype = netbios_question_hdr->nametype; + resp->resp_name.type = netbios_question_hdr->type; + resp->resp_name.cls = netbios_question_hdr->cls; + resp->resp_name.ttl = PP_HTONL(NETBIOS_NAME_TTL); + resp->resp_name.datalen = PP_HTONS(sizeof(resp->resp_name.flags) + sizeof(resp->resp_name.addr)); + resp->resp_name.flags = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE); + ip4_addr_copy(resp->resp_name.addr, *netif_ip4_addr(netif_default)); + + /* send the NetBIOS response */ + udp_sendto(upcb, q, addr, port); + + /* free the "reference" pbuf */ + pbuf_free(q); + } + } +#if LWIP_NETBIOS_RESPOND_NAME_QUERY + } else if (netbios_question_hdr->type == PP_HTONS(NETB_QTYPE_NBSTAT)) { + /* if the packet is for us or general query */ + if (!lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) || + !lwip_strnicmp(netbios_name, "*", sizeof(NETBIOS_LOCAL_NAME))) { + /* general query - ask for our IP address */ + struct pbuf *q; + struct netbios_answer *resp; + + q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_answer), PBUF_RAM); + if (q != NULL) { + /* buffer to which a response is compiled */ + resp = (struct netbios_answer *) q->payload; + + /* Init response to zero, especially the statistics fields */ + memset(resp, 0, sizeof(*resp)); + + /* copy the query to the response ID */ + resp->answer_hdr.trans_id = netbios_hdr->trans_id; + /* acknowledgment of termination */ + resp->answer_hdr.flags = PP_HTONS(NETB_HFLAG_RESPONSE | NETB_HFLAG_OPCODE_NAME_QUERY | NETB_HFLAG_AUTHORATIVE); + /* resp->answer_hdr.questions = PP_HTONS(0); done by memset() */ + /* serial number of the answer */ + resp->answer_hdr.answerRRs = PP_HTONS(1); + /* resp->answer_hdr.authorityRRs = PP_HTONS(0); done by memset() */ + /* resp->answer_hdr.additionalRRs = PP_HTONS(0); done by memset() */ + /* we will copy the length of the station name */ + resp->name_size = netbios_question_hdr->nametype; + /* we will copy the queried name */ + MEMCPY(resp->query_name, netbios_question_hdr->encname, (NETBIOS_NAME_LEN * 2) + 1); + /* NBSTAT */ + resp->packet_type = PP_HTONS(0x21); + /* Internet name */ + resp->cls = PP_HTONS(1); + /* resp->ttl = PP_HTONL(0); done by memset() */ + resp->data_length = PP_HTONS(sizeof(struct netbios_answer) - offsetof(struct netbios_answer, number_of_names)); + resp->number_of_names = 1; + + /* make windows see us as workstation, not as a server */ + memset(resp->answer_name, 0x20, NETBIOS_NAME_LEN - 1); + /* strlen is checked to be < NETBIOS_NAME_LEN during initialization */ + MEMCPY(resp->answer_name, NETBIOS_LOCAL_NAME, strlen(NETBIOS_LOCAL_NAME)); + + /* b-node, unique, active */ + resp->answer_name_flags = PP_HTONS(NETB_NFLAG_NAME_IS_ACTIVE); + + /* Set responder netif MAC address */ + SMEMCPY(resp->unit_id, ip_current_input_netif()->hwaddr, sizeof(resp->unit_id)); + + udp_sendto(upcb, q, addr, port); + pbuf_free(q); + } + } +#endif /* LWIP_NETBIOS_RESPOND_NAME_QUERY */ + } + } + } + /* free the pbuf */ + pbuf_free(p); + } +} + +/** + * @ingroup netbiosns + * Init netbios responder + */ +void +netbiosns_init(void) +{ + /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */ +#ifdef NETBIOS_LWIP_NAME + LWIP_ASSERT("NetBIOS name is too long!", strlen(NETBIOS_LWIP_NAME) < NETBIOS_NAME_LEN); +#endif + + netbiosns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY); + if (netbiosns_pcb != NULL) { + /* we have to be allowed to send broadcast packets! */ + ip_set_option(netbiosns_pcb, SOF_BROADCAST); + udp_bind(netbiosns_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_NETBIOS); + udp_recv(netbiosns_pcb, netbiosns_recv, netbiosns_pcb); + } +} + +#ifndef NETBIOS_LWIP_NAME +/** + * @ingroup netbiosns + * Set netbios name. ATTENTION: the hostname must be less than 15 characters! + * the NetBIOS name spec says the name MUST be upper case, so incoming name is forced into uppercase :-) + */ +void +netbiosns_set_name(const char *hostname) +{ + size_t i; + size_t copy_len = strlen(hostname); + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ASSERT("NetBIOS name is too long!", copy_len < NETBIOS_NAME_LEN); + if (copy_len >= NETBIOS_NAME_LEN) { + copy_len = NETBIOS_NAME_LEN - 1; + } + + /* make name into upper case */ + for (i = 0; i < copy_len; i++ ) { + netbiosns_local_name[i] = (char)lwip_toupper(hostname[i]); + } + netbiosns_local_name[copy_len] = '\0'; +} +#endif /* NETBIOS_LWIP_NAME */ + +/** + * @ingroup netbiosns + * Stop netbios responder + */ +void +netbiosns_stop(void) +{ + LWIP_ASSERT_CORE_LOCKED(); + if (netbiosns_pcb != NULL) { + udp_remove(netbiosns_pcb); + netbiosns_pcb = NULL; + } +} + +#endif /* LWIP_IPV4 && LWIP_UDP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/smtp/smtp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/smtp/smtp.c new file mode 100644 index 0000000..55303c3 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/smtp/smtp.c @@ -0,0 +1,1555 @@ +/** + * @file + * SMTP client module + * + * Author: Simon Goldschmidt + * + * @defgroup smtp SMTP client + * @ingroup apps + * + * This is simple SMTP client for raw API. + * It is a minimal implementation of SMTP as specified in RFC 5321. + * + * Example usage: +@code{.c} + void my_smtp_result_fn(void *arg, u8_t smtp_result, u16_t srv_err, err_t err) + { + printf("mail (%p) sent with results: 0x%02x, 0x%04x, 0x%08x\n", arg, + smtp_result, srv_err, err); + } + static void my_smtp_test(void) + { + smtp_set_server_addr("mymailserver.org"); + -> set both username and password as NULL if no auth needed + smtp_set_auth("username", "password"); + smtp_send_mail("sender", "recipient", "subject", "body", my_smtp_result_fn, + some_argument); + } +@endcode + + * When using from any other thread than the tcpip_thread (for NO_SYS==0), use + * smtp_send_mail_int()! + * + * SMTP_BODYDH usage: +@code{.c} + int my_smtp_bodydh_fn(void *arg, struct smtp_bodydh *bdh) + { + if(bdh->state >= 10) { + return BDH_DONE; + } + sprintf(bdh->buffer,"Line #%2d\r\n",bdh->state); + bdh->length = strlen(bdh->buffer); + ++bdh->state; + return BDH_WORKING; + } + + smtp_send_mail_bodycback("sender", "recipient", "subject", + my_smtp_bodydh_fn, my_smtp_result_fn, some_argument); +@endcode + * + * @todo: + * - attachments (the main difficulty here is streaming base64-encoding to + * prevent having to allocate a buffer for the whole encoded file at once) + * - test with more mail servers... + * + */ + +#include "lwip/apps/smtp.h" + +#if LWIP_TCP && LWIP_CALLBACK_API +#include "lwip/sys.h" +#include "lwip/sockets.h" +#include "lwip/altcp.h" +#include "lwip/dns.h" +#include "lwip/mem.h" +#include "lwip/altcp_tcp.h" +#include "lwip/altcp_tls.h" + +#include /* strlen, memcpy */ +#include + +/** TCP poll interval. Unit is 0.5 sec. */ +#define SMTP_POLL_INTERVAL 4 +/** TCP poll timeout while sending message body, reset after every + * successful write. 3 minutes */ +#define SMTP_TIMEOUT_DATABLOCK ( 3 * 60 * SMTP_POLL_INTERVAL / 2) +/** TCP poll timeout while waiting for confirmation after sending the body. + * 10 minutes */ +#define SMTP_TIMEOUT_DATATERM (10 * 60 * SMTP_POLL_INTERVAL / 2) +/** TCP poll timeout while not sending the body. + * This is somewhat lower than the RFC states (5 minutes for initial, MAIL + * and RCPT) but still OK for us here. + * 2 minutes */ +#define SMTP_TIMEOUT ( 2 * 60 * SMTP_POLL_INTERVAL / 2) + +/* the various debug levels for this file */ +#define SMTP_DEBUG_TRACE (SMTP_DEBUG | LWIP_DBG_TRACE) +#define SMTP_DEBUG_STATE (SMTP_DEBUG | LWIP_DBG_STATE) +#define SMTP_DEBUG_WARN (SMTP_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define SMTP_DEBUG_WARN_STATE (SMTP_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE) +#define SMTP_DEBUG_SERIOUS (SMTP_DEBUG | LWIP_DBG_LEVEL_SERIOUS) + + +#define SMTP_RX_BUF_LEN 255 +#define SMTP_TX_BUF_LEN 255 +#define SMTP_CRLF "\r\n" +#define SMTP_CRLF_LEN 2 + +#define SMTP_RESP_220 "220" +#define SMTP_RESP_235 "235" +#define SMTP_RESP_250 "250" +#define SMTP_RESP_334 "334" +#define SMTP_RESP_354 "354" +#define SMTP_RESP_LOGIN_UNAME "VXNlcm5hbWU6" +#define SMTP_RESP_LOGIN_PASS "UGFzc3dvcmQ6" + +#define SMTP_KEYWORD_AUTH_SP "AUTH " +#define SMTP_KEYWORD_AUTH_EQ "AUTH=" +#define SMTP_KEYWORD_AUTH_LEN 5 +#define SMTP_AUTH_PARAM_PLAIN "PLAIN" +#define SMTP_AUTH_PARAM_LOGIN "LOGIN" + +#define SMTP_CMD_EHLO_1 "EHLO [" +#define SMTP_CMD_EHLO_1_LEN 6 +#define SMTP_CMD_EHLO_2 "]\r\n" +#define SMTP_CMD_EHLO_2_LEN 3 +#define SMTP_CMD_AUTHPLAIN_1 "AUTH PLAIN " +#define SMTP_CMD_AUTHPLAIN_1_LEN 11 +#define SMTP_CMD_AUTHPLAIN_2 "\r\n" +#define SMTP_CMD_AUTHPLAIN_2_LEN 2 +#define SMTP_CMD_AUTHLOGIN "AUTH LOGIN\r\n" +#define SMTP_CMD_AUTHLOGIN_LEN 12 +#define SMTP_CMD_MAIL_1 "MAIL FROM: <" +#define SMTP_CMD_MAIL_1_LEN 12 +#define SMTP_CMD_MAIL_2 ">\r\n" +#define SMTP_CMD_MAIL_2_LEN 3 +#define SMTP_CMD_RCPT_1 "RCPT TO: <" +#define SMTP_CMD_RCPT_1_LEN 10 +#define SMTP_CMD_RCPT_2 ">\r\n" +#define SMTP_CMD_RCPT_2_LEN 3 +#define SMTP_CMD_DATA "DATA\r\n" +#define SMTP_CMD_DATA_LEN 6 +#define SMTP_CMD_HEADER_1 "From: <" +#define SMTP_CMD_HEADER_1_LEN 7 +#define SMTP_CMD_HEADER_2 ">\r\nTo: <" +#define SMTP_CMD_HEADER_2_LEN 8 +#define SMTP_CMD_HEADER_3 ">\r\nSubject: " +#define SMTP_CMD_HEADER_3_LEN 12 +#define SMTP_CMD_HEADER_4 "\r\n\r\n" +#define SMTP_CMD_HEADER_4_LEN 4 +#define SMTP_CMD_BODY_FINISHED "\r\n.\r\n" +#define SMTP_CMD_BODY_FINISHED_LEN 5 +#define SMTP_CMD_QUIT "QUIT\r\n" +#define SMTP_CMD_QUIT_LEN 6 + +#if defined(SMTP_STAT_TX_BUF_MAX) && SMTP_STAT_TX_BUF_MAX +#define SMTP_TX_BUF_MAX(len) LWIP_MACRO(if((len) > smtp_tx_buf_len_max) smtp_tx_buf_len_max = (len);) +#else /* SMTP_STAT_TX_BUF_MAX */ +#define SMTP_TX_BUF_MAX(len) +#endif /* SMTP_STAT_TX_BUF_MAX */ + +#if SMTP_COPY_AUTHDATA +#define SMTP_USERNAME(session) (session)->username +#define SMTP_PASS(session) (session)->pass +#define SMTP_AUTH_PLAIN_DATA(session) (session)->auth_plain +#define SMTP_AUTH_PLAIN_LEN(session) (session)->auth_plain_len +#else /* SMTP_COPY_AUTHDATA */ +#define SMTP_USERNAME(session) smtp_username +#define SMTP_PASS(session) smtp_pass +#define SMTP_AUTH_PLAIN_DATA(session) smtp_auth_plain +#define SMTP_AUTH_PLAIN_LEN(session) smtp_auth_plain_len +#endif /* SMTP_COPY_AUTHDATA */ + +#if SMTP_BODYDH +#ifndef SMTP_BODYDH_MALLOC +#define SMTP_BODYDH_MALLOC(size) mem_malloc(size) +#define SMTP_BODYDH_FREE(ptr) mem_free(ptr) +#endif + +/* Some internal state return values */ +#define BDHALLDATASENT 2 +#define BDHSOMEDATASENT 1 + +enum bdh_handler_state { + BDH_SENDING, /* Serving the user function generating body content */ + BDH_STOP /* User function stopped, closing */ +}; +#endif + +/** State for SMTP client state machine */ +enum smtp_session_state { + SMTP_NULL, + SMTP_HELO, + SMTP_AUTH_PLAIN, + SMTP_AUTH_LOGIN_UNAME, + SMTP_AUTH_LOGIN_PASS, + SMTP_AUTH_LOGIN, + SMTP_MAIL, + SMTP_RCPT, + SMTP_DATA, + SMTP_BODY, + SMTP_QUIT, + SMTP_CLOSED +}; + +#ifdef LWIP_DEBUG +/** State-to-string table for debugging */ +static const char *smtp_state_str[] = { + "SMTP_NULL", + "SMTP_HELO", + "SMTP_AUTH_PLAIN", + "SMTP_AUTH_LOGIN_UNAME", + "SMTP_AUTH_LOGIN_PASS", + "SMTP_AUTH_LOGIN", + "SMTP_MAIL", + "SMTP_RCPT", + "SMTP_DATA", + "SMTP_BODY", + "SMTP_QUIT", + "SMTP_CLOSED", +}; + +static const char *smtp_result_strs[] = { + "SMTP_RESULT_OK", + "SMTP_RESULT_ERR_UNKNOWN", + "SMTP_RESULT_ERR_CONNECT", + "SMTP_RESULT_ERR_HOSTNAME", + "SMTP_RESULT_ERR_CLOSED", + "SMTP_RESULT_ERR_TIMEOUT", + "SMTP_RESULT_ERR_SVR_RESP", + "SMTP_RESULT_ERR_MEM" +}; +#endif /* LWIP_DEBUG */ + +#if SMTP_BODYDH +struct smtp_bodydh_state { + smtp_bodycback_fn callback_fn; /* The function to call (again) */ + u16_t state; + struct smtp_bodydh exposed; /* the user function structure */ +}; +#endif /* SMTP_BODYDH */ + +/** struct keeping the body and state of an smtp session */ +struct smtp_session { + /** keeping the state of the smtp session */ + enum smtp_session_state state; + /** timeout handling, if this reaches 0, the connection is closed */ + u16_t timer; + /** helper buffer for transmit, not used for sending body */ + char tx_buf[SMTP_TX_BUF_LEN + 1]; + struct pbuf* p; + /** source email address */ + const char* from; + /** size of the sourceemail address */ + u16_t from_len; + /** target email address */ + const char* to; + /** size of the target email address */ + u16_t to_len; + /** subject of the email */ + const char *subject; + /** length of the subject string */ + u16_t subject_len; + /** this is the body of the mail to be sent */ + const char* body; + /** this is the length of the body to be sent */ + u16_t body_len; + /** amount of data from body already sent */ + u16_t body_sent; + /** callback function to call when closed */ + smtp_result_fn callback_fn; + /** argument for callback function */ + void *callback_arg; +#if SMTP_COPY_AUTHDATA + /** Username to use for this request */ + char *username; + /** Password to use for this request */ + char *pass; + /** Username and password combined as necessary for PLAIN authentication */ + char auth_plain[SMTP_MAX_USERNAME_LEN + SMTP_MAX_PASS_LEN + 3]; + /** Length of smtp_auth_plain string (cannot use strlen since it includes \0) */ + size_t auth_plain_len; +#endif /* SMTP_COPY_AUTHDATA */ +#if SMTP_BODYDH + struct smtp_bodydh_state *bodydh; +#endif /* SMTP_BODYDH */ +}; + +/** IP address or DNS name of the server to use for next SMTP request */ +static char smtp_server[SMTP_MAX_SERVERNAME_LEN + 1]; +/** TCP port of the server to use for next SMTP request */ +static u16_t smtp_server_port = SMTP_DEFAULT_PORT; +#if LWIP_ALTCP && LWIP_ALTCP_TLS +/** If this is set, mail is sent using SMTPS */ +static struct altcp_tls_config *smtp_server_tls_config; +#endif +/** Username to use for the next SMTP request */ +static char *smtp_username; +/** Password to use for the next SMTP request */ +static char *smtp_pass; +/** Username and password combined as necessary for PLAIN authentication */ +static char smtp_auth_plain[SMTP_MAX_USERNAME_LEN + SMTP_MAX_PASS_LEN + 3]; +/** Length of smtp_auth_plain string (cannot use strlen since it includes \0) */ +static size_t smtp_auth_plain_len; + +#if SMTP_CHECK_DATA +static err_t smtp_verify(const char *data, size_t data_len, u8_t linebreaks_allowed); +#endif /* SMTP_CHECK_DATA */ +static err_t smtp_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err); +static void smtp_tcp_err(void *arg, err_t err); +static err_t smtp_tcp_poll(void *arg, struct altcp_pcb *pcb); +static err_t smtp_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len); +static err_t smtp_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err); +#if LWIP_DNS +static void smtp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg); +#endif /* LWIP_DNS */ +#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN +static size_t smtp_base64_encode(char* target, size_t target_len, const char* source, size_t source_len); +#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */ +static enum smtp_session_state smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len); +static void smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb); +static void smtp_process(void *arg, struct altcp_pcb *pcb, struct pbuf *p); +#if SMTP_BODYDH +static void smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb); +#endif /* SMTP_BODYDH */ + + +#ifdef LWIP_DEBUG +/** Convert an smtp result to a string */ +const char* +smtp_result_str(u8_t smtp_result) +{ + if (smtp_result >= LWIP_ARRAYSIZE(smtp_result_strs)) { + return "UNKNOWN"; + } + return smtp_result_strs[smtp_result]; +} + +/** Null-terminates the payload of p for printing out messages. + * WARNING: use this only if p is not needed any more as the last byte of + * payload is deleted! + */ +static const char* +smtp_pbuf_str(struct pbuf* p) +{ + if ((p == NULL) || (p->len == 0)) { + return ""; + } + ((char*)p->payload)[p->len] = 0; + return (const char*)p->payload; +} +#endif /* LWIP_DEBUG */ + +/** @ingroup smtp + * Set IP address or DNS name for next SMTP connection + * + * @param server IP address (in ASCII representation) or DNS name of the server + */ +err_t +smtp_set_server_addr(const char* server) +{ + size_t len = 0; + + LWIP_ASSERT_CORE_LOCKED(); + + if (server != NULL) { + /* strlen: returns length WITHOUT terminating 0 byte */ + len = strlen(server); + } + if (len > SMTP_MAX_SERVERNAME_LEN) { + return ERR_MEM; + } + if (len != 0) { + MEMCPY(smtp_server, server, len); + } + smtp_server[len] = 0; /* always OK because of smtp_server[SMTP_MAX_SERVERNAME_LEN + 1] */ + return ERR_OK; +} + +/** @ingroup smtp + * Set TCP port for next SMTP connection + * + * @param port TCP port + */ +void +smtp_set_server_port(u16_t port) +{ + LWIP_ASSERT_CORE_LOCKED(); + smtp_server_port = port; +} + +#if LWIP_ALTCP && LWIP_ALTCP_TLS +/** @ingroup smtp + * Set TLS configuration for next SMTP connection + * + * @param tls_config TLS configuration + */ +void +smtp_set_tls_config(struct altcp_tls_config *tls_config) +{ + LWIP_ASSERT_CORE_LOCKED(); + smtp_server_tls_config = tls_config; +} +#endif + +/** @ingroup smtp + * Set authentication parameters for next SMTP connection + * + * @param username login name as passed to the server + * @param pass password passed to the server together with username + */ +err_t +smtp_set_auth(const char* username, const char* pass) +{ + size_t uname_len = 0; + size_t pass_len = 0; + + LWIP_ASSERT_CORE_LOCKED(); + + memset(smtp_auth_plain, 0xfa, 64); + if (username != NULL) { + uname_len = strlen(username); + if (uname_len > SMTP_MAX_USERNAME_LEN) { + LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Username is too long, %d instead of %d\n", + (int)uname_len, SMTP_MAX_USERNAME_LEN)); + return ERR_ARG; + } + } + if (pass != NULL) { +#if SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN + pass_len = strlen(pass); + if (pass_len > SMTP_MAX_PASS_LEN) { + LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Password is too long, %d instead of %d\n", + (int)uname_len, SMTP_MAX_USERNAME_LEN)); + return ERR_ARG; + } +#else /* SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN */ + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("Password not supported as no authentication methods are activated\n")); +#endif /* SMTP_SUPPORT_AUTH_LOGIN || SMTP_SUPPORT_AUTH_PLAIN */ + } + *smtp_auth_plain = 0; + if (username != NULL) { + smtp_username = smtp_auth_plain + 1; + strcpy(smtp_username, username); + } + if (pass != NULL) { + smtp_pass = smtp_auth_plain + uname_len + 2; + strcpy(smtp_pass, pass); + } + smtp_auth_plain_len = uname_len + pass_len + 2; + + return ERR_OK; +} + +#if SMTP_BODYDH +static void smtp_free_struct(struct smtp_session *s) +{ + if (s->bodydh != NULL) { + SMTP_BODYDH_FREE(s->bodydh); + } + SMTP_STATE_FREE(s); +} +#else /* SMTP_BODYDH */ +#define smtp_free_struct(x) SMTP_STATE_FREE(x) +#endif /* SMTP_BODYDH */ + +static struct altcp_pcb* +smtp_setup_pcb(struct smtp_session *s, const ip_addr_t* remote_ip) +{ + struct altcp_pcb* pcb; + LWIP_UNUSED_ARG(remote_ip); + +#if LWIP_ALTCP && LWIP_ALTCP_TLS + if (smtp_server_tls_config) { + pcb = altcp_tls_new(smtp_server_tls_config, IP_GET_TYPE(remote_ip)); + } else +#endif + { + pcb = altcp_tcp_new_ip_type(IP_GET_TYPE(remote_ip)); + } + if (pcb != NULL) { + altcp_arg(pcb, s); + altcp_recv(pcb, smtp_tcp_recv); + altcp_err(pcb, smtp_tcp_err); + altcp_poll(pcb, smtp_tcp_poll, SMTP_POLL_INTERVAL); + altcp_sent(pcb, smtp_tcp_sent); + } + return pcb; +} + +/** The actual mail-sending function, called by smtp_send_mail and + * smtp_send_mail_static after setting up the struct smtp_session. + */ +static err_t +smtp_send_mail_alloced(struct smtp_session *s) +{ + err_t err; + struct altcp_pcb* pcb = NULL; + ip_addr_t addr; + + LWIP_ASSERT("no smtp_session supplied", s != NULL); + +#if SMTP_CHECK_DATA + /* check that body conforms to RFC: + * - convert all single-CR or -LF in body to CRLF + * - only 7-bit ASCII is allowed + */ + if (smtp_verify(s->to, s->to_len, 0) != ERR_OK) { + err = ERR_ARG; + goto leave; + } + if (smtp_verify(s->from, s->from_len, 0) != ERR_OK) { + err = ERR_ARG; + goto leave; + } + if (smtp_verify(s->subject, s->subject_len, 0) != ERR_OK) { + err = ERR_ARG; + goto leave; + } +#if SMTP_BODYDH + if (s->bodydh == NULL) +#endif /* SMTP_BODYDH */ + { + if (smtp_verify(s->body, s->body_len, 0) != ERR_OK) { + err = ERR_ARG; + goto leave; + } + } +#endif /* SMTP_CHECK_DATA */ + +#if SMTP_COPY_AUTHDATA + /* copy auth data, ensuring the first byte is always zero */ + MEMCPY(s->auth_plain + 1, smtp_auth_plain + 1, smtp_auth_plain_len - 1); + s->auth_plain_len = smtp_auth_plain_len; + /* default username and pass is empty string */ + s->username = s->auth_plain; + s->pass = s->auth_plain; + if (smtp_username != NULL) { + s->username += smtp_username - smtp_auth_plain; + } + if (smtp_pass != NULL) { + s->pass += smtp_pass - smtp_auth_plain; + } +#endif /* SMTP_COPY_AUTHDATA */ + + s->state = SMTP_NULL; + s->timer = SMTP_TIMEOUT; + +#if LWIP_DNS + err = dns_gethostbyname(smtp_server, &addr, smtp_dns_found, s); +#else /* LWIP_DNS */ + err = ipaddr_aton(smtp_server, &addr) ? ERR_OK : ERR_ARG; +#endif /* LWIP_DNS */ + if (err == ERR_OK) { + pcb = smtp_setup_pcb(s, &addr); + if (pcb == NULL) { + err = ERR_MEM; + goto leave; + } + err = altcp_connect(pcb, &addr, smtp_server_port, smtp_tcp_connected); + if (err != ERR_OK) { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err)); + goto deallocate_and_leave; + } + } else if (err != ERR_INPROGRESS) { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("dns_gethostbyname failed: %d\n", (int)err)); + goto deallocate_and_leave; + } + return ERR_OK; + +deallocate_and_leave: + if (pcb != NULL) { + altcp_arg(pcb, NULL); + altcp_close(pcb); + } +leave: + smtp_free_struct(s); + /* no need to call the callback here since we return != ERR_OK */ + return err; +} + +/** @ingroup smtp + * Send an email via the currently selected server, username and password. + * + * @param from source email address (must be NULL-terminated) + * @param to target email address (must be NULL-terminated) + * @param subject email subject (must be NULL-terminated) + * @param body email body (must be NULL-terminated) + * @param callback_fn callback function + * @param callback_arg user argument to callback_fn + * @returns - ERR_OK if structures were allocated and no error occured starting the connection + * (this does not mean the email has been successfully sent!) + * - another err_t on error. + */ +err_t +smtp_send_mail(const char* from, const char* to, const char* subject, const char* body, + smtp_result_fn callback_fn, void* callback_arg) +{ + struct smtp_session* s; + size_t from_len = strlen(from); + size_t to_len = strlen(to); + size_t subject_len = strlen(subject); + size_t body_len = strlen(body); + size_t mem_len = sizeof(struct smtp_session); + char *sfrom, *sto, *ssubject, *sbody; + + LWIP_ASSERT_CORE_LOCKED(); + + mem_len += from_len + to_len + subject_len + body_len + 4; + if (mem_len > 0xffff) { + /* too long! */ + return ERR_MEM; + } + + /* Allocate memory to keep this email's session state */ + s = (struct smtp_session *)SMTP_STATE_MALLOC((mem_size_t)mem_len); + if (s == NULL) { + return ERR_MEM; + } + /* initialize the structure */ + memset(s, 0, mem_len); + s->from = sfrom = (char*)s + sizeof(struct smtp_session); + s->from_len = (u16_t)from_len; + s->to = sto = sfrom + from_len + 1; + s->to_len = (u16_t)to_len; + s->subject = ssubject = sto + to_len + 1; + s->subject_len = (u16_t)subject_len; + s->body = sbody = ssubject + subject_len + 1; + s->body_len = (u16_t)body_len; + /* copy source and target email address */ + /* cast to size_t is a hack to cast away constness */ + MEMCPY(sfrom, from, from_len + 1); + MEMCPY(sto, to, to_len + 1); + MEMCPY(ssubject, subject, subject_len + 1); + MEMCPY(sbody, body, body_len + 1); + + s->callback_fn = callback_fn; + s->callback_arg = callback_arg; + + /* call the actual implementation of this function */ + return smtp_send_mail_alloced(s); +} + +/** @ingroup smtp + * Same as smtp_send_mail, but doesn't copy from, to, subject and body into + * an internal buffer to save memory. + * WARNING: the above data must stay untouched until the callback function is + * called (unless the function returns != ERR_OK) + */ +err_t +smtp_send_mail_static(const char *from, const char* to, const char* subject, + const char* body, smtp_result_fn callback_fn, void* callback_arg) +{ + struct smtp_session* s; + size_t len; + + LWIP_ASSERT_CORE_LOCKED(); + + s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session)); + if (s == NULL) { + return ERR_MEM; + } + memset(s, 0, sizeof(struct smtp_session)); + /* initialize the structure */ + s->from = from; + len = strlen(from); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->from_len = (u16_t)len; + s->to = to; + len = strlen(to); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->to_len = (u16_t)len; + s->subject = subject; + len = strlen(subject); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->subject_len = (u16_t)len; + s->body = body; + len = strlen(body); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->body_len = (u16_t)len; + s->callback_fn = callback_fn; + s->callback_arg = callback_arg; + /* call the actual implementation of this function */ + return smtp_send_mail_alloced(s); +} + + +/** @ingroup smtp + * Same as smtp_send_mail but takes a struct smtp_send_request as single + * parameter which contains all the other parameters. + * To be used with tcpip_callback to send mail from interrupt context or from + * another thread. + * + * WARNING: server and authentication must stay untouched until this function has run! + * + * Usage example: + * - allocate a struct smtp_send_request (in a way that is allowed in interrupt context) + * - fill the members of the struct as if calling smtp_send_mail + * - specify a callback_function + * - set callback_arg to the structure itself + * - call this function + * - wait for the callback function to be called + * - in the callback function, deallocate the structure (passed as arg) + */ +void +smtp_send_mail_int(void *arg) +{ + struct smtp_send_request *req = (struct smtp_send_request*)arg; + err_t err; + + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ASSERT("smtp_send_mail_int: no argument given", arg != NULL); + + if (req->static_data) { + err = smtp_send_mail_static(req->from, req->to, req->subject, req->body, + req->callback_fn, req->callback_arg); + } else { + err = smtp_send_mail(req->from, req->to, req->subject, req->body, + req->callback_fn, req->callback_arg); + } + if ((err != ERR_OK) && (req->callback_fn != NULL)) { + req->callback_fn(req->callback_arg, SMTP_RESULT_ERR_UNKNOWN, 0, err); + } +} + +#if SMTP_CHECK_DATA +/** Verify that a given string conforms to the SMTP rules + * (7-bit only, no single CR or LF, + * @todo: no line consisting of a single dot only) + */ +static err_t +smtp_verify(const char *data, size_t data_len, u8_t linebreaks_allowed) +{ + size_t i; + u8_t last_was_cr = 0; + for (i = 0; i < data_len; i++) { + char current = data[i]; + if ((current & 0x80) != 0) { + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: no 8-bit data supported: %s\n", data)); + return ERR_ARG; + } + if (current == '\r') { + if (!linebreaks_allowed) { + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found CR where no linebreaks allowed: %s\n", data)); + return ERR_ARG; + } + if (last_was_cr) { + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found double CR: %s\n", data)); + return ERR_ARG; + } + last_was_cr = 1; + } else { + if (current == '\n') { + if (!last_was_cr) { + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_verify: found LF without CR before: %s\n", data)); + return ERR_ARG; + } + } + last_was_cr = 0; + } + } + return ERR_OK; +} +#endif /* SMTP_CHECK_DATA */ + +/** Frees the smtp_session and calls the callback function */ +static void +smtp_free(struct smtp_session *s, u8_t result, u16_t srv_err, err_t err) +{ + smtp_result_fn fn = s->callback_fn; + void *arg = s->callback_arg; + if (s->p != NULL) { + pbuf_free(s->p); + } + smtp_free_struct(s); + if (fn != NULL) { + fn(arg, result, srv_err, err); + } +} + +/** Try to close a pcb and free the arg if successful */ +static void +smtp_close(struct smtp_session *s, struct altcp_pcb *pcb, u8_t result, + u16_t srv_err, err_t err) +{ + if (pcb != NULL) { + altcp_arg(pcb, NULL); + if (altcp_close(pcb) == ERR_OK) { + if (s != NULL) { + smtp_free(s, result, srv_err, err); + } + } else { + /* close failed, set back arg */ + altcp_arg(pcb, s); + } + } else { + if (s != NULL) { + smtp_free(s, result, srv_err, err); + } + } +} + +/** Raw API TCP err callback: pcb is already deallocated */ +static void +smtp_tcp_err(void *arg, err_t err) +{ + LWIP_UNUSED_ARG(err); + if (arg != NULL) { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_tcp_err: connection reset by remote host\n")); + smtp_free((struct smtp_session*)arg, SMTP_RESULT_ERR_CLOSED, 0, err); + } +} + +/** Raw API TCP poll callback */ +static err_t +smtp_tcp_poll(void *arg, struct altcp_pcb *pcb) +{ + if (arg != NULL) { + struct smtp_session *s = (struct smtp_session*)arg; + if (s->timer != 0) { + s->timer--; + } + } + smtp_process(arg, pcb, NULL); + return ERR_OK; +} + +/** Raw API TCP sent callback */ +static err_t +smtp_tcp_sent(void *arg, struct altcp_pcb *pcb, u16_t len) +{ + LWIP_UNUSED_ARG(len); + + smtp_process(arg, pcb, NULL); + + return ERR_OK; +} + +/** Raw API TCP recv callback */ +static err_t +smtp_tcp_recv(void *arg, struct altcp_pcb *pcb, struct pbuf *p, err_t err) +{ + LWIP_UNUSED_ARG(err); + if (p != NULL) { + altcp_recved(pcb, p->tot_len); + smtp_process(arg, pcb, p); + } else { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_tcp_recv: connection closed by remote host\n")); + smtp_close((struct smtp_session*)arg, pcb, SMTP_RESULT_ERR_CLOSED, 0, err); + } + return ERR_OK; +} + +static err_t +smtp_tcp_connected(void *arg, struct altcp_pcb *pcb, err_t err) +{ + LWIP_UNUSED_ARG(arg); + + if (err == ERR_OK) { + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_connected: Waiting for 220\n")); + } else { + /* shouldn't happen, but we still check 'err', only to be sure */ + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_connected: %d\n", (int)err)); + smtp_close((struct smtp_session*)arg, pcb, SMTP_RESULT_ERR_CONNECT, 0, err); + } + return ERR_OK; +} + +#if LWIP_DNS +/** DNS callback + * If ipaddr is non-NULL, resolving succeeded, otherwise it failed. + */ +static void +smtp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) +{ + struct smtp_session *s = (struct smtp_session*)arg; + struct altcp_pcb *pcb; + err_t err; + u8_t result; + + LWIP_UNUSED_ARG(hostname); + + if (ipaddr != NULL) { + pcb = smtp_setup_pcb(s, ipaddr); + if (pcb != NULL) { + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_dns_found: hostname resolved, connecting\n")); + err = altcp_connect(pcb, ipaddr, smtp_server_port, smtp_tcp_connected); + if (err == ERR_OK) { + return; + } + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("tcp_connect failed: %d\n", (int)err)); + result = SMTP_RESULT_ERR_CONNECT; + } else { + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_dns_found: failed to allocate tcp pcb\n")); + result = SMTP_RESULT_ERR_MEM; + err = ERR_MEM; + } + } else { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_dns_found: failed to resolve hostname: %s\n", + hostname)); + pcb = NULL; + result = SMTP_RESULT_ERR_HOSTNAME; + err = ERR_ARG; + } + smtp_close(s, pcb, result, 0, err); +} +#endif /* LWIP_DNS */ + +#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN + +/** Table 6-bit-index-to-ASCII used for base64-encoding */ +static const char base64_table[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '+', '/' +}; + +/** Base64 encoding */ +static size_t +smtp_base64_encode(char* target, size_t target_len, const char* source, size_t source_len) +{ + size_t i; + s8_t j; + size_t target_idx = 0; + size_t longer = (source_len % 3) ? (3 - (source_len % 3)) : 0; + size_t source_len_b64 = source_len + longer; + size_t len = (((source_len_b64) * 4) / 3); + u8_t x = 5; + u8_t current = 0; + LWIP_UNUSED_ARG(target_len); + + LWIP_ASSERT("target_len is too short", target_len >= len); + + for (i = 0; i < source_len_b64; i++) { + u8_t b = (i < source_len ? (u8_t)source[i] : 0); + for (j = 7; j >= 0; j--, x--) { + if ((b & (1 << j)) != 0) { + current = (u8_t)(current | (1U << x)); + } + if (x == 0) { + target[target_idx++] = base64_table[current]; + x = 6; + current = 0; + } + } + } + for (i = len - longer; i < len; i++) { + target[i] = '='; + } + return len; +} +#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */ + +/** Parse pbuf to see if it contains the beginning of an answer. + * If so, it returns the contained response code as number between 1 and 999. + * If not, zero is returned. + * + * @param s smtp session struct + */ +static u16_t +smtp_is_response(struct smtp_session *s) +{ + char digits[4]; + long num; + + if (s->p == NULL) { + return 0; + } + /* copy three digits and convert them to int */ + if (pbuf_copy_partial(s->p, digits, 3, 0) != 3) { + /* pbuf was too short */ + return 0; + } + digits[3] = 0; + num = strtol(digits, NULL, 10); + if ((num <= 0) || (num >= 1000)) { + /* failed to find response code at start of line */ + return 0; + } + return (u16_t)num; +} + +/** Parse pbuf to see if it contains a fully received answer. + * If one is found, ERR_OK is returned. + * If none is found, ERR_VAL is returned. + * + * A fully received answer is a 3-digit number followed by a space, + * some string and a CRLF as line ending. + * + * @param s smtp session struct + */ +static err_t +smtp_is_response_finished(struct smtp_session *s) +{ + u8_t sp; + u16_t crlf; + u16_t offset; + + if (s->p == NULL) { + return ERR_VAL; + } + offset = 0; +again: + /* We could check the response number here, but we trust the + * protocol definition which says the client can rely on it being + * the same on every line. */ + + /* find CRLF */ + if (offset > 0xFFFF - 4) { + /* would overflow */ + return ERR_VAL; + } + crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, (u16_t)(offset + 4)); + if (crlf == 0xFFFF) { + /* no CRLF found */ + return ERR_VAL; + } + sp = pbuf_get_at(s->p, (u16_t)(offset + 3)); + if (sp == '-') { + /* no space after response code -> try next line */ + offset = (u16_t)(crlf + 2); + if (offset < crlf) { + /* overflow */ + return ERR_VAL; + } + goto again; + } else if (sp == ' ') { + /* CRLF found after response code + space -> valid response */ + return ERR_OK; + } + /* sp contains invalid character */ + return ERR_VAL; +} + +/** Prepare HELO/EHLO message */ +static enum smtp_session_state +smtp_prepare_helo(struct smtp_session *s, u16_t *tx_buf_len, struct altcp_pcb *pcb) +{ + size_t ipa_len; + const char *ipa = ipaddr_ntoa(altcp_get_ip(pcb, 1)); + LWIP_ASSERT("ipaddr_ntoa returned NULL", ipa != NULL); + ipa_len = strlen(ipa); + LWIP_ASSERT("string too long", ipa_len <= (SMTP_TX_BUF_LEN-SMTP_CMD_EHLO_1_LEN-SMTP_CMD_EHLO_2_LEN)); + + *tx_buf_len = (u16_t)(SMTP_CMD_EHLO_1_LEN + (u16_t)ipa_len + SMTP_CMD_EHLO_2_LEN); + LWIP_ASSERT("tx_buf overflow detected", *tx_buf_len <= SMTP_TX_BUF_LEN); + + SMEMCPY(s->tx_buf, SMTP_CMD_EHLO_1, SMTP_CMD_EHLO_1_LEN); + MEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN], ipa, ipa_len); + SMEMCPY(&s->tx_buf[SMTP_CMD_EHLO_1_LEN + ipa_len], SMTP_CMD_EHLO_2, SMTP_CMD_EHLO_2_LEN); + return SMTP_HELO; +} + +#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN +/** Parse last server response (in rx_buf) for supported authentication method, + * create data to send out (to tx_buf), set tx_data_len correctly + * and return the next state. + */ +static enum smtp_session_state +smtp_prepare_auth_or_mail(struct smtp_session *s, u16_t *tx_buf_len) +{ + /* check response for supported authentication method */ + u16_t auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_SP); + if (auth == 0xFFFF) { + auth = pbuf_strstr(s->p, SMTP_KEYWORD_AUTH_EQ); + } + if (auth != 0xFFFF) { + u16_t crlf = pbuf_memfind(s->p, SMTP_CRLF, SMTP_CRLF_LEN, auth); + if ((crlf != 0xFFFF) && (crlf > auth)) { + /* use tx_buf temporarily */ + u16_t copied = pbuf_copy_partial(s->p, s->tx_buf, (u16_t)(crlf - auth), auth); + if (copied != 0) { + char *sep = s->tx_buf + SMTP_KEYWORD_AUTH_LEN; + s->tx_buf[copied] = 0; +#if SMTP_SUPPORT_AUTH_PLAIN + /* favour PLAIN over LOGIN since it involves less requests */ + if (strstr(sep, SMTP_AUTH_PARAM_PLAIN) != NULL) { + size_t auth_len; + /* server supports AUTH PLAIN */ + SMEMCPY(s->tx_buf, SMTP_CMD_AUTHPLAIN_1, SMTP_CMD_AUTHPLAIN_1_LEN); + + /* add base64-encoded string "\0username\0password" */ + auth_len = smtp_base64_encode(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN], + SMTP_TX_BUF_LEN - SMTP_CMD_AUTHPLAIN_1_LEN, SMTP_AUTH_PLAIN_DATA(s), + SMTP_AUTH_PLAIN_LEN(s)); + LWIP_ASSERT("string too long", auth_len <= (SMTP_TX_BUF_LEN-SMTP_CMD_AUTHPLAIN_1_LEN-SMTP_CMD_AUTHPLAIN_2_LEN)); + *tx_buf_len = (u16_t)(SMTP_CMD_AUTHPLAIN_1_LEN + SMTP_CMD_AUTHPLAIN_2_LEN + (u16_t)auth_len); + SMEMCPY(&s->tx_buf[SMTP_CMD_AUTHPLAIN_1_LEN + auth_len], SMTP_CMD_AUTHPLAIN_2, + SMTP_CMD_AUTHPLAIN_2_LEN); + return SMTP_AUTH_PLAIN; + } else +#endif /* SMTP_SUPPORT_AUTH_PLAIN */ + { +#if SMTP_SUPPORT_AUTH_LOGIN + if (strstr(sep, SMTP_AUTH_PARAM_LOGIN) != NULL) { + /* server supports AUTH LOGIN */ + *tx_buf_len = SMTP_CMD_AUTHLOGIN_LEN; + SMEMCPY(s->tx_buf, SMTP_CMD_AUTHLOGIN, SMTP_CMD_AUTHLOGIN_LEN); + return SMTP_AUTH_LOGIN_UNAME; + } +#endif /* SMTP_SUPPORT_AUTH_LOGIN */ + } + } + } + } + /* server didnt's send correct keywords for AUTH, try sending directly */ + return smtp_prepare_mail(s, tx_buf_len); +} +#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */ + +#if SMTP_SUPPORT_AUTH_LOGIN +/** Send base64-encoded username */ +static enum smtp_session_state +smtp_prepare_auth_login_uname(struct smtp_session *s, u16_t *tx_buf_len) +{ + size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN, + SMTP_USERNAME(s), strlen(SMTP_USERNAME(s))); + /* @todo: support base64-encoded longer than 64k */ + LWIP_ASSERT("string too long", base64_len <= 0xffff); + LWIP_ASSERT("tx_buf overflow detected", base64_len <= SMTP_TX_BUF_LEN - SMTP_CRLF_LEN); + *tx_buf_len = (u16_t)(base64_len + SMTP_CRLF_LEN); + + SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN); + s->tx_buf[*tx_buf_len] = 0; + return SMTP_AUTH_LOGIN_PASS; +} + +/** Send base64-encoded password */ +static enum smtp_session_state +smtp_prepare_auth_login_pass(struct smtp_session *s, u16_t *tx_buf_len) +{ + size_t base64_len = smtp_base64_encode(s->tx_buf, SMTP_TX_BUF_LEN, + SMTP_PASS(s), strlen(SMTP_PASS(s))); + /* @todo: support base64-encoded longer than 64k */ + LWIP_ASSERT("string too long", base64_len <= 0xffff); + LWIP_ASSERT("tx_buf overflow detected", base64_len <= SMTP_TX_BUF_LEN - SMTP_CRLF_LEN); + *tx_buf_len = (u16_t)(base64_len + SMTP_CRLF_LEN); + + SMEMCPY(&s->tx_buf[base64_len], SMTP_CRLF, SMTP_CRLF_LEN); + s->tx_buf[*tx_buf_len] = 0; + return SMTP_AUTH_LOGIN; +} +#endif /* SMTP_SUPPORT_AUTH_LOGIN */ + +/** Prepare MAIL message */ +static enum smtp_session_state +smtp_prepare_mail(struct smtp_session *s, u16_t *tx_buf_len) +{ + char *target = s->tx_buf; + LWIP_ASSERT("tx_buf overflow detected", s->from_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_MAIL_1_LEN - SMTP_CMD_MAIL_2_LEN)); + *tx_buf_len = (u16_t)(SMTP_CMD_MAIL_1_LEN + SMTP_CMD_MAIL_2_LEN + s->from_len); + target[*tx_buf_len] = 0; + + SMEMCPY(target, SMTP_CMD_MAIL_1, SMTP_CMD_MAIL_1_LEN); + target += SMTP_CMD_MAIL_1_LEN; + MEMCPY(target, s->from, s->from_len); + target += s->from_len; + SMEMCPY(target, SMTP_CMD_MAIL_2, SMTP_CMD_MAIL_2_LEN); + return SMTP_MAIL; +} + +/** Prepare RCPT message */ +static enum smtp_session_state +smtp_prepare_rcpt(struct smtp_session *s, u16_t *tx_buf_len) +{ + char *target = s->tx_buf; + LWIP_ASSERT("tx_buf overflow detected", s->to_len <= (SMTP_TX_BUF_LEN - SMTP_CMD_RCPT_1_LEN - SMTP_CMD_RCPT_2_LEN)); + *tx_buf_len = (u16_t)(SMTP_CMD_RCPT_1_LEN + SMTP_CMD_RCPT_2_LEN + s->to_len); + target[*tx_buf_len] = 0; + + SMEMCPY(target, SMTP_CMD_RCPT_1, SMTP_CMD_RCPT_1_LEN); + target += SMTP_CMD_RCPT_1_LEN; + MEMCPY(target, s->to, s->to_len); + target += s->to_len; + SMEMCPY(target, SMTP_CMD_RCPT_2, SMTP_CMD_RCPT_2_LEN); + return SMTP_RCPT; +} + +/** Prepare header of body */ +static enum smtp_session_state +smtp_prepare_header(struct smtp_session *s, u16_t *tx_buf_len) +{ + char *target = s->tx_buf; + int len = SMTP_CMD_HEADER_1_LEN + SMTP_CMD_HEADER_2_LEN + + SMTP_CMD_HEADER_3_LEN + SMTP_CMD_HEADER_4_LEN + s->from_len + s->to_len + + s->subject_len; + LWIP_ASSERT("tx_buf overflow detected", len > 0 && len <= SMTP_TX_BUF_LEN); + *tx_buf_len = (u16_t)len; + target[*tx_buf_len] = 0; + + SMEMCPY(target, SMTP_CMD_HEADER_1, SMTP_CMD_HEADER_1_LEN); + target += SMTP_CMD_HEADER_1_LEN; + MEMCPY(target, s->from, s->from_len); + target += s->from_len; + SMEMCPY(target, SMTP_CMD_HEADER_2, SMTP_CMD_HEADER_2_LEN); + target += SMTP_CMD_HEADER_2_LEN; + MEMCPY(target, s->to, s->to_len); + target += s->to_len; + SMEMCPY(target, SMTP_CMD_HEADER_3, SMTP_CMD_HEADER_3_LEN); + target += SMTP_CMD_HEADER_3_LEN; + MEMCPY(target, s->subject, s->subject_len); + target += s->subject_len; + SMEMCPY(target, SMTP_CMD_HEADER_4, SMTP_CMD_HEADER_4_LEN); + + return SMTP_BODY; +} + +/** Prepare QUIT message */ +static enum smtp_session_state +smtp_prepare_quit(struct smtp_session *s, u16_t *tx_buf_len) +{ + *tx_buf_len = SMTP_CMD_QUIT_LEN; + s->tx_buf[*tx_buf_len] = 0; + SMEMCPY(s->tx_buf, SMTP_CMD_QUIT, SMTP_CMD_QUIT_LEN); + LWIP_ASSERT("tx_buf overflow detected", *tx_buf_len <= SMTP_TX_BUF_LEN); + return SMTP_CLOSED; +} + +/** If in state SMTP_BODY, try to send more body data */ +static void +smtp_send_body(struct smtp_session *s, struct altcp_pcb *pcb) +{ + err_t err; + + if (s->state == SMTP_BODY) { +#if SMTP_BODYDH + if (s->bodydh) { + smtp_send_body_data_handler(s, pcb); + } else +#endif /* SMTP_BODYDH */ + { + u16_t send_len = (u16_t)(s->body_len - s->body_sent); + if (send_len > 0) { + u16_t snd_buf = altcp_sndbuf(pcb); + if (send_len > snd_buf) { + send_len = snd_buf; + } + if (send_len > 0) { + /* try to send something out */ + err = altcp_write(pcb, &s->body[s->body_sent], (u16_t)send_len, TCP_WRITE_FLAG_COPY); + if (err == ERR_OK) { + s->timer = SMTP_TIMEOUT_DATABLOCK; + s->body_sent = (u16_t)(s->body_sent + send_len); + if (s->body_sent < s->body_len) { + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: %d of %d bytes written\n", + s->body_sent, s->body_len)); + } + } + } + } + } + if (s->body_sent == s->body_len) { + /* the whole body has been written, write last line */ + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: body completely written (%d bytes), appending end-of-body\n", + s->body_len)); + err = altcp_write(pcb, SMTP_CMD_BODY_FINISHED, SMTP_CMD_BODY_FINISHED_LEN, 0); + if (err == ERR_OK) { + s->timer = SMTP_TIMEOUT_DATATERM; + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_send_body: end-of-body written, changing state to %s\n", + smtp_state_str[SMTP_QUIT])); + /* last line written, change state, wait for confirmation */ + s->state = SMTP_QUIT; + } + } + } +} + +/** State machine-like implementation of an SMTP client. + */ +static void +smtp_process(void *arg, struct altcp_pcb *pcb, struct pbuf *p) +{ + struct smtp_session* s = (struct smtp_session*)arg; + u16_t response_code = 0; + u16_t tx_buf_len = 0; + enum smtp_session_state next_state; + + if (arg == NULL) { + /* already closed SMTP connection */ + if (p != NULL) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("Received %d bytes after closing: %s\n", + p->tot_len, smtp_pbuf_str(p))); + pbuf_free(p); + } + return; + } + + next_state = s->state; + + if (p != NULL) { + /* received data */ + if (s->p == NULL) { + s->p = p; + } else { + pbuf_cat(s->p, p); + } + } else { + /* idle timer, close connection if timed out */ + if (s->timer == 0) { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_process: connection timed out, closing\n")); + smtp_close(s, pcb, SMTP_RESULT_ERR_TIMEOUT, 0, ERR_TIMEOUT); + return; + } + if (s->state == SMTP_BODY) { + smtp_send_body(s, pcb); + return; + } + } + response_code = smtp_is_response(s); + if (response_code) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: received response code: %d\n", response_code)); + if (smtp_is_response_finished(s) != ERR_OK) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process: partly received response code: %d\n", response_code)); + /* wait for next packet to complete the respone */ + return; + } + } else { + if (s->p != NULL) { + LWIP_DEBUGF(SMTP_DEBUG_WARN, ("smtp_process: unknown data received (%s)\n", + smtp_pbuf_str(s->p))); + pbuf_free(s->p); + s->p = NULL; + } + return; + } + + switch(s->state) + { + case(SMTP_NULL): + /* wait for 220 */ + if (response_code == 220) { + /* then send EHLO */ + next_state = smtp_prepare_helo(s, &tx_buf_len, pcb); + } + break; + case(SMTP_HELO): + /* wait for 250 */ + if (response_code == 250) { +#if SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN + /* then send AUTH or MAIL */ + next_state = smtp_prepare_auth_or_mail(s, &tx_buf_len); + } + break; + case(SMTP_AUTH_LOGIN): + case(SMTP_AUTH_PLAIN): + /* wait for 235 */ + if (response_code == 235) { +#endif /* SMTP_SUPPORT_AUTH_PLAIN || SMTP_SUPPORT_AUTH_LOGIN */ + /* send MAIL */ + next_state = smtp_prepare_mail(s, &tx_buf_len); + } + break; +#if SMTP_SUPPORT_AUTH_LOGIN + case(SMTP_AUTH_LOGIN_UNAME): + /* wait for 334 Username */ + if (response_code == 334) { + if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_UNAME) != 0xFFFF) { + /* send username */ + next_state = smtp_prepare_auth_login_uname(s, &tx_buf_len); + } + } + break; + case(SMTP_AUTH_LOGIN_PASS): + /* wait for 334 Password */ + if (response_code == 334) { + if (pbuf_strstr(s->p, SMTP_RESP_LOGIN_PASS) != 0xFFFF) { + /* send username */ + next_state = smtp_prepare_auth_login_pass(s, &tx_buf_len); + } + } + break; +#endif /* SMTP_SUPPORT_AUTH_LOGIN */ + case(SMTP_MAIL): + /* wait for 250 */ + if (response_code == 250) { + /* send RCPT */ + next_state = smtp_prepare_rcpt(s, &tx_buf_len); + } + break; + case(SMTP_RCPT): + /* wait for 250 */ + if (response_code == 250) { + /* send DATA */ + SMEMCPY(s->tx_buf, SMTP_CMD_DATA, SMTP_CMD_DATA_LEN); + tx_buf_len = SMTP_CMD_DATA_LEN; + next_state = SMTP_DATA; + } + break; + case(SMTP_DATA): + /* wait for 354 */ + if (response_code == 354) { + /* send email header */ + next_state = smtp_prepare_header(s, &tx_buf_len); + } + break; + case(SMTP_BODY): + /* nothing to be done here, handled somewhere else */ + break; + case(SMTP_QUIT): + /* wait for 250 */ + if (response_code == 250) { + /* send QUIT */ + next_state = smtp_prepare_quit(s, &tx_buf_len); + } + break; + case(SMTP_CLOSED): + /* nothing to do, wait for connection closed from server */ + return; + default: + LWIP_DEBUGF(SMTP_DEBUG_SERIOUS, ("Invalid state: %d/%s\n", (int)s->state, + smtp_state_str[s->state])); + break; + } + if (s->state == next_state) { + LWIP_DEBUGF(SMTP_DEBUG_WARN_STATE, ("smtp_process[%s]: unexpected response_code, closing: %d (%s)\n", + smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p))); + /* close connection */ + smtp_close(s, pcb, SMTP_RESULT_ERR_SVR_RESP, response_code, ERR_OK); + return; + } + if (tx_buf_len > 0) { + SMTP_TX_BUF_MAX(tx_buf_len); + if (altcp_write(pcb, s->tx_buf, tx_buf_len, TCP_WRITE_FLAG_COPY) == ERR_OK) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: received command %d (%s)\n", + smtp_state_str[s->state], response_code, smtp_pbuf_str(s->p))); + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_process[%s]: sent %"U16_F" bytes: \"%s\"\n", + smtp_state_str[s->state], tx_buf_len, s->tx_buf)); + s->timer = SMTP_TIMEOUT; + pbuf_free(s->p); + s->p = NULL; + LWIP_DEBUGF(SMTP_DEBUG_STATE, ("smtp_process: changing state from %s to %s\n", + smtp_state_str[s->state], smtp_state_str[next_state])); + s->state = next_state; + if (next_state == SMTP_BODY) { + /* try to stream-send body data right now */ + smtp_send_body(s, pcb); + } else if (next_state == SMTP_CLOSED) { + /* sent out all data, delete structure */ + altcp_arg(pcb, NULL); + smtp_free(s, SMTP_RESULT_OK, 0, ERR_OK); + } + } + } +} + +#if SMTP_BODYDH +/** Elementary sub-function to send data + * + * @returns: BDHALLDATASENT all data has been written + * BDHSOMEDATASENT some data has been written + * 0 no data has been written + */ +static int +smtp_send_bodyh_data(struct altcp_pcb *pcb, const char **from, u16_t *howmany) +{ + err_t err; + u16_t len = *howmany; + + len = (u16_t)LWIP_MIN(len, altcp_sndbuf(pcb)); + err = altcp_write(pcb, *from, len, TCP_WRITE_FLAG_COPY); + if (err == ERR_OK) { + *from += len; + if ((*howmany -= len) > 0) { + return BDHSOMEDATASENT; + } + return BDHALLDATASENT; + } + return 0; +} + +/** Same as smtp_send_mail_static, but uses a callback function to send body data + */ +err_t +smtp_send_mail_bodycback(const char *from, const char* to, const char* subject, + smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg) +{ + struct smtp_session* s; + size_t len; + + LWIP_ASSERT_CORE_LOCKED(); + + s = (struct smtp_session*)SMTP_STATE_MALLOC(sizeof(struct smtp_session)); + if (s == NULL) { + return ERR_MEM; + } + memset(s, 0, sizeof(struct smtp_session)); + s->bodydh = (struct smtp_bodydh_state*)SMTP_BODYDH_MALLOC(sizeof(struct smtp_bodydh_state)); + if (s->bodydh == NULL) { + SMTP_STATE_FREE(s); + return ERR_MEM; + } + memset(s->bodydh, 0, sizeof(struct smtp_bodydh_state)); + /* initialize the structure */ + s->from = from; + len = strlen(from); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->from_len = (u16_t)len; + s->to = to; + len = strlen(to); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->to_len = (u16_t)len; + s->subject = subject; + len = strlen(subject); + LWIP_ASSERT("string is too long", len <= 0xffff); + s->subject_len = (u16_t)len; + s->body = NULL; + LWIP_ASSERT("string is too long", len <= 0xffff); + s->callback_fn = callback_fn; + s->callback_arg = callback_arg; + s->bodydh->callback_fn = bodycback_fn; + s->bodydh->state = BDH_SENDING; + /* call the actual implementation of this function */ + return smtp_send_mail_alloced(s); +} + +static void +smtp_send_body_data_handler(struct smtp_session *s, struct altcp_pcb *pcb) +{ + struct smtp_bodydh_state *bdh; + int res = 0, ret; + LWIP_ASSERT("s != NULL", s != NULL); + bdh = s->bodydh; + LWIP_ASSERT("bodydh != NULL", bdh != NULL); + + /* resume any leftovers from prior memory constraints */ + if (s->body_len) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: resume\n")); + if((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len)) + != BDHALLDATASENT) { + s->body_sent = s->body_len - 1; + return; + } + } + ret = res; + /* all data on buffer has been queued, resume execution */ + if (bdh->state == BDH_SENDING) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: run\n")); + do { + ret |= res; /* remember if we once queued something to send */ + bdh->exposed.length = 0; + if (bdh->callback_fn(s->callback_arg, &bdh->exposed) == BDH_DONE) { + bdh->state = BDH_STOP; + } + s->body = bdh->exposed.buffer; + s->body_len = bdh->exposed.length; + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: trying to send %u bytes\n", (unsigned int)s->body_len)); + } while (s->body_len && + ((res = smtp_send_bodyh_data(pcb, (const char **)&s->body, &s->body_len)) == BDHALLDATASENT) + && (bdh->state != BDH_STOP)); + } + if ((bdh->state != BDH_SENDING) && (ret != BDHSOMEDATASENT)) { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: stop\n")); + s->body_sent = s->body_len; + } else { + LWIP_DEBUGF(SMTP_DEBUG_TRACE, ("smtp_send_body_data_handler: pause\n")); + s->body_sent = s->body_len - 1; + } +} +#endif /* SMTP_BODYDH */ + +#endif /* LWIP_TCP && LWIP_CALLBACK_API */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.c similarity index 88% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.c index f35b760..6df34db 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.c @@ -54,7 +54,7 @@ * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode */ err_t -snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv) +snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv) { u8_t data; u8_t length_bytes_required; @@ -130,7 +130,7 @@ snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tl * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode */ err_t -snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len) +snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len) { PBUF_OP_EXEC(snmp_pbuf_stream_writebuf(pbuf_stream, raw, raw_len)); @@ -148,7 +148,7 @@ snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t r * @see snmp_asn1_enc_u32t_cnt() */ err_t -snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value) +snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value) { if (octets_needed > 5) { return ERR_ARG; @@ -169,48 +169,6 @@ snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u3 return ERR_OK; } - -/** - * Encodes u64_t (counter64) into a pbuf chained ASN1 msg. - * - * @param pbuf_stream points to a pbuf stream - * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt()) - * @param value is the host order u32_t value to be encoded - * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode - * - * @see snmp_asn1_enc_u64t_cnt() - */ -err_t -snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value) -{ - if (octets_needed > 9) { - return ERR_ARG; - } - if (octets_needed == 9) { - /* not enough bits in 'value' add leading 0x00 */ - PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00)); - octets_needed--; - } - - while (octets_needed > 4) { - octets_needed--; - PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> ((octets_needed-4) << 3)))); - } - - /* skip to low u32 */ - value++; - - while (octets_needed > 1) { - octets_needed--; - PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> (octets_needed << 3)))); - } - - /* always write at least one octet (also in case of value == 0) */ - PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value))); - - return ERR_OK; -} - /** * Encodes s32_t integer into a pbuf chained ASN1 msg. * @@ -222,7 +180,7 @@ snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, co * @see snmp_asn1_enc_s32t_cnt() */ err_t -snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value) +snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value) { while (octets_needed > 1) { octets_needed--; @@ -245,7 +203,7 @@ snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s3 * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode */ err_t -snmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len) +snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len) { if (oid_len > 1) { /* write compressed first two sub id's */ @@ -329,31 +287,6 @@ snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed) } } -/** - * Returns octet count for an u64_t. - * - * @param value value to be encoded - * @param octets_needed points to the return value - * - * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded - * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value - * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! - */ -void -snmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed) -{ - /* check if high u32 is 0 */ - if (*value == 0x00) { - /* only low u32 is important */ - value++; - snmp_asn1_enc_u32t_cnt(*value, octets_needed); - } else { - /* low u32 does not matter for length determination */ - snmp_asn1_enc_u32t_cnt(*value, octets_needed); - *octets_needed = *octets_needed + 4; /* add the 4 bytes of low u32 */ - } -} - /** * Returns octet count for an s32_t. * @@ -420,7 +353,7 @@ snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed) * @return ERR_OK if successful, ERR_VAL if we can't decode */ err_t -snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv) +snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv) { u8_t data; @@ -442,6 +375,9 @@ snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tl tlv->value_len = data; } else if (data > 0x80) { /* long form */ u8_t length_bytes = data - 0x80; + if (length_bytes > pbuf_stream->length) { + return ERR_VAL; + } tlv->length_len = length_bytes + 1; /* this byte + defined number of length bytes following */ tlv->value_len = 0; @@ -509,60 +445,6 @@ snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value return ERR_VAL; } -/** - * Decodes large positive integer (counter64) into 2x u32_t. - * - * @param pbuf_stream points to a pbuf stream - * @param len length of the coded integer field - * @param value return host order integer - * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode - * - * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded - * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value - * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! - */ -err_t -snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value) -{ - u8_t data; - - if (len <= 4) { - /* high u32 is 0 */ - *value = 0; - /* directly skip to low u32 */ - value++; - } - - if ((len > 0) && (len <= 9)) { - PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); - - /* expecting sign bit to be zero, only unsigned please! */ - if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) { - *value = data; - len--; - - while (len > 0) { - PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); - - if (len == 4) { - /* skip to low u32 */ - value++; - *value = 0; - } else { - *value <<= 8; - } - - *value |= data; - len--; - } - - return ERR_OK; - } - } - - return ERR_VAL; -} - /** * Decodes integer into s32_t. * @@ -576,51 +458,26 @@ snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value err_t snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value) { -#if BYTE_ORDER == LITTLE_ENDIAN - u8_t *lsb_ptr = (u8_t*)value; -#endif -#if BYTE_ORDER == BIG_ENDIAN - u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1; -#endif - u8_t sign; u8_t data; if ((len > 0) && (len < 5)) { PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); - len--; if (data & 0x80) { /* negative, start from -1 */ *value = -1; - sign = 1; - *lsb_ptr &= data; + *value = (*value << 8) | data; } else { /* positive, start from 0 */ - *value = 0; - sign = 0; - *lsb_ptr |= data; + *value = data; } - - /* OR/AND octets with value */ + len--; + /* shift in the remaining value */ while (len > 0) { PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); + *value = (*value << 8) | data; len--; - -#if BYTE_ORDER == LITTLE_ENDIAN - *value <<= 8; -#endif -#if BYTE_ORDER == BIG_ENDIAN - *value >>= 8; -#endif - - if (sign) { - *lsb_ptr |= 255; - *lsb_ptr &= data; - } else { - *lsb_ptr |= data; - } } - return ERR_OK; } @@ -638,7 +495,7 @@ snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode */ err_t -snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t* oid, u8_t* oid_len, u8_t oid_max_len) +snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len) { u32_t *oid_ptr; u8_t data; @@ -729,7 +586,7 @@ snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t* oid, u * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode */ err_t -snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t* buf_len, u16_t buf_max_len) +snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len) { if (len > buf_max_len) { /* not enough dst space */ @@ -746,4 +603,102 @@ snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u1 return ERR_OK; } +#if LWIP_HAVE_INT64 +/** + * Returns octet count for an u64_t. + * + * @param value value to be encoded + * @param octets_needed points to the return value + * + * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded + * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value + * of 0xFFFFFFFFFFFFFFFF is preceded with 0x00 and the length is 9 octets!! + */ +void +snmp_asn1_enc_u64t_cnt(u64_t value, u16_t *octets_needed) +{ + /* check if high u32 is 0 */ + if ((value >> 32) == 0) { + /* only low u32 is important */ + snmp_asn1_enc_u32t_cnt((u32_t)value, octets_needed); + } else { + /* low u32 does not matter for length determination */ + snmp_asn1_enc_u32t_cnt((u32_t)(value >> 32), octets_needed); + *octets_needed = *octets_needed + 4; /* add the 4 bytes of low u32 */ + } +} + +/** + * Decodes large positive integer (counter64) into 2x u32_t. + * + * @param pbuf_stream points to a pbuf stream + * @param len length of the coded integer field + * @param value return 64 bit integer + * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode + * + * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded + * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value + * of 0xFFFFFFFFFFFFFFFF is preceded with 0x00 and the length is 9 octets!! + */ +err_t +snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u64_t *value) +{ + u8_t data; + + if ((len > 0) && (len <= 9)) { + PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); + + /* expecting sign bit to be zero, only unsigned please! */ + if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) { + *value = data; + len--; + + while (len > 0) { + PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data)); + *value <<= 8; + *value |= data; + len--; + } + + return ERR_OK; + } + } + + return ERR_VAL; +} + +/** + * Encodes u64_t (counter64) into a pbuf chained ASN1 msg. + * + * @param pbuf_stream points to a pbuf stream + * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt()) + * @param value is the value to be encoded + * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode + * + * @see snmp_asn1_enc_u64t_cnt() + */ +err_t +snmp_asn1_enc_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u64_t value) +{ + if (octets_needed > 9) { + return ERR_ARG; + } + if (octets_needed == 9) { + /* not enough bits in 'value' add leading 0x00 */ + PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00)); + octets_needed--; + } + + while (octets_needed > 1) { + octets_needed--; + PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value >> (octets_needed << 3)))); + } + + /* always write at least one octet (also in case of value == 0) */ + PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value))); + + return ERR_OK; +} +#endif + #endif /* LWIP_SNMP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.h similarity index 80% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.h index ec50d8c..87c0973 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_asn1.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_asn1.h @@ -57,19 +57,21 @@ extern "C" { #define SNMP_ASN1_DATATYPE_MASK 0x1F #define SNMP_ASN1_DATATYPE_EXTENDED 0x1F /* DataType indicating that datatype is encoded in following bytes */ -/* context specific (SNMP) tags (from SNMP spec. RFC1157) */ +/* context specific (SNMP) tags (from SNMP spec. RFC1157 and RFC1905) */ #define SNMP_ASN1_CONTEXT_PDU_GET_REQ 0 #define SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ 1 #define SNMP_ASN1_CONTEXT_PDU_GET_RESP 2 #define SNMP_ASN1_CONTEXT_PDU_SET_REQ 3 #define SNMP_ASN1_CONTEXT_PDU_TRAP 4 #define SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ 5 +#define SNMP_ASN1_CONTEXT_PDU_INFORM_REQ 6 +#define SNMP_ASN1_CONTEXT_PDU_V2_TRAP 7 +#define SNMP_ASN1_CONTEXT_PDU_REPORT 8 #define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT 0 #define SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW 2 -struct snmp_asn1_tlv -{ +struct snmp_asn1_tlv { u8_t type; /* only U8 because extended types are not specified by SNMP */ u8_t type_len; /* encoded length of 'type' field (normally 1) */ u8_t length_len; /* indicates how many bytes are required to encode the 'value_len' field */ @@ -79,25 +81,28 @@ struct snmp_asn1_tlv #define SNMP_ASN1_TLV_LENGTH(tlv) ((tlv).type_len + (tlv).length_len + (tlv).value_len) #define SNMP_ASN1_SET_TLV_PARAMS(tlv, type_, length_len_, value_len_) do { (tlv).type = (type_); (tlv).type_len = 0; (tlv).length_len = (length_len_); (tlv).value_len = (value_len_); } while (0); -err_t snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv); +err_t snmp_asn1_dec_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv); err_t snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value); -err_t snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value); err_t snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value); -err_t snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t* oid, u8_t* oid_len, u8_t oid_max_len); -err_t snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t* buf_len, u16_t buf_max_len); +err_t snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *oid, u8_t *oid_len, u8_t oid_max_len); +err_t snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t *buf_len, u16_t buf_max_len); -err_t snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv); +err_t snmp_ans1_enc_tlv(struct snmp_pbuf_stream *pbuf_stream, struct snmp_asn1_tlv *tlv); void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed); void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed); -void snmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed); void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed); void snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed); -err_t snmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len); -err_t snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value); -err_t snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value); -err_t snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value); -err_t snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len); +err_t snmp_asn1_enc_oid(struct snmp_pbuf_stream *pbuf_stream, const u32_t *oid, u16_t oid_len); +err_t snmp_asn1_enc_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, s32_t value); +err_t snmp_asn1_enc_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u32_t value); +err_t snmp_asn1_enc_raw(struct snmp_pbuf_stream *pbuf_stream, const u8_t *raw, u16_t raw_len); + +#if LWIP_HAVE_INT64 +err_t snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u64_t *value); +void snmp_asn1_enc_u64t_cnt(u64_t value, u16_t *octets_needed); +err_t snmp_asn1_enc_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t octets_needed, u64_t value); +#endif #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core.c similarity index 88% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core.c index c041833..987f106 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core.c @@ -34,24 +34,24 @@ */ /** - * @defgroup snmp SNMPv2c agent + * @defgroup snmp SNMPv2c/v3 agent * @ingroup apps - * SNMPv2c compatible agent\n + * SNMPv2c and SNMPv3 compatible agent\n * There is also a MIB compiler and a MIB viewer in lwIP contrib repository * (lwip-contrib/apps/LwipMibCompiler).\n * The agent implements the most important MIB2 MIBs including IPv6 support * (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version - * whithout IPv6 statistics (TODO).\n + * without IPv6 statistics (TODO).\n * Rewritten by Martin Hentschel and * Dirk Ziegelmeier \n - * Work on SNMPv3 has started, but is not finished.\n * * 0 Agent Capabilities * ==================== - * + * * Features: * --------- * - SNMPv2c support. + * - SNMPv3 support (a port to ARM mbedtls is provided, LWIP_SNMP_V3_MBEDTLS option). * - Low RAM usage - no memory pools, stack only. * - MIB2 implementation is separated from SNMP stack. * - Support for multiple MIBs (snmp_set_mibs() call) - e.g. for private MIB. @@ -66,7 +66,7 @@ * - Simplified thread sync support for MIBs - useful when MIBs * need to access variables shared with other threads where no locking is * possible. Used in MIB2 to access lwIP stats from lwIP thread. - * + * * MIB compiler (code generator): * ------------------------------ * - Provided in lwIP contrib repository. @@ -78,92 +78,100 @@ * - MIB parser, C file generation framework and LWIP code generation are cleanly * separated, which means the code may be useful as a base for code generation * of other SNMP agents. - * + * * Notes: * ------ * - Stack and MIB compiler were used to implement a Profinet device. * Compiled/implemented MIBs: LLDP-MIB, LLDP-EXT-DOT3-MIB, LLDP-EXT-PNO-MIB. - * + * * SNMPv1 per RFC1157 and SNMPv2c per RFC 3416 * ------------------------------------------- * Note the S in SNMP stands for "Simple". Note that "Simple" is * relative. SNMP is simple compared to the complex ISO network * management protocols CMIP (Common Management Information Protocol) * and CMOT (CMip Over Tcp). - * + * + * SNMPv3 + * ------ + * When SNMPv3 is used, several functions from snmpv3.h must be implemented + * by the user. This is mainly user management and persistence handling. + * The sample provided in lwip-contrib is insecure, don't use it in production + * systems, especially the missing persistence for engine boots variable + * simplifies replay attacks. + * * MIB II * ------ * The standard lwIP stack management information base. * This is a required MIB, so this is always enabled. * The groups EGP, CMOT and transmission are disabled by default. - * + * * Most mib-2 objects are not writable except: * sysName, sysLocation, sysContact, snmpEnableAuthenTraps. * Writing to or changing the ARP and IP address and route * tables is not possible. - * + * * Note lwIP has a very limited notion of IP routing. It currently * doen't have a route table and doesn't have a notion of the U,G,H flags. * Instead lwIP uses the interface list with only one default interface * acting as a single gateway interface (G) for the default route. - * + * * The agent returns a "virtual table" with the default route 0.0.0.0 * for the default interface and network routes (no H) for each * network interface in the netif_list. * All routes are considered to be up (U). - * + * * Loading additional MIBs * ----------------------- * MIBs can only be added in compile-time, not in run-time. - * - * + * + * * 1 Building the Agent * ==================== * First of all you'll need to add the following define * to your local lwipopts.h: * \#define LWIP_SNMP 1 - * + * * and add the source files your makefile. - * + * * Note you'll might need to adapt you network driver to update * the mib2 variables for your interface. - * + * * 2 Running the Agent * =================== * The following function calls must be made in your program to * actually get the SNMP agent running. - * + * * Before starting the agent you should supply pointers * for sysContact, sysLocation, and snmpEnableAuthenTraps. * You can do this by calling - * + * * - snmp_mib2_set_syscontact() * - snmp_mib2_set_syslocation() * - snmp_set_auth_traps_enabled() - * - * You can register a callback which is called on successful write access: + * + * You can register a callback which is called on successful write access: * snmp_set_write_callback(). - * + * * Additionally you may want to set - * + * * - snmp_mib2_set_sysdescr() * - snmp_set_device_enterprise_oid() * - snmp_mib2_set_sysname() - * + * * Also before starting the agent you need to setup * one or more trap destinations using these calls: - * + * * - snmp_trap_dst_enable() * - snmp_trap_dst_ip_set() - * + * * If you need more than MIB2, set the MIBs you want to use * by snmp_set_mibs(). - * + * * Finally, enable the agent by calling snmp_init() * * @defgroup snmp_core Core * @ingroup snmp - * + * * @defgroup snmp_traps Traps * @ingroup snmp */ @@ -180,31 +188,39 @@ #if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) - #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" +#error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_SNMP) - #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if SNMP_MAX_OBJ_ID_LEN > 255 +#error "SNMP_MAX_OBJ_ID_LEN must fit into an u8_t" #endif struct snmp_statistics snmp_stats; static const struct snmp_obj_id snmp_device_enterprise_oid_default = {SNMP_DEVICE_ENTERPRISE_OID_LEN, SNMP_DEVICE_ENTERPRISE_OID}; -static const struct snmp_obj_id* snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default; +static const struct snmp_obj_id *snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default; const u32_t snmp_zero_dot_zero_values[] = { 0, 0 }; const struct snmp_obj_id_const_ref snmp_zero_dot_zero = { LWIP_ARRAYSIZE(snmp_zero_dot_zero_values), snmp_zero_dot_zero_values }; - -#if SNMP_LWIP_MIB2 +#if SNMP_LWIP_MIB2 && LWIP_SNMP_V3 #include "lwip/apps/snmp_mib2.h" -static const struct snmp_mib* const default_mibs[] = { &mib2 }; -static u8_t snmp_num_mibs = 1; +#include "lwip/apps/snmp_snmpv2_framework.h" +#include "lwip/apps/snmp_snmpv2_usm.h" +static const struct snmp_mib *const default_mibs[] = { &mib2, &snmpframeworkmib, &snmpusmmib }; +static u8_t snmp_num_mibs = LWIP_ARRAYSIZE(default_mibs); +#elif SNMP_LWIP_MIB2 +#include "lwip/apps/snmp_mib2.h" +static const struct snmp_mib *const default_mibs[] = { &mib2 }; +static u8_t snmp_num_mibs = LWIP_ARRAYSIZE(default_mibs); #else -static const struct snmp_mib* const default_mibs[] = { NULL }; +static const struct snmp_mib *const default_mibs[] = { NULL }; static u8_t snmp_num_mibs = 0; #endif /* List of known mibs */ -static struct snmp_mib const * const *snmp_mibs = default_mibs; +static struct snmp_mib const *const *snmp_mibs = default_mibs; /** * @ingroup snmp_core @@ -219,6 +235,7 @@ static struct snmp_mib const * const *snmp_mibs = default_mibs; void snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("mibs pointer must be != NULL", (mibs != NULL)); LWIP_ASSERT("num_mibs pointer must be != 0", (num_mibs != 0)); snmp_mibs = mibs; @@ -232,15 +249,16 @@ snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs) * The 'device enterprise oid' shall point to an OID located under 'private-enterprises' branch (1.3.6.1.4.1.XXX). If a vendor * wants to provide a custom object there, he has to get its own enterprise oid from IANA (http://www.iana.org). It * is not allowed to use LWIP enterprise ID! - * In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own + * In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own * enterprise oid. * e.g. * device a > 1.3.6.1.4.1.XXX(ent-oid).1(devices).1(device a) * device b > 1.3.6.1.4.1.XXX(ent-oid).1(devices).2(device b) * for more details see description of 'sysObjectID' field in RFC1213-MIB */ -void snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid) +void snmp_set_device_enterprise_oid(const struct snmp_obj_id *device_enterprise_oid) { + LWIP_ASSERT_CORE_LOCKED(); if (device_enterprise_oid == NULL) { snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default; } else { @@ -250,10 +268,11 @@ void snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_ /** * @ingroup snmp_core - * Get 'device enterprise oid' + * Get 'device enterprise oid' */ -const struct snmp_obj_id* snmp_get_device_enterprise_oid(void) +const struct snmp_obj_id *snmp_get_device_enterprise_oid(void) { + LWIP_ASSERT_CORE_LOCKED(); return snmp_device_enterprise_oid; } @@ -496,16 +515,16 @@ snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip) u8_t snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port) { - u8_t idx = 0; + u8_t idx; /* InetAddressType + InetAddress */ - idx += snmp_oid_to_ip(&oid[idx], oid_len-idx, ip); + idx = snmp_oid_to_ip(&oid[0], oid_len, ip); if (idx == 0) { return 0; } /* InetPortNumber */ - if (oid_len < (idx+1)) { + if (oid_len < (idx + 1)) { return 0; } if (oid[idx] > 0xffff) { @@ -521,14 +540,14 @@ snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port) /** * Assign an OID to struct snmp_obj_id - * @param target Assignment target + * @param target Assignment target * @param oid OID * @param oid_len OID length */ void -snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len) +snmp_oid_assign(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len) { - LWIP_ASSERT("oid_len <= LWIP_SNMP_OBJ_ID_LEN", oid_len <= SNMP_MAX_OBJ_ID_LEN); + LWIP_ASSERT("oid_len <= SNMP_MAX_OBJ_ID_LEN", oid_len <= SNMP_MAX_OBJ_ID_LEN); target->len = oid_len; @@ -544,14 +563,14 @@ snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len) * @param oid_len OID length */ void -snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len) +snmp_oid_prefix(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len) { - LWIP_ASSERT("target->len + oid_len <= LWIP_SNMP_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN); + LWIP_ASSERT("target->len + oid_len <= SNMP_MAX_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN); if (oid_len > 0) { /* move existing OID to make room at the beginning for OID to insert */ int i; - for (i = target->len-1; i>=0; i--) { + for (i = target->len - 1; i >= 0; i--) { target->id[i + oid_len] = target->id[i]; } @@ -569,7 +588,7 @@ snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len) * @param oid2_len OID 2 length */ void -snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len) +snmp_oid_combine(struct snmp_obj_id *target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len) { snmp_oid_assign(target, oid1, oid1_len); snmp_oid_append(target, oid2, oid2_len); @@ -582,13 +601,13 @@ snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, c * @param oid_len OID length */ void -snmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len) +snmp_oid_append(struct snmp_obj_id *target, const u32_t *oid, u8_t oid_len) { - LWIP_ASSERT("offset + oid_len <= LWIP_SNMP_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN); + LWIP_ASSERT("offset + oid_len <= SNMP_MAX_OBJ_ID_LEN", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN); if (oid_len > 0) { MEMCPY(&target->id[target->len], oid, oid_len * sizeof(u32_t)); - target->len += oid_len; + target->len = (u8_t)(target->len + oid_len); } } @@ -644,7 +663,7 @@ snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_ u8_t snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len) { - return (snmp_oid_compare(oid1, oid1_len, oid2, oid2_len) == 0)? 1 : 0; + return (snmp_oid_compare(oid1, oid1_len, oid2, oid2_len) == 0) ? 1 : 0; } /** @@ -655,32 +674,18 @@ snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_le u8_t netif_to_num(const struct netif *netif) { - u8_t result = 0; - struct netif *netif_iterator = netif_list; - - while (netif_iterator != NULL) { - result++; - - if (netif_iterator == netif) { - return result; - } - - netif_iterator = netif_iterator->next; - } - - LWIP_ASSERT("netif not found in netif_list", 0); - return 0; + return netif_get_index(netif); } -static const struct snmp_mib* +static const struct snmp_mib * snmp_get_mib_from_oid(const u32_t *oid, u8_t oid_len) { - const u32_t* list_oid; - const u32_t* searched_oid; + const u32_t *list_oid; + const u32_t *searched_oid; u8_t i, l; u8_t max_match_len = 0; - const struct snmp_mib* matched_mib = NULL; + const struct snmp_mib *matched_mib = NULL; LWIP_ASSERT("'oid' param must not be NULL!", (oid != NULL)); @@ -717,11 +722,11 @@ snmp_get_mib_from_oid(const u32_t *oid, u8_t oid_len) return matched_mib; } -static const struct snmp_mib* +static const struct snmp_mib * snmp_get_next_mib(const u32_t *oid, u8_t oid_len) { u8_t i; - const struct snmp_mib* next_mib = NULL; + const struct snmp_mib *next_mib = NULL; LWIP_ASSERT("'oid' param must not be NULL!", (oid != NULL)); @@ -745,10 +750,10 @@ snmp_get_next_mib(const u32_t *oid, u8_t oid_len) return next_mib; } -static const struct snmp_mib* +static const struct snmp_mib * snmp_get_mib_between(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len) { - const struct snmp_mib* next_mib = snmp_get_next_mib(oid1, oid1_len); + const struct snmp_mib *next_mib = snmp_get_next_mib(oid1, oid1_len); LWIP_ASSERT("'oid2' param must not be NULL!", (oid2 != NULL)); LWIP_ASSERT("'oid2_len' param must be greater than 0!", (oid2_len > 0)); @@ -763,7 +768,7 @@ snmp_get_mib_between(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t o } u8_t -snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance) +snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance *node_instance) { u8_t result = SNMP_ERR_NOSUCHOBJECT; const struct snmp_mib *mib; @@ -776,15 +781,15 @@ snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node mn = snmp_mib_tree_resolve_exact(mib, oid, oid_len, &oid_instance_len); if ((mn != NULL) && (mn->node_type != SNMP_NODE_TREE)) { /* get instance */ - const struct snmp_leaf_node* leaf_node = (const struct snmp_leaf_node*)(const void*)mn; + const struct snmp_leaf_node *leaf_node = (const struct snmp_leaf_node *)(const void *)mn; node_instance->node = mn; snmp_oid_assign(&node_instance->instance_oid, oid + (oid_len - oid_instance_len), oid_instance_len); result = leaf_node->get_instance( - oid, - oid_len - oid_instance_len, - node_instance); + oid, + oid_len - oid_instance_len, + node_instance); #ifdef LWIP_DEBUG if (result == SNMP_ERR_NOERROR) { @@ -803,11 +808,11 @@ snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node } u8_t -snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance) +snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void *validate_node_instance_arg, struct snmp_obj_id *node_oid, struct snmp_node_instance *node_instance) { const struct snmp_mib *mib; const struct snmp_node *mn = NULL; - const u32_t* start_oid = NULL; + const u32_t *start_oid = NULL; u8_t start_oid_len = 0; /* resolve target MIB from passed OID */ @@ -843,7 +848,7 @@ snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_valida /* validate the node; if the node has no further instance or the returned instance is invalid, search for the next in MIB and validate again */ node_instance->node = mn; while (mn != NULL) { - u8_t result; + u8_t result; /* clear fields which may have values from previous loops */ node_instance->asn1_type = 0; @@ -855,10 +860,10 @@ snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_valida node_instance->reference.ptr = NULL; node_instance->reference_len = 0; - result = ((const struct snmp_leaf_node*)(const void*)mn)->get_next_instance( - node_oid->id, - node_oid->len, - node_instance); + result = ((const struct snmp_leaf_node *)(const void *)mn)->get_next_instance( + node_oid->id, + node_oid->len, + node_instance); if (result == SNMP_ERR_NOERROR) { #ifdef LWIP_DEBUG @@ -906,7 +911,7 @@ snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_valida /* we found a suitable next node, now we have to check if a inner MIB is located between the searched OID and the resulting OID. - this is possible because MIB's may be located anywhere in the global tree, that means also in + this is possible because MIB's may be located anywhere in the global tree, that means also in the subtree of another MIB (e.g. if searched OID is .2 and resulting OID is .4, then another MIB having .3 as root node may exist) */ @@ -975,17 +980,17 @@ snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_valida * */ const struct snmp_node * -snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len) +snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t *oid_instance_len) { - const struct snmp_node* const* node = &mib->root_node; + const struct snmp_node *const *node = &mib->root_node; u8_t oid_offset = mib->base_oid_len; while ((oid_offset < oid_len) && ((*node)->node_type == SNMP_NODE_TREE)) { /* search for matching sub node */ u32_t subnode_oid = *(oid + oid_offset); - u32_t i = (*(const struct snmp_tree_node* const*)node)->subnode_count; - node = (*(const struct snmp_tree_node* const*)node)->subnodes; + u32_t i = (*(const struct snmp_tree_node * const *)node)->subnode_count; + node = (*(const struct snmp_tree_node * const *)node)->subnodes; while ((i > 0) && ((*node)->oid != subnode_oid)) { node++; i--; @@ -1008,12 +1013,12 @@ snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t o return NULL; } -const struct snmp_node* -snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret) +const struct snmp_node * +snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id *oidret) { u8_t oid_offset = mib->base_oid_len; - const struct snmp_node* const* node; - const struct snmp_tree_node* node_stack[SNMP_MAX_OBJ_ID_LEN]; + const struct snmp_node *const *node; + const struct snmp_tree_node *node_stack[SNMP_MAX_OBJ_ID_LEN]; s32_t nsi = 0; /* NodeStackIndex */ u32_t subnode_oid; @@ -1023,7 +1028,7 @@ snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oi } /* first build node stack related to passed oid (as far as possible), then go backwards to determine the next node */ - node_stack[nsi] = (const struct snmp_tree_node*)(const void*)mib->root_node; + node_stack[nsi] = (const struct snmp_tree_node *)(const void *)mib->root_node; while (oid_offset < oid_len) { /* search for matching sub node */ u32_t i = node_stack[nsi]->subnode_count; @@ -1041,7 +1046,7 @@ snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oi break; } nsi++; - node_stack[nsi] = (const struct snmp_tree_node*)(const void*)(*node); + node_stack[nsi] = (const struct snmp_tree_node *)(const void *)(*node); oid_offset++; } @@ -1055,7 +1060,7 @@ snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oi } while (nsi >= 0) { - const struct snmp_node* subnode = NULL; + const struct snmp_node *subnode = NULL; /* find next node on current level */ s32_t i = node_stack[nsi]->subnode_count; @@ -1080,7 +1085,7 @@ snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oi if (subnode->node_type == SNMP_NODE_TREE) { /* next is a tree node, go into it and start searching */ nsi++; - node_stack[nsi] = (const struct snmp_tree_node*)(const void*)subnode; + node_stack[nsi] = (const struct snmp_tree_node *)(const void *)subnode; subnode_oid = 0; } else { /* we found a leaf node -> fill oidret and return it */ @@ -1106,8 +1111,8 @@ snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oi /** initialize struct next_oid_state using this function before passing it to next_oid_check */ void snmp_next_oid_init(struct snmp_next_oid_state *state, - const u32_t *start_oid, u8_t start_oid_len, - u32_t *next_oid_buf, u8_t next_oid_max_len) + const u32_t *start_oid, u8_t start_oid_len, + u32_t *next_oid_buf, u8_t next_oid_max_len) { state->start_oid = start_oid; state->start_oid_len = start_oid_len; @@ -1121,7 +1126,7 @@ snmp_next_oid_init(struct snmp_next_oid_state *state, this methid is intended if the complete OID is not yet known but it is very expensive to build it up, so it is possible to test the starting part before building up the complete oid and pass it to snmp_next_oid_check()*/ u8_t -snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len) +snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len) { if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) { u8_t start_oid_len = (oid_len < state->start_oid_len) ? oid_len : state->start_oid_len; @@ -1130,7 +1135,7 @@ snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, cons if (snmp_oid_compare(oid, oid_len, state->start_oid, start_oid_len) >= 0) { /* check if new oid is located closer to start oid than current closest oid */ if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) || - (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) { + (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) { return 1; } } @@ -1141,7 +1146,7 @@ snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, cons /** checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 */ u8_t -snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference) +snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void *reference) { /* do not overwrite a fail result */ if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) { @@ -1149,7 +1154,7 @@ snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u if (snmp_oid_compare(oid, oid_len, state->start_oid, state->start_oid_len) > 0) { /* check if new oid is located closer to start oid than current closest oid */ if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) || - (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) { + (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) { if (oid_len <= state->next_oid_max_len) { MEMCPY(state->next_oid, oid, oid_len * sizeof(u32_t)); state->next_oid_len = oid_len; @@ -1185,7 +1190,7 @@ snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range } snmp_err_t -snmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value) +snmp_set_test_ok(struct snmp_node_instance *instance, u16_t value_len, void *value) { LWIP_UNUSED_ARG(instance); LWIP_UNUSED_ARG(value_len); @@ -1228,8 +1233,7 @@ snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value) } bits_processed++; b <<= 1; - } - while ((bits_processed & 0x07) != 0); /* &0x07 -> % 8 */ + } while ((bits_processed & 0x07) != 0); /* &0x07 -> % 8 */ } else { bits_processed += 8; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core_priv.h similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core_priv.h index 5552177..9532c05 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_core_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_core_priv.h @@ -55,17 +55,24 @@ extern "C" { */ #define SNMP_ERR_TOOBIG 1 #define SNMP_ERR_AUTHORIZATIONERROR 16 + +#define SNMP_ERR_UNKNOWN_ENGINEID 30 +#define SNMP_ERR_UNKNOWN_SECURITYNAME 31 +#define SNMP_ERR_UNSUPPORTED_SECLEVEL 32 +#define SNMP_ERR_NOTINTIMEWINDOW 33 +#define SNMP_ERR_DECRYIPTION_ERROR 34 + #define SNMP_ERR_NOSUCHOBJECT SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT #define SNMP_ERR_ENDOFMIBVIEW SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW -const struct snmp_node* snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len); -const struct snmp_node* snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret); +const struct snmp_node *snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t *oid_instance_len); +const struct snmp_node *snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id *oidret); -typedef u8_t (*snmp_validate_node_instance_method)(struct snmp_node_instance*, void*); +typedef u8_t (*snmp_validate_node_instance_method)(struct snmp_node_instance *, void *); -u8_t snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance); -u8_t snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance); +u8_t snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance *node_instance); +u8_t snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void *validate_node_instance_arg, struct snmp_obj_id *node_oid, struct snmp_node_instance *node_instance); #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2.c similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2.c index 9d8c43c..3383e44 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2.c @@ -59,7 +59,7 @@ #include "lwip/tcpip.h" #include "lwip/priv/tcpip_priv.h" void -snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg) +snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void *arg) { #if LWIP_TCPIP_CORE_LOCKING LOCK_TCPIP_CORE(); @@ -87,7 +87,7 @@ extern const struct snmp_scalar_array_node snmp_mib2_system_node; extern const struct snmp_tree_node snmp_mib2_at_root; extern const struct snmp_tree_node snmp_mib2_ip_root; -static const struct snmp_node* const mib2_nodes[] = { +static const struct snmp_node *const mib2_nodes[] = { &snmp_mib2_system_node.node.node, &snmp_mib2_interface_root.node, #if LWIP_ARP && LWIP_IPV4 @@ -110,7 +110,7 @@ static const struct snmp_node* const mib2_nodes[] = { static const struct snmp_tree_node mib2_root = SNMP_CREATE_TREE_NODE(1, mib2_nodes); -static const u32_t mib2_base_oid_arr[] = { 1,3,6,1,2,1 }; +static const u32_t mib2_base_oid_arr[] = { 1, 3, 6, 1, 2, 1 }; const struct snmp_mib mib2 = SNMP_MIB_CREATE(mib2_base_oid_arr, &mib2_root.node); #endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_icmp.c similarity index 58% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_icmp.c index 995bd32..033d229 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_icmp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_icmp.c @@ -58,90 +58,90 @@ static s16_t icmp_get_value(const struct snmp_scalar_array_node_def *node, void *value) { - u32_t *uint_ptr = (u32_t*)value; + u32_t *uint_ptr = (u32_t *)value; switch (node->oid) { - case 1: /* icmpInMsgs */ - *uint_ptr = STATS_GET(mib2.icmpinmsgs); - return sizeof(*uint_ptr); - case 2: /* icmpInErrors */ - *uint_ptr = STATS_GET(mib2.icmpinerrors); - return sizeof(*uint_ptr); - case 3: /* icmpInDestUnreachs */ - *uint_ptr = STATS_GET(mib2.icmpindestunreachs); - return sizeof(*uint_ptr); - case 4: /* icmpInTimeExcds */ - *uint_ptr = STATS_GET(mib2.icmpintimeexcds); - return sizeof(*uint_ptr); - case 5: /* icmpInParmProbs */ - *uint_ptr = STATS_GET(mib2.icmpinparmprobs); - return sizeof(*uint_ptr); - case 6: /* icmpInSrcQuenchs */ - *uint_ptr = STATS_GET(mib2.icmpinsrcquenchs); - return sizeof(*uint_ptr); - case 7: /* icmpInRedirects */ - *uint_ptr = STATS_GET(mib2.icmpinredirects); - return sizeof(*uint_ptr); - case 8: /* icmpInEchos */ - *uint_ptr = STATS_GET(mib2.icmpinechos); - return sizeof(*uint_ptr); - case 9: /* icmpInEchoReps */ - *uint_ptr = STATS_GET(mib2.icmpinechoreps); - return sizeof(*uint_ptr); - case 10: /* icmpInTimestamps */ - *uint_ptr = STATS_GET(mib2.icmpintimestamps); - return sizeof(*uint_ptr); - case 11: /* icmpInTimestampReps */ - *uint_ptr = STATS_GET(mib2.icmpintimestampreps); - return sizeof(*uint_ptr); - case 12: /* icmpInAddrMasks */ - *uint_ptr = STATS_GET(mib2.icmpinaddrmasks); - return sizeof(*uint_ptr); - case 13: /* icmpInAddrMaskReps */ - *uint_ptr = STATS_GET(mib2.icmpinaddrmaskreps); - return sizeof(*uint_ptr); - case 14: /* icmpOutMsgs */ - *uint_ptr = STATS_GET(mib2.icmpoutmsgs); - return sizeof(*uint_ptr); - case 15: /* icmpOutErrors */ - *uint_ptr = STATS_GET(mib2.icmpouterrors); - return sizeof(*uint_ptr); - case 16: /* icmpOutDestUnreachs */ - *uint_ptr = STATS_GET(mib2.icmpoutdestunreachs); - return sizeof(*uint_ptr); - case 17: /* icmpOutTimeExcds */ - *uint_ptr = STATS_GET(mib2.icmpouttimeexcds); - return sizeof(*uint_ptr); - case 18: /* icmpOutParmProbs: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 19: /* icmpOutSrcQuenchs: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 20: /* icmpOutRedirects: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 21: /* icmpOutEchos */ - *uint_ptr = STATS_GET(mib2.icmpoutechos); - return sizeof(*uint_ptr); - case 22: /* icmpOutEchoReps */ - *uint_ptr = STATS_GET(mib2.icmpoutechoreps); - return sizeof(*uint_ptr); - case 23: /* icmpOutTimestamps: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 24: /* icmpOutTimestampReps: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 25: /* icmpOutAddrMasks: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - case 26: /* icmpOutAddrMaskReps: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_value(): unknown id: %"S32_F"\n", node->oid)); - break; + case 1: /* icmpInMsgs */ + *uint_ptr = STATS_GET(mib2.icmpinmsgs); + return sizeof(*uint_ptr); + case 2: /* icmpInErrors */ + *uint_ptr = STATS_GET(mib2.icmpinerrors); + return sizeof(*uint_ptr); + case 3: /* icmpInDestUnreachs */ + *uint_ptr = STATS_GET(mib2.icmpindestunreachs); + return sizeof(*uint_ptr); + case 4: /* icmpInTimeExcds */ + *uint_ptr = STATS_GET(mib2.icmpintimeexcds); + return sizeof(*uint_ptr); + case 5: /* icmpInParmProbs */ + *uint_ptr = STATS_GET(mib2.icmpinparmprobs); + return sizeof(*uint_ptr); + case 6: /* icmpInSrcQuenchs */ + *uint_ptr = STATS_GET(mib2.icmpinsrcquenchs); + return sizeof(*uint_ptr); + case 7: /* icmpInRedirects */ + *uint_ptr = STATS_GET(mib2.icmpinredirects); + return sizeof(*uint_ptr); + case 8: /* icmpInEchos */ + *uint_ptr = STATS_GET(mib2.icmpinechos); + return sizeof(*uint_ptr); + case 9: /* icmpInEchoReps */ + *uint_ptr = STATS_GET(mib2.icmpinechoreps); + return sizeof(*uint_ptr); + case 10: /* icmpInTimestamps */ + *uint_ptr = STATS_GET(mib2.icmpintimestamps); + return sizeof(*uint_ptr); + case 11: /* icmpInTimestampReps */ + *uint_ptr = STATS_GET(mib2.icmpintimestampreps); + return sizeof(*uint_ptr); + case 12: /* icmpInAddrMasks */ + *uint_ptr = STATS_GET(mib2.icmpinaddrmasks); + return sizeof(*uint_ptr); + case 13: /* icmpInAddrMaskReps */ + *uint_ptr = STATS_GET(mib2.icmpinaddrmaskreps); + return sizeof(*uint_ptr); + case 14: /* icmpOutMsgs */ + *uint_ptr = STATS_GET(mib2.icmpoutmsgs); + return sizeof(*uint_ptr); + case 15: /* icmpOutErrors */ + *uint_ptr = STATS_GET(mib2.icmpouterrors); + return sizeof(*uint_ptr); + case 16: /* icmpOutDestUnreachs */ + *uint_ptr = STATS_GET(mib2.icmpoutdestunreachs); + return sizeof(*uint_ptr); + case 17: /* icmpOutTimeExcds */ + *uint_ptr = STATS_GET(mib2.icmpouttimeexcds); + return sizeof(*uint_ptr); + case 18: /* icmpOutParmProbs: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 19: /* icmpOutSrcQuenchs: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 20: /* icmpOutRedirects: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 21: /* icmpOutEchos */ + *uint_ptr = STATS_GET(mib2.icmpoutechos); + return sizeof(*uint_ptr); + case 22: /* icmpOutEchoReps */ + *uint_ptr = STATS_GET(mib2.icmpoutechoreps); + return sizeof(*uint_ptr); + case 23: /* icmpOutTimestamps: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 24: /* icmpOutTimestampReps: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 25: /* icmpOutAddrMasks: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + case 26: /* icmpOutAddrMaskReps: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("icmp_get_value(): unknown id: %"S32_F"\n", node->oid)); + break; } return 0; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_interfaces.c similarity index 65% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_interfaces.c index 979b507..5f12dd5 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_interfaces.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_interfaces.c @@ -59,16 +59,15 @@ /* --- interfaces .1.3.6.1.2.1.2 ----------------------------------------------------- */ static s16_t -interfaces_get_value(struct snmp_node_instance* instance, void* value) +interfaces_get_value(struct snmp_node_instance *instance, void *value) { if (instance->node->oid == 1) { - s32_t *sint_ptr = (s32_t*)value; + s32_t *sint_ptr = (s32_t *)value; s32_t num_netifs = 0; - struct netif *netif = netif_list; - while (netif != NULL) { + struct netif *netif; + NETIF_FOREACH(netif) { num_netifs++; - netif = netif->next; } *sint_ptr = num_netifs; @@ -93,7 +92,7 @@ static const u8_t iftable_ifAdminStatus_lowerLayerDown = 7; static const u8_t iftable_ifAdminStatus_down = 2; static snmp_err_t -interfaces_Table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance) +interfaces_Table_get_cell_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance) { u32_t ifIndex; struct netif *netif; @@ -109,14 +108,12 @@ interfaces_Table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8 ifIndex = row_oid[0]; /* find netif with index */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { if (netif_to_num(netif) == ifIndex) { /* store netif pointer for subsequent operations (get/test/set) */ cell_instance->reference.ptr = netif; return SNMP_ERR_NOERROR; } - netif = netif->next; } /* not found */ @@ -124,7 +121,7 @@ interfaces_Table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8 } static snmp_err_t -interfaces_Table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance) +interfaces_Table_get_next_cell_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance) { struct netif *netif; struct snmp_next_oid_state state; @@ -136,15 +133,12 @@ interfaces_Table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges)); /* iterate over all possible OIDs to find the next one */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { u32_t test_oid[LWIP_ARRAYSIZE(interfaces_Table_oid_ranges)]; test_oid[0] = netif_to_num(netif); /* check generated OID: is it a candidate for the next one? */ snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges), netif); - - netif = netif->next; } /* did we find a next one? */ @@ -160,118 +154,117 @@ interfaces_Table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* } static s16_t -interfaces_Table_get_value(struct snmp_node_instance* instance, void* value) +interfaces_Table_get_value(struct snmp_node_instance *instance, void *value) { - struct netif *netif = (struct netif*)instance->reference.ptr; - u32_t* value_u32 = (u32_t*)value; - s32_t* value_s32 = (s32_t*)value; + struct netif *netif = (struct netif *)instance->reference.ptr; + u32_t *value_u32 = (u32_t *)value; + s32_t *value_s32 = (s32_t *)value; u16_t value_len; - switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id)) - { - case 1: /* ifIndex */ - *value_s32 = netif_to_num(netif); - value_len = sizeof(*value_s32); - break; - case 2: /* ifDescr */ - value_len = sizeof(netif->name); - MEMCPY(value, netif->name, value_len); - break; - case 3: /* ifType */ - *value_s32 = netif->link_type; - value_len = sizeof(*value_s32); - break; - case 4: /* ifMtu */ - *value_s32 = netif->mtu; - value_len = sizeof(*value_s32); - break; - case 5: /* ifSpeed */ - *value_u32 = netif->link_speed; - value_len = sizeof(*value_u32); - break; - case 6: /* ifPhysAddress */ - value_len = sizeof(netif->hwaddr); - MEMCPY(value, &netif->hwaddr, value_len); - break; - case 7: /* ifAdminStatus */ - if (netif_is_up(netif)) { - *value_s32 = iftable_ifOperStatus_up; - } else { - *value_s32 = iftable_ifOperStatus_down; - } - value_len = sizeof(*value_s32); - break; - case 8: /* ifOperStatus */ - if (netif_is_up(netif)) { - if (netif_is_link_up(netif)) { - *value_s32 = iftable_ifAdminStatus_up; + switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id)) { + case 1: /* ifIndex */ + *value_s32 = netif_to_num(netif); + value_len = sizeof(*value_s32); + break; + case 2: /* ifDescr */ + value_len = sizeof(netif->name); + MEMCPY(value, netif->name, value_len); + break; + case 3: /* ifType */ + *value_s32 = netif->link_type; + value_len = sizeof(*value_s32); + break; + case 4: /* ifMtu */ + *value_s32 = netif->mtu; + value_len = sizeof(*value_s32); + break; + case 5: /* ifSpeed */ + *value_u32 = netif->link_speed; + value_len = sizeof(*value_u32); + break; + case 6: /* ifPhysAddress */ + value_len = sizeof(netif->hwaddr); + MEMCPY(value, &netif->hwaddr, value_len); + break; + case 7: /* ifAdminStatus */ + if (netif_is_up(netif)) { + *value_s32 = iftable_ifOperStatus_up; } else { - *value_s32 = iftable_ifAdminStatus_lowerLayerDown; + *value_s32 = iftable_ifOperStatus_down; } - } else { - *value_s32 = iftable_ifAdminStatus_down; - } - value_len = sizeof(*value_s32); - break; - case 9: /* ifLastChange */ - *value_u32 = netif->ts; - value_len = sizeof(*value_u32); - break; - case 10: /* ifInOctets */ - *value_u32 = netif->mib2_counters.ifinoctets; - value_len = sizeof(*value_u32); - break; - case 11: /* ifInUcastPkts */ - *value_u32 = netif->mib2_counters.ifinucastpkts; - value_len = sizeof(*value_u32); - break; - case 12: /* ifInNUcastPkts */ - *value_u32 = netif->mib2_counters.ifinnucastpkts; - value_len = sizeof(*value_u32); - break; - case 13: /* ifInDiscards */ - *value_u32 = netif->mib2_counters.ifindiscards; - value_len = sizeof(*value_u32); - break; - case 14: /* ifInErrors */ - *value_u32 = netif->mib2_counters.ifinerrors; - value_len = sizeof(*value_u32); - break; - case 15: /* ifInUnkownProtos */ - *value_u32 = netif->mib2_counters.ifinunknownprotos; - value_len = sizeof(*value_u32); - break; - case 16: /* ifOutOctets */ - *value_u32 = netif->mib2_counters.ifoutoctets; - value_len = sizeof(*value_u32); - break; - case 17: /* ifOutUcastPkts */ - *value_u32 = netif->mib2_counters.ifoutucastpkts; - value_len = sizeof(*value_u32); - break; - case 18: /* ifOutNUcastPkts */ - *value_u32 = netif->mib2_counters.ifoutnucastpkts; - value_len = sizeof(*value_u32); - break; - case 19: /* ifOutDiscarts */ - *value_u32 = netif->mib2_counters.ifoutdiscards; - value_len = sizeof(*value_u32); - break; - case 20: /* ifOutErrors */ - *value_u32 = netif->mib2_counters.ifouterrors; - value_len = sizeof(*value_u32); - break; - case 21: /* ifOutQLen */ - *value_u32 = iftable_ifOutQLen; - value_len = sizeof(*value_u32); - break; - /** @note returning zeroDotZero (0.0) no media specific MIB support */ - case 22: /* ifSpecific */ - value_len = snmp_zero_dot_zero.len * sizeof(u32_t); - MEMCPY(value, snmp_zero_dot_zero.id, value_len); - break; - default: - return 0; + value_len = sizeof(*value_s32); + break; + case 8: /* ifOperStatus */ + if (netif_is_up(netif)) { + if (netif_is_link_up(netif)) { + *value_s32 = iftable_ifAdminStatus_up; + } else { + *value_s32 = iftable_ifAdminStatus_lowerLayerDown; + } + } else { + *value_s32 = iftable_ifAdminStatus_down; + } + value_len = sizeof(*value_s32); + break; + case 9: /* ifLastChange */ + *value_u32 = netif->ts; + value_len = sizeof(*value_u32); + break; + case 10: /* ifInOctets */ + *value_u32 = netif->mib2_counters.ifinoctets; + value_len = sizeof(*value_u32); + break; + case 11: /* ifInUcastPkts */ + *value_u32 = netif->mib2_counters.ifinucastpkts; + value_len = sizeof(*value_u32); + break; + case 12: /* ifInNUcastPkts */ + *value_u32 = netif->mib2_counters.ifinnucastpkts; + value_len = sizeof(*value_u32); + break; + case 13: /* ifInDiscards */ + *value_u32 = netif->mib2_counters.ifindiscards; + value_len = sizeof(*value_u32); + break; + case 14: /* ifInErrors */ + *value_u32 = netif->mib2_counters.ifinerrors; + value_len = sizeof(*value_u32); + break; + case 15: /* ifInUnkownProtos */ + *value_u32 = netif->mib2_counters.ifinunknownprotos; + value_len = sizeof(*value_u32); + break; + case 16: /* ifOutOctets */ + *value_u32 = netif->mib2_counters.ifoutoctets; + value_len = sizeof(*value_u32); + break; + case 17: /* ifOutUcastPkts */ + *value_u32 = netif->mib2_counters.ifoutucastpkts; + value_len = sizeof(*value_u32); + break; + case 18: /* ifOutNUcastPkts */ + *value_u32 = netif->mib2_counters.ifoutnucastpkts; + value_len = sizeof(*value_u32); + break; + case 19: /* ifOutDiscarts */ + *value_u32 = netif->mib2_counters.ifoutdiscards; + value_len = sizeof(*value_u32); + break; + case 20: /* ifOutErrors */ + *value_u32 = netif->mib2_counters.ifouterrors; + value_len = sizeof(*value_u32); + break; + case 21: /* ifOutQLen */ + *value_u32 = iftable_ifOutQLen; + value_len = sizeof(*value_u32); + break; + /** @note returning zeroDotZero (0.0) no media specific MIB support */ + case 22: /* ifSpecific */ + value_len = snmp_zero_dot_zero.len * sizeof(u32_t); + MEMCPY(value, snmp_zero_dot_zero.id, value_len); + break; + default: + return 0; } return value_len; @@ -280,9 +273,9 @@ interfaces_Table_get_value(struct snmp_node_instance* instance, void* value) #if !SNMP_SAFE_REQUESTS static snmp_err_t -interfaces_Table_set_test(struct snmp_node_instance* instance, u16_t len, void *value) +interfaces_Table_set_test(struct snmp_node_instance *instance, u16_t len, void *value) { - s32_t *sint_ptr = (s32_t*)value; + s32_t *sint_ptr = (s32_t *)value; /* stack should never call this method for another column, because all other columns are set to readonly */ @@ -297,10 +290,10 @@ interfaces_Table_set_test(struct snmp_node_instance* instance, u16_t len, void * } static snmp_err_t -interfaces_Table_set_value(struct snmp_node_instance* instance, u16_t len, void *value) +interfaces_Table_set_value(struct snmp_node_instance *instance, u16_t len, void *value) { - struct netif *netif = (struct netif*)instance->reference.ptr; - s32_t *sint_ptr = (s32_t*)value; + struct netif *netif = (struct netif *)instance->reference.ptr; + s32_t *sint_ptr = (s32_t *)value; /* stack should never call this method for another column, because all other columns are set to readonly */ @@ -351,21 +344,21 @@ static const struct snmp_table_col_def interfaces_Table_columns[] = { #if !SNMP_SAFE_REQUESTS static const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE( - 2, interfaces_Table_columns, - interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance, - interfaces_Table_get_value, interfaces_Table_set_test, interfaces_Table_set_value); + 2, interfaces_Table_columns, + interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance, + interfaces_Table_get_value, interfaces_Table_set_test, interfaces_Table_set_value); #else static const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE( - 2, interfaces_Table_columns, - interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance, - interfaces_Table_get_value, NULL, NULL); + 2, interfaces_Table_columns, + interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance, + interfaces_Table_get_value, NULL, NULL); #endif /* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */ CREATE_LWIP_SYNC_NODE(1, interfaces_Number) CREATE_LWIP_SYNC_NODE(2, interfaces_Table) -static const struct snmp_node* const interface_nodes[] = { +static const struct snmp_node *const interface_nodes[] = { &SYNC_NODE_NAME(interfaces_Number).node.node, &SYNC_NODE_NAME(interfaces_Table).node.node }; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_ip.c similarity index 69% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_ip.c index 4f05180..6931049 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_ip.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_ip.c @@ -59,85 +59,85 @@ /* --- ip .1.3.6.1.2.1.4 ----------------------------------------------------- */ static s16_t -ip_get_value(struct snmp_node_instance* instance, void* value) +ip_get_value(struct snmp_node_instance *instance, void *value) { - s32_t* sint_ptr = (s32_t*)value; - u32_t* uint_ptr = (u32_t*)value; + s32_t *sint_ptr = (s32_t *)value; + u32_t *uint_ptr = (u32_t *)value; switch (instance->node->oid) { - case 1: /* ipForwarding */ + case 1: /* ipForwarding */ #if IP_FORWARD - /* forwarding */ - *sint_ptr = 1; + /* forwarding */ + *sint_ptr = 1; #else - /* not-forwarding */ - *sint_ptr = 2; + /* not-forwarding */ + *sint_ptr = 2; #endif - return sizeof(*sint_ptr); - case 2: /* ipDefaultTTL */ - *sint_ptr = IP_DEFAULT_TTL; - return sizeof(*sint_ptr); - case 3: /* ipInReceives */ - *uint_ptr = STATS_GET(mib2.ipinreceives); - return sizeof(*uint_ptr); - case 4: /* ipInHdrErrors */ - *uint_ptr = STATS_GET(mib2.ipinhdrerrors); - return sizeof(*uint_ptr); - case 5: /* ipInAddrErrors */ - *uint_ptr = STATS_GET(mib2.ipinaddrerrors); - return sizeof(*uint_ptr); - case 6: /* ipForwDatagrams */ - *uint_ptr = STATS_GET(mib2.ipforwdatagrams); - return sizeof(*uint_ptr); - case 7: /* ipInUnknownProtos */ - *uint_ptr = STATS_GET(mib2.ipinunknownprotos); - return sizeof(*uint_ptr); - case 8: /* ipInDiscards */ - *uint_ptr = STATS_GET(mib2.ipindiscards); - return sizeof(*uint_ptr); - case 9: /* ipInDelivers */ - *uint_ptr = STATS_GET(mib2.ipindelivers); - return sizeof(*uint_ptr); - case 10: /* ipOutRequests */ - *uint_ptr = STATS_GET(mib2.ipoutrequests); - return sizeof(*uint_ptr); - case 11: /* ipOutDiscards */ - *uint_ptr = STATS_GET(mib2.ipoutdiscards); - return sizeof(*uint_ptr); - case 12: /* ipOutNoRoutes */ - *uint_ptr = STATS_GET(mib2.ipoutnoroutes); - return sizeof(*uint_ptr); - case 13: /* ipReasmTimeout */ + return sizeof(*sint_ptr); + case 2: /* ipDefaultTTL */ + *sint_ptr = IP_DEFAULT_TTL; + return sizeof(*sint_ptr); + case 3: /* ipInReceives */ + *uint_ptr = STATS_GET(mib2.ipinreceives); + return sizeof(*uint_ptr); + case 4: /* ipInHdrErrors */ + *uint_ptr = STATS_GET(mib2.ipinhdrerrors); + return sizeof(*uint_ptr); + case 5: /* ipInAddrErrors */ + *uint_ptr = STATS_GET(mib2.ipinaddrerrors); + return sizeof(*uint_ptr); + case 6: /* ipForwDatagrams */ + *uint_ptr = STATS_GET(mib2.ipforwdatagrams); + return sizeof(*uint_ptr); + case 7: /* ipInUnknownProtos */ + *uint_ptr = STATS_GET(mib2.ipinunknownprotos); + return sizeof(*uint_ptr); + case 8: /* ipInDiscards */ + *uint_ptr = STATS_GET(mib2.ipindiscards); + return sizeof(*uint_ptr); + case 9: /* ipInDelivers */ + *uint_ptr = STATS_GET(mib2.ipindelivers); + return sizeof(*uint_ptr); + case 10: /* ipOutRequests */ + *uint_ptr = STATS_GET(mib2.ipoutrequests); + return sizeof(*uint_ptr); + case 11: /* ipOutDiscards */ + *uint_ptr = STATS_GET(mib2.ipoutdiscards); + return sizeof(*uint_ptr); + case 12: /* ipOutNoRoutes */ + *uint_ptr = STATS_GET(mib2.ipoutnoroutes); + return sizeof(*uint_ptr); + case 13: /* ipReasmTimeout */ #if IP_REASSEMBLY - *sint_ptr = IP_REASS_MAXAGE; + *sint_ptr = IP_REASS_MAXAGE; #else - *sint_ptr = 0; + *sint_ptr = 0; #endif - return sizeof(*sint_ptr); - case 14: /* ipReasmReqds */ - *uint_ptr = STATS_GET(mib2.ipreasmreqds); - return sizeof(*uint_ptr); - case 15: /* ipReasmOKs */ - *uint_ptr = STATS_GET(mib2.ipreasmoks); - return sizeof(*uint_ptr); - case 16: /* ipReasmFails */ - *uint_ptr = STATS_GET(mib2.ipreasmfails); - return sizeof(*uint_ptr); - case 17: /* ipFragOKs */ - *uint_ptr = STATS_GET(mib2.ipfragoks); - return sizeof(*uint_ptr); - case 18: /* ipFragFails */ - *uint_ptr = STATS_GET(mib2.ipfragfails); - return sizeof(*uint_ptr); - case 19: /* ipFragCreates */ - *uint_ptr = STATS_GET(mib2.ipfragcreates); - return sizeof(*uint_ptr); - case 23: /* ipRoutingDiscards: not supported -> always 0 */ - *uint_ptr = 0; - return sizeof(*uint_ptr); - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); - break; + return sizeof(*sint_ptr); + case 14: /* ipReasmReqds */ + *uint_ptr = STATS_GET(mib2.ipreasmreqds); + return sizeof(*uint_ptr); + case 15: /* ipReasmOKs */ + *uint_ptr = STATS_GET(mib2.ipreasmoks); + return sizeof(*uint_ptr); + case 16: /* ipReasmFails */ + *uint_ptr = STATS_GET(mib2.ipreasmfails); + return sizeof(*uint_ptr); + case 17: /* ipFragOKs */ + *uint_ptr = STATS_GET(mib2.ipfragoks); + return sizeof(*uint_ptr); + case 18: /* ipFragFails */ + *uint_ptr = STATS_GET(mib2.ipfragfails); + return sizeof(*uint_ptr); + case 19: /* ipFragCreates */ + *uint_ptr = STATS_GET(mib2.ipfragcreates); + return sizeof(*uint_ptr); + case 23: /* ipRoutingDiscards: not supported -> always 0 */ + *uint_ptr = 0; + return sizeof(*uint_ptr); + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("ip_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); + break; } return 0; @@ -154,40 +154,40 @@ ip_get_value(struct snmp_node_instance* instance, void* value) * otherwise return badvalue. */ static snmp_err_t -ip_set_test(struct snmp_node_instance* instance, u16_t len, void *value) +ip_set_test(struct snmp_node_instance *instance, u16_t len, void *value) { snmp_err_t ret = SNMP_ERR_WRONGVALUE; - s32_t *sint_ptr = (s32_t*)value; + s32_t *sint_ptr = (s32_t *)value; LWIP_UNUSED_ARG(len); switch (instance->node->oid) { - case 1: /* ipForwarding */ + case 1: /* ipForwarding */ #if IP_FORWARD - /* forwarding */ - if (*sint_ptr == 1) + /* forwarding */ + if (*sint_ptr == 1) #else - /* not-forwarding */ - if (*sint_ptr == 2) + /* not-forwarding */ + if (*sint_ptr == 2) #endif - { - ret = SNMP_ERR_NOERROR; - } - break; - case 2: /* ipDefaultTTL */ - if (*sint_ptr == IP_DEFAULT_TTL) { - ret = SNMP_ERR_NOERROR; - } - break; - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_set_test(): unknown id: %"S32_F"\n", instance->node->oid)); - break; + { + ret = SNMP_ERR_NOERROR; + } + break; + case 2: /* ipDefaultTTL */ + if (*sint_ptr == IP_DEFAULT_TTL) { + ret = SNMP_ERR_NOERROR; + } + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("ip_set_test(): unknown id: %"S32_F"\n", instance->node->oid)); + break; } return ret; } static snmp_err_t -ip_set_value(struct snmp_node_instance* instance, u16_t len, void *value) +ip_set_value(struct snmp_node_instance *instance, u16_t len, void *value) { LWIP_UNUSED_ARG(instance); LWIP_UNUSED_ARG(len); @@ -207,48 +207,48 @@ static const struct snmp_oid_range ip_AddrTable_oid_ranges[] = { }; static snmp_err_t -ip_AddrTable_get_cell_value_core(struct netif *netif, const u32_t* column, union snmp_variant_value* value, u32_t* value_len) +ip_AddrTable_get_cell_value_core(struct netif *netif, const u32_t *column, union snmp_variant_value *value, u32_t *value_len) { LWIP_UNUSED_ARG(value_len); switch (*column) { - case 1: /* ipAdEntAddr */ - value->u32 = netif_ip4_addr(netif)->addr; - break; - case 2: /* ipAdEntIfIndex */ - value->u32 = netif_to_num(netif); - break; - case 3: /* ipAdEntNetMask */ - value->u32 = netif_ip4_netmask(netif)->addr; - break; - case 4: /* ipAdEntBcastAddr */ - /* lwIP oddity, there's no broadcast - address in the netif we can rely on */ - value->u32 = IPADDR_BROADCAST & 1; - break; - case 5: /* ipAdEntReasmMaxSize */ + case 1: /* ipAdEntAddr */ + value->u32 = netif_ip4_addr(netif)->addr; + break; + case 2: /* ipAdEntIfIndex */ + value->u32 = netif_to_num(netif); + break; + case 3: /* ipAdEntNetMask */ + value->u32 = netif_ip4_netmask(netif)->addr; + break; + case 4: /* ipAdEntBcastAddr */ + /* lwIP oddity, there's no broadcast + address in the netif we can rely on */ + value->u32 = IPADDR_BROADCAST & 1; + break; + case 5: /* ipAdEntReasmMaxSize */ #if IP_REASSEMBLY - /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs, - * but only if receiving one fragmented packet at a time. - * The current solution is to calculate for 2 simultaneous packets... - */ - value->u32 = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) * - (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN))); + /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs, + * but only if receiving one fragmented packet at a time. + * The current solution is to calculate for 2 simultaneous packets... + */ + value->u32 = (IP_HLEN + ((IP_REASS_MAX_PBUFS / 2) * + (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN))); #else - /** @todo returning MTU would be a bad thing and - returning a wild guess like '576' isn't good either */ - value->u32 = 0; + /** @todo returning MTU would be a bad thing and + returning a wild guess like '576' isn't good either */ + value->u32 = 0; #endif - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -ip_AddrTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +ip_AddrTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip4_addr_t ip; struct netif *netif; @@ -262,14 +262,11 @@ ip_AddrTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_ snmp_oid_to_ip4(&row_oid[0], &ip); /* we know it succeeds because of oid_in_range check above */ /* find netif with requested ip */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { if (ip4_addr_cmp(&ip, netif_ip4_addr(netif))) { /* fill in object properties */ return ip_AddrTable_get_cell_value_core(netif, column, value, value_len); } - - netif = netif->next; } /* not found */ @@ -277,7 +274,7 @@ ip_AddrTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_ } static snmp_err_t -ip_AddrTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +ip_AddrTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct netif *netif; struct snmp_next_oid_state state; @@ -287,22 +284,19 @@ ip_AddrTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_o snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges)); /* iterate over all possible OIDs to find the next one */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { u32_t test_oid[LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges)]; snmp_ip4_to_oid(netif_ip4_addr(netif), &test_oid[0]); /* check generated OID: is it a candidate for the next one? */ snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges), netif); - - netif = netif->next; } /* did we find a next one? */ if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) { snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); /* fill in object properties */ - return ip_AddrTable_get_cell_value_core((struct netif*)state.reference, column, value, value_len); + return ip_AddrTable_get_cell_value_core((struct netif *)state.reference, column, value, value_len); } /* not found */ @@ -320,86 +314,86 @@ static const struct snmp_oid_range ip_RouteTable_oid_ranges[] = { }; static snmp_err_t -ip_RouteTable_get_cell_value_core(struct netif *netif, u8_t default_route, const u32_t* column, union snmp_variant_value* value, u32_t* value_len) +ip_RouteTable_get_cell_value_core(struct netif *netif, u8_t default_route, const u32_t *column, union snmp_variant_value *value, u32_t *value_len) { switch (*column) { - case 1: /* ipRouteDest */ - if (default_route) { - /* default rte has 0.0.0.0 dest */ - value->u32 = IP4_ADDR_ANY4->addr; - } else { - /* netifs have netaddress dest */ - ip4_addr_t tmp; - ip4_addr_get_network(&tmp, netif_ip4_addr(netif), netif_ip4_netmask(netif)); - value->u32 = tmp.addr; - } - break; - case 2: /* ipRouteIfIndex */ - value->u32 = netif_to_num(netif); - break; - case 3: /* ipRouteMetric1 */ - if (default_route) { - value->s32 = 1; /* default */ - } else { - value->s32 = 0; /* normal */ - } - break; - case 4: /* ipRouteMetric2 */ - case 5: /* ipRouteMetric3 */ - case 6: /* ipRouteMetric4 */ - value->s32 = -1; /* none */ - break; - case 7: /* ipRouteNextHop */ - if (default_route) { - /* default rte: gateway */ - value->u32 = netif_ip4_gw(netif)->addr; - } else { - /* other rtes: netif ip_addr */ - value->u32 = netif_ip4_addr(netif)->addr; - } - break; - case 8: /* ipRouteType */ - if (default_route) { - /* default rte is indirect */ - value->u32 = 4; /* indirect */ - } else { - /* other rtes are direct */ - value->u32 = 3; /* direct */ - } - break; - case 9: /* ipRouteProto */ - /* locally defined routes */ - value->u32 = 2; /* local */ - break; - case 10: /* ipRouteAge */ - /* @todo (sysuptime - timestamp last change) / 100 */ - value->u32 = 0; - break; - case 11: /* ipRouteMask */ - if (default_route) { - /* default rte use 0.0.0.0 mask */ - value->u32 = IP4_ADDR_ANY4->addr; - } else { - /* other rtes use netmask */ - value->u32 = netif_ip4_netmask(netif)->addr; - } - break; - case 12: /* ipRouteMetric5 */ - value->s32 = -1; /* none */ - break; - case 13: /* ipRouteInfo */ - value->const_ptr = snmp_zero_dot_zero.id; - *value_len = snmp_zero_dot_zero.len * sizeof(u32_t); - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 1: /* ipRouteDest */ + if (default_route) { + /* default rte has 0.0.0.0 dest */ + value->u32 = IP4_ADDR_ANY4->addr; + } else { + /* netifs have netaddress dest */ + ip4_addr_t tmp; + ip4_addr_get_network(&tmp, netif_ip4_addr(netif), netif_ip4_netmask(netif)); + value->u32 = tmp.addr; + } + break; + case 2: /* ipRouteIfIndex */ + value->u32 = netif_to_num(netif); + break; + case 3: /* ipRouteMetric1 */ + if (default_route) { + value->s32 = 1; /* default */ + } else { + value->s32 = 0; /* normal */ + } + break; + case 4: /* ipRouteMetric2 */ + case 5: /* ipRouteMetric3 */ + case 6: /* ipRouteMetric4 */ + value->s32 = -1; /* none */ + break; + case 7: /* ipRouteNextHop */ + if (default_route) { + /* default rte: gateway */ + value->u32 = netif_ip4_gw(netif)->addr; + } else { + /* other rtes: netif ip_addr */ + value->u32 = netif_ip4_addr(netif)->addr; + } + break; + case 8: /* ipRouteType */ + if (default_route) { + /* default rte is indirect */ + value->u32 = 4; /* indirect */ + } else { + /* other rtes are direct */ + value->u32 = 3; /* direct */ + } + break; + case 9: /* ipRouteProto */ + /* locally defined routes */ + value->u32 = 2; /* local */ + break; + case 10: /* ipRouteAge */ + /* @todo (sysuptime - timestamp last change) / 100 */ + value->u32 = 0; + break; + case 11: /* ipRouteMask */ + if (default_route) { + /* default rte use 0.0.0.0 mask */ + value->u32 = IP4_ADDR_ANY4->addr; + } else { + /* other rtes use netmask */ + value->u32 = netif_ip4_netmask(netif)->addr; + } + break; + case 12: /* ipRouteMetric5 */ + value->s32 = -1; /* none */ + break; + case 13: /* ipRouteInfo */ + value->const_ptr = snmp_zero_dot_zero.id; + *value_len = snmp_zero_dot_zero.len * sizeof(u32_t); + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -ip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +ip_RouteTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip4_addr_t test_ip; struct netif *netif; @@ -419,8 +413,7 @@ ip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row } /* find netif with requested route */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { ip4_addr_t dst; ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif)); @@ -428,8 +421,6 @@ ip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row /* fill in object properties */ return ip_RouteTable_get_cell_value_core(netif, 0, column, value, value_len); } - - netif = netif->next; } /* not found */ @@ -437,7 +428,7 @@ ip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row } static snmp_err_t -ip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +ip_RouteTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct netif *netif; struct snmp_next_oid_state state; @@ -454,8 +445,7 @@ ip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_ } /* iterate over all possible OIDs to find the next one */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { ip4_addr_t dst; ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif)); @@ -464,8 +454,6 @@ ip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_ snmp_ip4_to_oid(&dst, &test_oid[0]); snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges), netif); } - - netif = netif->next; } /* did we find a next one? */ @@ -474,7 +462,7 @@ ip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_ snmp_oid_to_ip4(&result_temp[0], &dst); snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); /* fill in object properties */ - return ip_RouteTable_get_cell_value_core((struct netif*)state.reference, ip4_addr_isany_val(dst), column, value, value_len); + return ip_RouteTable_get_cell_value_core((struct netif *)state.reference, ip4_addr_isany_val(dst), column, value, value_len); } else { /* not found */ return SNMP_ERR_NOSUCHINSTANCE; @@ -494,7 +482,7 @@ static const struct snmp_oid_range ip_NetToMediaTable_oid_ranges[] = { }; static snmp_err_t -ip_NetToMediaTable_get_cell_value_core(u8_t arp_table_index, const u32_t* column, union snmp_variant_value* value, u32_t* value_len) +ip_NetToMediaTable_get_cell_value_core(size_t arp_table_index, const u32_t *column, union snmp_variant_value *value, u32_t *value_len) { ip4_addr_t *ip; struct netif *netif; @@ -504,32 +492,32 @@ ip_NetToMediaTable_get_cell_value_core(u8_t arp_table_index, const u32_t* column /* value */ switch (*column) { - case 1: /* atIfIndex / ipNetToMediaIfIndex */ - value->u32 = netif_to_num(netif); - break; - case 2: /* atPhysAddress / ipNetToMediaPhysAddress */ - value->ptr = ethaddr; - *value_len = sizeof(*ethaddr); - break; - case 3: /* atNetAddress / ipNetToMediaNetAddress */ - value->u32 = ip->addr; - break; - case 4: /* ipNetToMediaType */ - value->u32 = 3; /* dynamic*/ - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 1: /* atIfIndex / ipNetToMediaIfIndex */ + value->u32 = netif_to_num(netif); + break; + case 2: /* atPhysAddress / ipNetToMediaPhysAddress */ + value->ptr = ethaddr; + *value_len = sizeof(*ethaddr); + break; + case 3: /* atNetAddress / ipNetToMediaNetAddress */ + value->u32 = ip->addr; + break; + case 4: /* ipNetToMediaType */ + value->u32 = 3; /* dynamic*/ + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -ip_NetToMediaTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +ip_NetToMediaTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip4_addr_t ip_in; u8_t netif_index; - u8_t i; + size_t i; /* check if incoming OID length and if values are in plausible range */ if (!snmp_oid_in_range(row_oid, row_oid_len, ip_NetToMediaTable_oid_ranges, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges))) { @@ -541,7 +529,7 @@ ip_NetToMediaTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_ snmp_oid_to_ip4(&row_oid[1], &ip_in); /* we know it succeeds because of oid_in_range check above */ /* find requested entry */ - for (i=0; iid, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges)); /* iterate over all possible OIDs to find the next one */ - for (i=0; ioid) { - case 1: /* snmpInPkts */ - *uint_ptr = snmp_stats.inpkts; - break; - case 2: /* snmpOutPkts */ - *uint_ptr = snmp_stats.outpkts; - break; - case 3: /* snmpInBadVersions */ - *uint_ptr = snmp_stats.inbadversions; - break; - case 4: /* snmpInBadCommunityNames */ - *uint_ptr = snmp_stats.inbadcommunitynames; - break; - case 5: /* snmpInBadCommunityUses */ - *uint_ptr = snmp_stats.inbadcommunityuses; - break; - case 6: /* snmpInASNParseErrs */ - *uint_ptr = snmp_stats.inasnparseerrs; - break; - case 8: /* snmpInTooBigs */ - *uint_ptr = snmp_stats.intoobigs; - break; - case 9: /* snmpInNoSuchNames */ - *uint_ptr = snmp_stats.innosuchnames; - break; - case 10: /* snmpInBadValues */ - *uint_ptr = snmp_stats.inbadvalues; - break; - case 11: /* snmpInReadOnlys */ - *uint_ptr = snmp_stats.inreadonlys; - break; - case 12: /* snmpInGenErrs */ - *uint_ptr = snmp_stats.ingenerrs; - break; - case 13: /* snmpInTotalReqVars */ - *uint_ptr = snmp_stats.intotalreqvars; - break; - case 14: /* snmpInTotalSetVars */ - *uint_ptr = snmp_stats.intotalsetvars; - break; - case 15: /* snmpInGetRequests */ - *uint_ptr = snmp_stats.ingetrequests; - break; - case 16: /* snmpInGetNexts */ - *uint_ptr = snmp_stats.ingetnexts; - break; - case 17: /* snmpInSetRequests */ - *uint_ptr = snmp_stats.insetrequests; - break; - case 18: /* snmpInGetResponses */ - *uint_ptr = snmp_stats.ingetresponses; - break; - case 19: /* snmpInTraps */ - *uint_ptr = snmp_stats.intraps; - break; - case 20: /* snmpOutTooBigs */ - *uint_ptr = snmp_stats.outtoobigs; - break; - case 21: /* snmpOutNoSuchNames */ - *uint_ptr = snmp_stats.outnosuchnames; - break; - case 22: /* snmpOutBadValues */ - *uint_ptr = snmp_stats.outbadvalues; - break; - case 24: /* snmpOutGenErrs */ - *uint_ptr = snmp_stats.outgenerrs; - break; - case 25: /* snmpOutGetRequests */ - *uint_ptr = snmp_stats.outgetrequests; - break; - case 26: /* snmpOutGetNexts */ - *uint_ptr = snmp_stats.outgetnexts; - break; - case 27: /* snmpOutSetRequests */ - *uint_ptr = snmp_stats.outsetrequests; - break; - case 28: /* snmpOutGetResponses */ - *uint_ptr = snmp_stats.outgetresponses; - break; - case 29: /* snmpOutTraps */ - *uint_ptr = snmp_stats.outtraps; - break; - case 30: /* snmpEnableAuthenTraps */ - if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) { - *uint_ptr = MIB2_AUTH_TRAPS_DISABLED; - } else { - *uint_ptr = MIB2_AUTH_TRAPS_ENABLED; - } - break; - case 31: /* snmpSilentDrops */ - *uint_ptr = 0; /* not supported */ - break; - case 32: /* snmpProxyDrops */ - *uint_ptr = 0; /* not supported */ - break; - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_value(): unknown id: %"S32_F"\n", node->oid)); - return 0; + case 1: /* snmpInPkts */ + *uint_ptr = snmp_stats.inpkts; + break; + case 2: /* snmpOutPkts */ + *uint_ptr = snmp_stats.outpkts; + break; + case 3: /* snmpInBadVersions */ + *uint_ptr = snmp_stats.inbadversions; + break; + case 4: /* snmpInBadCommunityNames */ + *uint_ptr = snmp_stats.inbadcommunitynames; + break; + case 5: /* snmpInBadCommunityUses */ + *uint_ptr = snmp_stats.inbadcommunityuses; + break; + case 6: /* snmpInASNParseErrs */ + *uint_ptr = snmp_stats.inasnparseerrs; + break; + case 8: /* snmpInTooBigs */ + *uint_ptr = snmp_stats.intoobigs; + break; + case 9: /* snmpInNoSuchNames */ + *uint_ptr = snmp_stats.innosuchnames; + break; + case 10: /* snmpInBadValues */ + *uint_ptr = snmp_stats.inbadvalues; + break; + case 11: /* snmpInReadOnlys */ + *uint_ptr = snmp_stats.inreadonlys; + break; + case 12: /* snmpInGenErrs */ + *uint_ptr = snmp_stats.ingenerrs; + break; + case 13: /* snmpInTotalReqVars */ + *uint_ptr = snmp_stats.intotalreqvars; + break; + case 14: /* snmpInTotalSetVars */ + *uint_ptr = snmp_stats.intotalsetvars; + break; + case 15: /* snmpInGetRequests */ + *uint_ptr = snmp_stats.ingetrequests; + break; + case 16: /* snmpInGetNexts */ + *uint_ptr = snmp_stats.ingetnexts; + break; + case 17: /* snmpInSetRequests */ + *uint_ptr = snmp_stats.insetrequests; + break; + case 18: /* snmpInGetResponses */ + *uint_ptr = snmp_stats.ingetresponses; + break; + case 19: /* snmpInTraps */ + *uint_ptr = snmp_stats.intraps; + break; + case 20: /* snmpOutTooBigs */ + *uint_ptr = snmp_stats.outtoobigs; + break; + case 21: /* snmpOutNoSuchNames */ + *uint_ptr = snmp_stats.outnosuchnames; + break; + case 22: /* snmpOutBadValues */ + *uint_ptr = snmp_stats.outbadvalues; + break; + case 24: /* snmpOutGenErrs */ + *uint_ptr = snmp_stats.outgenerrs; + break; + case 25: /* snmpOutGetRequests */ + *uint_ptr = snmp_stats.outgetrequests; + break; + case 26: /* snmpOutGetNexts */ + *uint_ptr = snmp_stats.outgetnexts; + break; + case 27: /* snmpOutSetRequests */ + *uint_ptr = snmp_stats.outsetrequests; + break; + case 28: /* snmpOutGetResponses */ + *uint_ptr = snmp_stats.outgetresponses; + break; + case 29: /* snmpOutTraps */ + *uint_ptr = snmp_stats.outtraps; + break; + case 30: /* snmpEnableAuthenTraps */ + if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) { + *uint_ptr = MIB2_AUTH_TRAPS_DISABLED; + } else { + *uint_ptr = MIB2_AUTH_TRAPS_ENABLED; + } + break; + case 31: /* snmpSilentDrops */ + *uint_ptr = 0; /* not supported */ + break; + case 32: /* snmpProxyDrops */ + *uint_ptr = 0; /* not supported */ + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("snmp_get_value(): unknown id: %"S32_F"\n", node->oid)); + return 0; } return sizeof(*uint_ptr); @@ -160,7 +160,7 @@ snmp_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *va if (node->oid == 30) { /* snmpEnableAuthenTraps */ - s32_t *sint_ptr = (s32_t*)value; + s32_t *sint_ptr = (s32_t *)value; /* we should have writable non-volatile mem here */ if ((*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) || (*sint_ptr == MIB2_AUTH_TRAPS_ENABLED)) { @@ -177,7 +177,7 @@ snmp_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *v if (node->oid == 30) { /* snmpEnableAuthenTraps */ - s32_t *sint_ptr = (s32_t*)value; + s32_t *sint_ptr = (s32_t *)value; if (*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) { snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED); } else { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_system.c similarity index 77% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_system.c index 90e5780..71c1c29 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_system.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_system.c @@ -58,31 +58,31 @@ /** mib-2.system.sysDescr */ static const u8_t sysdescr_default[] = SNMP_LWIP_MIB2_SYSDESC; -static const u8_t* sysdescr = sysdescr_default; -static const u16_t* sysdescr_len = NULL; /* use strlen for determining len */ +static const u8_t *sysdescr = sysdescr_default; +static const u16_t *sysdescr_len = NULL; /* use strlen for determining len */ /** mib-2.system.sysContact */ static const u8_t syscontact_default[] = SNMP_LWIP_MIB2_SYSCONTACT; -static const u8_t* syscontact = syscontact_default; -static const u16_t* syscontact_len = NULL; /* use strlen for determining len */ -static u8_t* syscontact_wr = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */ -static u16_t* syscontact_wr_len = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */ +static const u8_t *syscontact = syscontact_default; +static const u16_t *syscontact_len = NULL; /* use strlen for determining len */ +static u8_t *syscontact_wr = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */ +static u16_t *syscontact_wr_len = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */ static u16_t syscontact_bufsize = 0; /* 0=not writable */ /** mib-2.system.sysName */ static const u8_t sysname_default[] = SNMP_LWIP_MIB2_SYSNAME; -static const u8_t* sysname = sysname_default; -static const u16_t* sysname_len = NULL; /* use strlen for determining len */ -static u8_t* sysname_wr = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */ -static u16_t* sysname_wr_len = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */ +static const u8_t *sysname = sysname_default; +static const u16_t *sysname_len = NULL; /* use strlen for determining len */ +static u8_t *sysname_wr = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */ +static u16_t *sysname_wr_len = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */ static u16_t sysname_bufsize = 0; /* 0=not writable */ /** mib-2.system.sysLocation */ static const u8_t syslocation_default[] = SNMP_LWIP_MIB2_SYSLOCATION; -static const u8_t* syslocation = syslocation_default; -static const u16_t* syslocation_len = NULL; /* use strlen for determining len */ -static u8_t* syslocation_wr = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */ -static u16_t* syslocation_wr_len = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */ +static const u8_t *syslocation = syslocation_default; +static const u16_t *syslocation_len = NULL; /* use strlen for determining len */ +static u8_t *syslocation_wr = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */ +static u16_t *syslocation_wr_len = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */ static u16_t syslocation_bufsize = 0; /* 0=not writable */ /** @@ -229,48 +229,47 @@ snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen) static s16_t system_get_value(const struct snmp_scalar_array_node_def *node, void *value) { - const u8_t* var = NULL; - const s16_t* var_len; + const u8_t *var = NULL; + const s16_t *var_len; u16_t result; switch (node->oid) { - case 1: /* sysDescr */ - var = sysdescr; - var_len = (const s16_t*)sysdescr_len; - break; - case 2: /* sysObjectID */ - { - const struct snmp_obj_id* dev_enterprise_oid = snmp_get_device_enterprise_oid(); + case 1: /* sysDescr */ + var = sysdescr; + var_len = (const s16_t *)sysdescr_len; + break; + case 2: { /* sysObjectID */ + const struct snmp_obj_id *dev_enterprise_oid = snmp_get_device_enterprise_oid(); MEMCPY(value, dev_enterprise_oid->id, dev_enterprise_oid->len * sizeof(u32_t)); return dev_enterprise_oid->len * sizeof(u32_t); } - case 3: /* sysUpTime */ - MIB2_COPY_SYSUPTIME_TO((u32_t*)value); - return sizeof(u32_t); - case 4: /* sysContact */ - var = syscontact; - var_len = (const s16_t*)syscontact_len; - break; - case 5: /* sysName */ - var = sysname; - var_len = (const s16_t*)sysname_len; - break; - case 6: /* sysLocation */ - var = syslocation; - var_len = (const s16_t*)syslocation_len; - break; - case 7: /* sysServices */ - *(s32_t*)value = SNMP_SYSSERVICES; - return sizeof(s32_t); - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_value(): unknown id: %"S32_F"\n", node->oid)); - return 0; + case 3: /* sysUpTime */ + MIB2_COPY_SYSUPTIME_TO((u32_t *)value); + return sizeof(u32_t); + case 4: /* sysContact */ + var = syscontact; + var_len = (const s16_t *)syscontact_len; + break; + case 5: /* sysName */ + var = sysname; + var_len = (const s16_t *)sysname_len; + break; + case 6: /* sysLocation */ + var = syslocation; + var_len = (const s16_t *)syslocation_len; + break; + case 7: /* sysServices */ + *(s32_t *)value = SNMP_SYSSERVICES; + return sizeof(s32_t); + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_get_value(): unknown id: %"S32_F"\n", node->oid)); + return 0; } /* handle string values (OID 1,4,5 and 6) */ LWIP_ASSERT("", (value != NULL)); if (var_len == NULL) { - result = (s16_t)strlen((const char*)var); + result = (s16_t)strlen((const char *)var); } else { result = *var_len; } @@ -282,27 +281,27 @@ static snmp_err_t system_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value) { snmp_err_t ret = SNMP_ERR_WRONGVALUE; - const u16_t* var_bufsize = NULL; - const u16_t* var_wr_len; + const u16_t *var_bufsize = NULL; + const u16_t *var_wr_len; LWIP_UNUSED_ARG(value); switch (node->oid) { - case 4: /* sysContact */ - var_bufsize = &syscontact_bufsize; - var_wr_len = syscontact_wr_len; - break; - case 5: /* sysName */ - var_bufsize = &sysname_bufsize; - var_wr_len = sysname_wr_len; - break; - case 6: /* sysLocation */ - var_bufsize = &syslocation_bufsize; - var_wr_len = syslocation_wr_len; - break; - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_test(): unknown id: %"S32_F"\n", node->oid)); - return ret; + case 4: /* sysContact */ + var_bufsize = &syscontact_bufsize; + var_wr_len = syscontact_wr_len; + break; + case 5: /* sysName */ + var_bufsize = &sysname_bufsize; + var_wr_len = sysname_wr_len; + break; + case 6: /* sysLocation */ + var_bufsize = &syslocation_bufsize; + var_wr_len = syslocation_wr_len; + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_set_test(): unknown id: %"S32_F"\n", node->oid)); + return ret; } /* check if value is writable at all */ @@ -327,31 +326,31 @@ system_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void * static snmp_err_t system_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value) { - u8_t* var_wr = NULL; - u16_t* var_wr_len; + u8_t *var_wr = NULL; + u16_t *var_wr_len; switch (node->oid) { - case 4: /* sysContact */ - var_wr = syscontact_wr; - var_wr_len = syscontact_wr_len; - break; - case 5: /* sysName */ - var_wr = sysname_wr; - var_wr_len = sysname_wr_len; - break; - case 6: /* sysLocation */ - var_wr = syslocation_wr; - var_wr_len = syslocation_wr_len; - break; - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_set_value(): unknown id: %"S32_F"\n", node->oid)); - return SNMP_ERR_GENERROR; + case 4: /* sysContact */ + var_wr = syscontact_wr; + var_wr_len = syscontact_wr_len; + break; + case 5: /* sysName */ + var_wr = sysname_wr; + var_wr_len = sysname_wr_len; + break; + case 6: /* sysLocation */ + var_wr = syslocation_wr; + var_wr_len = syslocation_wr_len; + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("system_set_value(): unknown id: %"S32_F"\n", node->oid)); + return SNMP_ERR_GENERROR; } /* no need to check size of target buffer, this was already done in set_test method */ LWIP_ASSERT("", var_wr != NULL); MEMCPY(var_wr, value, len); - + if (var_wr_len == NULL) { /* add terminating 0 */ var_wr[len] = 0; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_tcp.c similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_tcp.c index 21f6965..8a321f3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_tcp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_tcp.c @@ -59,42 +59,41 @@ /* --- tcp .1.3.6.1.2.1.6 ----------------------------------------------------- */ static s16_t -tcp_get_value(struct snmp_node_instance* instance, void* value) +tcp_get_value(struct snmp_node_instance *instance, void *value) { - u32_t *uint_ptr = (u32_t*)value; - s32_t *sint_ptr = (s32_t*)value; + u32_t *uint_ptr = (u32_t *)value; + s32_t *sint_ptr = (s32_t *)value; switch (instance->node->oid) { - case 1: /* tcpRtoAlgorithm, vanj(4) */ - *sint_ptr = 4; - return sizeof(*sint_ptr); - case 2: /* tcpRtoMin */ - /* @todo not the actual value, a guess, - needs to be calculated */ - *sint_ptr = 1000; - return sizeof(*sint_ptr); - case 3: /* tcpRtoMax */ - /* @todo not the actual value, a guess, - needs to be calculated */ - *sint_ptr = 60000; - return sizeof(*sint_ptr); - case 4: /* tcpMaxConn */ - *sint_ptr = MEMP_NUM_TCP_PCB; - return sizeof(*sint_ptr); - case 5: /* tcpActiveOpens */ - *uint_ptr = STATS_GET(mib2.tcpactiveopens); - return sizeof(*uint_ptr); - case 6: /* tcpPassiveOpens */ - *uint_ptr = STATS_GET(mib2.tcppassiveopens); - return sizeof(*uint_ptr); - case 7: /* tcpAttemptFails */ - *uint_ptr = STATS_GET(mib2.tcpattemptfails); - return sizeof(*uint_ptr); - case 8: /* tcpEstabResets */ - *uint_ptr = STATS_GET(mib2.tcpestabresets); - return sizeof(*uint_ptr); - case 9: /* tcpCurrEstab */ - { + case 1: /* tcpRtoAlgorithm, vanj(4) */ + *sint_ptr = 4; + return sizeof(*sint_ptr); + case 2: /* tcpRtoMin */ + /* @todo not the actual value, a guess, + needs to be calculated */ + *sint_ptr = 1000; + return sizeof(*sint_ptr); + case 3: /* tcpRtoMax */ + /* @todo not the actual value, a guess, + needs to be calculated */ + *sint_ptr = 60000; + return sizeof(*sint_ptr); + case 4: /* tcpMaxConn */ + *sint_ptr = MEMP_NUM_TCP_PCB; + return sizeof(*sint_ptr); + case 5: /* tcpActiveOpens */ + *uint_ptr = STATS_GET(mib2.tcpactiveopens); + return sizeof(*uint_ptr); + case 6: /* tcpPassiveOpens */ + *uint_ptr = STATS_GET(mib2.tcppassiveopens); + return sizeof(*uint_ptr); + case 7: /* tcpAttemptFails */ + *uint_ptr = STATS_GET(mib2.tcpattemptfails); + return sizeof(*uint_ptr); + case 8: /* tcpEstabResets */ + *uint_ptr = STATS_GET(mib2.tcpestabresets); + return sizeof(*uint_ptr); + case 9: { /* tcpCurrEstab */ u16_t tcpcurrestab = 0; struct tcp_pcb *pcb = tcp_active_pcbs; while (pcb != NULL) { @@ -107,30 +106,38 @@ tcp_get_value(struct snmp_node_instance* instance, void* value) *uint_ptr = tcpcurrestab; } return sizeof(*uint_ptr); - case 10: /* tcpInSegs */ - *uint_ptr = STATS_GET(mib2.tcpinsegs); - return sizeof(*uint_ptr); - case 11: /* tcpOutSegs */ - *uint_ptr = STATS_GET(mib2.tcpoutsegs); - return sizeof(*uint_ptr); - case 12: /* tcpRetransSegs */ - *uint_ptr = STATS_GET(mib2.tcpretranssegs); - return sizeof(*uint_ptr); - case 14: /* tcpInErrs */ - *uint_ptr = STATS_GET(mib2.tcpinerrs); - return sizeof(*uint_ptr); - case 15: /* tcpOutRsts */ - *uint_ptr = STATS_GET(mib2.tcpoutrsts); - return sizeof(*uint_ptr); - case 17: /* tcpHCInSegs */ - memset(value, 0, 2*sizeof(u32_t)); /* not supported */ - return 2*sizeof(u32_t); - case 18: /* tcpHCOutSegs */ - memset(value, 0, 2*sizeof(u32_t)); /* not supported */ - return 2*sizeof(u32_t); - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); - break; + case 10: /* tcpInSegs */ + *uint_ptr = STATS_GET(mib2.tcpinsegs); + return sizeof(*uint_ptr); + case 11: /* tcpOutSegs */ + *uint_ptr = STATS_GET(mib2.tcpoutsegs); + return sizeof(*uint_ptr); + case 12: /* tcpRetransSegs */ + *uint_ptr = STATS_GET(mib2.tcpretranssegs); + return sizeof(*uint_ptr); + case 14: /* tcpInErrs */ + *uint_ptr = STATS_GET(mib2.tcpinerrs); + return sizeof(*uint_ptr); + case 15: /* tcpOutRsts */ + *uint_ptr = STATS_GET(mib2.tcpoutrsts); + return sizeof(*uint_ptr); +#if LWIP_HAVE_INT64 + case 17: { /* tcpHCInSegs */ + /* use the 32 bit counter for now... */ + u64_t val64 = STATS_GET(mib2.tcpinsegs); + *((u64_t *)value) = val64; + } + return sizeof(u64_t); + case 18: { /* tcpHCOutSegs */ + /* use the 32 bit counter for now... */ + u64_t val64 = STATS_GET(mib2.tcpoutsegs); + *((u64_t *)value) = val64; + } + return sizeof(u64_t); +#endif + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("tcp_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); + break; } return 0; @@ -155,45 +162,45 @@ static const struct snmp_oid_range tcp_ConnTable_oid_ranges[] = { }; static snmp_err_t -tcp_ConnTable_get_cell_value_core(struct tcp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len) +tcp_ConnTable_get_cell_value_core(struct tcp_pcb *pcb, const u32_t *column, union snmp_variant_value *value, u32_t *value_len) { LWIP_UNUSED_ARG(value_len); /* value */ switch (*column) { - case 1: /* tcpConnState */ - value->u32 = pcb->state + 1; - break; - case 2: /* tcpConnLocalAddress */ - value->u32 = ip_2_ip4(&pcb->local_ip)->addr; - break; - case 3: /* tcpConnLocalPort */ - value->u32 = pcb->local_port; - break; - case 4: /* tcpConnRemAddress */ - if (pcb->state == LISTEN) { - value->u32 = IP4_ADDR_ANY4->addr; - } else { - value->u32 = ip_2_ip4(&pcb->remote_ip)->addr; - } - break; - case 5: /* tcpConnRemPort */ - if (pcb->state == LISTEN) { - value->u32 = 0; - } else { - value->u32 = pcb->remote_port; - } - break; - default: - LWIP_ASSERT("invalid id", 0); - return SNMP_ERR_NOSUCHINSTANCE; + case 1: /* tcpConnState */ + value->u32 = pcb->state + 1; + break; + case 2: /* tcpConnLocalAddress */ + value->u32 = ip_2_ip4(&pcb->local_ip)->addr; + break; + case 3: /* tcpConnLocalPort */ + value->u32 = pcb->local_port; + break; + case 4: /* tcpConnRemAddress */ + if (pcb->state == LISTEN) { + value->u32 = IP4_ADDR_ANY4->addr; + } else { + value->u32 = ip_2_ip4(&pcb->remote_ip)->addr; + } + break; + case 5: /* tcpConnRemPort */ + if (pcb->state == LISTEN) { + value->u32 = 0; + } else { + value->u32 = pcb->remote_port; + } + break; + default: + LWIP_ASSERT("invalid id", 0); + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -tcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +tcp_ConnTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { u8_t i; ip4_addr_t local_ip; @@ -220,7 +227,7 @@ tcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row while (pcb != NULL) { /* do local IP and local port match? */ if (IP_IS_V4_VAL(pcb->local_ip) && - ip4_addr_cmp(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) { + ip4_addr_cmp(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) { /* PCBs in state LISTEN are not connected and have no remote_ip or remote_port */ if (pcb->state == LISTEN) { @@ -230,7 +237,7 @@ tcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row } } else { if (IP_IS_V4_VAL(pcb->remote_ip) && - ip4_addr_cmp(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) { + ip4_addr_cmp(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) { /* fill in object properties */ return tcp_ConnTable_get_cell_value_core(pcb, column, value, value_len); } @@ -246,7 +253,7 @@ tcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row } static snmp_err_t -tcp_ConnTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +tcp_ConnTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { u8_t i; struct tcp_pcb *pcb; @@ -290,7 +297,7 @@ tcp_ConnTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_ if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) { snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); /* fill in object properties */ - return tcp_ConnTable_get_cell_value_core((struct tcp_pcb*)state.reference, column, value, value_len); + return tcp_ConnTable_get_cell_value_core((struct tcp_pcb *)state.reference, column, value, value_len); } /* not found */ @@ -302,43 +309,43 @@ tcp_ConnTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_ /* --- tcpConnectionTable --- */ static snmp_err_t -tcp_ConnectionTable_get_cell_value_core(const u32_t* column, struct tcp_pcb *pcb, union snmp_variant_value* value) +tcp_ConnectionTable_get_cell_value_core(const u32_t *column, struct tcp_pcb *pcb, union snmp_variant_value *value) { /* all items except tcpConnectionState and tcpConnectionProcess are declared as not-accessible */ switch (*column) { - case 7: /* tcpConnectionState */ - value->u32 = pcb->state + 1; - break; - case 8: /* tcpConnectionProcess */ - value->u32 = 0; /* not supported */ - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 7: /* tcpConnectionState */ + value->u32 = pcb->state + 1; + break; + case 8: /* tcpConnectionProcess */ + value->u32 = 0; /* not supported */ + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -tcp_ConnectionTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +tcp_ConnectionTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip_addr_t local_ip, remote_ip; u16_t local_port, remote_port; struct tcp_pcb *pcb; u8_t idx = 0; u8_t i; - struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs}; + struct tcp_pcb **const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs}; LWIP_UNUSED_ARG(value_len); /* tcpConnectionLocalAddressType + tcpConnectionLocalAddress + tcpConnectionLocalPort */ - idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port); + idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port); if (idx == 0) { return SNMP_ERR_NOSUCHINSTANCE; } /* tcpConnectionRemAddressType + tcpConnectionRemAddress + tcpConnectionRemPort */ - idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port); + idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &remote_ip, &remote_port); if (idx == 0) { return SNMP_ERR_NOSUCHINSTANCE; } @@ -349,9 +356,9 @@ tcp_ConnectionTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8 while (pcb != NULL) { if (ip_addr_cmp(&local_ip, &pcb->local_ip) && - (local_port == pcb->local_port) && - ip_addr_cmp(&remote_ip, &pcb->remote_ip) && - (remote_port == pcb->remote_port)) { + (local_port == pcb->local_port) && + ip_addr_cmp(&remote_ip, &pcb->remote_ip) && + (remote_port == pcb->remote_port)) { /* fill in object properties */ return tcp_ConnectionTable_get_cell_value_core(column, pcb, value); } @@ -364,7 +371,7 @@ tcp_ConnectionTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8 } static snmp_err_t -tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct tcp_pcb *pcb; struct snmp_next_oid_state state; @@ -372,7 +379,7 @@ tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct * 1x tcpConnectionRemAddressType + 1x OID len + 16x tcpConnectionRemAddress + 1x tcpConnectionRemPort */ u32_t result_temp[38]; u8_t i; - struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs}; + struct tcp_pcb **const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs}; LWIP_UNUSED_ARG(value_len); @@ -404,7 +411,7 @@ tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) { snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); /* fill in object properties */ - return tcp_ConnectionTable_get_cell_value_core(column, (struct tcp_pcb*)state.reference, value); + return tcp_ConnectionTable_get_cell_value_core(column, (struct tcp_pcb *)state.reference, value); } else { /* not found */ return SNMP_ERR_NOSUCHINSTANCE; @@ -414,22 +421,22 @@ tcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct /* --- tcpListenerTable --- */ static snmp_err_t -tcp_ListenerTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value) +tcp_ListenerTable_get_cell_value_core(const u32_t *column, union snmp_variant_value *value) { /* all items except tcpListenerProcess are declared as not-accessible */ switch (*column) { - case 4: /* tcpListenerProcess */ - value->u32 = 0; /* not supported */ - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 4: /* tcpListenerProcess */ + value->u32 = 0; /* not supported */ + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -tcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +tcp_ListenerTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip_addr_t local_ip; u16_t local_port; @@ -439,7 +446,7 @@ tcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t LWIP_UNUSED_ARG(value_len); /* tcpListenerLocalAddressType + tcpListenerLocalAddress + tcpListenerLocalPort */ - idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port); + idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port); if (idx == 0) { return SNMP_ERR_NOSUCHINSTANCE; } @@ -448,7 +455,7 @@ tcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t pcb = tcp_listen_pcbs.listen_pcbs; while (pcb != NULL) { if (ip_addr_cmp(&local_ip, &pcb->local_ip) && - (local_port == pcb->local_port)) { + (local_port == pcb->local_port)) { /* fill in object properties */ return tcp_ListenerTable_get_cell_value_core(column, value); } @@ -460,7 +467,7 @@ tcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t } static snmp_err_t -tcp_ListenerTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +tcp_ListenerTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct tcp_pcb_listen *pcb; struct snmp_next_oid_state state; @@ -512,8 +519,10 @@ static const struct snmp_scalar_node tcp_OutSegs = SNMP_SCALAR_CREATE_NODE static const struct snmp_scalar_node tcp_RetransSegs = SNMP_SCALAR_CREATE_NODE_READONLY(12, SNMP_ASN1_TYPE_COUNTER, tcp_get_value); static const struct snmp_scalar_node tcp_InErrs = SNMP_SCALAR_CREATE_NODE_READONLY(14, SNMP_ASN1_TYPE_COUNTER, tcp_get_value); static const struct snmp_scalar_node tcp_OutRsts = SNMP_SCALAR_CREATE_NODE_READONLY(15, SNMP_ASN1_TYPE_COUNTER, tcp_get_value); +#if LWIP_HAVE_INT64 static const struct snmp_scalar_node tcp_HCInSegs = SNMP_SCALAR_CREATE_NODE_READONLY(17, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value); static const struct snmp_scalar_node tcp_HCOutSegs = SNMP_SCALAR_CREATE_NODE_READONLY(18, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value); +#endif #if LWIP_IPV4 static const struct snmp_table_simple_col_def tcp_ConnTable_columns[] = { @@ -561,12 +570,14 @@ CREATE_LWIP_SYNC_NODE(13, tcp_ConnTable) #endif /* LWIP_IPV4 */ CREATE_LWIP_SYNC_NODE(14, tcp_InErrs) CREATE_LWIP_SYNC_NODE(15, tcp_OutRsts) +#if LWIP_HAVE_INT64 CREATE_LWIP_SYNC_NODE(17, tcp_HCInSegs) CREATE_LWIP_SYNC_NODE(18, tcp_HCOutSegs) +#endif CREATE_LWIP_SYNC_NODE(19, tcp_ConnectionTable) CREATE_LWIP_SYNC_NODE(20, tcp_ListenerTable) -static const struct snmp_node* const tcp_nodes[] = { +static const struct snmp_node *const tcp_nodes[] = { &SYNC_NODE_NAME(tcp_RtoAlgorithm).node.node, &SYNC_NODE_NAME(tcp_RtoMin).node.node, &SYNC_NODE_NAME(tcp_RtoMax).node.node, @@ -585,8 +596,10 @@ static const struct snmp_node* const tcp_nodes[] = { &SYNC_NODE_NAME(tcp_InErrs).node.node, &SYNC_NODE_NAME(tcp_OutRsts).node.node, &SYNC_NODE_NAME(tcp_HCInSegs).node.node, +#if LWIP_HAVE_INT64 &SYNC_NODE_NAME(tcp_HCOutSegs).node.node, &SYNC_NODE_NAME(tcp_ConnectionTable).node.node, +#endif &SYNC_NODE_NAME(tcp_ListenerTable).node.node }; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_udp.c similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_udp.c index 6a983df..d0bd5de 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_mib2_udp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_mib2_udp.c @@ -58,32 +58,40 @@ /* --- udp .1.3.6.1.2.1.7 ----------------------------------------------------- */ static s16_t -udp_get_value(struct snmp_node_instance* instance, void* value) +udp_get_value(struct snmp_node_instance *instance, void *value) { - u32_t *uint_ptr = (u32_t*)value; + u32_t *uint_ptr = (u32_t *)value; switch (instance->node->oid) { - case 1: /* udpInDatagrams */ - *uint_ptr = STATS_GET(mib2.udpindatagrams); - return sizeof(*uint_ptr); - case 2: /* udpNoPorts */ - *uint_ptr = STATS_GET(mib2.udpnoports); - return sizeof(*uint_ptr); - case 3: /* udpInErrors */ - *uint_ptr = STATS_GET(mib2.udpinerrors); - return sizeof(*uint_ptr); - case 4: /* udpOutDatagrams */ - *uint_ptr = STATS_GET(mib2.udpoutdatagrams); - return sizeof(*uint_ptr); - case 8: /* udpHCInDatagrams */ - memset(value, 0, 2*sizeof(u32_t)); /* not supported */ - return 2*sizeof(u32_t); - case 9: /* udpHCOutDatagrams */ - memset(value, 0, 2*sizeof(u32_t)); /* not supported */ - return 2*sizeof(u32_t); - default: - LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); - break; + case 1: /* udpInDatagrams */ + *uint_ptr = STATS_GET(mib2.udpindatagrams); + return sizeof(*uint_ptr); + case 2: /* udpNoPorts */ + *uint_ptr = STATS_GET(mib2.udpnoports); + return sizeof(*uint_ptr); + case 3: /* udpInErrors */ + *uint_ptr = STATS_GET(mib2.udpinerrors); + return sizeof(*uint_ptr); + case 4: /* udpOutDatagrams */ + *uint_ptr = STATS_GET(mib2.udpoutdatagrams); + return sizeof(*uint_ptr); +#if LWIP_HAVE_INT64 + case 8: { /* udpHCInDatagrams */ + /* use the 32 bit counter for now... */ + u64_t val64 = STATS_GET(mib2.udpindatagrams); + *((u64_t *)value) = val64; + } + return sizeof(u64_t); + case 9: { /* udpHCOutDatagrams */ + /* use the 32 bit counter for now... */ + u64_t val64 = STATS_GET(mib2.udpoutdatagrams); + *((u64_t *)value) = val64; + } + return sizeof(u64_t); +#endif + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("udp_get_value(): unknown id: %"S32_F"\n", instance->node->oid)); + break; } return 0; @@ -92,22 +100,22 @@ udp_get_value(struct snmp_node_instance* instance, void* value) /* --- udpEndpointTable --- */ static snmp_err_t -udp_endpointTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value) +udp_endpointTable_get_cell_value_core(const u32_t *column, union snmp_variant_value *value) { /* all items except udpEndpointProcess are declared as not-accessible */ switch (*column) { - case 8: /* udpEndpointProcess */ - value->u32 = 0; /* not supported */ - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 8: /* udpEndpointProcess */ + value->u32 = 0; /* not supported */ + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } static snmp_err_t -udp_endpointTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +udp_endpointTable_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip_addr_t local_ip, remote_ip; u16_t local_port, remote_port; @@ -117,32 +125,32 @@ udp_endpointTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t LWIP_UNUSED_ARG(value_len); /* udpEndpointLocalAddressType + udpEndpointLocalAddress + udpEndpointLocalPort */ - idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port); + idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &local_ip, &local_port); if (idx == 0) { return SNMP_ERR_NOSUCHINSTANCE; } /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */ - idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port); + idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len - idx, &remote_ip, &remote_port); if (idx == 0) { return SNMP_ERR_NOSUCHINSTANCE; } /* udpEndpointInstance */ - if (row_oid_len < (idx+1)) { + if (row_oid_len < (idx + 1)) { return SNMP_ERR_NOSUCHINSTANCE; } if (row_oid[idx] != 0) { return SNMP_ERR_NOSUCHINSTANCE; } - + /* find udp_pcb with requested ip and port*/ pcb = udp_pcbs; while (pcb != NULL) { if (ip_addr_cmp(&local_ip, &pcb->local_ip) && - (local_port == pcb->local_port) && - ip_addr_cmp(&remote_ip, &pcb->remote_ip) && - (remote_port == pcb->remote_port)) { + (local_port == pcb->local_port) && + ip_addr_cmp(&remote_ip, &pcb->remote_ip) && + (remote_port == pcb->remote_port)) { /* fill in object properties */ return udp_endpointTable_get_cell_value_core(column, value); } @@ -153,8 +161,8 @@ udp_endpointTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t return SNMP_ERR_NOSUCHINSTANCE; } -static snmp_err_t -udp_endpointTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +static snmp_err_t +udp_endpointTable_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct udp_pcb *pcb; struct snmp_next_oid_state state; @@ -181,12 +189,12 @@ udp_endpointTable_get_next_cell_instance_and_value(const u32_t* column, struct s /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */ idx += snmp_ip_port_to_oid(&pcb->remote_ip, pcb->remote_port, &test_oid[idx]); - test_oid[idx] = 0; /* udpEndpointInstance */ + test_oid[idx] = 0; /* udpEndpointInstance */ idx++; - + /* check generated OID: is it a candidate for the next one? */ snmp_next_oid_check(&state, test_oid, idx, NULL); - + pcb = pcb->next; } @@ -214,29 +222,29 @@ static const struct snmp_oid_range udp_Table_oid_ranges[] = { { 1, 0xffff } /* Port */ }; -static snmp_err_t -udp_Table_get_cell_value_core(struct udp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len) +static snmp_err_t +udp_Table_get_cell_value_core(struct udp_pcb *pcb, const u32_t *column, union snmp_variant_value *value, u32_t *value_len) { LWIP_UNUSED_ARG(value_len); switch (*column) { - case 1: /* udpLocalAddress */ - /* set reference to PCB local IP and return a generic node that copies IP4 addresses */ - value->u32 = ip_2_ip4(&pcb->local_ip)->addr; - break; - case 2: /* udpLocalPort */ - /* set reference to PCB local port and return a generic node that copies u16_t values */ - value->u32 = pcb->local_port; - break; - default: - return SNMP_ERR_NOSUCHINSTANCE; + case 1: /* udpLocalAddress */ + /* set reference to PCB local IP and return a generic node that copies IP4 addresses */ + value->u32 = ip_2_ip4(&pcb->local_ip)->addr; + break; + case 2: /* udpLocalPort */ + /* set reference to PCB local port and return a generic node that copies u16_t values */ + value->u32 = pcb->local_port; + break; + default: + return SNMP_ERR_NOSUCHINSTANCE; } return SNMP_ERR_NOERROR; } -static snmp_err_t -udp_Table_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len) +static snmp_err_t +udp_Table_get_cell_value(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, union snmp_variant_value *value, u32_t *value_len) { ip4_addr_t ip; u16_t port; @@ -267,8 +275,8 @@ udp_Table_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid return SNMP_ERR_NOSUCHINSTANCE; } -static snmp_err_t -udp_Table_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len) +static snmp_err_t +udp_Table_get_next_cell_instance_and_value(const u32_t *column, struct snmp_obj_id *row_oid, union snmp_variant_value *value, u32_t *value_len) { struct udp_pcb *pcb; struct snmp_next_oid_state state; @@ -289,7 +297,7 @@ udp_Table_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_ /* check generated OID: is it a candidate for the next one? */ snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(udp_Table_oid_ranges), pcb); } - + pcb = pcb->next; } @@ -297,7 +305,7 @@ udp_Table_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_ if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) { snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); /* fill in object properties */ - return udp_Table_get_cell_value_core((struct udp_pcb*)state.reference, column, value, value_len); + return udp_Table_get_cell_value_core((struct udp_pcb *)state.reference, column, value, value_len); } else { /* not found */ return SNMP_ERR_NOSUCHINSTANCE; @@ -310,8 +318,10 @@ static const struct snmp_scalar_node udp_inDatagrams = SNMP_SCALAR_CREATE_NOD static const struct snmp_scalar_node udp_noPorts = SNMP_SCALAR_CREATE_NODE_READONLY(2, SNMP_ASN1_TYPE_COUNTER, udp_get_value); static const struct snmp_scalar_node udp_inErrors = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_COUNTER, udp_get_value); static const struct snmp_scalar_node udp_outDatagrams = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_COUNTER, udp_get_value); +#if LWIP_HAVE_INT64 static const struct snmp_scalar_node udp_HCInDatagrams = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER64, udp_get_value); static const struct snmp_scalar_node udp_HCOutDatagrams = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_COUNTER64, udp_get_value); +#endif #if LWIP_IPV4 static const struct snmp_table_simple_col_def udp_Table_columns[] = { @@ -322,13 +332,13 @@ static const struct snmp_table_simple_node udp_Table = SNMP_TABLE_CREATE_SIMPLE( #endif /* LWIP_IPV4 */ static const struct snmp_table_simple_col_def udp_endpointTable_columns[] = { - /* all items except udpEndpointProcess are declared as not-accessible */ + /* all items except udpEndpointProcess are declared as not-accessible */ { 8, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 } /* udpEndpointProcess */ }; static const struct snmp_table_simple_node udp_endpointTable = SNMP_TABLE_CREATE_SIMPLE(7, udp_endpointTable_columns, udp_endpointTable_get_cell_value, udp_endpointTable_get_next_cell_instance_and_value); -/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */ +/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */ CREATE_LWIP_SYNC_NODE(1, udp_inDatagrams) CREATE_LWIP_SYNC_NODE(2, udp_noPorts) CREATE_LWIP_SYNC_NODE(3, udp_inErrors) @@ -337,10 +347,12 @@ CREATE_LWIP_SYNC_NODE(4, udp_outDatagrams) CREATE_LWIP_SYNC_NODE(5, udp_Table) #endif /* LWIP_IPV4 */ CREATE_LWIP_SYNC_NODE(7, udp_endpointTable) +#if LWIP_HAVE_INT64 CREATE_LWIP_SYNC_NODE(8, udp_HCInDatagrams) CREATE_LWIP_SYNC_NODE(9, udp_HCOutDatagrams) +#endif -static const struct snmp_node* const udp_nodes[] = { +static const struct snmp_node *const udp_nodes[] = { &SYNC_NODE_NAME(udp_inDatagrams).node.node, &SYNC_NODE_NAME(udp_noPorts).node.node, &SYNC_NODE_NAME(udp_inErrors).node.node, @@ -348,9 +360,12 @@ static const struct snmp_node* const udp_nodes[] = { #if LWIP_IPV4 &SYNC_NODE_NAME(udp_Table).node.node, #endif /* LWIP_IPV4 */ - &SYNC_NODE_NAME(udp_endpointTable).node.node, + &SYNC_NODE_NAME(udp_endpointTable).node.node +#if LWIP_HAVE_INT64 + , &SYNC_NODE_NAME(udp_HCInDatagrams).node.node, &SYNC_NODE_NAME(udp_HCOutDatagrams).node.node +#endif }; const struct snmp_tree_node snmp_mib2_udp_root = SNMP_CREATE_TREE_NODE(7, udp_nodes); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.c similarity index 78% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.c index 0cb7ca9..0b6693a 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.c @@ -48,13 +48,21 @@ #if LWIP_SNMP_V3 #include "lwip/apps/snmpv3.h" #include "snmpv3_priv.h" -#ifdef LWIP_SNMPV3_INCLUDE_ENGINE -#include LWIP_SNMPV3_INCLUDE_ENGINE +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME #endif #endif #include +#define SNMP_V3_AUTH_FLAG 0x01 +#define SNMP_V3_PRIV_FLAG 0x02 + +/* Security levels */ +#define SNMP_V3_NOAUTHNOPRIV 0x00 +#define SNMP_V3_AUTHNOPRIV SNMP_V3_AUTH_FLAG +#define SNMP_V3_AUTHPRIV (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG) + /* public (non-static) constants */ /** SNMP community string */ const char *snmp_community = SNMP_COMMUNITY; @@ -64,7 +72,88 @@ const char *snmp_community_write = SNMP_COMMUNITY_WRITE; const char *snmp_community_trap = SNMP_COMMUNITY_TRAP; snmp_write_callback_fct snmp_write_callback = NULL; -void* snmp_write_callback_arg = NULL; +void *snmp_write_callback_arg = NULL; + +#if LWIP_SNMP_CONFIGURE_VERSIONS + +static u8_t v1_enabled = 1; +static u8_t v2c_enabled = 1; +static u8_t v3_enabled = 1; + +static u8_t +snmp_version_enabled(u8_t version) +{ + if (version == SNMP_VERSION_1) { + return v1_enabled; + } else if (version == SNMP_VERSION_2c) { + return v2c_enabled; + } +#if LWIP_SNMP_V3 + else if (version == SNMP_VERSION_3) { + return v3_enabled; + } +#endif + else { + LWIP_ASSERT("Invalid SNMP version", 0); + return 0; + } +} + +u8_t +snmp_v1_enabled(void) +{ + return snmp_version_enabled(SNMP_VERSION_1); +} + +u8_t +snmp_v2c_enabled(void) +{ + return snmp_version_enabled(SNMP_VERSION_2c); +} + +u8_t +snmp_v3_enabled(void) +{ + return snmp_version_enabled(SNMP_VERSION_3); +} + +static void +snmp_version_enable(u8_t version, u8_t enable) +{ + if (version == SNMP_VERSION_1) { + v1_enabled = enable; + } else if (version == SNMP_VERSION_2c) { + v2c_enabled = enable; + } +#if LWIP_SNMP_V3 + else if (version == SNMP_VERSION_3) { + v3_enabled = enable; + } +#endif + else { + LWIP_ASSERT("Invalid SNMP version", 0); + } +} + +void +snmp_v1_enable(u8_t enable) +{ + snmp_version_enable(SNMP_VERSION_1, enable); +} + +void +snmp_v2c_enable(u8_t enable) +{ + snmp_version_enable(SNMP_VERSION_2c, enable); +} + +void +snmp_v3_enable(u8_t enable) +{ + snmp_version_enable(SNMP_VERSION_3, enable); +} + +#endif /** * @ingroup snmp_core @@ -86,8 +175,9 @@ snmp_get_community(void) * @param community is a pointer to new community string */ void -snmp_set_community(const char * const community) +snmp_set_community(const char *const community) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN); snmp_community = community; } @@ -123,8 +213,9 @@ snmp_get_community_trap(void) * @param community is a pointer to new write-access community string */ void -snmp_set_community_write(const char * const community) +snmp_set_community_write(const char *const community) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("community string must not be NULL", community != NULL); LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN); snmp_community_write = community; @@ -139,8 +230,9 @@ snmp_set_community_write(const char * const community) * @param community is a pointer to new trap community string */ void -snmp_set_community_trap(const char * const community) +snmp_set_community_trap(const char *const community) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("community string is too long!", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN); snmp_community_trap = community; } @@ -149,9 +241,10 @@ snmp_set_community_trap(const char * const community) * @ingroup snmp_core * Callback fired on every successful write access */ -void -snmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg) +void +snmp_set_write_callback(snmp_write_callback_fct write_callback, void *callback_arg) { + LWIP_ASSERT_CORE_LOCKED(); snmp_write_callback = write_callback; snmp_write_callback_arg = callback_arg; } @@ -180,7 +273,7 @@ snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t por { err_t err; struct snmp_request request; - + memset(&request, 0, sizeof(request)); request.handle = handle; request.source_ip = source_ip; @@ -206,23 +299,83 @@ snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t por err = snmp_process_set_request(&request); } } +#if LWIP_SNMP_V3 + else { + struct snmp_varbind vb; + + vb.next = NULL; + vb.prev = NULL; + vb.type = SNMP_ASN1_TYPE_COUNTER32; + vb.value_len = sizeof(u32_t); + + switch (request.error_status) { + case SNMP_ERR_AUTHORIZATIONERROR: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.wrongdigests; + } + break; + case SNMP_ERR_UNKNOWN_ENGINEID: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.unknownengineids; + } + break; + case SNMP_ERR_UNKNOWN_SECURITYNAME: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.unknownusernames; + } + break; + case SNMP_ERR_UNSUPPORTED_SECLEVEL: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.unsupportedseclevels; + } + break; + case SNMP_ERR_NOTINTIMEWINDOW: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.notintimewindows; + } + break; + case SNMP_ERR_DECRYIPTION_ERROR: { + static const u32_t oid[] = { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 }; + snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid)); + vb.value = &snmp_stats.decryptionerrors; + } + break; + default: + /* Unknown or unhandled error_status */ + err = ERR_ARG; + } + + if (err == ERR_OK) { + snmp_append_outbound_varbind(&(request.outbound_pbuf_stream), &vb); + request.error_status = SNMP_ERR_NOERROR; + } + + request.request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_REPORT); + request.request_id = request.msg_id; + } +#endif if (err == ERR_OK) { err = snmp_complete_outbound_frame(&request); - + if (err == ERR_OK) { err = snmp_sendto(request.handle, request.outbound_pbuf, request.source_ip, request.source_port); - if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) - && (request.error_status == SNMP_ERR_NOERROR) - && (snmp_write_callback != NULL)) { + if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) + && (request.error_status == SNMP_ERR_NOERROR) + && (snmp_write_callback != NULL)) { /* raise write notification for all written objects */ snmp_execute_write_callbacks(&request); } } } } - + if (request.outbound_pbuf != NULL) { pbuf_free(request.outbound_pbuf); } @@ -230,21 +383,23 @@ snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t por } static u8_t -snmp_msg_getnext_validate_node_inst(struct snmp_node_instance* node_instance, void* validate_arg) +snmp_msg_getnext_validate_node_inst(struct snmp_node_instance *node_instance, void *validate_arg) { if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != SNMP_NODE_INSTANCE_ACCESS_READ) || (node_instance->get_value == NULL)) { return SNMP_ERR_NOSUCHINSTANCE; } - if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((struct snmp_request*)validate_arg)->version == SNMP_VERSION_1)) { +#if LWIP_HAVE_INT64 + if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((struct snmp_request *)validate_arg)->version == SNMP_VERSION_1)) { /* according to RFC 2089 skip Counter64 objects in GetNext requests from v1 clients */ return SNMP_ERR_NOSUCHINSTANCE; } +#endif return SNMP_ERR_NOERROR; } -static void +static void snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next) { err_t err; @@ -296,10 +451,10 @@ snmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t } } else { s16_t len = node_instance.get_value(&node_instance, vb->value); - vb->type = node_instance.asn1_type; - if(len >= 0) { + if (len >= 0) { vb->value_len = (u16_t)len; /* cast is OK because we checked >= 0 above */ + vb->type = node_instance.asn1_type; LWIP_ASSERT("SNMP_MAX_VALUE_SIZE is configured too low", (vb->value_len & ~SNMP_GET_VALUE_RAW_DATA) <= SNMP_MAX_VALUE_SIZE); err = snmp_append_outbound_varbind(&request->outbound_pbuf_stream, vb); @@ -388,7 +543,7 @@ snmp_process_getnext_request(struct snmp_request *request) request->error_status = SNMP_ERR_GENERROR; } } - + return ERR_OK; } @@ -447,7 +602,7 @@ snmp_process_getbulk_request(struct snmp_request *request) while ((request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (request->outbound_pbuf_stream.offset != repetition_offset)) { u8_t all_endofmibview = 1; - + snmp_vb_enumerator_init(&repetition_varbind_enumerator, request->outbound_pbuf, repetition_offset, request->outbound_pbuf_stream.offset - repetition_offset); repetition_offset = request->outbound_pbuf_stream.offset; /* for next loop */ @@ -478,7 +633,7 @@ snmp_process_getbulk_request(struct snmp_request *request) /* stop when all varbinds in a loop return EndOfMibView */ break; } - + repetitions--; } @@ -510,7 +665,7 @@ snmp_process_set_request(struct snmp_request *request) if (err == SNMP_VB_ENUMERATOR_ERR_OK) { struct snmp_node_instance node_instance; memset(&node_instance, 0, sizeof(node_instance)); - + request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance); if (request->error_status == SNMP_ERR_NOERROR) { if (node_instance.asn1_type != vb.type) { @@ -615,9 +770,13 @@ snmp_parse_inbound_frame(struct snmp_request *request) s32_t parent_tlv_value_len; s32_t s32_value; err_t err; +#if LWIP_SNMP_V3 + snmpv3_auth_algo_t auth; + snmpv3_priv_algo_t priv; +#endif IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len)); - + /* decode main container consisting of version, community and PDU */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len == pbuf_stream.length)); @@ -628,15 +787,19 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER); parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv); IF_PARSE_ASSERT(parent_tlv_value_len > 0); - + IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value)); - if ((s32_value != SNMP_VERSION_1) && - (s32_value != SNMP_VERSION_2c) + + if (((s32_value != SNMP_VERSION_1) && + (s32_value != SNMP_VERSION_2c) #if LWIP_SNMP_V3 - && (s32_value != SNMP_VERSION_3) + && (s32_value != SNMP_VERSION_3) #endif - ) - { + ) +#if LWIP_SNMP_CONFIGURE_VERSIONS + || (!snmp_version_enabled(s32_value)) +#endif + ) { /* unsupported SNMP version */ snmp_stats.inbadversions++; return ERR_ARG; @@ -650,8 +813,9 @@ snmp_parse_inbound_frame(struct snmp_request *request) /* SNMPv3 doesn't use communities */ /* @todo: Differentiate read/write access */ - strcpy((char*)request->community, snmp_community); - request->community_strlen = (u16_t)strlen(snmp_community); + strncpy((char *)request->community, snmp_community, SNMP_MAX_COMMUNITY_STR_LEN); + request->community[SNMP_MAX_COMMUNITY_STR_LEN] = 0; /* ensure NULL termination (strncpy does NOT guarantee it!) */ + request->community_strlen = (u16_t)strnlen((char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN); /* RFC3414 globalData */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); @@ -720,7 +884,7 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authoritative_engine_id, - &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); + &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); request->msg_authoritative_engine_id_len = (u8_t)u16_value; /* msgAuthoritativeEngineBoots */ @@ -736,7 +900,6 @@ snmp_parse_inbound_frame(struct snmp_request *request) parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv); IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_time)); - /* @todo: Implement time window checking */ /* msgUserName */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); @@ -745,10 +908,8 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_user_name, - &u16_value, SNMP_V3_MAX_USER_LENGTH)); + &u16_value, SNMP_V3_MAX_USER_LENGTH)); request->msg_user_name_len = (u8_t)u16_value; - /* @todo: Implement unknown user error response */ - IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, NULL, NULL)); /* msgAuthenticationParameters */ memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH); @@ -760,38 +921,10 @@ snmp_parse_inbound_frame(struct snmp_request *request) inbound_msgAuthenticationParameters_offset = pbuf_stream.offset; LWIP_UNUSED_ARG(inbound_msgAuthenticationParameters_offset); /* Read auth parameters */ - IF_PARSE_ASSERT(tlv.value_len <= SNMP_V3_MAX_AUTH_PARAM_LENGTH); + /* IF_PARSE_ASSERT(tlv.value_len <= SNMP_V3_MAX_AUTH_PARAM_LENGTH); */ IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authentication_parameters, - &u16_value, tlv.value_len)); - -#if LWIP_SNMP_V3_CRYPTO - if (request->msg_flags & SNMP_V3_AUTH_FLAG) { - const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 }; - u8_t key[20]; - u8_t algo; - u8_t hmac[LWIP_MAX(SNMP_V3_SHA_LEN, SNMP_V3_MD5_LEN)]; - struct snmp_pbuf_stream auth_stream; - - /* Rewind stream */ - IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len)); - IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&pbuf_stream, inbound_msgAuthenticationParameters_offset)); - /* Set auth parameters to zero for verification */ - IF_PARSE_EXEC(snmp_asn1_enc_raw(&pbuf_stream, zero_arr, tlv.value_len)); - - /* Verify authentication */ - IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len)); - - IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL)); - IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, algo, hmac)); - /* @todo: Implement error response */ - IF_PARSE_EXEC(memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)); - } -#else - /* Ungraceful exit if we encounter cryptography and don't support it. - * @todo: Implement error response - */ - IF_PARSE_ASSERT(!(request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG))); -#endif + &u16_value, tlv.value_len)); + request->msg_authentication_parameters_len = (u8_t)u16_value; /* msgPrivacyParameters */ memset(request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH); @@ -801,25 +934,168 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_privacy_parameters, - &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH)); + &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH)); + request->msg_privacy_parameters_len = (u8_t)u16_value; + /* validate securityParameters here (do this after decoding because we don't want to increase other counters for wrong frames) + * 1) securityParameters was correctly serialized if we reach here. + * 2) securityParameters are already cached. + * 3) if msgAuthoritativeEngineID is unknown, zero-length or too long: + b) https://tools.ietf.org/html/rfc3414#section-7 + */ + { + const char *eid; + u8_t eid_len; + + snmpv3_get_engine_id(&eid, &eid_len); + + if ((request->msg_authoritative_engine_id_len == 0) || + (request->msg_authoritative_engine_id_len != eid_len) || + (memcmp(eid, request->msg_authoritative_engine_id, eid_len) != 0)) { + snmp_stats.unknownengineids++; + request->msg_flags = 0; /* noauthnopriv */ + request->error_status = SNMP_ERR_UNKNOWN_ENGINEID; + return ERR_OK; + } + } + + /* 4) verify username */ + if (snmpv3_get_user((char *)request->msg_user_name, &auth, NULL, &priv, NULL)) { + snmp_stats.unknownusernames++; + request->msg_flags = 0; /* noauthnopriv */ + request->error_status = SNMP_ERR_UNKNOWN_SECURITYNAME; + return ERR_OK; + } + + /* 5) verify security level */ + switch (request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)) { + case SNMP_V3_NOAUTHNOPRIV: + if ((auth != SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) { + /* Invalid security level for user */ + snmp_stats.unsupportedseclevels++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL; + return ERR_OK; + } + break; #if LWIP_SNMP_V3_CRYPTO - /* Decrypt message */ - if (request->msg_flags & SNMP_V3_PRIV_FLAG) { + case SNMP_V3_AUTHNOPRIV: + if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv != SNMP_V3_PRIV_ALGO_INVAL)) { + /* Invalid security level for user */ + snmp_stats.unsupportedseclevels++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL; + return ERR_OK; + } + break; + case SNMP_V3_AUTHPRIV: + if ((auth == SNMP_V3_AUTH_ALGO_INVAL) || (priv == SNMP_V3_PRIV_ALGO_INVAL)) { + /* Invalid security level for user */ + snmp_stats.unsupportedseclevels++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL; + return ERR_OK; + } + break; +#endif + default: + snmp_stats.unsupportedseclevels++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_UNSUPPORTED_SECLEVEL; + return ERR_OK; + } + + /* 6) if securitylevel specifies authentication, authenticate message. */ +#if LWIP_SNMP_V3_CRYPTO + if (request->msg_flags & SNMP_V3_AUTH_FLAG) { + const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 }; + u8_t key[20]; + u8_t hmac[LWIP_MAX(SNMP_V3_SHA_LEN, SNMP_V3_MD5_LEN)]; + struct snmp_pbuf_stream auth_stream; + + if (request->msg_authentication_parameters_len > SNMP_V3_MAX_AUTH_PARAM_LENGTH) { + snmp_stats.wrongdigests++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_AUTHORIZATIONERROR; + return ERR_OK; + } + + /* Rewind stream */ + IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len)); + IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&auth_stream, inbound_msgAuthenticationParameters_offset)); + /* Set auth parameters to zero for verification */ + IF_PARSE_EXEC(snmp_asn1_enc_raw(&auth_stream, zero_arr, request->msg_authentication_parameters_len)); + + /* Verify authentication */ + IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len)); + + IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, &auth, key, NULL, NULL)); + IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, auth, hmac)); + + if (memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH)) { + snmp_stats.wrongdigests++; + request->msg_flags = SNMP_V3_NOAUTHNOPRIV; + request->error_status = SNMP_ERR_AUTHORIZATIONERROR; + return ERR_OK; + } + + /* 7) if securitylevel specifies authentication, verify engineboots, enginetime and lastenginetime */ + { + s32_t boots = snmpv3_get_engine_boots_internal(); + if ((request->msg_authoritative_engine_boots != boots) || (boots == 2147483647UL)) { + snmp_stats.notintimewindows++; + request->msg_flags = SNMP_V3_AUTHNOPRIV; + request->error_status = SNMP_ERR_NOTINTIMEWINDOW; + return ERR_OK; + } + } + { + s32_t time = snmpv3_get_engine_time_internal(); + if (request->msg_authoritative_engine_time > (time + 150)) { + snmp_stats.notintimewindows++; + request->msg_flags = SNMP_V3_AUTHNOPRIV; + request->error_status = SNMP_ERR_NOTINTIMEWINDOW; + return ERR_OK; + } else if (time > 150) { + if (request->msg_authoritative_engine_time < (time - 150)) { + snmp_stats.notintimewindows++; + request->msg_flags = SNMP_V3_AUTHNOPRIV; + request->error_status = SNMP_ERR_NOTINTIMEWINDOW; + return ERR_OK; + } + } + } + } +#endif + + /* 8) if securitylevel specifies privacy, decrypt message. */ +#if LWIP_SNMP_V3_CRYPTO + if (request->msg_flags & SNMP_V3_PRIV_FLAG) { + /* Decrypt message */ + u8_t key[20]; - u8_t algo; IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING); parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv); IF_PARSE_ASSERT(parent_tlv_value_len > 0); - IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key)); - IF_PARSE_EXEC(snmpv3_crypt(&pbuf_stream, tlv.value_len, key, - request->msg_privacy_parameters, request->msg_authoritative_engine_boots, - request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_DECRYPT)); + IF_PARSE_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &priv, key)); + if (snmpv3_crypt(&pbuf_stream, tlv.value_len, key, + request->msg_privacy_parameters, request->msg_authoritative_engine_boots, + request->msg_authoritative_engine_time, priv, SNMP_V3_PRIV_MODE_DECRYPT) != ERR_OK) { + snmp_stats.decryptionerrors++; + request->msg_flags = SNMP_V3_AUTHNOPRIV; + request->error_status = SNMP_ERR_DECRYIPTION_ERROR; + return ERR_OK; + } } #endif + /* 9) calculate max size of scoped pdu? + * 10) securityname for user is retrieved from usertable? + * 11) security data is cached? + * 12) + */ /* Scoped PDU * Encryption context @@ -836,8 +1112,9 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_engine_id, - &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); + &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); request->context_engine_id_len = (u8_t)u16_value; + /* TODO: do we need to verify this contextengineid too? */ /* contextName */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); @@ -846,27 +1123,28 @@ snmp_parse_inbound_frame(struct snmp_request *request) IF_PARSE_ASSERT(parent_tlv_value_len > 0); IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_name, - &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); + &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH)); request->context_name_len = (u8_t)u16_value; + /* TODO: do we need to verify this contextname too? */ } else #endif { - /* decode community */ - IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); - IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING); - parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv); - IF_PARSE_ASSERT(parent_tlv_value_len > 0); + /* decode community */ + IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); + IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING); + parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv); + IF_PARSE_ASSERT(parent_tlv_value_len > 0); - err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN); - if (err == ERR_MEM) { - /* community string does not fit in our buffer -> its too long -> its invalid */ - request->community_strlen = 0; - snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len); - } else { - IF_PARSE_ASSERT(err == ERR_OK); - } - /* add zero terminator */ - request->community[request->community_strlen] = 0; + err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN); + if (err == ERR_MEM) { + /* community string does not fit in our buffer -> its too long -> its invalid */ + request->community_strlen = 0; + snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len); + } else { + IF_PARSE_ASSERT(err == ERR_OK); + } + /* add zero terminator */ + request->community[request->community_strlen] = 0; } /* decode PDU type (next container level) */ @@ -876,7 +1154,7 @@ snmp_parse_inbound_frame(struct snmp_request *request) parent_tlv_value_len = tlv.value_len; /* validate PDU type */ - switch(tlv.type) { + switch (tlv.type) { case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_REQ): /* GetRequest PDU */ snmp_stats.ingetrequests++; @@ -900,9 +1178,9 @@ snmp_parse_inbound_frame(struct snmp_request *request) /* unsupported input PDU for this agent (no parse error) */ LWIP_DEBUGF(SNMP_DEBUG, ("Unknown/Invalid SNMP PDU type received: %d", tlv.type)); \ return ERR_ARG; - break; } request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK; + request->request_out_type = (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP); /* validate community (do this after decoding PDU type because we don't want to increase 'inbadcommunitynames' for wrong frame types */ if (request->community_strlen == 0) { @@ -915,27 +1193,27 @@ snmp_parse_inbound_frame(struct snmp_request *request) /* our write community is empty, that means all our objects are readonly */ request->error_status = SNMP_ERR_NOTWRITABLE; request->error_index = 1; - } else if (strncmp(snmp_community_write, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) { + } else if (strncmp(snmp_community_write, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) { /* community name does not match */ snmp_stats.inbadcommunitynames++; snmp_authfail_trap(); return ERR_ARG; } - } else { - if (strncmp(snmp_community, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) { + } else { + if (strncmp(snmp_community, (const char *)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) { /* community name does not match */ snmp_stats.inbadcommunitynames++; snmp_authfail_trap(); return ERR_ARG; } } - + /* decode request ID */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER); parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv); IF_PARSE_ASSERT(parent_tlv_value_len > 0); - + IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->request_id)); /* decode error status / non-repeaters */ @@ -976,7 +1254,7 @@ snmp_parse_inbound_frame(struct snmp_request *request) /* decode varbind-list type (next container level) */ IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv)); IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= pbuf_stream.length)); - + request->inbound_varbind_offset = pbuf_stream.offset; request->inbound_varbind_len = pbuf_stream.length - request->inbound_padding_len; snmp_vb_enumerator_init(&(request->inbound_varbind_enumerator), request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len); @@ -990,7 +1268,7 @@ static err_t snmp_prepare_outbound_frame(struct snmp_request *request) { struct snmp_asn1_tlv tlv; - struct snmp_pbuf_stream* pbuf_stream = &(request->outbound_pbuf_stream); + struct snmp_pbuf_stream *pbuf_stream = &(request->outbound_pbuf_stream); /* try allocating pbuf(s) for maximum response size */ request->outbound_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM); @@ -1013,13 +1291,13 @@ snmp_prepare_outbound_frame(struct snmp_request *request) #if LWIP_SNMP_V3 if (request->version < SNMP_VERSION_3) { #endif - /* community */ - SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen); - OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); - OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) ); + /* community */ + SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen); + OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) ); #if LWIP_SNMP_V3 } else { - const char* id; + const char *id; /* globalData */ request->outbound_msg_global_data_offset = pbuf_stream->offset; @@ -1152,7 +1430,7 @@ snmp_prepare_outbound_frame(struct snmp_request *request) /* 'PDU' sequence */ request->outbound_pdu_offset = pbuf_stream->offset; - SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3, 0); + SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3, 0); OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); /* request ID */ @@ -1200,7 +1478,7 @@ snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len) if (varbind->value_len != sizeof (s32_t)) { return ERR_VAL; } - snmp_asn1_enc_s32t_cnt(*((s32_t*) varbind->value), &len->value_value_len); + snmp_asn1_enc_s32t_cnt(*((s32_t *) varbind->value), &len->value_value_len); break; case SNMP_ASN1_TYPE_COUNTER: case SNMP_ASN1_TYPE_GAUGE: @@ -1208,7 +1486,7 @@ snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len) if (varbind->value_len != sizeof (u32_t)) { return ERR_VAL; } - snmp_asn1_enc_u32t_cnt(*((u32_t*) varbind->value), &len->value_value_len); + snmp_asn1_enc_u32t_cnt(*((u32_t *) varbind->value), &len->value_value_len); break; case SNMP_ASN1_TYPE_OCTET_STRING: case SNMP_ASN1_TYPE_IPADDR: @@ -1225,14 +1503,16 @@ snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len) if ((varbind->value_len & 0x03) != 0) { return ERR_VAL; } - snmp_asn1_enc_oid_cnt((u32_t*) varbind->value, varbind->value_len >> 2, &len->value_value_len); + snmp_asn1_enc_oid_cnt((u32_t *) varbind->value, varbind->value_len >> 2, &len->value_value_len); break; +#if LWIP_HAVE_INT64 case SNMP_ASN1_TYPE_COUNTER64: - if (varbind->value_len != (2 * sizeof (u32_t))) { + if (varbind->value_len != sizeof(u64_t)) { return ERR_VAL; } - snmp_asn1_enc_u64t_cnt((u32_t*) varbind->value, &len->value_value_len); + snmp_asn1_enc_u64t_cnt(*(u64_t *)varbind->value, &len->value_value_len); break; +#endif default: /* unsupported type */ return ERR_VAL; @@ -1249,7 +1529,7 @@ snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len) #define OVB_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG) err_t -snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind) +snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbind) { struct snmp_asn1_tlv tlv; struct snmp_varbind_len len; @@ -1283,29 +1563,31 @@ snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_v if (len.value_value_len > 0) { if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) { - OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len)); + OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t *) varbind->value, len.value_value_len)); } else { switch (varbind->type) { case SNMP_ASN1_TYPE_INTEGER: - OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, len.value_value_len, *((s32_t*) varbind->value))); + OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, len.value_value_len, *((s32_t *) varbind->value))); break; case SNMP_ASN1_TYPE_COUNTER: case SNMP_ASN1_TYPE_GAUGE: case SNMP_ASN1_TYPE_TIMETICKS: - OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream, len.value_value_len, *((u32_t*) varbind->value))); + OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream, len.value_value_len, *((u32_t *) varbind->value))); break; case SNMP_ASN1_TYPE_OCTET_STRING: case SNMP_ASN1_TYPE_IPADDR: case SNMP_ASN1_TYPE_OPAQUE: - OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len)); + OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t *) varbind->value, len.value_value_len)); len.value_value_len = varbind->value_len; break; case SNMP_ASN1_TYPE_OBJECT_ID: - OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (u32_t*) varbind->value, varbind->value_len / sizeof (u32_t))); + OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (u32_t *) varbind->value, varbind->value_len / sizeof (u32_t))); break; +#if LWIP_HAVE_INT64 case SNMP_ASN1_TYPE_COUNTER64: - OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream, len.value_value_len, (u32_t*) varbind->value)); + OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream, len.value_value_len, *(u64_t *) varbind->value)); break; +#endif default: LWIP_ASSERT("Unknown variable type", 0); break; @@ -1327,8 +1609,8 @@ snmp_complete_outbound_frame(struct snmp_request *request) if (request->error_status != SNMP_ERR_NOERROR) { /* map v2c error codes to v1 compliant error code (according to RFC 2089) */ switch (request->error_status) { - /* mapping of implementation specific "virtual" error codes - * (during processing of frame we already stored them in error_status field, + /* mapping of implementation specific "virtual" error codes + * (during processing of frame we already stored them in error_status field, * so no need to check all varbinds here for those exceptions as suggested by RFC) */ case SNMP_ERR_NOSUCHINSTANCE: case SNMP_ERR_NOSUCHOBJECT: @@ -1356,7 +1638,7 @@ snmp_complete_outbound_frame(struct snmp_request *request) default: request->error_status = SNMP_ERR_GENERROR; break; - } + } } } else { if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) { @@ -1384,7 +1666,7 @@ snmp_complete_outbound_frame(struct snmp_request *request) struct snmp_pbuf_stream inbound_stream; OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len) ); OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, request->outbound_varbind_offset, request->outbound_pbuf->tot_len - request->outbound_varbind_offset) ); - snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0); + OF_BUILD_EXEC( snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0) ); } frame_size = request->outbound_pbuf_stream.offset; @@ -1395,7 +1677,7 @@ snmp_complete_outbound_frame(struct snmp_request *request) u8_t i; outbound_padding = (8 - (u8_t)((frame_size - request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07; for (i = 0; i < outbound_padding; i++) { - snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0); + OF_BUILD_EXEC( snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0) ); } } #endif @@ -1410,18 +1692,18 @@ snmp_complete_outbound_frame(struct snmp_request *request) /* complete missing length in 'globalData' sequence */ /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_global_data_end - - request->outbound_msg_global_data_offset - 1 - 1); + - request->outbound_msg_global_data_offset - 1 - 1); OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_global_data_offset)); OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv)); /* complete missing length in 'msgSecurityParameters' sequence */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, request->outbound_msg_security_parameters_end - - request->outbound_msg_security_parameters_str_offset - 1 - 1); + - request->outbound_msg_security_parameters_str_offset - 1 - 1); OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_str_offset)); OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv)); SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_security_parameters_end - - request->outbound_msg_security_parameters_seq_offset - 1 - 1); + - request->outbound_msg_security_parameters_seq_offset - 1 - 1); OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_seq_offset)); OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv)); @@ -1433,8 +1715,8 @@ snmp_complete_outbound_frame(struct snmp_request *request) #endif /* complete missing length in 'PDU' sequence */ - SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3, - frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */ + SNMP_ASN1_SET_TLV_PARAMS(tlv, request->request_out_type, 3, + frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */ OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_pdu_offset) ); OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) ); @@ -1502,42 +1784,42 @@ snmp_complete_outbound_frame(struct snmp_request *request) /* Encrypt response */ if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) { u8_t key[20]; - u8_t algo; + snmpv3_priv_algo_t algo; /* complete missing length in PDU sequence */ OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len)); OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_string_offset)); SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, frame_size + outbound_padding - - request->outbound_scoped_pdu_string_offset - 1 - 3); + - request->outbound_scoped_pdu_string_offset - 1 - 3); OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv)); - OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key)); + OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, NULL, NULL, &algo, key)); OF_BUILD_EXEC(snmpv3_crypt(&request->outbound_pbuf_stream, tlv.value_len, key, - request->msg_privacy_parameters, request->msg_authoritative_engine_boots, - request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT)); + request->msg_privacy_parameters, request->msg_authoritative_engine_boots, + request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT)); } if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_AUTH_FLAG)) { u8_t key[20]; - u8_t algo; + snmpv3_auth_algo_t algo; u8_t hmac[20]; - OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL)); + OF_BUILD_EXEC(snmpv3_get_user((char *)request->msg_user_name, &algo, key, NULL, NULL)); OF_BUILD_EXEC(snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), - request->outbound_pbuf, 0, request->outbound_pbuf->tot_len)); + request->outbound_pbuf, 0, request->outbound_pbuf->tot_len)); OF_BUILD_EXEC(snmpv3_auth(&request->outbound_pbuf_stream, frame_size + outbound_padding, key, algo, hmac)); MEMCPY(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH); OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, - request->outbound_pbuf, 0, request->outbound_pbuf->tot_len)); + request->outbound_pbuf, 0, request->outbound_pbuf->tot_len)); OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&request->outbound_pbuf_stream, - request->outbound_msg_authentication_parameters_offset)); + request->outbound_msg_authentication_parameters_offset)); SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH); OF_BUILD_EXEC(snmp_ans1_enc_tlv(&request->outbound_pbuf_stream, &tlv)); OF_BUILD_EXEC(snmp_asn1_enc_raw(&request->outbound_pbuf_stream, - request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH)); + request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH)); } #endif @@ -1549,7 +1831,7 @@ snmp_complete_outbound_frame(struct snmp_request *request) return ERR_OK; } -static void +static void snmp_execute_write_callbacks(struct snmp_request *request) { struct snmp_varbind_enumerator inbound_varbind_enumerator; @@ -1569,7 +1851,7 @@ snmp_execute_write_callbacks(struct snmp_request *request) /* ----------------------------------------------------------------------- */ void -snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length) +snmp_vb_enumerator_init(struct snmp_varbind_enumerator *enumerator, struct pbuf *p, u16_t offset, u16_t length) { snmp_pbuf_stream_init(&(enumerator->pbuf_stream), p, offset, length); enumerator->varbind_count = 0; @@ -1579,14 +1861,13 @@ snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* #define VB_PARSE_ASSERT(code) PARSE_ASSERT(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) snmp_vb_enumerator_err_t -snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind) +snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator *enumerator, struct snmp_varbind *varbind) { struct snmp_asn1_tlv tlv; u16_t varbind_len; err_t err; - - if (enumerator->pbuf_stream.length == 0) - { + + if (enumerator->pbuf_stream.length == 0) { return SNMP_VB_ENUMERATOR_ERR_EOVB; } enumerator->varbind_count++; @@ -1599,7 +1880,7 @@ snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct s /* decode varbind name (object id) */ VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv)); VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_OBJECT_ID) && (SNMP_ASN1_TLV_LENGTH(tlv) < varbind_len) && (tlv.value_len < enumerator->pbuf_stream.length)); - + VB_PARSE_EXEC(snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, varbind->oid.id, &(varbind->oid.len), SNMP_MAX_OBJ_ID_LEN)); varbind_len -= SNMP_ASN1_TLV_LENGTH(tlv); @@ -1612,18 +1893,18 @@ snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct s if (varbind->value != NULL) { switch (varbind->type) { case SNMP_ASN1_TYPE_INTEGER: - VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (s32_t*)varbind->value)); - varbind->value_len = sizeof(s32_t*); + VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (s32_t *)varbind->value)); + varbind->value_len = sizeof(s32_t); break; case SNMP_ASN1_TYPE_COUNTER: case SNMP_ASN1_TYPE_GAUGE: case SNMP_ASN1_TYPE_TIMETICKS: - VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value)); - varbind->value_len = sizeof(u32_t*); + VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t *)varbind->value)); + varbind->value_len = sizeof(u32_t); break; case SNMP_ASN1_TYPE_OCTET_STRING: case SNMP_ASN1_TYPE_OPAQUE: - err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE); + err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t *)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE); if (err == ERR_MEM) { return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH; } @@ -1634,7 +1915,7 @@ snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct s break; case SNMP_ASN1_TYPE_OBJECT_ID: /* misuse tlv.length_len as OID_length transporter */ - err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value, &tlv.length_len, SNMP_MAX_OBJ_ID_LEN); + err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (u32_t *)varbind->value, &tlv.length_len, SNMP_MAX_OBJ_ID_LEN); if (err == ERR_MEM) { return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH; } @@ -1644,15 +1925,17 @@ snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct s case SNMP_ASN1_TYPE_IPADDR: if (tlv.value_len == 4) { /* must be exactly 4 octets! */ - VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE)); + VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t *)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE)); } else { VB_PARSE_ASSERT(0); } break; +#if LWIP_HAVE_INT64 case SNMP_ASN1_TYPE_COUNTER64: - VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value)); - varbind->value_len = 2 * sizeof(u32_t*); + VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u64_t *)varbind->value)); + varbind->value_len = sizeof(u64_t); break; +#endif default: VB_PARSE_ASSERT(0); break; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.h similarity index 87% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.h index 2d01ef3..903f08a 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_msg.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_msg.h @@ -57,24 +57,12 @@ extern "C" { #endif -/* The listen port of the SNMP agent. Clients have to make their requests to - this port. Most standard clients won't work if you change this! */ -#ifndef SNMP_IN_PORT -#define SNMP_IN_PORT 161 -#endif -/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't - work if you change this! */ -#ifndef SNMP_TRAP_PORT -#define SNMP_TRAP_PORT 162 -#endif - /* version defines used in PDU */ #define SNMP_VERSION_1 0 #define SNMP_VERSION_2c 1 #define SNMP_VERSION_3 3 -struct snmp_varbind_enumerator -{ +struct snmp_varbind_enumerator { struct snmp_pbuf_stream pbuf_stream; u16_t varbind_count; }; @@ -86,11 +74,10 @@ typedef enum { SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH = 3 } snmp_vb_enumerator_err_t; -void snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length); -snmp_vb_enumerator_err_t snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind); +void snmp_vb_enumerator_init(struct snmp_varbind_enumerator *enumerator, struct pbuf *p, u16_t offset, u16_t length); +snmp_vb_enumerator_err_t snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator *enumerator, struct snmp_varbind *varbind); -struct snmp_request -{ +struct snmp_request { /* Communication handle */ void *handle; /* source IP address */ @@ -115,7 +102,10 @@ struct snmp_request s32_t non_repeaters; /* max-repetitions (getBulkRequest (SNMPv2c)) */ s32_t max_repetitions; - + + /* Usually response-pdu (2). When snmpv3 errors are detected report-pdu(8) */ + u8_t request_out_type; + #if LWIP_SNMP_V3 s32_t msg_id; s32_t msg_max_size; @@ -128,7 +118,9 @@ struct snmp_request u8_t msg_user_name[SNMP_V3_MAX_USER_LENGTH]; u8_t msg_user_name_len; u8_t msg_authentication_parameters[SNMP_V3_MAX_AUTH_PARAM_LENGTH]; + u8_t msg_authentication_parameters_len; u8_t msg_privacy_parameters[SNMP_V3_MAX_PRIV_PARAM_LENGTH]; + u8_t msg_privacy_parameters_len; u8_t context_engine_id[SNMP_V3_MAX_ENGINE_ID_LENGTH]; u8_t context_engine_id_len; u8_t context_name[SNMP_V3_MAX_ENGINE_ID_LENGTH]; @@ -162,8 +154,7 @@ struct snmp_request }; /** A helper struct keeping length information about varbinds */ -struct snmp_varbind_len -{ +struct snmp_varbind_len { u8_t vb_len_len; u16_t vb_value_len; u8_t oid_len_len; @@ -177,13 +168,13 @@ extern const char *snmp_community; /** Agent community string for write access */ extern const char *snmp_community_write; /** handle for sending traps */ -extern void* snmp_traps_handle; +extern void *snmp_traps_handle; void snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t port); err_t snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port); -u8_t snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result); +u8_t snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result); err_t snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len); -err_t snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind); +err_t snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbind); #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_netconn.c similarity index 88% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_netconn.c index 24c3e26..8850acb 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_netconn.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_netconn.c @@ -42,6 +42,7 @@ #include "lwip/udp.h" #include "snmp_msg.h" #include "lwip/sys.h" +#include "lwip/prot/iana.h" /** SNMP netconn API worker thread */ static void @@ -51,17 +52,17 @@ snmp_netconn_thread(void *arg) struct netbuf *buf; err_t err; LWIP_UNUSED_ARG(arg); - + /* Bind to SNMP port with default IP address */ #if LWIP_IPV6 conn = netconn_new(NETCONN_UDP_IPV6); - netconn_bind(conn, IP6_ADDR_ANY, SNMP_IN_PORT); + netconn_bind(conn, IP6_ADDR_ANY, LWIP_IANA_PORT_SNMP); #else /* LWIP_IPV6 */ conn = netconn_new(NETCONN_UDP); - netconn_bind(conn, IP4_ADDR_ANY, SNMP_IN_PORT); + netconn_bind(conn, IP4_ADDR_ANY, LWIP_IANA_PORT_SNMP); #endif /* LWIP_IPV6 */ LWIP_ERROR("snmp_netconn: invalid conn", (conn != NULL), return;); - + snmp_traps_handle = conn; do { @@ -74,28 +75,28 @@ snmp_netconn_thread(void *arg) if (buf != NULL) { netbuf_delete(buf); } - } while(1); + } while (1); } -err_t +err_t snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port) { err_t result; struct netbuf buf; - + memset(&buf, 0, sizeof(buf)); buf.p = p; - result = netconn_sendto((struct netconn*)handle, &buf, dst, port); - + result = netconn_sendto((struct netconn *)handle, &buf, dst, port); + return result; } u8_t -snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result) +snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result) { - struct netconn* conn = (struct netconn*)handle; + struct netconn *conn = (struct netconn *)handle; struct netif *dst_if; - const ip_addr_t* dst_ip; + const ip_addr_t *dst_ip; LWIP_UNUSED_ARG(conn); /* unused in case of IPV4 only configuration */ @@ -115,6 +116,7 @@ snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result) void snmp_init(void) { + LWIP_ASSERT_CORE_LOCKED(); sys_thread_new("snmp_netconn", snmp_netconn_thread, NULL, SNMP_STACK_SIZE, SNMP_THREAD_PRIO); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.c similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.c index 3c1217d..42867fb 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.c @@ -44,7 +44,7 @@ #include err_t -snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length) +snmp_pbuf_stream_init(struct snmp_pbuf_stream *pbuf_stream, struct pbuf *p, u16_t offset, u16_t length) { pbuf_stream->offset = offset; pbuf_stream->length = length; @@ -54,7 +54,7 @@ snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_ } err_t -snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data) +snmp_pbuf_stream_read(struct snmp_pbuf_stream *pbuf_stream, u8_t *data) { if (pbuf_stream->length == 0) { return ERR_BUF; @@ -71,13 +71,13 @@ snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data) } err_t -snmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data) +snmp_pbuf_stream_write(struct snmp_pbuf_stream *pbuf_stream, u8_t data) { return snmp_pbuf_stream_writebuf(pbuf_stream, &data, 1); } err_t -snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len) +snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream *pbuf_stream, const void *buf, u16_t buf_len) { if (pbuf_stream->length < buf_len) { return ERR_BUF; @@ -94,7 +94,7 @@ snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, } err_t -snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len) +snmp_pbuf_stream_writeto(struct snmp_pbuf_stream *pbuf_stream, struct snmp_pbuf_stream *target_pbuf_stream, u16_t len) { if ((pbuf_stream == NULL) || (target_pbuf_stream == NULL)) { @@ -112,14 +112,14 @@ snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_ u16_t chunk_len; err_t err; u16_t target_offset; - struct pbuf* pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset); + struct pbuf *pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset); if ((pbuf == NULL) || (pbuf->len == 0)) { return ERR_BUF; } chunk_len = LWIP_MIN(len, pbuf->len); - err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t*)pbuf->payload)[target_offset], chunk_len); + err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t *)pbuf->payload)[target_offset], chunk_len); if (err != ERR_OK) { return err; } @@ -133,7 +133,7 @@ snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_ } err_t -snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset) +snmp_pbuf_stream_seek(struct snmp_pbuf_stream *pbuf_stream, s32_t offset) { if ((offset < 0) || (offset > pbuf_stream->length)) { /* we cannot seek backwards or forward behind stream end */ @@ -147,7 +147,7 @@ snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset) } err_t -snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset) +snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream *pbuf_stream, u32_t offset) { s32_t rel_offset = offset - pbuf_stream->offset; return snmp_pbuf_stream_seek(pbuf_stream, rel_offset); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.h similarity index 76% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.h index 9778de7..682713f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_pbuf_stream.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_pbuf_stream.h @@ -49,20 +49,19 @@ extern "C" { #endif -struct snmp_pbuf_stream -{ - struct pbuf* pbuf; +struct snmp_pbuf_stream { + struct pbuf *pbuf; u16_t offset; u16_t length; }; -err_t snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length); -err_t snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data); -err_t snmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data); -err_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len); -err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len); -err_t snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset); -err_t snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset); +err_t snmp_pbuf_stream_init(struct snmp_pbuf_stream *pbuf_stream, struct pbuf *p, u16_t offset, u16_t length); +err_t snmp_pbuf_stream_read(struct snmp_pbuf_stream *pbuf_stream, u8_t *data); +err_t snmp_pbuf_stream_write(struct snmp_pbuf_stream *pbuf_stream, u8_t data); +err_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream *pbuf_stream, const void *buf, u16_t buf_len); +err_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream *pbuf_stream, struct snmp_pbuf_stream *target_pbuf_stream, u16_t len); +err_t snmp_pbuf_stream_seek(struct snmp_pbuf_stream *pbuf_stream, s32_t offset); +err_t snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream *pbuf_stream, u32_t offset); #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_raw.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_raw.c similarity index 88% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_raw.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_raw.c index 4a40864..e203cb6 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_raw.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_raw.c @@ -39,6 +39,7 @@ #include "lwip/udp.h" #include "lwip/ip.h" +#include "lwip/prot/iana.h" #include "snmp_msg.h" /* lwIP UDP receive callback function */ @@ -52,18 +53,18 @@ snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, pbuf_free(p); } -err_t +err_t snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port) { - return udp_sendto((struct udp_pcb*)handle, p, dst, port); + return udp_sendto((struct udp_pcb *)handle, p, dst, port); } u8_t -snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result) +snmp_get_local_ip_for_dst(void *handle, const ip_addr_t *dst, ip_addr_t *result) { - struct udp_pcb* udp_pcb = (struct udp_pcb*)handle; + struct udp_pcb *udp_pcb = (struct udp_pcb *)handle; struct netif *dst_if; - const ip_addr_t* dst_ip; + const ip_addr_t *dst_ip; LWIP_UNUSED_ARG(udp_pcb); /* unused in case of IPV4 only configuration */ @@ -86,14 +87,16 @@ void snmp_init(void) { err_t err; - + struct udp_pcb *snmp_pcb = udp_new_ip_type(IPADDR_TYPE_ANY); LWIP_ERROR("snmp_raw: no PCB", (snmp_pcb != NULL), return;); + LWIP_ASSERT_CORE_LOCKED(); + snmp_traps_handle = snmp_pcb; - udp_recv(snmp_pcb, snmp_recv, (void *)SNMP_IN_PORT); - err = udp_bind(snmp_pcb, IP_ANY_TYPE, SNMP_IN_PORT); + udp_recv(snmp_pcb, snmp_recv, NULL); + err = udp_bind(snmp_pcb, IP_ANY_TYPE, LWIP_IANA_PORT_SNMP); LWIP_ERROR("snmp_raw: Unable to bind PCB", (err == ERR_OK), return;); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_scalar.c similarity index 71% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_scalar.c index 136c9ec..094f52f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_scalar.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_scalar.c @@ -42,14 +42,14 @@ #include "lwip/apps/snmp_scalar.h" #include "lwip/apps/snmp_core.h" -static s16_t snmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value); -static snmp_err_t snmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value); -static snmp_err_t snmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value); +static s16_t snmp_scalar_array_get_value(struct snmp_node_instance *instance, void *value); +static snmp_err_t snmp_scalar_array_set_test(struct snmp_node_instance *instance, u16_t value_len, void *value); +static snmp_err_t snmp_scalar_array_set_value(struct snmp_node_instance *instance, u16_t value_len, void *value); -snmp_err_t -snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t +snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { - const struct snmp_scalar_node* scalar_node = (const struct snmp_scalar_node*)(const void*)instance->node; + const struct snmp_scalar_node *scalar_node = (const struct snmp_scalar_node *)(const void *)instance->node; LWIP_UNUSED_ARG(root_oid); LWIP_UNUSED_ARG(root_oid_len); @@ -67,8 +67,8 @@ snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_n return SNMP_ERR_NOERROR; } -snmp_err_t -snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t +snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { /* because our only instance is .0 we can only return a next instance if no instance oid is passed */ if (instance->instance_oid.len == 0) { @@ -83,14 +83,14 @@ snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct s snmp_err_t -snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { LWIP_UNUSED_ARG(root_oid); LWIP_UNUSED_ARG(root_oid_len); if ((instance->instance_oid.len == 2) && (instance->instance_oid.id[1] == 0)) { - const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node; - const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes; + const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node; + const struct snmp_scalar_array_node_def *array_node_def = array_node->array_nodes; u32_t i = 0; while (i < array_node->array_node_count) { @@ -118,11 +118,11 @@ snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct } snmp_err_t -snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { - const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node; - const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes; - const struct snmp_scalar_array_node_def* result = NULL; + const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node; + const struct snmp_scalar_array_node_def *array_node_def = array_node->array_nodes; + const struct snmp_scalar_array_node_def *result = NULL; LWIP_UNUSED_ARG(root_oid); LWIP_UNUSED_ARG(root_oid_len); @@ -130,7 +130,7 @@ snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, st if ((instance->instance_oid.len == 0) && (array_node->array_node_count > 0)) { /* return node with lowest OID */ u16_t i = 0; - + result = array_node_def; array_node_def++; @@ -142,7 +142,7 @@ snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, st } } else if (instance->instance_oid.len >= 1) { if (instance->instance_oid.len == 1) { - /* if we have the requested OID we return its instance, otherwise we search for the next available */ + /* if we have the requested OID we return its instance, otherwise we search for the next available */ u16_t i = 0; while (i < array_node->array_node_count) { if (array_node_def->oid == instance->instance_oid.id[0]) { @@ -179,7 +179,7 @@ snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, st instance->instance_oid.len = 2; instance->instance_oid.id[0] = result->oid; instance->instance_oid.id[1] = 0; - + instance->access = result->access; instance->asn1_type = result->asn1_type; instance->get_value = snmp_scalar_array_get_value; @@ -191,30 +191,42 @@ snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, st } static s16_t -snmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value) +snmp_scalar_array_get_value(struct snmp_node_instance *instance, void *value) { - const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node; - const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr; + s16_t result = -1; + const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node; + const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr; - return array_node->get_value(array_node_def, value); + if (array_node->get_value != NULL) { + result = array_node->get_value(array_node_def, value); + } + return result; } static snmp_err_t -snmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value) +snmp_scalar_array_set_test(struct snmp_node_instance *instance, u16_t value_len, void *value) { - const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node; - const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr; + snmp_err_t result = SNMP_ERR_NOTWRITABLE; + const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node; + const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr; - return array_node->set_test(array_node_def, value_len, value); + if (array_node->set_test != NULL) { + result = array_node->set_test(array_node_def, value_len, value); + } + return result; } static snmp_err_t -snmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value) +snmp_scalar_array_set_value(struct snmp_node_instance *instance, u16_t value_len, void *value) { - const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node; - const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr; + snmp_err_t result = SNMP_ERR_NOTWRITABLE; + const struct snmp_scalar_array_node *array_node = (const struct snmp_scalar_array_node *)(const void *)instance->node; + const struct snmp_scalar_array_node_def *array_node_def = (const struct snmp_scalar_array_node_def *)instance->reference.const_ptr; - return array_node->set_value(array_node_def, value_len, value); + if (array_node->set_value != NULL) { + result = array_node->set_value(array_node_def, value_len, value); + } + return result; } #endif /* LWIP_SNMP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_framework.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_framework.c new file mode 100644 index 0000000..a5611db --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_framework.c @@ -0,0 +1,90 @@ +/* +Generated by LwipMibCompiler +*/ + +#include "lwip/apps/snmp_opts.h" + +#if LWIP_SNMP && LWIP_SNMP_V3 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/apps/snmp_snmpv2_framework.h" +#include "lwip/apps/snmp.h" +#include "lwip/apps/snmp_core.h" +#include "lwip/apps/snmp_scalar.h" +#include "lwip/apps/snmp_table.h" +#include "lwip/apps/snmpv3.h" +#include "snmpv3_priv.h" + +#include "lwip/sys.h" + +#include + +const struct snmp_obj_id usmNoAuthProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 1 } }; +const struct snmp_obj_id usmHMACMD5AuthProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 2 } }; +const struct snmp_obj_id usmHMACSHAAuthProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 1, 3 } }; +/* .4 sha-224 + * .5 sha-256 + * .6 sha-384 + * .7 sha-512 + */ + +const struct snmp_obj_id usmNoPrivProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 1 } }; +const struct snmp_obj_id usmDESPrivProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 2 } }; +/* .3 3des-ede */ +const struct snmp_obj_id usmAESPrivProtocol = { 10, { 1, 3, 6, 1, 6, 3, 10, 1, 2, 4 } }; +/* .5 unknown + * .6 unknown + * .7 unknown + */ + +/* TODO: where should this value come from? */ +#define SNMP_FRAMEWORKMIB_SNMPENGINEMAXMESSAGESIZE 1500 + +/* --- snmpFrameworkMIBObjects 1.3.6.1.6.3.10.2 ----------------------------------------------------- */ +static s16_t snmpengine_scalars_get_value(const struct snmp_scalar_array_node_def *node, void *value) +{ + const char *engineid; + u8_t engineid_len; + + switch (node->oid) { + case 1: /* snmpEngineID */ + snmpv3_get_engine_id(&engineid, &engineid_len); + MEMCPY(value, engineid, engineid_len); + return engineid_len; + case 2: /* snmpEngineBoots */ + *(s32_t *)value = snmpv3_get_engine_boots_internal(); + return sizeof(s32_t); + case 3: /* snmpEngineTime */ + *(s32_t *)value = snmpv3_get_engine_time_internal(); + return sizeof(s32_t); + case 4: /* snmpEngineMaxMessageSize */ + *(s32_t *)value = SNMP_FRAMEWORKMIB_SNMPENGINEMAXMESSAGESIZE; + return sizeof(s32_t); + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("snmpengine_scalars_get_value(): unknown id: %"S32_F"\n", node->oid)); + return 0; + } +} + +static const struct snmp_scalar_array_node_def snmpengine_scalars_nodes[] = { + {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineID */ + {2, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineBoots */ + {3, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineTime */ + {4, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY}, /* snmpEngineMaxMessageSize */ +}; +static const struct snmp_scalar_array_node snmpengine_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, snmpengine_scalars_nodes, snmpengine_scalars_get_value, NULL, NULL); + +static const struct snmp_node *const snmpframeworkmibobjects_subnodes[] = { + &snmpengine_scalars.node.node +}; +static const struct snmp_tree_node snmpframeworkmibobjects_treenode = SNMP_CREATE_TREE_NODE(2, snmpframeworkmibobjects_subnodes); + +/* --- snmpFrameworkMIB ----------------------------------------------------- */ +static const struct snmp_node *const snmpframeworkmib_subnodes[] = { + &snmpframeworkmibobjects_treenode.node +}; +static const struct snmp_tree_node snmpframeworkmib_root = SNMP_CREATE_TREE_NODE(10, snmpframeworkmib_subnodes); +static const u32_t snmpframeworkmib_base_oid[] = {1, 3, 6, 1, 6, 3, 10}; +const struct snmp_mib snmpframeworkmib = {snmpframeworkmib_base_oid, LWIP_ARRAYSIZE(snmpframeworkmib_base_oid), &snmpframeworkmib_root.node}; + +/* --- snmpFrameworkMIB ----------------------------------------------------- */ +#endif /* LWIP_SNMP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_usm.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_usm.c new file mode 100644 index 0000000..7490c9c --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_snmpv2_usm.c @@ -0,0 +1,410 @@ +/* +Generated by LwipMibCompiler +*/ + +#include "lwip/apps/snmp_opts.h" +#if LWIP_SNMP && LWIP_SNMP_V3 + +#include "lwip/apps/snmp_snmpv2_usm.h" +#include "lwip/apps/snmp.h" +#include "lwip/apps/snmp_core.h" +#include "lwip/apps/snmp_scalar.h" +#include "lwip/apps/snmp_table.h" +#include "lwip/apps/snmpv3.h" +#include "snmpv3_priv.h" + +#include "lwip/apps/snmp_snmpv2_framework.h" + +#include + +/* --- usmUser 1.3.6.1.6.3.15.1.2 ----------------------------------------------------- */ + +static const struct snmp_oid_range usmUserTable_oid_ranges[] = { + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, + { 0, 0xff }, { 0, 0xff }, { 0, 0xff }, { 0, 0xff } +}; + +static void snmp_engineid_to_oid(const char *engineid, u32_t *oid, u32_t len) +{ + u8_t i; + + for (i = 0; i < len; i++) { + oid[i] = engineid[i]; + } +} + +static void snmp_oid_to_name(char *name, const u32_t *oid, size_t len) +{ + u8_t i; + + for (i = 0; i < len; i++) { + name[i] = (char)oid[i]; + } +} + +static void snmp_name_to_oid(const char *name, u32_t *oid, size_t len) +{ + u8_t i; + + for (i = 0; i < len; i++) { + oid[i] = name[i]; + } +} + +static const struct snmp_obj_id *snmp_auth_algo_to_oid(snmpv3_auth_algo_t algo) +{ + if (algo == SNMP_V3_AUTH_ALGO_MD5) { + return &usmHMACMD5AuthProtocol; + } else if (algo == SNMP_V3_AUTH_ALGO_SHA) { + return &usmHMACMD5AuthProtocol; + } + + return &usmNoAuthProtocol; +} + +static const struct snmp_obj_id *snmp_priv_algo_to_oid(snmpv3_priv_algo_t algo) +{ + if (algo == SNMP_V3_PRIV_ALGO_DES) { + return &usmDESPrivProtocol; + } else if (algo == SNMP_V3_PRIV_ALGO_AES) { + return &usmAESPrivProtocol; + } + + return &usmNoPrivProtocol; +} + +char username[32]; + +static snmp_err_t usmusertable_get_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance) +{ + const char *engineid; + u8_t eid_len; + + u32_t engineid_oid[SNMP_V3_MAX_ENGINE_ID_LENGTH]; + + u8_t name_len; + u8_t engineid_len; + + u8_t name_start; + u8_t engineid_start; + + LWIP_UNUSED_ARG(column); + + snmpv3_get_engine_id(&engineid, &eid_len); + + engineid_len = (u8_t)row_oid[0]; + engineid_start = 1; + + if (engineid_len != eid_len) { + /* EngineID length does not match! */ + return SNMP_ERR_NOSUCHINSTANCE; + } + + if (engineid_len > row_oid_len) { + /* row OID doesn't contain enough data according to engineid_len.*/ + return SNMP_ERR_NOSUCHINSTANCE; + } + + /* check if incoming OID length and if values are in plausible range */ + if (!snmp_oid_in_range(&row_oid[engineid_start], engineid_len, usmUserTable_oid_ranges, engineid_len)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + + snmp_engineid_to_oid(engineid, engineid_oid, engineid_len); + + /* Verify EngineID */ + if (snmp_oid_equal(&row_oid[engineid_start], engineid_len, engineid_oid, engineid_len)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + + name_len = (u8_t)row_oid[engineid_start + engineid_len]; + name_start = engineid_start + engineid_len + 1; + + if (name_len > SNMP_V3_MAX_USER_LENGTH) { + /* specified name is too long */ + return SNMP_ERR_NOSUCHINSTANCE; + } + + if (1 + engineid_len + 1 + name_len != row_oid_len) { + /* Length of EngineID and name does not match row oid length. (+2 for length fields)*/ + return SNMP_ERR_NOSUCHINSTANCE; + } + + /* check if incoming OID length and if values are in plausible range */ + if (!snmp_oid_in_range(&row_oid[name_start], name_len, usmUserTable_oid_ranges, name_len)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + + /* Verify if user exists */ + memset(username, 0, sizeof(username)); + snmp_oid_to_name(username, &row_oid[name_start], name_len); + if (snmpv3_get_user(username, NULL, NULL, NULL, NULL) != ERR_OK) { + return SNMP_ERR_NOSUCHINSTANCE; + } + + /* Save name in reference pointer to make it easier to handle later on */ + cell_instance->reference.ptr = username; + cell_instance->reference_len = name_len; + + /* user was found */ + return SNMP_ERR_NOERROR; +} + +/* + * valid oid options + * + * . + * .. + * .. + * ... + * .... + * .... + * + */ +static snmp_err_t usmusertable_get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance) +{ + const char *engineid; + u8_t eid_len; + + u32_t engineid_oid[SNMP_V3_MAX_ENGINE_ID_LENGTH]; + + u8_t name_len; + u8_t engineid_len; + + u8_t name_start; + u8_t engineid_start = 1; + u8_t i; + + struct snmp_next_oid_state state; + + u32_t result_temp[LWIP_ARRAYSIZE(usmUserTable_oid_ranges)]; + + LWIP_UNUSED_ARG(column); + + snmpv3_get_engine_id(&engineid, &eid_len); + + /* If EngineID might be given */ + if (row_oid->len > 0) { + engineid_len = (u8_t)row_oid->id[0]; + engineid_start = 1; + + if (engineid_len != eid_len) { + /* EngineID length does not match! */ + return SNMP_ERR_NOSUCHINSTANCE; + } + + if (engineid_len > row_oid->len) { + /* Verify partial EngineID */ + snmp_engineid_to_oid(engineid, engineid_oid, row_oid->len - 1); + if (!snmp_oid_equal(&row_oid->id[engineid_start], row_oid->len - 1, engineid_oid, row_oid->len - 1)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + } else { + /* Verify complete EngineID */ + snmp_engineid_to_oid(engineid, engineid_oid, engineid_len); + if (!snmp_oid_equal(&row_oid->id[engineid_start], engineid_len, engineid_oid, engineid_len)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + } + + /* At this point, the given EngineID (partially) matches the local EngineID.*/ + + /* If name might also be given */ + if (row_oid->len > engineid_start + engineid_len) { + name_len = (u8_t)row_oid->id[engineid_start + engineid_len]; + name_start = engineid_start + engineid_len + 1; + + if (name_len > SNMP_V3_MAX_USER_LENGTH) { + /* specified name is too long, max length is 32 according to mib file.*/ + return SNMP_ERR_NOSUCHINSTANCE; + } + + if (row_oid->len < engineid_len + name_len + 2) { + /* Partial name given according to oid.*/ + u8_t tmplen = row_oid->len - engineid_len - 2; + if (!snmp_oid_in_range(&row_oid->id[name_start], tmplen, usmUserTable_oid_ranges, tmplen)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + } else { + /* Full name given according to oid. Also test for too much data.*/ + u8_t tmplen = row_oid->len - engineid_len - 2; + if (!snmp_oid_in_range(&row_oid->id[name_start], name_len, usmUserTable_oid_ranges, tmplen)) { + return SNMP_ERR_NOSUCHINSTANCE; + } + } + + /* At this point the EngineID and (partial) UserName match the local EngineID and UserName.*/ + } + } + + /* init struct to search next oid */ + snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(usmUserTable_oid_ranges)); + + for (i = 0; i < snmpv3_get_amount_of_users(); i++) { + u32_t test_oid[LWIP_ARRAYSIZE(usmUserTable_oid_ranges)]; + + test_oid[0] = eid_len; + snmp_engineid_to_oid(engineid, &test_oid[1], eid_len); + + snmpv3_get_username(username, i); + + test_oid[1 + eid_len] = strlen(username); + snmp_name_to_oid(username, &test_oid[2 + eid_len], strlen(username)); + + /* check generated OID: is it a candidate for the next one? */ + snmp_next_oid_check(&state, test_oid, (u8_t)(1 + eid_len + 1 + strlen(username)), LWIP_PTR_NUMERIC_CAST(void *, i)); + } + + /* did we find a next one? */ + if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) { + snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len); + /* store username for subsequent operations (get/test/set) */ + memset(username, 0, sizeof(username)); + snmpv3_get_username(username, LWIP_PTR_NUMERIC_CAST(u8_t, state.reference)); + cell_instance->reference.ptr = username; + cell_instance->reference_len = strlen(username); + return SNMP_ERR_NOERROR; + } + + /* not found */ + return SNMP_ERR_NOSUCHINSTANCE; +} + +static s16_t usmusertable_get_value(struct snmp_node_instance *cell_instance, void *value) +{ + snmpv3_user_storagetype_t storage_type; + + switch (SNMP_TABLE_GET_COLUMN_FROM_OID(cell_instance->instance_oid.id)) { + case 3: /* usmUserSecurityName */ + MEMCPY(value, cell_instance->reference.ptr, cell_instance->reference_len); + return (s16_t)cell_instance->reference_len; + case 4: /* usmUserCloneFrom */ + MEMCPY(value, snmp_zero_dot_zero.id, snmp_zero_dot_zero.len * sizeof(u32_t)); + return snmp_zero_dot_zero.len * sizeof(u32_t); + case 5: { /* usmUserAuthProtocol */ + const struct snmp_obj_id *auth_algo; + snmpv3_auth_algo_t auth_algo_val; + snmpv3_get_user((const char *)cell_instance->reference.ptr, &auth_algo_val, NULL, NULL, NULL); + auth_algo = snmp_auth_algo_to_oid(auth_algo_val); + MEMCPY(value, auth_algo->id, auth_algo->len * sizeof(u32_t)); + return auth_algo->len * sizeof(u32_t); + } + case 6: /* usmUserAuthKeyChange */ + return 0; + case 7: /* usmUserOwnAuthKeyChange */ + return 0; + case 8: { /* usmUserPrivProtocol */ + const struct snmp_obj_id *priv_algo; + snmpv3_priv_algo_t priv_algo_val; + snmpv3_get_user((const char *)cell_instance->reference.ptr, NULL, NULL, &priv_algo_val, NULL); + priv_algo = snmp_priv_algo_to_oid(priv_algo_val); + MEMCPY(value, priv_algo->id, priv_algo->len * sizeof(u32_t)); + return priv_algo->len * sizeof(u32_t); + } + case 9: /* usmUserPrivKeyChange */ + return 0; + case 10: /* usmUserOwnPrivKeyChange */ + return 0; + case 11: /* usmUserPublic */ + /* TODO: Implement usmUserPublic */ + return 0; + case 12: /* usmUserStorageType */ + snmpv3_get_user_storagetype((const char *)cell_instance->reference.ptr, &storage_type); + *(s32_t *)value = storage_type; + return sizeof(s32_t); + case 13: /* usmUserStatus */ + *(s32_t *)value = 1; /* active */ + return sizeof(s32_t); + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("usmusertable_get_value(): unknown id: %"S32_F"\n", SNMP_TABLE_GET_COLUMN_FROM_OID(cell_instance->instance_oid.id))); + return 0; + } +} + +/* --- usmMIBObjects 1.3.6.1.6.3.15.1 ----------------------------------------------------- */ +static s16_t usmstats_scalars_get_value(const struct snmp_scalar_array_node_def *node, void *value) +{ + u32_t *uint_ptr = (u32_t *)value; + switch (node->oid) { + case 1: /* usmStatsUnsupportedSecLevels */ + *uint_ptr = snmp_stats.unsupportedseclevels; + break; + case 2: /* usmStatsNotInTimeWindows */ + *uint_ptr = snmp_stats.notintimewindows; + break; + case 3: /* usmStatsUnknownUserNames */ + *uint_ptr = snmp_stats.unknownusernames; + break; + case 4: /* usmStatsUnknownEngineIDs */ + *uint_ptr = snmp_stats.unknownengineids; + break; + case 5: /* usmStatsWrongDigests */ + *uint_ptr = snmp_stats.wrongdigests; + break; + case 6: /* usmStatsDecryptionErrors */ + *uint_ptr = snmp_stats.decryptionerrors; + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG, ("usmstats_scalars_get_value(): unknown id: %"S32_F"\n", node->oid)); + return 0; + } + + return sizeof(*uint_ptr); +} + +/* --- snmpUsmMIB ----------------------------------------------------- */ + +/* --- usmUser 1.3.6.1.6.3.15.1.2 ----------------------------------------------------- */ + +static const struct snmp_table_col_def usmusertable_columns[] = { + {3, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserSecurityName */ + {4, SNMP_ASN1_TYPE_OBJECT_ID, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserCloneFrom */ + {5, SNMP_ASN1_TYPE_OBJECT_ID, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserAuthProtocol */ + {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserAuthKeyChange */ + {7, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserOwnAuthKeyChange */ + {8, SNMP_ASN1_TYPE_OBJECT_ID, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPrivProtocol */ + {9, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPrivKeyChange */ + {10, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserOwnPrivKeyChange */ + {11, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserPublic */ + {12, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserStorageType */ + {13, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmUserStatus */ +}; +static const struct snmp_table_node usmusertable = SNMP_TABLE_CREATE(2, usmusertable_columns, usmusertable_get_instance, usmusertable_get_next_instance, usmusertable_get_value, NULL, NULL); + +static const struct snmp_node *const usmuser_subnodes[] = { + &usmusertable.node.node +}; +static const struct snmp_tree_node usmuser_treenode = SNMP_CREATE_TREE_NODE(2, usmuser_subnodes); + +/* --- usmMIBObjects 1.3.6.1.6.3.15.1 ----------------------------------------------------- */ +static const struct snmp_scalar_array_node_def usmstats_scalars_nodes[] = { + {1, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnsupportedSecLevels */ + {2, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsNotInTimeWindows */ + {3, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnknownUserNames */ + {4, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsUnknownEngineIDs */ + {5, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsWrongDigests */ + {6, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}, /* usmStatsDecryptionErrors */ +}; +static const struct snmp_scalar_array_node usmstats_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, usmstats_scalars_nodes, usmstats_scalars_get_value, NULL, NULL); + +static const struct snmp_node *const usmmibobjects_subnodes[] = { + &usmstats_scalars.node.node, + &usmuser_treenode.node +}; +static const struct snmp_tree_node usmmibobjects_treenode = SNMP_CREATE_TREE_NODE(1, usmmibobjects_subnodes); + +/* --- snmpUsmMIB ----------------------------------------------------- */ +static const struct snmp_node *const snmpusmmib_subnodes[] = { + &usmmibobjects_treenode.node +}; +static const struct snmp_tree_node snmpusmmib_root = SNMP_CREATE_TREE_NODE(15, snmpusmmib_subnodes); +static const u32_t snmpusmmib_base_oid[] = {1, 3, 6, 1, 6, 3, 15}; +const struct snmp_mib snmpusmmib = {snmpusmmib_base_oid, LWIP_ARRAYSIZE(snmpusmmib_base_oid), &snmpusmmib_root.node}; + +#endif /* LWIP_SNMP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_table.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_table.c similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_table.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_table.c index 63ca595..4b77a47 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_table.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_table.c @@ -43,10 +43,10 @@ #include "lwip/apps/snmp_table.h" #include -snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE; - const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node; + const struct snmp_table_node *table_node = (const struct snmp_table_node *)(const void *)instance->node; LWIP_UNUSED_ARG(root_oid); LWIP_UNUSED_ARG(root_oid_len); @@ -55,13 +55,13 @@ snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, str /* fixed row entry always has oid 1 */ if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) { /* search column */ - const struct snmp_table_col_def* col_def = table_node->columns; + const struct snmp_table_col_def *col_def = table_node->columns; u16_t i = table_node->column_count; while (i > 0) { if (col_def->index == instance->instance_oid.id[1]) { break; } - + col_def++; i--; } @@ -75,20 +75,20 @@ snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, str instance->set_value = table_node->set_value; ret = table_node->get_cell_instance( - &(instance->instance_oid.id[1]), - &(instance->instance_oid.id[2]), - instance->instance_oid.len-2, - instance); + &(instance->instance_oid.id[1]), + &(instance->instance_oid.id[2]), + instance->instance_oid.len - 2, + instance); } } return ret; } -snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { - const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node; - const struct snmp_table_col_def* col_def; + const struct snmp_table_node *table_node = (const struct snmp_table_node *)(const void *)instance->node; + const struct snmp_table_col_def *col_def; struct snmp_obj_id row_oid; u32_t column = 0; snmp_err_t result; @@ -116,7 +116,7 @@ snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len /* resolve column and value */ do { u16_t i; - const struct snmp_table_col_def* next_col_def = NULL; + const struct snmp_table_col_def *next_col_def = NULL; col_def = table_node->columns; for (i = 0; i < table_node->column_count; i++) { @@ -138,9 +138,9 @@ snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len instance->access = next_col_def->access; result = table_node->get_next_cell_instance( - &next_col_def->index, - &row_oid, - instance); + &next_col_def->index, + &row_oid, + instance); if (result == SNMP_ERR_NOERROR) { col_def = next_col_def; @@ -161,10 +161,10 @@ snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len } -snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE; - const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node; + const struct snmp_table_simple_node *table_node = (const struct snmp_table_simple_node *)(const void *)instance->node; LWIP_UNUSED_ARG(root_oid); LWIP_UNUSED_ARG(root_oid_len); @@ -173,15 +173,15 @@ snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_l /* fixed row entry always has oid 1 */ if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) { ret = table_node->get_cell_value( - &(instance->instance_oid.id[1]), - &(instance->instance_oid.id[2]), - instance->instance_oid.len-2, - &instance->reference, - &instance->reference_len); + &(instance->instance_oid.id[1]), + &(instance->instance_oid.id[2]), + instance->instance_oid.len - 2, + &instance->reference, + &instance->reference_len); if (ret == SNMP_ERR_NOERROR) { /* search column */ - const struct snmp_table_simple_col_def* col_def = table_node->columns; + const struct snmp_table_simple_col_def *col_def = table_node->columns; u32_t i = table_node->column_count; while (i > 0) { if (col_def->index == instance->instance_oid.id[1]) { @@ -212,22 +212,22 @@ snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_l default: LWIP_DEBUGF(SNMP_DEBUG, ("snmp_table_simple_get_instance(): unknown column data_type: %d\n", col_def->data_type)); return SNMP_ERR_GENERROR; - } + } ret = SNMP_ERR_NOERROR; } else { ret = SNMP_ERR_NOSUCHINSTANCE; } - } + } } return ret; } -snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { - const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node; - const struct snmp_table_simple_col_def* col_def; + const struct snmp_table_simple_node *table_node = (const struct snmp_table_simple_node *)(const void *)instance->node; + const struct snmp_table_simple_col_def *col_def; struct snmp_obj_id row_oid; u32_t column = 0; snmp_err_t result; @@ -251,7 +251,7 @@ snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_ /* resolve column and value */ do { u32_t i; - const struct snmp_table_simple_col_def* next_col_def = NULL; + const struct snmp_table_simple_col_def *next_col_def = NULL; col_def = table_node->columns; for (i = 0; i < table_node->column_count; i++) { @@ -271,10 +271,10 @@ snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_ } result = table_node->get_next_cell_instance_and_value( - &next_col_def->index, - &row_oid, - &instance->reference, - &instance->reference_len); + &next_col_def->index, + &row_oid, + &instance->reference, + &instance->reference_len); if (result == SNMP_ERR_NOERROR) { col_def = next_col_def; @@ -283,8 +283,7 @@ snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_ row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */ column = next_col_def->index + 1; - } - while (1); + } while (1); instance->asn1_type = col_def->asn1_type; instance->access = SNMP_NODE_INSTANCE_READ_ONLY; @@ -318,23 +317,23 @@ snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_ s16_t -snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value) +snmp_table_extract_value_from_s32ref(struct snmp_node_instance *instance, void *value) { - s32_t *dst = (s32_t*)value; + s32_t *dst = (s32_t *)value; *dst = instance->reference.s32; return sizeof(*dst); } s16_t -snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value) +snmp_table_extract_value_from_u32ref(struct snmp_node_instance *instance, void *value) { - u32_t *dst = (u32_t*)value; + u32_t *dst = (u32_t *)value; *dst = instance->reference.u32; return sizeof(*dst); } s16_t -snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value) +snmp_table_extract_value_from_refconstptr(struct snmp_node_instance *instance, void *value) { MEMCPY(value, instance->reference.const_ptr, instance->reference_len); return (u16_t)instance->reference_len; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_threadsync.c similarity index 73% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_threadsync.c index 204f265..56d9886 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_threadsync.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_threadsync.c @@ -40,7 +40,7 @@ #include "lwip/apps/snmp_core.h" #include "lwip/sys.h" #include - + static void call_synced_function(struct threadsync_data *call_data, snmp_threadsync_called_fn fn) { @@ -53,17 +53,21 @@ call_synced_function(struct threadsync_data *call_data, snmp_threadsync_called_f static void threadsync_get_value_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; + struct threadsync_data *call_data = (struct threadsync_data *)ctx; - call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value); + if (call_data->proxy_instance.get_value != NULL) { + call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value); + } else { + call_data->retval.s16 = -1; + } sys_sem_signal(&call_data->threadsync_node->instance->sem); } static s16_t -threadsync_get_value(struct snmp_node_instance* instance, void* value) +threadsync_get_value(struct snmp_node_instance *instance, void *value) { - struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr; + struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr; call_data->arg1.value = value; call_synced_function(call_data, threadsync_get_value_synced); @@ -74,17 +78,21 @@ threadsync_get_value(struct snmp_node_instance* instance, void* value) static void threadsync_set_test_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; + struct threadsync_data *call_data = (struct threadsync_data *)ctx; - call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value); + if (call_data->proxy_instance.set_test != NULL) { + call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value); + } else { + call_data->retval.err = SNMP_ERR_NOTWRITABLE; + } sys_sem_signal(&call_data->threadsync_node->instance->sem); } static snmp_err_t -threadsync_set_test(struct snmp_node_instance* instance, u16_t len, void *value) +threadsync_set_test(struct snmp_node_instance *instance, u16_t len, void *value) { - struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr; + struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr; call_data->arg1.value = value; call_data->arg2.len = len; @@ -96,30 +104,34 @@ threadsync_set_test(struct snmp_node_instance* instance, u16_t len, void *value) static void threadsync_set_value_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; + struct threadsync_data *call_data = (struct threadsync_data *)ctx; - call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value); + if (call_data->proxy_instance.set_value != NULL) { + call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value); + } else { + call_data->retval.err = SNMP_ERR_NOTWRITABLE; + } sys_sem_signal(&call_data->threadsync_node->instance->sem); } static snmp_err_t -threadsync_set_value(struct snmp_node_instance* instance, u16_t len, void *value) +threadsync_set_value(struct snmp_node_instance *instance, u16_t len, void *value) { - struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr; + struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr; call_data->arg1.value = value; call_data->arg2.len = len; call_synced_function(call_data, threadsync_set_value_synced); - + return call_data->retval.err; } static void -threadsync_release_instance_synced(void* ctx) +threadsync_release_instance_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; - + struct threadsync_data *call_data = (struct threadsync_data *)ctx; + call_data->proxy_instance.release_instance(&call_data->proxy_instance); sys_sem_signal(&call_data->threadsync_node->instance->sem); @@ -128,18 +140,18 @@ threadsync_release_instance_synced(void* ctx) static void threadsync_release_instance(struct snmp_node_instance *instance) { - struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr; - + struct threadsync_data *call_data = (struct threadsync_data *)instance->reference.ptr; + if (call_data->proxy_instance.release_instance != NULL) { call_synced_function(call_data, threadsync_release_instance_synced); } } static void -get_instance_synced(void* ctx) +get_instance_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; - const struct snmp_leaf_node *leaf = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node; + struct threadsync_data *call_data = (struct threadsync_data *)ctx; + const struct snmp_leaf_node *leaf = (const struct snmp_leaf_node *)(const void *)call_data->proxy_instance.node; call_data->retval.err = leaf->get_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance); @@ -147,10 +159,10 @@ get_instance_synced(void* ctx) } static void -get_next_instance_synced(void* ctx) +get_next_instance_synced(void *ctx) { - struct threadsync_data *call_data = (struct threadsync_data*)ctx; - const struct snmp_leaf_node *leaf = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node; + struct threadsync_data *call_data = (struct threadsync_data *)ctx; + const struct snmp_leaf_node *leaf = (const struct snmp_leaf_node *)(const void *)call_data->proxy_instance.node; call_data->retval.err = leaf->get_next_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance); @@ -158,9 +170,9 @@ get_next_instance_synced(void* ctx) } static snmp_err_t -do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance, snmp_threadsync_called_fn fn) +do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance, snmp_threadsync_called_fn fn) { - const struct snmp_threadsync_node *threadsync_node = (const struct snmp_threadsync_node*)(const void*)instance->node; + const struct snmp_threadsync_node *threadsync_node = (const struct snmp_threadsync_node *)(const void *)instance->node; struct threadsync_data *call_data = &threadsync_node->instance->data; if (threadsync_node->node.node.oid != threadsync_node->target->node.oid) { @@ -184,9 +196,9 @@ do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* ins instance->access = call_data->proxy_instance.access; instance->asn1_type = call_data->proxy_instance.asn1_type; instance->release_instance = threadsync_release_instance; - instance->get_value = (call_data->proxy_instance.get_value != NULL)? threadsync_get_value : NULL; - instance->set_value = (call_data->proxy_instance.set_value != NULL)? threadsync_set_value : NULL; - instance->set_test = (call_data->proxy_instance.set_test != NULL)? threadsync_set_test : NULL; + instance->get_value = (call_data->proxy_instance.get_value != NULL) ? threadsync_get_value : NULL; + instance->set_value = (call_data->proxy_instance.set_value != NULL) ? threadsync_set_value : NULL; + instance->set_test = (call_data->proxy_instance.set_test != NULL) ? threadsync_set_test : NULL; snmp_oid_assign(&instance->instance_oid, call_data->proxy_instance.instance_oid.id, call_data->proxy_instance.instance_oid.len); } @@ -194,13 +206,13 @@ do_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* ins } snmp_err_t -snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { return do_sync(root_oid, root_oid_len, instance, get_instance_synced); } snmp_err_t -snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance) +snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance *instance) { return do_sync(root_oid, root_oid_len, instance, get_next_instance_synced); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_traps.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_traps.c similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_traps.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_traps.c index 0d2df64..3c9c817 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmp_traps.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmp_traps.c @@ -46,12 +46,12 @@ #include "lwip/sys.h" #include "lwip/apps/snmp.h" #include "lwip/apps/snmp_core.h" +#include "lwip/prot/iana.h" #include "snmp_msg.h" #include "snmp_asn1.h" #include "snmp_core_priv.h" -struct snmp_msg_trap -{ +struct snmp_msg_trap { /* source enterprise ID (sysObjectID) */ const struct snmp_obj_id *enterprise; /* source IP address, raw network order format */ @@ -78,16 +78,21 @@ struct snmp_msg_trap static u16_t snmp_trap_varbind_sum(struct snmp_msg_trap *trap, struct snmp_varbind *varbinds); static u16_t snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len); -static void snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream); -static void snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds); +static err_t snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream); +static err_t snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds); + +#define BUILD_EXEC(code) \ + if ((code) != ERR_OK) { \ + LWIP_DEBUGF(SNMP_DEBUG, ("SNMP error during creation of outbound trap frame!")); \ + return ERR_ARG; \ + } /** Agent community string for sending traps */ extern const char *snmp_community_trap; -void* snmp_traps_handle; +void *snmp_traps_handle; -struct snmp_trap_dst -{ +struct snmp_trap_dst { /* destination IP address in network order */ ip_addr_t dip; /* set to 0 when disabled, >0 when enabled */ @@ -106,6 +111,7 @@ static u8_t snmp_auth_traps_enabled = 0; void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable) { + LWIP_ASSERT_CORE_LOCKED(); if (dst_idx < SNMP_TRAP_DESTINATIONS) { trap_dst[dst_idx].enable = enable; } @@ -120,6 +126,7 @@ snmp_trap_dst_enable(u8_t dst_idx, u8_t enable) void snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst) { + LWIP_ASSERT_CORE_LOCKED(); if (dst_idx < SNMP_TRAP_DESTINATIONS) { ip_addr_set(&trap_dst[dst_idx].dip, dst); } @@ -163,7 +170,7 @@ snmp_get_auth_traps_enabled(void) * (sysObjectID) for specific traps. */ err_t -snmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds) +snmp_send_trap(const struct snmp_obj_id *eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds) { struct snmp_msg_trap trap_msg; struct snmp_trap_dst *td; @@ -171,6 +178,8 @@ snmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specifi u16_t i, tot_len; err_t err = ERR_OK; + LWIP_ASSERT_CORE_LOCKED(); + trap_msg.snmp_version = 0; for (i = 0, td = &trap_dst[0]; i < SNMP_TRAP_DESTINATIONS; i++, td++) { @@ -202,7 +211,7 @@ snmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specifi struct snmp_pbuf_stream pbuf_stream; snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len); - /* pass 1, encode packet ino the pbuf(s) */ + /* pass 1, encode packet into the pbuf(s) */ snmp_trap_header_enc(&trap_msg, &pbuf_stream); snmp_trap_varbind_enc(&trap_msg, &pbuf_stream, varbinds); @@ -210,7 +219,7 @@ snmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specifi snmp_stats.outpkts++; /** send to the TRAP destination */ - snmp_sendto(snmp_traps_handle, p, &td->dip, SNMP_TRAP_PORT); + snmp_sendto(snmp_traps_handle, p, &td->dip, LWIP_IANA_PORT_SNMP_TRAP); pbuf_free(p); } else { err = ERR_MEM; @@ -228,7 +237,7 @@ snmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specifi * @ingroup snmp_traps * Send generic SNMP trap */ -err_t +err_t snmp_send_trap_generic(s32_t generic_trap) { static const struct snmp_obj_id oid = { 7, { 1, 3, 6, 1, 2, 1, 11 } }; @@ -257,7 +266,7 @@ snmp_coldstart_trap(void) /** * @ingroup snmp_traps - * Send authentication failure trap (used internally by agent) + * Send authentication failure trap (used internally by agent) */ void snmp_authfail_trap(void) @@ -357,7 +366,7 @@ snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len) return tot_len; } -static void +static err_t snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds) { struct snmp_asn1_tlv tlv; @@ -366,80 +375,84 @@ snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_ varbind = varbinds; SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->vbseqlen); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); while (varbind != NULL) { - snmp_append_outbound_varbind(pbuf_stream, varbind); + BUILD_EXEC( snmp_append_outbound_varbind(pbuf_stream, varbind) ); varbind = varbind->next; } + + return ERR_OK; } /** * Encodes trap header from head to tail. */ -static void +static err_t snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream) { struct snmp_asn1_tlv tlv; /* 'Message' sequence */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->seqlen); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); /* version */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0); snmp_asn1_enc_s32t_cnt(trap->snmp_version, &tlv.value_len); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version) ); /* community */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, trap->comlen); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)snmp_community_trap, trap->comlen); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)snmp_community_trap, trap->comlen) ); /* 'PDU' sequence */ SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_TRAP), 0, trap->pdulen); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); /* object ID */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID, 0, 0); snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &tlv.value_len); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len) ); /* IP addr */ if (IP_IS_V6_VAL(trap->sip)) { #if LWIP_IPV6 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip6(&trap->sip)->addr)); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip6(&trap->sip)->addr, sizeof(ip_2_ip6(&trap->sip)->addr)); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip6(&trap->sip)->addr, sizeof(ip_2_ip6(&trap->sip)->addr)) ); #endif } else { #if LWIP_IPV4 SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip4(&trap->sip)->addr)); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip4(&trap->sip)->addr, sizeof(ip_2_ip4(&trap->sip)->addr)); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip4(&trap->sip)->addr, sizeof(ip_2_ip4(&trap->sip)->addr)) ); #endif } /* trap length */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0); snmp_asn1_enc_s32t_cnt(trap->gen_trap, &tlv.value_len); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap) ); /* specific trap */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0); snmp_asn1_enc_s32t_cnt(trap->spc_trap, &tlv.value_len); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap) ); /* timestamp */ SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_TIMETICKS, 0, 0); snmp_asn1_enc_s32t_cnt(trap->ts, &tlv.value_len); - snmp_ans1_enc_tlv(pbuf_stream, &tlv); - snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts); + BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) ); + BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts) ); + + return ERR_OK; } #endif /* LWIP_SNMP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3.c similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3.c index 69fb3a0..ed5a076 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3.c @@ -58,7 +58,7 @@ snmpv3_engine_id_changed(void) * (re-)initialized itself since snmpEngineID * was last configured. */ -u32_t +s32_t snmpv3_get_engine_boots_internal(void) { if (snmpv3_get_engine_boots() == 0 || @@ -75,7 +75,7 @@ snmpv3_get_engine_boots_internal(void) * Once the timer reaches 2147483647 it gets reset to zero and the * engine boot ups get incremented. */ -u32_t +s32_t snmpv3_get_engine_time_internal(void) { if (snmpv3_get_engine_time() >= SNMP_MAX_TIME_BOOT) { @@ -101,7 +101,7 @@ snmpv3_get_engine_time_internal(void) * @todo: This is a potential thread safety issue. */ err_t -snmpv3_build_priv_param(u8_t* priv_param) +snmpv3_build_priv_param(u8_t *priv_param) { #ifdef LWIP_RAND /* Based on RFC3826 */ static u8_t init; @@ -124,7 +124,7 @@ snmpv3_build_priv_param(u8_t* priv_param) } #else /* Based on RFC3414 */ static u32_t ctr; - u32_t boots = LWIP_SNMPV3_GET_ENGINE_BOOTS(); + u32_t boots = snmpv3_get_engine_boots_internal(); SMEMCPY(&priv_param[0], &boots, 4); SMEMCPY(&priv_param[4], &ctr, 4); ctr++; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_mbedtls.c similarity index 78% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_mbedtls.c index 0b1eefb..48c1a81 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_mbedtls.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_mbedtls.c @@ -49,8 +49,8 @@ #include "mbedtls/sha1.h" err_t -snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, - const u8_t* key, u8_t algo, u8_t* hmac_out) +snmpv3_auth(struct snmp_pbuf_stream *stream, u16_t length, + const u8_t *key, snmpv3_auth_algo_t algo, u8_t *hmac_out) { u32_t i; u8_t key_len; @@ -70,10 +70,10 @@ snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, } mbedtls_md_init(&ctx); - if(mbedtls_md_setup(&ctx, md_info, 1) != 0) { + if (mbedtls_md_setup(&ctx, md_info, 1) != 0) { return ERR_ARG; } - + if (mbedtls_md_hmac_starts(&ctx, key, key_len) != 0) { goto free_md; } @@ -96,7 +96,7 @@ snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, mbedtls_md_free(&ctx); return ERR_OK; - + free_md: mbedtls_md_free(&ctx); return ERR_ARG; @@ -105,9 +105,9 @@ free_md: #if LWIP_SNMP_V3_CRYPTO err_t -snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, - const u8_t* key, const u8_t* priv_param, const u32_t engine_boots, - const u32_t engine_time, u8_t algo, u8_t mode) +snmpv3_crypt(struct snmp_pbuf_stream *stream, u16_t length, + const u8_t *key, const u8_t *priv_param, const u32_t engine_boots, + const u32_t engine_time, snmpv3_priv_algo_t algo, snmpv3_priv_mode_t mode) { size_t i; mbedtls_cipher_context_t ctx; @@ -130,21 +130,21 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, } cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_CBC); - if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) { + if (mbedtls_cipher_setup(&ctx, cipher_info) != 0) { return ERR_ARG; } - if(mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE) != 0) { + if (mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE) != 0) { return ERR_ARG; } - if(mbedtls_cipher_setkey(&ctx, key, 8*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) { + if (mbedtls_cipher_setkey(&ctx, key, 8 * 8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT) ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) { goto error; } - /* Prepare IV */ + /* Prepare IV */ for (i = 0; i < LWIP_ARRAYSIZE(iv_local); i++) { iv_local[i] = priv_param[i] ^ key[i + 8]; } - if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) { + if (mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) { goto error; } @@ -152,31 +152,38 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, size_t j; u8_t in_bytes[8]; out_len = LWIP_ARRAYSIZE(out_bytes) ; - + for (j = 0; j < LWIP_ARRAYSIZE(in_bytes); j++) { - snmp_pbuf_stream_read(&read_stream, &in_bytes[j]); + if (snmp_pbuf_stream_read(&read_stream, &in_bytes[j]) != ERR_OK) { + goto error; + } } - if(mbedtls_cipher_update(&ctx, in_bytes, LWIP_ARRAYSIZE(in_bytes), out_bytes, &out_len) != 0) { + if (mbedtls_cipher_update(&ctx, in_bytes, LWIP_ARRAYSIZE(in_bytes), out_bytes, &out_len) != 0) { goto error; } - snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len); + if (snmp_pbuf_stream_writebuf(&write_stream, out_bytes, (u16_t)out_len) != ERR_OK) { + goto error; + } } - + out_len = LWIP_ARRAYSIZE(out_bytes); - if(mbedtls_cipher_finish(&ctx, out_bytes, &out_len) != 0) { + if (mbedtls_cipher_finish(&ctx, out_bytes, &out_len) != 0) { + goto error; + } + + if (snmp_pbuf_stream_writebuf(&write_stream, out_bytes, (u16_t)out_len) != ERR_OK) { goto error; } - snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len); } else if (algo == SNMP_V3_PRIV_ALGO_AES) { u8_t iv_local[16]; cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CFB128); - if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) { + if (mbedtls_cipher_setup(&ctx, cipher_info) != 0) { return ERR_ARG; } - if(mbedtls_cipher_setkey(&ctx, key, 16*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) { + if (mbedtls_cipher_setkey(&ctx, key, 16 * 8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT) ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) { goto error; } @@ -193,7 +200,7 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, iv_local[4 + 2] = (engine_time >> 8) & 0xFF; iv_local[4 + 3] = (engine_time >> 0) & 0xFF; SMEMCPY(iv_local + 8, priv_param, 8); - if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) { + if (mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) { goto error; } @@ -201,12 +208,16 @@ snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, u8_t in_byte; u8_t out_byte; size_t out_len = sizeof(out_byte); - - snmp_pbuf_stream_read(&read_stream, &in_byte); - if(mbedtls_cipher_update(&ctx, &in_byte, sizeof(in_byte), &out_byte, &out_len) != 0) { + + if (snmp_pbuf_stream_read(&read_stream, &in_byte) != ERR_OK) { + goto error; + } + if (mbedtls_cipher_update(&ctx, &in_byte, sizeof(in_byte), &out_byte, &out_len) != 0) { + goto error; + } + if (snmp_pbuf_stream_write(&write_stream, out_byte) != ERR_OK) { goto error; } - snmp_pbuf_stream_write(&write_stream, out_byte); } } else { return ERR_ARG; @@ -223,13 +234,13 @@ error: #endif /* LWIP_SNMP_V3_CRYPTO */ /* A.2.1. Password to Key Sample Code for MD5 */ -void +void snmpv3_password_to_key_md5( - const u8_t *password, /* IN */ - u8_t passwordlen, /* IN */ - const u8_t *engineID, /* IN - pointer to snmpEngineID */ - u8_t engineLength,/* IN - length of snmpEngineID */ - u8_t *key) /* OUT - pointer to caller 16-octet buffer */ + const u8_t *password, /* IN */ + size_t passwordlen, /* IN */ + const u8_t *engineID, /* IN - pointer to snmpEngineID */ + u8_t engineLength,/* IN - length of snmpEngineID */ + u8_t *key) /* OUT - pointer to caller 16-octet buffer */ { mbedtls_md5_context MD; u8_t *cp, password_buf[64]; @@ -276,13 +287,13 @@ snmpv3_password_to_key_md5( } /* A.2.2. Password to Key Sample Code for SHA */ -void +void snmpv3_password_to_key_sha( - const u8_t *password, /* IN */ - u8_t passwordlen, /* IN */ - const u8_t *engineID, /* IN - pointer to snmpEngineID */ - u8_t engineLength,/* IN - length of snmpEngineID */ - u8_t *key) /* OUT - pointer to caller 20-octet buffer */ + const u8_t *password, /* IN */ + size_t passwordlen, /* IN */ + const u8_t *engineID, /* IN - pointer to snmpEngineID */ + u8_t engineLength,/* IN - length of snmpEngineID */ + u8_t *key) /* OUT - pointer to caller 20-octet buffer */ { mbedtls_sha1_context SH; u8_t *cp, password_buf[72]; @@ -323,7 +334,7 @@ snmpv3_password_to_key_sha( mbedtls_sha1_starts(&SH); mbedtls_sha1_update(&SH, password_buf, 40 + engineLength); mbedtls_sha1_finish(&SH, key); - + mbedtls_sha1_free(&SH); return; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_priv.h similarity index 77% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_priv.h index b87666d..323364c 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/snmpv3_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/snmp/snmpv3_priv.h @@ -39,6 +39,7 @@ #if LWIP_SNMP && LWIP_SNMP_V3 +#include "lwip/apps/snmpv3.h" #include "snmp_pbuf_stream.h" /* According to RFC 3411 */ @@ -48,18 +49,20 @@ #define SNMP_V3_MAX_AUTH_PARAM_LENGTH 12 #define SNMP_V3_MAX_PRIV_PARAM_LENGTH 8 -#define SNMP_V3_AUTH_FLAG 0x01 -#define SNMP_V3_PRIV_FLAG 0x02 - #define SNMP_V3_MD5_LEN 16 #define SNMP_V3_SHA_LEN 20 -u32_t snmpv3_get_engine_boots_internal(void); -u32_t snmpv3_get_engine_time_internal(void); -err_t snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key, u8_t algo, u8_t* hmac_out); -err_t snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key, - const u8_t* priv_param, const u32_t engine_boots, const u32_t engine_time, u8_t algo, u8_t mode); -err_t snmpv3_build_priv_param(u8_t* priv_param); +typedef enum { + SNMP_V3_PRIV_MODE_DECRYPT = 0, + SNMP_V3_PRIV_MODE_ENCRYPT = 1 +} snmpv3_priv_mode_t; + +s32_t snmpv3_get_engine_boots_internal(void); +err_t snmpv3_auth(struct snmp_pbuf_stream *stream, u16_t length, const u8_t *key, snmpv3_auth_algo_t algo, u8_t *hmac_out); +err_t snmpv3_crypt(struct snmp_pbuf_stream *stream, u16_t length, const u8_t *key, + const u8_t *priv_param, const u32_t engine_boots, const u32_t engine_time, snmpv3_priv_algo_t algo, snmpv3_priv_mode_t mode); +err_t snmpv3_build_priv_param(u8_t *priv_param); +void snmpv3_enginetime_timer(void *arg); #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/sntp/sntp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/sntp/sntp.c similarity index 61% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/sntp/sntp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/sntp/sntp.c index 71b2abe..23731e5 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/sntp/sntp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/sntp/sntp.c @@ -42,11 +42,10 @@ * This is simple "SNTP" client for the lwIP raw API. * It is a minimal implementation of SNTPv4 as specified in RFC 4330. * - * For a list of some public NTP servers, see this link : + * For a list of some public NTP servers, see this link: * http://support.ntp.org/bin/view/Servers/NTPPoolServers * * @todo: - * - set/change servers at runtime * - complete SNTP_CHECK_RESPONSE checks 3 and 4 */ @@ -72,21 +71,12 @@ #define SNTP_SUPPORT_MULTIPLE_SERVERS 0 #endif /* NTP_MAX_SERVERS > 1 */ -#if (SNTP_UPDATE_DELAY < 15000) && !defined(SNTP_SUPPRESS_DELAY_CHECK) +#ifndef SNTP_SUPPRESS_DELAY_CHECK +#if SNTP_UPDATE_DELAY < 15000 #error "SNTPv4 RFC 4330 enforces a minimum update time of 15 seconds (define SNTP_SUPPRESS_DELAY_CHECK to disable this error)!" #endif - -/* Configure behaviour depending on microsecond or second precision */ -#ifdef SNTP_SET_SYSTEM_TIME_US -#define SNTP_CALC_TIME_US 1 -#define SNTP_RECEIVE_TIME_SIZE 2 -#else -#define SNTP_SET_SYSTEM_TIME_US(sec, us) -#define SNTP_CALC_TIME_US 0 -#define SNTP_RECEIVE_TIME_SIZE 1 #endif - /* the various debug levels for this file */ #define SNTP_DEBUG_TRACE (SNTP_DEBUG | LWIP_DBG_TRACE) #define SNTP_DEBUG_STATE (SNTP_DEBUG | LWIP_DBG_STATE) @@ -101,10 +91,10 @@ #define SNTP_OFFSET_LI_VN_MODE 0 #define SNTP_LI_MASK 0xC0 -#define SNTP_LI_NO_WARNING 0x00 -#define SNTP_LI_LAST_MINUTE_61_SEC 0x01 -#define SNTP_LI_LAST_MINUTE_59_SEC 0x02 -#define SNTP_LI_ALARM_CONDITION 0x03 /* (clock not synchronized) */ +#define SNTP_LI_NO_WARNING (0x00 << 6) +#define SNTP_LI_LAST_MINUTE_61_SEC (0x01 << 6) +#define SNTP_LI_LAST_MINUTE_59_SEC (0x02 << 6) +#define SNTP_LI_ALARM_CONDITION (0x03 << 6) /* (clock not synchronized) */ #define SNTP_VERSION_MASK 0x38 #define SNTP_VERSION (4/* NTP Version 4*/<<3) @@ -121,18 +111,89 @@ #define SNTP_OFFSET_RECEIVE_TIME 32 #define SNTP_OFFSET_TRANSMIT_TIME 40 -/* number of seconds between 1900 and 1970 (MSB=1)*/ -#define DIFF_SEC_1900_1970 (2208988800UL) -/* number of seconds between 1970 and Feb 7, 2036 (6:28:16 UTC) (MSB=0) */ -#define DIFF_SEC_1970_2036 (2085978496UL) +/* Number of seconds between 1970 and Feb 7, 2036 06:28:16 UTC (epoch 1) */ +#define DIFF_SEC_1970_2036 ((u32_t)2085978496L) + +/** Convert NTP timestamp fraction to microseconds. + */ +#ifndef SNTP_FRAC_TO_US +# if LWIP_HAVE_INT64 +# define SNTP_FRAC_TO_US(f) ((u32_t)(((u64_t)(f) * 1000000UL) >> 32)) +# else +# define SNTP_FRAC_TO_US(f) ((u32_t)(f) / 4295) +# endif +#endif /* !SNTP_FRAC_TO_US */ + +/* Configure behaviour depending on native, microsecond or second precision. + * Treat NTP timestamps as signed two's-complement integers. This way, + * timestamps that have the MSB set simply become negative offsets from + * the epoch (Feb 7, 2036 06:28:16 UTC). Representable dates range from + * 1968 to 2104. + */ +#ifndef SNTP_SET_SYSTEM_TIME_NTP +# ifdef SNTP_SET_SYSTEM_TIME_US +# define SNTP_SET_SYSTEM_TIME_NTP(s, f) \ + SNTP_SET_SYSTEM_TIME_US((u32_t)((s) + DIFF_SEC_1970_2036), SNTP_FRAC_TO_US(f)) +# else +# define SNTP_SET_SYSTEM_TIME_NTP(s, f) \ + SNTP_SET_SYSTEM_TIME((u32_t)((s) + DIFF_SEC_1970_2036)) +# endif +#endif /* !SNTP_SET_SYSTEM_TIME_NTP */ + +/* Get the system time either natively as NTP timestamp or convert from + * Unix time in seconds and microseconds. Take care to avoid overflow if the + * microsecond value is at the maximum of 999999. Also add 0.5 us fudge to + * avoid special values like 0, and to mask round-off errors that would + * otherwise break round-trip conversion identity. + */ +#ifndef SNTP_GET_SYSTEM_TIME_NTP +# define SNTP_GET_SYSTEM_TIME_NTP(s, f) do { \ + u32_t sec_, usec_; \ + SNTP_GET_SYSTEM_TIME(sec_, usec_); \ + (s) = (s32_t)(sec_ - DIFF_SEC_1970_2036); \ + (f) = usec_ * 4295 - ((usec_ * 2143) >> 16) + 2147; \ + } while (0) +#endif /* !SNTP_GET_SYSTEM_TIME_NTP */ + +/* Start offset of the timestamps to extract from the SNTP packet */ +#define SNTP_OFFSET_TIMESTAMPS \ + (SNTP_OFFSET_TRANSMIT_TIME + 8 - sizeof(struct sntp_timestamps)) + +/* Round-trip delay arithmetic helpers */ +#if SNTP_COMP_ROUNDTRIP +# if !LWIP_HAVE_INT64 +# error "SNTP round-trip delay compensation requires 64-bit arithmetic" +# endif +# define SNTP_SEC_FRAC_TO_S64(s, f) \ + ((s64_t)(((u64_t)(s) << 32) | (u32_t)(f))) +# define SNTP_TIMESTAMP_TO_S64(t) \ + SNTP_SEC_FRAC_TO_S64(lwip_ntohl((t).sec), lwip_ntohl((t).frac)) +#endif /* SNTP_COMP_ROUNDTRIP */ + +/** + * 64-bit NTP timestamp, in network byte order. + */ +struct sntp_time { + u32_t sec; + u32_t frac; +}; + +/** + * Timestamps to be extracted from the NTP header. + */ +struct sntp_timestamps { +#if SNTP_COMP_ROUNDTRIP || SNTP_CHECK_RESPONSE >= 2 + struct sntp_time orig; + struct sntp_time recv; +#endif + struct sntp_time xmit; +}; /** * SNTP packet format (without optional fields) * Timestamps are coded as 64 bits: - * - 32 bits seconds since Jan 01, 1970, 00:00 - * - 32 bits seconds fraction (0-padded) - * For future use, if the MSB in the seconds part is set, seconds are based - * on Feb 07, 2036, 06:28:16. + * - signed 32 bits seconds since Feb 07, 2036, 06:28:16 UTC (epoch 1) + * - unsigned 32 bits seconds fraction (2^32 = 1 second) */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" @@ -163,19 +224,23 @@ static void sntp_request(void *arg); static u8_t sntp_opmode; /** The UDP pcb used by the SNTP client */ -static struct udp_pcb* sntp_pcb; +static struct udp_pcb *sntp_pcb; /** Names/Addresses of servers */ struct sntp_server { #if SNTP_SERVER_DNS - char* name; + const char *name; #endif /* SNTP_SERVER_DNS */ ip_addr_t addr; +#if SNTP_MONITOR_SERVER_REACHABILITY + /** Reachability shift register as described in RFC 5905 */ + u8_t reachability; +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ }; static struct sntp_server sntp_servers[SNTP_MAX_SERVERS]; -#if SNTP_GET_SERVERS_FROM_DHCP +#if SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 static u8_t sntp_set_servers_from_dhcp; -#endif /* SNTP_GET_SERVERS_FROM_DHCP */ +#endif /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ #if SNTP_SUPPORT_MULTIPLE_SERVERS /** The currently used server (initialized to 0) */ static u8_t sntp_current_server; @@ -199,38 +264,69 @@ static ip_addr_t sntp_last_server_address; #if SNTP_CHECK_RESPONSE >= 2 /** Saves the last timestamp sent (which is sent back by the server) - * to compare against in response */ -static u32_t sntp_last_timestamp_sent[2]; + * to compare against in response. Stored in network byte order. */ +static struct sntp_time sntp_last_timestamp_sent; #endif /* SNTP_CHECK_RESPONSE >= 2 */ +#if defined(LWIP_DEBUG) && !defined(sntp_format_time) +/* Debug print helper. */ +static const char * +sntp_format_time(s32_t sec) +{ + time_t ut; + ut = (u32_t)((u32_t)sec + DIFF_SEC_1970_2036); + return ctime(&ut); +} +#endif /* LWIP_DEBUG && !sntp_format_time */ + /** * SNTP processing of received timestamp */ static void -sntp_process(u32_t *receive_timestamp) +sntp_process(const struct sntp_timestamps *timestamps) { - /* convert SNTP time (1900-based) to unix GMT time (1970-based) - * if MSB is 0, SNTP time is 2036-based! - */ - u32_t rx_secs = lwip_ntohl(receive_timestamp[0]); - int is_1900_based = ((rx_secs & 0x80000000) != 0); - u32_t t = is_1900_based ? (rx_secs - DIFF_SEC_1900_1970) : (rx_secs + DIFF_SEC_1970_2036); - time_t tim = t; + s32_t sec; + u32_t frac; -#if SNTP_CALC_TIME_US - u32_t us = lwip_ntohl(receive_timestamp[1]) / 4295; - SNTP_SET_SYSTEM_TIME_US(t, us); - /* display local time from GMT time */ - LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s, %"U32_F" us", ctime(&tim), us)); + sec = (s32_t)lwip_ntohl(timestamps->xmit.sec); + frac = lwip_ntohl(timestamps->xmit.frac); -#else /* SNTP_CALC_TIME_US */ +#if SNTP_COMP_ROUNDTRIP +# if SNTP_CHECK_RESPONSE >= 2 + if (timestamps->recv.sec != 0 || timestamps->recv.frac != 0) +# endif + { + s32_t dest_sec; + u32_t dest_frac; + u32_t step_sec; - /* change system time and/or the update the RTC clock */ - SNTP_SET_SYSTEM_TIME(t); - /* display local time from GMT time */ - LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s", ctime(&tim))); -#endif /* SNTP_CALC_TIME_US */ - LWIP_UNUSED_ARG(tim); + /* Get the destination time stamp, i.e. the current system time */ + SNTP_GET_SYSTEM_TIME_NTP(dest_sec, dest_frac); + + step_sec = (dest_sec < sec) ? ((u32_t)sec - (u32_t)dest_sec) + : ((u32_t)dest_sec - (u32_t)sec); + /* In order to avoid overflows, skip the compensation if the clock step + * is larger than about 34 years. */ + if ((step_sec >> 30) == 0) { + s64_t t1, t2, t3, t4; + + t4 = SNTP_SEC_FRAC_TO_S64(dest_sec, dest_frac); + t3 = SNTP_SEC_FRAC_TO_S64(sec, frac); + t1 = SNTP_TIMESTAMP_TO_S64(timestamps->orig); + t2 = SNTP_TIMESTAMP_TO_S64(timestamps->recv); + /* Clock offset calculation according to RFC 4330 */ + t4 += ((t2 - t1) + (t3 - t4)) / 2; + + sec = (s32_t)((u64_t)t4 >> 32); + frac = (u32_t)((u64_t)t4); + } + } +#endif /* SNTP_COMP_ROUNDTRIP */ + + SNTP_SET_SYSTEM_TIME_NTP(sec, frac); + LWIP_UNUSED_ARG(frac); /* might be unused if only seconds are set */ + LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_process: %s, %" U32_F " us\n", + sntp_format_time(sec), SNTP_FRAC_TO_US(frac))); } /** @@ -242,18 +338,23 @@ sntp_initialize_request(struct sntp_msg *req) memset(req, 0, SNTP_MSG_LEN); req->li_vn_mode = SNTP_LI_NO_WARNING | SNTP_VERSION | SNTP_MODE_CLIENT; -#if SNTP_CHECK_RESPONSE >= 2 +#if SNTP_CHECK_RESPONSE >= 2 || SNTP_COMP_ROUNDTRIP { - u32_t sntp_time_sec, sntp_time_us; - /* fill in transmit timestamp and save it in 'sntp_last_timestamp_sent' */ - SNTP_GET_SYSTEM_TIME(sntp_time_sec, sntp_time_us); - sntp_last_timestamp_sent[0] = lwip_htonl(sntp_time_sec + DIFF_SEC_1900_1970); - req->transmit_timestamp[0] = sntp_last_timestamp_sent[0]; - /* we send/save us instead of fraction to be faster... */ - sntp_last_timestamp_sent[1] = lwip_htonl(sntp_time_us); - req->transmit_timestamp[1] = sntp_last_timestamp_sent[1]; + s32_t secs; + u32_t sec, frac; + /* Get the transmit timestamp */ + SNTP_GET_SYSTEM_TIME_NTP(secs, frac); + sec = lwip_htonl((u32_t)secs); + frac = lwip_htonl(frac); + +# if SNTP_CHECK_RESPONSE >= 2 + sntp_last_timestamp_sent.sec = sec; + sntp_last_timestamp_sent.frac = frac; +# endif + req->transmit_timestamp[0] = sec; + req->transmit_timestamp[1] = frac; } -#endif /* SNTP_CHECK_RESPONSE >= 2 */ +#endif /* SNTP_CHECK_RESPONSE >= 2 || SNTP_COMP_ROUNDTRIP */ } /** @@ -262,14 +363,15 @@ sntp_initialize_request(struct sntp_msg *req) * @param arg is unused (only necessary to conform to sys_timeout) */ static void -sntp_retry(void* arg) +sntp_retry(void *arg) { LWIP_UNUSED_ARG(arg); LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_retry: Next request will be sent in %"U32_F" ms\n", - sntp_retry_timeout)); + sntp_retry_timeout)); /* set up a timer to send a retry and increase the retry delay */ + sys_untimeout(sntp_request, NULL); sys_timeout(sntp_retry_timeout, sntp_request, NULL); #if SNTP_RETRY_TIMEOUT_EXP @@ -281,6 +383,8 @@ sntp_retry(void* arg) if ((new_retry_timeout <= SNTP_RETRY_TIMEOUT_MAX) && (new_retry_timeout > sntp_retry_timeout)) { sntp_retry_timeout = new_retry_timeout; + } else { + sntp_retry_timeout = SNTP_RETRY_TIMEOUT_MAX; } } #endif /* SNTP_RETRY_TIMEOUT_EXP */ @@ -296,7 +400,7 @@ sntp_retry(void* arg) * @param arg is unused (only necessary to conform to sys_timeout) */ static void -sntp_try_next_server(void* arg) +sntp_try_next_server(void *arg) { u8_t old_server, i; LWIP_UNUSED_ARG(arg); @@ -311,9 +415,9 @@ sntp_try_next_server(void* arg) #if SNTP_SERVER_DNS || (sntp_servers[sntp_current_server].name != NULL) #endif - ) { + ) { LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_try_next_server: Sending request to server %"U16_F"\n", - (u16_t)sntp_current_server)); + (u16_t)sntp_current_server)); /* new server: reset retry timeout */ SNTP_RESET_RETRY_TIMEOUT(); /* instantly send a request to the next server */ @@ -332,25 +436,21 @@ sntp_try_next_server(void* arg) /** UDP recv callback for the sntp pcb */ static void -sntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +sntp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { + struct sntp_timestamps timestamps; u8_t mode; u8_t stratum; - u32_t receive_timestamp[SNTP_RECEIVE_TIME_SIZE]; err_t err; LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(pcb); - /* packet received: stop retry timeout */ - sys_untimeout(sntp_try_next_server, NULL); - sys_untimeout(sntp_request, NULL); - err = ERR_ARG; #if SNTP_CHECK_RESPONSE >= 1 /* check server address and port */ if (((sntp_opmode != SNTP_OPMODE_POLL) || ip_addr_cmp(addr, &sntp_last_server_address)) && - (port == SNTP_PORT)) + (port == SNTP_PORT)) #else /* SNTP_CHECK_RESPONSE >= 1 */ LWIP_UNUSED_ARG(addr); LWIP_UNUSED_ARG(port); @@ -358,32 +458,30 @@ sntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, { /* process the response */ if (p->tot_len == SNTP_MSG_LEN) { - pbuf_copy_partial(p, &mode, 1, SNTP_OFFSET_LI_VN_MODE); - mode &= SNTP_MODE_MASK; + mode = pbuf_get_at(p, SNTP_OFFSET_LI_VN_MODE) & SNTP_MODE_MASK; /* if this is a SNTP response... */ - if (((sntp_opmode == SNTP_OPMODE_POLL) && (mode == SNTP_MODE_SERVER)) || + if (((sntp_opmode == SNTP_OPMODE_POLL) && (mode == SNTP_MODE_SERVER)) || ((sntp_opmode == SNTP_OPMODE_LISTENONLY) && (mode == SNTP_MODE_BROADCAST))) { - pbuf_copy_partial(p, &stratum, 1, SNTP_OFFSET_STRATUM); + stratum = pbuf_get_at(p, SNTP_OFFSET_STRATUM); + if (stratum == SNTP_STRATUM_KOD) { /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */ err = SNTP_ERR_KOD; LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_recv: Received Kiss-of-Death\n")); } else { + pbuf_copy_partial(p, ×tamps, sizeof(timestamps), SNTP_OFFSET_TIMESTAMPS); #if SNTP_CHECK_RESPONSE >= 2 /* check originate_timetamp against sntp_last_timestamp_sent */ - u32_t originate_timestamp[2]; - pbuf_copy_partial(p, &originate_timestamp, 8, SNTP_OFFSET_ORIGINATE_TIME); - if ((originate_timestamp[0] != sntp_last_timestamp_sent[0]) || - (originate_timestamp[1] != sntp_last_timestamp_sent[1])) - { - LWIP_DEBUGF(SNTP_DEBUG_WARN, ("sntp_recv: Invalid originate timestamp in response\n")); + if (timestamps.orig.sec != sntp_last_timestamp_sent.sec || + timestamps.orig.frac != sntp_last_timestamp_sent.frac) { + LWIP_DEBUGF(SNTP_DEBUG_WARN, + ("sntp_recv: Invalid originate timestamp in response\n")); } else #endif /* SNTP_CHECK_RESPONSE >= 2 */ - /* @todo: add code for SNTP_CHECK_RESPONSE >= 3 and >= 4 here */ + /* @todo: add code for SNTP_CHECK_RESPONSE >= 3 and >= 4 here */ { /* correct answer */ err = ERR_OK; - pbuf_copy_partial(p, &receive_timestamp, SNTP_RECEIVE_TIME_SIZE * 4, SNTP_OFFSET_TRANSMIT_TIME); } } } else { @@ -401,30 +499,39 @@ sntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, err = ERR_TIMEOUT; } #endif /* SNTP_CHECK_RESPONSE >= 1 */ - pbuf_free(p); - if (err == ERR_OK) { - sntp_process(receive_timestamp); + pbuf_free(p); + + if (err == ERR_OK) { + /* correct packet received: process it it */ + sntp_process(×tamps); + +#if SNTP_MONITOR_SERVER_REACHABILITY + /* indicate that server responded */ + sntp_servers[sntp_current_server].reachability |= 1; +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ /* Set up timeout for next request (only if poll response was received)*/ if (sntp_opmode == SNTP_OPMODE_POLL) { + u32_t sntp_update_delay; + sys_untimeout(sntp_try_next_server, NULL); + sys_untimeout(sntp_request, NULL); + /* Correct response, reset retry timeout */ SNTP_RESET_RETRY_TIMEOUT(); - sys_timeout((u32_t)SNTP_UPDATE_DELAY, sntp_request, NULL); + sntp_update_delay = (u32_t)SNTP_UPDATE_DELAY; + sys_timeout(sntp_update_delay, sntp_request, NULL); LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_recv: Scheduled next time request: %"U32_F" ms\n", - (u32_t)SNTP_UPDATE_DELAY)); + sntp_update_delay)); } - } else if (err != ERR_TIMEOUT) { - /* Errors are only processed in case of an explicit poll response */ + } else if (err == SNTP_ERR_KOD) { + /* KOD errors are only processed in case of an explicit poll response */ if (sntp_opmode == SNTP_OPMODE_POLL) { - if (err == SNTP_ERR_KOD) { - /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */ - sntp_try_next_server(NULL); - } else { - /* another error, try the same server again */ - sntp_retry(NULL); - } + /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */ + sntp_try_next_server(NULL); } + } else { + /* ignore any broken packet, poll mode: retry after timeout to avoid flooding */ } } @@ -435,7 +542,10 @@ sntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, static void sntp_send_request(const ip_addr_t *server_addr) { - struct pbuf* p; + struct pbuf *p; + + LWIP_ASSERT("server_addr != NULL", server_addr != NULL); + p = pbuf_alloc(PBUF_TRANSPORT, SNTP_MSG_LEN, PBUF_RAM); if (p != NULL) { struct sntp_msg *sntpmsg = (struct sntp_msg *)p->payload; @@ -446,16 +556,22 @@ sntp_send_request(const ip_addr_t *server_addr) udp_sendto(sntp_pcb, p, server_addr, SNTP_PORT); /* free the pbuf after sending it */ pbuf_free(p); +#if SNTP_MONITOR_SERVER_REACHABILITY + /* indicate new packet has been sent */ + sntp_servers[sntp_current_server].reachability <<= 1; +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ /* set up receive timeout: try next server or retry on timeout */ + sys_untimeout(sntp_try_next_server, NULL); sys_timeout((u32_t)SNTP_RECV_TIMEOUT, sntp_try_next_server, NULL); #if SNTP_CHECK_RESPONSE >= 1 /* save server address to verify it in sntp_recv */ - ip_addr_set(&sntp_last_server_address, server_addr); + ip_addr_copy(sntp_last_server_address, *server_addr); #endif /* SNTP_CHECK_RESPONSE >= 1 */ } else { LWIP_DEBUGF(SNTP_DEBUG_SERIOUS, ("sntp_send_request: Out of memory, trying again in %"U32_F" ms\n", - (u32_t)SNTP_RETRY_TIMEOUT)); + (u32_t)SNTP_RETRY_TIMEOUT)); /* out of memory: set up a timer to send a retry */ + sys_untimeout(sntp_request, NULL); sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_request, NULL); } } @@ -465,7 +581,7 @@ sntp_send_request(const ip_addr_t *server_addr) * DNS found callback when using DNS names as server address. */ static void -sntp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) +sntp_dns_found(const char *hostname, const ip_addr_t *ipaddr, void *arg) { LWIP_UNUSED_ARG(hostname); LWIP_UNUSED_ARG(arg); @@ -473,6 +589,7 @@ sntp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg) if (ipaddr != NULL) { /* Address resolved, send request */ LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_dns_found: Server address resolved, sending request\n")); + sntp_servers[sntp_current_server].addr = *ipaddr; sntp_send_request(ipaddr); } else { /* DNS resolving failed -> try another server */ @@ -501,7 +618,7 @@ sntp_request(void *arg) /* always resolve the name and rely on dns-internal caching & timeout */ ip_addr_set_zero(&sntp_servers[sntp_current_server].addr); err = dns_gethostbyname(sntp_servers[sntp_current_server].name, &sntp_server_address, - sntp_dns_found, NULL); + sntp_dns_found, NULL); if (err == ERR_INPROGRESS) { /* DNS request sent, wait for sntp_dns_found being called */ LWIP_DEBUGF(SNTP_DEBUG_STATE, ("sntp_request: Waiting for server address to be resolved.\n")); @@ -518,11 +635,12 @@ sntp_request(void *arg) if (err == ERR_OK) { LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_request: current server address is %s\n", - ipaddr_ntoa(&sntp_server_address))); + ipaddr_ntoa(&sntp_server_address))); sntp_send_request(&sntp_server_address); } else { /* address conversion failed, try another server */ LWIP_DEBUGF(SNTP_DEBUG_WARN_STATE, ("sntp_request: Invalid server address, trying next server.\n")); + sys_untimeout(sntp_try_next_server, NULL); sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_try_next_server, NULL); } } @@ -535,6 +653,9 @@ sntp_request(void *arg) void sntp_init(void) { + /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */ + LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp_init: SNTP initialised\n")); + #ifdef SNTP_SERVER_ADDRESS #if SNTP_SERVER_DNS sntp_setservername(0, SNTP_SERVER_ADDRESS); @@ -571,7 +692,14 @@ sntp_init(void) void sntp_stop(void) { + LWIP_ASSERT_CORE_LOCKED(); if (sntp_pcb != NULL) { +#if SNTP_MONITOR_SERVER_REACHABILITY + u8_t i; + for (i = 0; i < SNTP_MAX_SERVERS; i++) { + sntp_servers[i].reachability = 0; + } +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ sys_untimeout(sntp_request, NULL); sys_untimeout(sntp_try_next_server, NULL); udp_remove(sntp_pcb); @@ -585,7 +713,7 @@ sntp_stop(void) */ u8_t sntp_enabled(void) { - return (sntp_pcb != NULL)? 1 : 0; + return (sntp_pcb != NULL) ? 1 : 0; } /** @@ -596,6 +724,7 @@ u8_t sntp_enabled(void) void sntp_setoperatingmode(u8_t operating_mode) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("Invalid operating mode", operating_mode <= SNTP_OPMODE_LISTENONLY); LWIP_ASSERT("Operating mode must not be set while SNTP client is running", sntp_pcb == NULL); sntp_opmode = operating_mode; @@ -611,7 +740,24 @@ sntp_getoperatingmode(void) return sntp_opmode; } -#if SNTP_GET_SERVERS_FROM_DHCP +#if SNTP_MONITOR_SERVER_REACHABILITY +/** + * @ingroup sntp + * Gets the server reachability shift register as described in RFC 5905. + * + * @param idx the index of the NTP server + */ +u8_t +sntp_getreachability(u8_t idx) +{ + if (idx < SNTP_MAX_SERVERS) { + return sntp_servers[idx].reachability; + } + return 0; +} +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ + +#if SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 /** * Config SNTP server handling by IP address, name, or DHCP; clear table * @param set_servers_from_dhcp enable or disable getting server addresses from dhcp @@ -620,11 +766,12 @@ void sntp_servermode_dhcp(int set_servers_from_dhcp) { u8_t new_mode = set_servers_from_dhcp ? 1 : 0; + LWIP_ASSERT_CORE_LOCKED(); if (sntp_set_servers_from_dhcp != new_mode) { sntp_set_servers_from_dhcp = new_mode; } } -#endif /* SNTP_GET_SERVERS_FROM_DHCP */ +#endif /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ /** * @ingroup sntp @@ -636,6 +783,7 @@ sntp_servermode_dhcp(int set_servers_from_dhcp) void sntp_setserver(u8_t idx, const ip_addr_t *server) { + LWIP_ASSERT_CORE_LOCKED(); if (idx < SNTP_MAX_SERVERS) { if (server != NULL) { sntp_servers[idx].addr = (*server); @@ -652,15 +800,15 @@ sntp_setserver(u8_t idx, const ip_addr_t *server) /** * Initialize one of the NTP servers by IP address, required by DHCP * - * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS - * @param dnsserver IP address of the NTP server to set + * @param num the index of the NTP server to set must be < SNTP_MAX_SERVERS + * @param server IP address of the NTP server to set */ void dhcp_set_ntp_servers(u8_t num, const ip4_addr_t *server) { LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp: %s %u.%u.%u.%u as NTP server #%u via DHCP\n", - (sntp_set_servers_from_dhcp ? "Got" : "Rejected"), - ip4_addr1(server), ip4_addr2(server), ip4_addr3(server), ip4_addr4(server), num)); + (sntp_set_servers_from_dhcp ? "Got" : "Rejected"), + ip4_addr1(server), ip4_addr2(server), ip4_addr3(server), ip4_addr4(server), num)); if (sntp_set_servers_from_dhcp && num) { u8_t i; for (i = 0; (i < num) && (i < SNTP_MAX_SERVERS); i++) { @@ -675,6 +823,33 @@ dhcp_set_ntp_servers(u8_t num, const ip4_addr_t *server) } #endif /* LWIP_DHCP && SNTP_GET_SERVERS_FROM_DHCP */ +#if LWIP_IPV6_DHCP6 && SNTP_GET_SERVERS_FROM_DHCPV6 +/** + * Initialize one of the NTP servers by IP address, required by DHCPV6 + * + * @param num the number of NTP server addresses to set must be < SNTP_MAX_SERVERS + * @param server array of IP address of the NTP servers to set + */ +void +dhcp6_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs) +{ + LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp: %s %u NTP server(s) via DHCPv6\n", + (sntp_set_servers_from_dhcp ? "Got" : "Rejected"), + num_ntp_servers)); + if (sntp_set_servers_from_dhcp && num_ntp_servers) { + u8_t i; + for (i = 0; (i < num_ntp_servers) && (i < SNTP_MAX_SERVERS); i++) { + LWIP_DEBUGF(SNTP_DEBUG_TRACE, ("sntp: NTP server %u: %s\n", + i, ipaddr_ntoa(&ntp_server_addrs[i]))); + sntp_setserver(i, &ntp_server_addrs[i]); + } + for (i = num_ntp_servers; i < SNTP_MAX_SERVERS; i++) { + sntp_setserver(i, NULL); + } + } +} +#endif /* LWIP_DHCPv6 && SNTP_GET_SERVERS_FROM_DHCPV6 */ + /** * @ingroup sntp * Obtain one of the currently configured by IP address (or DHCP) NTP servers @@ -683,7 +858,7 @@ dhcp_set_ntp_servers(u8_t num, const ip4_addr_t *server) * @return IP address of the indexed NTP server or "ip_addr_any" if the NTP * server has not been configured by address (or at all). */ -const ip_addr_t* +const ip_addr_t * sntp_getserver(u8_t idx) { if (idx < SNTP_MAX_SERVERS) { @@ -696,12 +871,13 @@ sntp_getserver(u8_t idx) /** * Initialize one of the NTP servers by name * - * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS - * @param dnsserver DNS name of the NTP server to set, to be resolved at contact time + * @param idx the index of the NTP server to set must be < SNTP_MAX_SERVERS + * @param server DNS name of the NTP server to set, to be resolved at contact time */ void -sntp_setservername(u8_t idx, char *server) +sntp_setservername(u8_t idx, const char *server) { + LWIP_ASSERT_CORE_LOCKED(); if (idx < SNTP_MAX_SERVERS) { sntp_servers[idx].name = server; } @@ -710,11 +886,11 @@ sntp_setservername(u8_t idx, char *server) /** * Obtain one of the currently configured by name NTP servers. * - * @param numdns the index of the NTP server + * @param idx the index of the NTP server * @return IP address of the indexed NTP server or NULL if the NTP * server has not been configured by name (or at all) */ -char * +const char * sntp_getservername(u8_t idx) { if (idx < SNTP_MAX_SERVERS) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/tftp/tftp_server.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/tftp/tftp_server.c similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/tftp/tftp_server.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/tftp/tftp_server.c index 243b092..e3f1512 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/tftp/tftp_server.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/apps/tftp/tftp_server.c @@ -1,4 +1,4 @@ -/****************************************************************//** +/** * * @file tftp_server.c * @@ -10,9 +10,9 @@ * Copyright (c) Deltatee Enterprises Ltd. 2013 * All rights reserved. * - ********************************************************************/ + */ -/* +/* * Redistribution and use in source and binary forms, with or without * modification,are permitted provided that the following conditions are met: * @@ -92,7 +92,7 @@ struct tftp_state { static struct tftp_state tftp_state; -static void tftp_tmr(void* arg); +static void tftp_tmr(void *arg); static void close_handle(void) @@ -100,13 +100,13 @@ close_handle(void) tftp_state.port = 0; ip_addr_set_any(0, &tftp_state.addr); - if(tftp_state.last_data != NULL) { + if (tftp_state.last_data != NULL) { pbuf_free(tftp_state.last_data); tftp_state.last_data = NULL; } sys_untimeout(tftp_tmr, NULL); - + if (tftp_state.handle) { tftp_state.ctx->close(tftp_state.handle); tftp_state.handle = NULL; @@ -118,15 +118,15 @@ static void send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str) { int str_length = strlen(str); - struct pbuf* p; - u16_t* payload; - + struct pbuf *p; + u16_t *payload; + p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(TFTP_HEADER_LENGTH + str_length + 1), PBUF_RAM); - if(p == NULL) { + if (p == NULL) { return; } - payload = (u16_t*) p->payload; + payload = (u16_t *) p->payload; payload[0] = PP_HTONS(TFTP_ERROR); payload[1] = lwip_htons(code); MEMCPY(&payload[2], str, str_length + 1); @@ -138,15 +138,15 @@ send_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char * static void send_ack(u16_t blknum) { - struct pbuf* p; - u16_t* payload; - + struct pbuf *p; + u16_t *payload; + p = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH, PBUF_RAM); - if(p == NULL) { + if (p == NULL) { return; } - payload = (u16_t*) p->payload; - + payload = (u16_t *) p->payload; + payload[0] = PP_HTONS(TFTP_ACK); payload[1] = lwip_htons(blknum); udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port); @@ -157,15 +157,15 @@ static void resend_data(void) { struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, tftp_state.last_data->len, PBUF_RAM); - if(p == NULL) { + if (p == NULL) { return; } - if(pbuf_copy(p, tftp_state.last_data) != ERR_OK) { + if (pbuf_copy(p, tftp_state.last_data) != ERR_OK) { pbuf_free(p); return; } - + udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port); pbuf_free(p); } @@ -176,12 +176,12 @@ send_data(void) u16_t *payload; int ret; - if(tftp_state.last_data != NULL) { + if (tftp_state.last_data != NULL) { pbuf_free(tftp_state.last_data); } - + tftp_state.last_data = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH + TFTP_MAX_PAYLOAD_SIZE, PBUF_RAM); - if(tftp_state.last_data == NULL) { + if (tftp_state.last_data == NULL) { return; } @@ -208,7 +208,7 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(upcb); - + if (((tftp_state.port != 0) && (port != tftp_state.port)) || (!ip_addr_isany_val(tftp_state.addr) && !ip_addr_cmp(&tftp_state.addr, addr))) { send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Only one connection at a time is supported"); @@ -223,37 +223,36 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 switch (opcode) { case PP_HTONS(TFTP_RRQ): /* fall through */ - case PP_HTONS(TFTP_WRQ): - { + case PP_HTONS(TFTP_WRQ): { const char tftp_null = 0; - char filename[TFTP_MAX_FILENAME_LEN]; - char mode[TFTP_MAX_MODE_LEN]; + char filename[TFTP_MAX_FILENAME_LEN + 1]; + char mode[TFTP_MAX_MODE_LEN + 1]; u16_t filename_end_offset; u16_t mode_end_offset; - if(tftp_state.handle != NULL) { + if (tftp_state.handle != NULL) { send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Only one connection at a time is supported"); break; } - + sys_timeout(TFTP_TIMER_MSECS, tftp_tmr, NULL); /* find \0 in pbuf -> end of filename string */ filename_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), 2); - if((u16_t)(filename_end_offset-2) > sizeof(filename)) { + if ((u16_t)(filename_end_offset - 1) > sizeof(filename)) { send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Filename too long/not NULL terminated"); break; } - pbuf_copy_partial(p, filename, filename_end_offset-2, 2); + pbuf_copy_partial(p, filename, filename_end_offset - 1, 2); /* find \0 in pbuf -> end of mode string */ - mode_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), filename_end_offset+1); - if((u16_t)(mode_end_offset-filename_end_offset) > sizeof(mode)) { + mode_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), filename_end_offset + 1); + if ((u16_t)(mode_end_offset - filename_end_offset) > sizeof(mode)) { send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Mode too long/not NULL terminated"); break; } - pbuf_copy_partial(p, mode, mode_end_offset-filename_end_offset, filename_end_offset+1); - + pbuf_copy_partial(p, mode, mode_end_offset - filename_end_offset, filename_end_offset + 1); + tftp_state.handle = tftp_state.ctx->open(filename, mode, opcode == PP_HTONS(TFTP_WRQ)); tftp_state.blknum = 1; @@ -279,12 +278,11 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 break; } - - case PP_HTONS(TFTP_DATA): - { + + case PP_HTONS(TFTP_DATA): { int ret; u16_t blknum; - + if (tftp_state.handle == NULL) { send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "No connection"); break; @@ -296,24 +294,32 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 } blknum = lwip_ntohs(sbuf[1]); - pbuf_header(p, -TFTP_HEADER_LENGTH); + if (blknum == tftp_state.blknum) { + pbuf_remove_header(p, TFTP_HEADER_LENGTH); - ret = tftp_state.ctx->write(tftp_state.handle, p); - if (ret < 0) { - send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "error writing file"); - close_handle(); - } else { + ret = tftp_state.ctx->write(tftp_state.handle, p); + if (ret < 0) { + send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "error writing file"); + close_handle(); + } else { + send_ack(blknum); + } + + if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) { + close_handle(); + } else { + tftp_state.blknum++; + } + } else if ((u16_t)(blknum + 1) == tftp_state.blknum) { + /* retransmit of previous block, ack again (casting to u16_t to care for overflow) */ send_ack(blknum); - } - - if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) { - close_handle(); + } else { + send_error(addr, port, TFTP_ERROR_UNKNOWN_TRFR_ID, "Wrong block number"); } break; } - case PP_HTONS(TFTP_ACK): - { + case PP_HTONS(TFTP_ACK): { u16_t blknum; int lastpkt; @@ -348,7 +354,7 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 break; } - + default: send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Unknown operation"); break; @@ -358,10 +364,10 @@ recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16 } static void -tftp_tmr(void* arg) +tftp_tmr(void *arg) { LWIP_UNUSED_ARG(arg); - + tftp_state.timer++; if (tftp_state.handle == NULL) { @@ -386,11 +392,12 @@ tftp_tmr(void* arg) * Initialize TFTP server. * @param ctx TFTP callback struct */ -err_t +err_t tftp_init(const struct tftp_context *ctx) { err_t ret; + /* LWIP_ASSERT_CORE_LOCKED(); is checked by udp_new() */ struct udp_pcb *pcb = udp_new_ip_type(IPADDR_TYPE_ANY); if (pcb == NULL) { return ERR_MEM; @@ -414,4 +421,15 @@ tftp_init(const struct tftp_context *ctx) return ERR_OK; } +/** @ingroup tftp + * Deinitialize ("turn off") TFTP server. + */ +void tftp_cleanup(void) +{ + LWIP_ASSERT("Cleanup called on non-initialized TFTP", tftp_state.upcb != NULL); + udp_remove(tftp_state.upcb); + close_handle(); + memset(&tftp_state, 0, sizeof(tftp_state)); +} + #endif /* LWIP_UDP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/Makefile similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/Makefile index 5c19968..6b123d7 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/Makefile +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/Makefile @@ -1,10 +1,6 @@ TOP_DIR = ../../../.. sinclude $(TOP_DIR)/tools/w800/conf.mk -EXCLUDES = timers.c - -CSRCS = $(filter-out $(EXCLUDES), $(wildcard *.c)) - ifndef PDIR GEN_LIBS = libcore$(LIB_EXT) COMPONENTS_libcore = ipv4/libipv4$(LIB_EXT) \ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/alg.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/alg.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/alg.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/alg.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp.c new file mode 100644 index 0000000..4abef7c --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp.c @@ -0,0 +1,717 @@ +/** + * @file + * @defgroup altcp Application layered TCP Functions + * @ingroup altcp_api + * + * This file contains the common functions for altcp to work. + * For more details see @ref altcp_api. + */ + +/** + * @defgroup altcp_api Application layered TCP Introduction + * @ingroup callbackstyle_api + * + * Overview + * -------- + * altcp (application layered TCP connection API; to be used from TCPIP thread) + * is an abstraction layer that prevents applications linking hard against the + * @ref tcp.h functions while providing the same functionality. It is used to + * e.g. add SSL/TLS (see LWIP_ALTCP_TLS) or proxy-connect support to an application + * written for the tcp callback API without that application knowing the + * protocol details. + * + * * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + * * This is achieved by simply including "lwip/altcp.h" instead of "lwip/tcp.h", + * replacing "struct tcp_pcb" with "struct altcp_pcb" and prefixing all functions + * with "altcp_" instead of "tcp_". + * + * With altcp support disabled (LWIP_ALTCP==0), applications written against the + * altcp API can still be compiled but are directly linked against the tcp.h + * callback API and then cannot use layered protocols. To minimize code changes + * in this case, the use of altcp_allocators is strongly suggested. + * + * Usage + * ----- + * To make use of this API from an existing tcp raw API application: + * * Include "lwip/altcp.h" instead of "lwip/tcp.h" + * * Replace "struct tcp_pcb" with "struct altcp_pcb" + * * Prefix all called tcp API functions with "altcp_" instead of "tcp_" to link + * against the altcp functions + * * @ref altcp_new (and @ref altcp_new_ip_type/@ref altcp_new_ip6) take + * an @ref altcp_allocator_t as an argument, whereas the original tcp API + * functions take no arguments. + * * An @ref altcp_allocator_t allocator is an object that holds a pointer to an + * allocator object and a corresponding state (e.g. for TLS, the corresponding + * state may hold certificates or keys). This way, the application does not + * even need to know if it uses TLS or pure TCP, this is handled at runtime + * by passing a specific allocator. + * * An application can alternatively bind hard to the altcp_tls API by calling + * @ref altcp_tls_new or @ref altcp_tls_wrap. + * * The TLS layer is not directly implemented by lwIP, but a port to mbedTLS is + * provided. + * * Another altcp layer is proxy-connect to use TLS behind a HTTP proxy (see + * @ref altcp_proxyconnect.h) + * + * altcp_allocator_t + * ----------------- + * An altcp allocator is created by the application by combining an allocator + * callback function and a corresponding state, e.g.:\code{.c} + * static const unsigned char cert[] = {0x2D, ... (see mbedTLS doc for how to create this)}; + * struct altcp_tls_config * conf = altcp_tls_create_config_client(cert, sizeof(cert)); + * altcp_allocator_t tls_allocator = { + * altcp_tls_alloc, conf + * }; + * \endcode + * + * + * struct altcp_tls_config + * ----------------------- + * The struct altcp_tls_config holds state that is needed to create new TLS client + * or server connections (e.g. certificates and private keys). + * + * It is not defined by lwIP itself but by the TLS port (e.g. altcp_tls to mbedTLS + * adaption). However, the parameters used to create it are defined in @ref + * altcp_tls.h (see @ref altcp_tls_create_config_server_privkey_cert for servers + * and @ref altcp_tls_create_config_client/@ref altcp_tls_create_config_client_2wayauth + * for clients). + * + * For mbedTLS, ensure that certificates can be parsed by 'mbedtls_x509_crt_parse()' and + * private keys can be parsed by 'mbedtls_pk_parse_key()'. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/priv/altcp_priv.h" +#include "lwip/altcp_tcp.h" +#include "lwip/tcp.h" +#include "lwip/mem.h" + +#include + +extern const struct altcp_functions altcp_tcp_functions; + +/** + * For altcp layer implementations only: allocate a new struct altcp_pcb from the pool + * and zero the memory + */ +struct altcp_pcb * +altcp_alloc(void) +{ + struct altcp_pcb *ret = (struct altcp_pcb *)memp_malloc(MEMP_ALTCP_PCB); + if (ret != NULL) { + memset(ret, 0, sizeof(struct altcp_pcb)); + } + return ret; +} + +/** + * For altcp layer implementations only: return a struct altcp_pcb to the pool + */ +void +altcp_free(struct altcp_pcb *conn) +{ + if (conn) { + if (conn->fns && conn->fns->dealloc) { + conn->fns->dealloc(conn); + } + memp_free(MEMP_ALTCP_PCB, conn); + } +} + +/** + * @ingroup altcp + * altcp_new_ip6: @ref altcp_new for IPv6 + */ +struct altcp_pcb * +altcp_new_ip6(altcp_allocator_t *allocator) +{ + return altcp_new_ip_type(allocator, IPADDR_TYPE_V6); +} + +/** + * @ingroup altcp + * altcp_new: @ref altcp_new for IPv4 + */ +struct altcp_pcb * +altcp_new(altcp_allocator_t *allocator) +{ + return altcp_new_ip_type(allocator, IPADDR_TYPE_V4); +} + +/** + * @ingroup altcp + * altcp_new_ip_type: called by applications to allocate a new pcb with the help of an + * allocator function. + * + * @param allocator allocator function and argument + * @param ip_type IP version of the pcb (@ref lwip_ip_addr_type) + * @return a new altcp_pcb or NULL on error + */ +struct altcp_pcb * +altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type) +{ + struct altcp_pcb *conn; + if (allocator == NULL) { + /* no allocator given, create a simple TCP connection */ + return altcp_tcp_new_ip_type(ip_type); + } + if (allocator->alloc == NULL) { + /* illegal allocator */ + return NULL; + } + conn = allocator->alloc(allocator->arg, ip_type); + if (conn == NULL) { + /* allocation failed */ + return NULL; + } + return conn; +} + +/** + * @ingroup altcp + * @see tcp_arg() + */ +void +altcp_arg(struct altcp_pcb *conn, void *arg) +{ + if (conn) { + conn->arg = arg; + } +} + +/** + * @ingroup altcp + * @see tcp_accept() + */ +void +altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept) +{ + if (conn != NULL) { + conn->accept = accept; + } +} + +/** + * @ingroup altcp + * @see tcp_recv() + */ +void +altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv) +{ + if (conn) { + conn->recv = recv; + } +} + +/** + * @ingroup altcp + * @see tcp_sent() + */ +void +altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent) +{ + if (conn) { + conn->sent = sent; + } +} + +/** + * @ingroup altcp + * @see tcp_poll() + */ +void +altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval) +{ + if (conn) { + conn->poll = poll; + conn->pollinterval = interval; + if (conn->fns && conn->fns->set_poll) { + conn->fns->set_poll(conn, interval); + } + } +} + +/** + * @ingroup altcp + * @see tcp_err() + */ +void +altcp_err(struct altcp_pcb *conn, altcp_err_fn err) +{ + if (conn) { + conn->err = err; + } +} + +/* Generic functions calling the "virtual" ones */ + +/** + * @ingroup altcp + * @see tcp_recved() + */ +void +altcp_recved(struct altcp_pcb *conn, u16_t len) +{ + if (conn && conn->fns && conn->fns->recved) { + conn->fns->recved(conn, len); + } +} + +/** + * @ingroup altcp + * @see tcp_bind() + */ +err_t +altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port) +{ + if (conn && conn->fns && conn->fns->bind) { + return conn->fns->bind(conn, ipaddr, port); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_connect() + */ +err_t +altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected) +{ + if (conn && conn->fns && conn->fns->connect) { + return conn->fns->connect(conn, ipaddr, port, connected); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_listen_with_backlog_and_err() + */ +struct altcp_pcb * +altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err) +{ + if (conn && conn->fns && conn->fns->listen) { + return conn->fns->listen(conn, backlog, err); + } + return NULL; +} + +/** + * @ingroup altcp + * @see tcp_abort() + */ +void +altcp_abort(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->abort) { + conn->fns->abort(conn); + } +} + +/** + * @ingroup altcp + * @see tcp_close() + */ +err_t +altcp_close(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->close) { + return conn->fns->close(conn); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_shutdown() + */ +err_t +altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx) +{ + if (conn && conn->fns && conn->fns->shutdown) { + return conn->fns->shutdown(conn, shut_rx, shut_tx); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_write() + */ +err_t +altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + if (conn && conn->fns && conn->fns->write) { + return conn->fns->write(conn, dataptr, len, apiflags); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_output() + */ +err_t +altcp_output(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->output) { + return conn->fns->output(conn); + } + return ERR_VAL; +} + +/** + * @ingroup altcp + * @see tcp_mss() + */ +u16_t +altcp_mss(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->mss) { + return conn->fns->mss(conn); + } + return 0; +} + +/** + * @ingroup altcp + * @see tcp_sndbuf() + */ +u16_t +altcp_sndbuf(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->sndbuf) { + return conn->fns->sndbuf(conn); + } + return 0; +} + +/** + * @ingroup altcp + * @see tcp_sndqueuelen() + */ +u16_t +altcp_sndqueuelen(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->sndqueuelen) { + return conn->fns->sndqueuelen(conn); + } + return 0; +} + +void +altcp_nagle_disable(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->nagle_disable) { + conn->fns->nagle_disable(conn); + } +} + +void +altcp_nagle_enable(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->nagle_enable) { + conn->fns->nagle_enable(conn); + } +} + +int +altcp_nagle_disabled(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->nagle_disabled) { + return conn->fns->nagle_disabled(conn); + } + return 0; +} + +/** + * @ingroup altcp + * @see tcp_setprio() + */ +void +altcp_setprio(struct altcp_pcb *conn, u8_t prio) +{ + if (conn && conn->fns && conn->fns->setprio) { + conn->fns->setprio(conn, prio); + } +} + +err_t +altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port) +{ + if (conn && conn->fns && conn->fns->addrinfo) { + return conn->fns->addrinfo(conn, local, addr, port); + } + return ERR_VAL; +} + +ip_addr_t * +altcp_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn && conn->fns && conn->fns->getip) { + return conn->fns->getip(conn, local); + } + return NULL; +} + +u16_t +altcp_get_port(struct altcp_pcb *conn, int local) +{ + if (conn && conn->fns && conn->fns->getport) { + return conn->fns->getport(conn, local); + } + return 0; +} + +#if LWIP_TCP_KEEPALIVE +void +altcp_keepalive_disable(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->keepalive_disable) { + conn->fns->keepalive_disable(conn); + } +} + +void +altcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count) +{ + if (conn && conn->fns && conn->fns->keepalive_enable) { + conn->fns->keepalive_enable(conn, idle, intvl, count); + } +} +#endif + +#ifdef LWIP_DEBUG +enum tcp_state +altcp_dbg_get_tcp_state(struct altcp_pcb *conn) +{ + if (conn && conn->fns && conn->fns->dbg_get_tcp_state) { + return conn->fns->dbg_get_tcp_state(conn); + } + return CLOSED; +} +#endif + +/* Default implementations for the "virtual" functions */ + +void +altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval) +{ + if (conn && conn->inner_conn) { + altcp_poll(conn->inner_conn, conn->poll, interval); + } +} + +void +altcp_default_recved(struct altcp_pcb *conn, u16_t len) +{ + if (conn && conn->inner_conn) { + altcp_recved(conn->inner_conn, len); + } +} + +err_t +altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port) +{ + if (conn && conn->inner_conn) { + return altcp_bind(conn->inner_conn, ipaddr, port); + } + return ERR_VAL; +} + +err_t +altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx) +{ + if (conn) { + if (shut_rx && shut_tx && conn->fns && conn->fns->close) { + /* default shutdown for both sides is close */ + return conn->fns->close(conn); + } + if (conn->inner_conn) { + return altcp_shutdown(conn->inner_conn, shut_rx, shut_tx); + } + } + return ERR_VAL; +} + +err_t +altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + if (conn && conn->inner_conn) { + return altcp_write(conn->inner_conn, dataptr, len, apiflags); + } + return ERR_VAL; +} + +err_t +altcp_default_output(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_output(conn->inner_conn); + } + return ERR_VAL; +} + +u16_t +altcp_default_mss(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_mss(conn->inner_conn); + } + return 0; +} + +u16_t +altcp_default_sndbuf(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_sndbuf(conn->inner_conn); + } + return 0; +} + +u16_t +altcp_default_sndqueuelen(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_sndqueuelen(conn->inner_conn); + } + return 0; +} + +void +altcp_default_nagle_disable(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + altcp_nagle_disable(conn->inner_conn); + } +} + +void +altcp_default_nagle_enable(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + altcp_nagle_enable(conn->inner_conn); + } +} + +int +altcp_default_nagle_disabled(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_nagle_disabled(conn->inner_conn); + } + return 0; +} + +void +altcp_default_setprio(struct altcp_pcb *conn, u8_t prio) +{ + if (conn && conn->inner_conn) { + altcp_setprio(conn->inner_conn, prio); + } +} + +void +altcp_default_dealloc(struct altcp_pcb *conn) +{ + LWIP_UNUSED_ARG(conn); + /* nothing to do */ +} + +err_t +altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port) +{ + if (conn && conn->inner_conn) { + return altcp_get_tcp_addrinfo(conn->inner_conn, local, addr, port); + } + return ERR_VAL; +} + +ip_addr_t * +altcp_default_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn && conn->inner_conn) { + return altcp_get_ip(conn->inner_conn, local); + } + return NULL; +} + +u16_t +altcp_default_get_port(struct altcp_pcb *conn, int local) +{ + if (conn && conn->inner_conn) { + return altcp_get_port(conn->inner_conn, local); + } + return 0; +} + +#if LWIP_TCP_KEEPALIVE +void +altcp_default_keepalive_disable(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + altcp_keepalive_disable(conn->inner_conn); + } +} + +void +altcp_default_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count) +{ + if (conn && conn->inner_conn) { + altcp_keepalive_enable(conn->inner_conn, idle, intvl, count); + } +} +#endif + +#ifdef LWIP_DEBUG +enum tcp_state +altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn) +{ + if (conn && conn->inner_conn) { + return altcp_dbg_get_tcp_state(conn->inner_conn); + } + return CLOSED; +} +#endif + + +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_alloc.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_alloc.c new file mode 100644 index 0000000..cd619bc --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_alloc.c @@ -0,0 +1,87 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + * + * This file contains allocation implementation that combine several layers. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/altcp_tcp.h" +#include "lwip/altcp_tls.h" +#include "lwip/priv/altcp_priv.h" +#include "lwip/mem.h" + +#include + +#if LWIP_ALTCP_TLS + +/** This standard allocator function creates an altcp pcb for + * TLS over TCP */ +struct altcp_pcb * +altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type) +{ + struct altcp_pcb *inner_conn, *ret; + LWIP_UNUSED_ARG(ip_type); + + inner_conn = altcp_tcp_new_ip_type(ip_type); + if (inner_conn == NULL) { + return NULL; + } + ret = altcp_tls_wrap(config, inner_conn); + if (ret == NULL) { + altcp_close(inner_conn); + } + return ret; +} + +/** This standard allocator function creates an altcp pcb for + * TLS over TCP */ +struct altcp_pcb * +altcp_tls_alloc(void *arg, u8_t ip_type) +{ + return altcp_tls_new((struct altcp_tls_config *)arg, ip_type); +} + +#endif /* LWIP_ALTCP_TLS */ + +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_tcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_tcp.c new file mode 100644 index 0000000..1869e2a --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/altcp_tcp.c @@ -0,0 +1,577 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + * + * This file contains the base implementation calling into tcp. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/altcp_tcp.h" +#include "lwip/priv/altcp_priv.h" +#include "lwip/tcp.h" +#include "lwip/priv/tcp_priv.h" +#include "lwip/mem.h" + +#include + +#define ALTCP_TCP_ASSERT_CONN(conn) do { \ + LWIP_ASSERT("conn->inner_conn == NULL", (conn)->inner_conn == NULL); \ + LWIP_UNUSED_ARG(conn); /* for LWIP_NOASSERT */ } while(0) +#define ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb) do { \ + LWIP_ASSERT("pcb mismatch", (conn)->state == tpcb); \ + LWIP_UNUSED_ARG(tpcb); /* for LWIP_NOASSERT */ \ + ALTCP_TCP_ASSERT_CONN(conn); } while(0) + + +/* Variable prototype, the actual declaration is at the end of this file + since it contains pointers to static functions declared here */ +extern const struct altcp_functions altcp_tcp_functions; + +static void altcp_tcp_setup(struct altcp_pcb *conn, struct tcp_pcb *tpcb); + +/* callback functions for TCP */ +static err_t +altcp_tcp_accept(void *arg, struct tcp_pcb *new_tpcb, err_t err) +{ + struct altcp_pcb *listen_conn = (struct altcp_pcb *)arg; + if (listen_conn && listen_conn->accept) { + /* create a new altcp_conn to pass to the next 'accept' callback */ + struct altcp_pcb *new_conn = altcp_alloc(); + if (new_conn == NULL) { + return ERR_MEM; + } + altcp_tcp_setup(new_conn, new_tpcb); + return listen_conn->accept(listen_conn->arg, new_conn, err); + } + return ERR_ARG; +} + +static err_t +altcp_tcp_connected(void *arg, struct tcp_pcb *tpcb, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb); + if (conn->connected) { + return conn->connected(conn->arg, conn, err); + } + } + return ERR_OK; +} + +static err_t +altcp_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb); + if (conn->recv) { + return conn->recv(conn->arg, conn, p, err); + } + } + if (p != NULL) { + /* prevent memory leaks */ + pbuf_free(p); + } + return ERR_OK; +} + +static err_t +altcp_tcp_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb); + if (conn->sent) { + return conn->sent(conn->arg, conn, len); + } + } + return ERR_OK; +} + +static err_t +altcp_tcp_poll(void *arg, struct tcp_pcb *tpcb) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + ALTCP_TCP_ASSERT_CONN_PCB(conn, tpcb); + if (conn->poll) { + return conn->poll(conn->arg, conn); + } + } + return ERR_OK; +} + +static void +altcp_tcp_err(void *arg, err_t err) +{ + struct altcp_pcb *conn = (struct altcp_pcb *)arg; + if (conn) { + conn->state = NULL; /* already freed */ + if (conn->err) { + conn->err(conn->arg, err); + } + altcp_free(conn); + } +} + +/* setup functions */ + +static void +altcp_tcp_remove_callbacks(struct tcp_pcb *tpcb) +{ + tcp_arg(tpcb, NULL); + if (tpcb->state != LISTEN) { + tcp_recv(tpcb, NULL); + tcp_sent(tpcb, NULL); + tcp_err(tpcb, NULL); + tcp_poll(tpcb, NULL, tpcb->pollinterval); + } +} + +static void +altcp_tcp_setup_callbacks(struct altcp_pcb *conn, struct tcp_pcb *tpcb) +{ + tcp_arg(tpcb, conn); + /* this might be called for LISTN when close fails... */ + if (tpcb->state != LISTEN) { + tcp_recv(tpcb, altcp_tcp_recv); + tcp_sent(tpcb, altcp_tcp_sent); + tcp_err(tpcb, altcp_tcp_err); + /* tcp_poll is set when interval is set by application */ + } +} + +static void +altcp_tcp_setup(struct altcp_pcb *conn, struct tcp_pcb *tpcb) +{ + altcp_tcp_setup_callbacks(conn, tpcb); + conn->state = tpcb; + conn->fns = &altcp_tcp_functions; +} + +struct altcp_pcb * +altcp_tcp_new_ip_type(u8_t ip_type) +{ + /* Allocate the tcp pcb first to invoke the priority handling code + if we're out of pcbs */ + struct tcp_pcb *tpcb = tcp_new_ip_type(ip_type); + if (tpcb != NULL) { + struct altcp_pcb *ret = altcp_alloc(); + if (ret != NULL) { + altcp_tcp_setup(ret, tpcb); + return ret; + } else { + /* altcp_pcb allocation failed -> free the tcp_pcb too */ + tcp_close(tpcb); + } + } + return NULL; +} + +/** altcp_tcp allocator function fitting to @ref altcp_allocator_t / @ref altcp_new. +* +* arg pointer is not used for TCP. +*/ +struct altcp_pcb * +altcp_tcp_alloc(void *arg, u8_t ip_type) +{ + LWIP_UNUSED_ARG(arg); + return altcp_tcp_new_ip_type(ip_type); +} + +struct altcp_pcb * +altcp_tcp_wrap(struct tcp_pcb *tpcb) +{ + if (tpcb != NULL) { + struct altcp_pcb *ret = altcp_alloc(); + if (ret != NULL) { + altcp_tcp_setup(ret, tpcb); + return ret; + } + } + return NULL; +} + + +/* "virtual" functions calling into tcp */ +static void +altcp_tcp_set_poll(struct altcp_pcb *conn, u8_t interval) +{ + if (conn != NULL) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + tcp_poll(pcb, altcp_tcp_poll, interval); + } +} + +static void +altcp_tcp_recved(struct altcp_pcb *conn, u16_t len) +{ + if (conn != NULL) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + tcp_recved(pcb, len); + } +} + +static err_t +altcp_tcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_bind(pcb, ipaddr, port); +} + +static err_t +altcp_tcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + conn->connected = connected; + pcb = (struct tcp_pcb *)conn->state; + return tcp_connect(pcb, ipaddr, port, altcp_tcp_connected); +} + +static struct altcp_pcb * +altcp_tcp_listen(struct altcp_pcb *conn, u8_t backlog, err_t *err) +{ + struct tcp_pcb *pcb; + struct tcp_pcb *lpcb; + if (conn == NULL) { + return NULL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + lpcb = tcp_listen_with_backlog_and_err(pcb, backlog, err); + if (lpcb != NULL) { + conn->state = lpcb; + tcp_accept(lpcb, altcp_tcp_accept); + return conn; + } + return NULL; +} + +static void +altcp_tcp_abort(struct altcp_pcb *conn) +{ + if (conn != NULL) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + if (pcb) { + tcp_abort(pcb); + } + } +} + +static err_t +altcp_tcp_close(struct altcp_pcb *conn) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + if (pcb) { + err_t err; + tcp_poll_fn oldpoll = pcb->poll; + altcp_tcp_remove_callbacks(pcb); + err = tcp_close(pcb); + if (err != ERR_OK) { + /* not closed, set up all callbacks again */ + altcp_tcp_setup_callbacks(conn, pcb); + /* poll callback is not included in the above */ + tcp_poll(pcb, oldpoll, pcb->pollinterval); + return err; + } + conn->state = NULL; /* unsafe to reference pcb after tcp_close(). */ + } + altcp_free(conn); + return ERR_OK; +} + +static err_t +altcp_tcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_shutdown(pcb, shut_rx, shut_tx); +} + +static err_t +altcp_tcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_write(pcb, dataptr, len, apiflags); +} + +static err_t +altcp_tcp_output(struct altcp_pcb *conn) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return ERR_VAL; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_output(pcb); +} + +static u16_t +altcp_tcp_mss(struct altcp_pcb *conn) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return 0; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_mss(pcb); +} + +static u16_t +altcp_tcp_sndbuf(struct altcp_pcb *conn) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return 0; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_sndbuf(pcb); +} + +static u16_t +altcp_tcp_sndqueuelen(struct altcp_pcb *conn) +{ + struct tcp_pcb *pcb; + if (conn == NULL) { + return 0; + } + ALTCP_TCP_ASSERT_CONN(conn); + pcb = (struct tcp_pcb *)conn->state; + return tcp_sndqueuelen(pcb); +} + +static void +altcp_tcp_nagle_disable(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + tcp_nagle_disable(pcb); + } +} + +static void +altcp_tcp_nagle_enable(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + tcp_nagle_enable(pcb); + } +} + +static int +altcp_tcp_nagle_disabled(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + return tcp_nagle_disabled(pcb); + } + return 0; +} + +static void +altcp_tcp_setprio(struct altcp_pcb *conn, u8_t prio) +{ + if (conn != NULL) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + tcp_setprio(pcb, prio); + } +} + +#if LWIP_TCP_KEEPALIVE +static void +altcp_tcp_keepalive_disable(struct altcp_pcb *conn) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + ip_reset_option(pcb, SOF_KEEPALIVE); + } +} + +static void +altcp_tcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t cnt) +{ + if (conn && conn->state) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + ip_set_option(pcb, SOF_KEEPALIVE); + pcb->keep_idle = idle ? idle : TCP_KEEPIDLE_DEFAULT; + pcb->keep_intvl = intvl ? intvl : TCP_KEEPINTVL_DEFAULT; + pcb->keep_cnt = cnt ? cnt : TCP_KEEPCNT_DEFAULT; + } +} +#endif + +static void +altcp_tcp_dealloc(struct altcp_pcb *conn) +{ + LWIP_UNUSED_ARG(conn); + ALTCP_TCP_ASSERT_CONN(conn); + /* no private state to clean up */ +} + +static err_t +altcp_tcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port) +{ + if (conn) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + return tcp_tcp_get_tcp_addrinfo(pcb, local, addr, port); + } + return ERR_VAL; +} + +static ip_addr_t * +altcp_tcp_get_ip(struct altcp_pcb *conn, int local) +{ + if (conn) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + if (pcb) { + if (local) { + return &pcb->local_ip; + } else { + return &pcb->remote_ip; + } + } + } + return NULL; +} + +static u16_t +altcp_tcp_get_port(struct altcp_pcb *conn, int local) +{ + if (conn) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + if (pcb) { + if (local) { + return pcb->local_port; + } else { + return pcb->remote_port; + } + } + } + return 0; +} + +#ifdef LWIP_DEBUG +static enum tcp_state +altcp_tcp_dbg_get_tcp_state(struct altcp_pcb *conn) +{ + if (conn) { + struct tcp_pcb *pcb = (struct tcp_pcb *)conn->state; + ALTCP_TCP_ASSERT_CONN(conn); + if (pcb) { + return pcb->state; + } + } + return CLOSED; +} +#endif +const struct altcp_functions altcp_tcp_functions = { + altcp_tcp_set_poll, + altcp_tcp_recved, + altcp_tcp_bind, + altcp_tcp_connect, + altcp_tcp_listen, + altcp_tcp_abort, + altcp_tcp_close, + altcp_tcp_shutdown, + altcp_tcp_write, + altcp_tcp_output, + altcp_tcp_mss, + altcp_tcp_sndbuf, + altcp_tcp_sndqueuelen, + altcp_tcp_nagle_disable, + altcp_tcp_nagle_enable, + altcp_tcp_nagle_disabled, + altcp_tcp_setprio, + altcp_tcp_dealloc, + altcp_tcp_get_tcp_addrinfo, + altcp_tcp_get_ip, + altcp_tcp_get_port +#if LWIP_TCP_KEEPALIVE + , altcp_tcp_keepalive_disable + , altcp_tcp_keepalive_enable +#endif +#ifdef LWIP_DEBUG + , altcp_tcp_dbg_get_tcp_state +#endif +}; + +#endif /* LWIP_ALTCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/def.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/def.c similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/def.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/def.c index 8125313..9da36fe 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/def.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/def.c @@ -11,7 +11,7 @@ * \#define lwip_htonl(x) your_htonl * * Note lwip_ntohs() and lwip_ntohl() are merely references to the htonx counterparts. - * + * * If you \#define them to htons() and htonl(), you should * \#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from * defining htonx/ntohx compatibility macros. @@ -75,7 +75,7 @@ u16_t lwip_htons(u16_t n) { - return (u16_t)PP_HTONS(n); + return PP_HTONS(n); } #endif /* lwip_htons */ @@ -89,7 +89,7 @@ lwip_htons(u16_t n) u32_t lwip_htonl(u32_t n) { - return (u32_t)PP_HTONL(n); + return PP_HTONL(n); } #endif /* lwip_htonl */ @@ -101,10 +101,10 @@ lwip_htonl(u32_t n) * lwIP default implementation for strnstr() non-standard function. * This can be \#defined to strnstr() depending on your platform port. */ -char* -lwip_strnstr(const char* buffer, const char* token, size_t n) +char * +lwip_strnstr(const char *buffer, const char *token, size_t n) { - const char* p; + const char *p; size_t tokenlen = strlen(token); if (tokenlen == 0) { return LWIP_CONST_CAST(char *, buffer); @@ -125,7 +125,7 @@ lwip_strnstr(const char* buffer, const char* token, size_t n) * This can be \#defined to stricmp() depending on your platform port. */ int -lwip_stricmp(const char* str1, const char* str2) +lwip_stricmp(const char *str1, const char *str2) { char c1, c2; @@ -160,7 +160,7 @@ lwip_stricmp(const char* str1, const char* str2) * This can be \#defined to strnicmp() depending on your platform port. */ int -lwip_strnicmp(const char* str1, const char* str2, size_t len) +lwip_strnicmp(const char *str1, const char *str2, size_t len) { char c1, c2; @@ -183,7 +183,8 @@ lwip_strnicmp(const char* str1, const char* str2, size_t len) return 1; } } - } while (len-- && c1 != 0); + len--; + } while ((len != 0) && (c1 != 0)); return 0; } #endif @@ -195,28 +196,45 @@ lwip_strnicmp(const char* str1, const char* str2, size_t len) * This can be \#defined to itoa() or snprintf(result, bufsize, "%d", number) depending on your platform port. */ void -lwip_itoa(char* result, size_t bufsize, int number) +lwip_itoa(char *result, size_t bufsize, int number) { - const int base = 10; - char* ptr = result, *ptr1 = result, tmp_char; - int tmp_value; - LWIP_UNUSED_ARG(bufsize); + char *res = result; + char *tmp = result + bufsize - 1; + int n = (number >= 0) ? number : -number; - do { - tmp_value = number; - number /= base; - *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - number * base)]; - } while(number); + /* handle invalid bufsize */ + if (bufsize < 2) { + if (bufsize == 1) { + *result = 0; + } + return; + } - /* Apply negative sign */ - if (tmp_value < 0) { - *ptr++ = '-'; + /* First, add sign */ + if (number < 0) { + *res++ = '-'; } - *ptr-- = '\0'; - while(ptr1 < ptr) { - tmp_char = *ptr; - *ptr--= *ptr1; - *ptr1++ = tmp_char; + /* Then create the string from the end and stop if buffer full, + and ensure output string is zero terminated */ + *tmp = 0; + while ((n != 0) && (tmp > res)) { + char val = (char)('0' + (n % 10)); + tmp--; + *tmp = val; + n = n / 10; } + if (n) { + /* buffer is too small */ + *result = 0; + return; + } + if (*tmp == 0) { + /* Nothing added? */ + *res++ = '0'; + *res++ = 0; + return; + } + /* move from temporary buffer to output buffer (sign is not moved) */ + memmove(res, tmp, (size_t)((result + bufsize) - tmp)); } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/dns.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/dns.c similarity index 89% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/dns.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/dns.c index 12c6f16..9d2f61e 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/dns.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/dns.c @@ -23,14 +23,16 @@ * Once a hostname has been resolved (or found to be non-existent), * the resolver code calls a specified callback function (which * must be implemented by the module that uses the resolver). - * + * * Multicast DNS queries are supported for names ending on ".local". * However, only "One-Shot Multicast DNS Queries" are supported (RFC 6762 * chapter 5.1), this is not a fully compliant implementation of continuous * mDNS querying! * * All functions must be called from TCPIP thread. - * + * + * @see DNS_MAX_SERVERS + * @see LWIP_DHCP_MAX_DNS_SERVERS * @see @ref netconn_common for thread-safe access. */ @@ -110,11 +112,6 @@ static u16_t dns_txid; #define DNS_PORT_ALLOWED(port) ((port) >= 1024) #endif -/** DNS maximum number of retries when asking for a name, before "timeout". */ -#ifndef DNS_MAX_RETRIES -#define DNS_MAX_RETRIES 4 -#endif - /** DNS resource record max. TTL (one week as default) */ #ifndef DNS_MAX_TTL #define DNS_MAX_TTL 604800 @@ -287,7 +284,7 @@ static err_t dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADD /* forward declarations */ static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); static void dns_check_entries(void); -static void dns_call_found(u8_t idx, ip_addr_t* addr); +static void dns_call_found(u8_t idx, ip_addr_t *addr); /*----------------------------------------------------------------------------- * Globals @@ -325,9 +322,9 @@ dns_init(void) #endif /* DNS_SERVER_ADDRESS */ LWIP_ASSERT("sanity check SIZEOF_DNS_QUERY", - sizeof(struct dns_query) == SIZEOF_DNS_QUERY); + sizeof(struct dns_query) == SIZEOF_DNS_QUERY); LWIP_ASSERT("sanity check SIZEOF_DNS_ANSWER", - sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT); + sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT); LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n")); @@ -340,7 +337,7 @@ dns_init(void) /* initialize DNS table not needed (initialized to zero since it is a * global variable) */ LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0", - DNS_STATE_UNUSED == 0); + DNS_STATE_UNUSED == 0); /* initialize DNS client */ udp_bind(dns_pcbs[0], IP_ANY_TYPE, 0); @@ -380,7 +377,7 @@ dns_setserver(u8_t numdns, const ip_addr_t *dnsserver) * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS * server has not been configured. */ -const ip_addr_t* +const ip_addr_t * dns_getserver(u8_t numdns) { if (numdns < DNS_MAX_SERVERS) { @@ -419,7 +416,7 @@ dns_init_local(void) entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST); LWIP_ASSERT("mem-error in dns_init_local", entry != NULL); if (entry != NULL) { - char* entry_name = (char*)entry + sizeof(struct local_hostlist_entry); + char *entry_name = (char *)entry + sizeof(struct local_hostlist_entry); MEMCPY(entry_name, init_entry->name, namelen); entry_name[namelen] = 0; entry->name = entry_name; @@ -566,7 +563,7 @@ dns_local_addhost(const char *hostname, const ip_addr_t *addr) { struct local_hostlist_entry *entry; size_t namelen; - char* entry_name; + char *entry_name; LWIP_ASSERT("invalid host name (NULL)", hostname != NULL); namelen = strlen(hostname); LWIP_ASSERT("namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN); @@ -574,7 +571,7 @@ dns_local_addhost(const char *hostname, const ip_addr_t *addr) if (entry == NULL) { return ERR_MEM; } - entry_name = (char*)entry + sizeof(struct local_hostlist_entry); + entry_name = (char *)entry + sizeof(struct local_hostlist_entry); MEMCPY(entry_name, hostname, namelen); entry_name[namelen] = 0; entry->name = entry_name; @@ -605,8 +602,6 @@ static err_t dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype)) { u8_t i; -#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) -#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */ #if DNS_LOCAL_HOSTLIST if (dns_lookup_local(name, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) { return ERR_OK; @@ -624,7 +619,7 @@ dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addr (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0) && LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name)); - ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr)); + ip_addr_debug_print_val(DNS_DEBUG, dns_table[i].ipaddr); LWIP_DEBUGF(DNS_DEBUG, ("\n")); if (addr) { ip_addr_copy(*addr, dns_table[i].ipaddr); @@ -642,22 +637,29 @@ dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addr * entry (otherwise, answers might arrive late for hostname not on the list * any more). * + * For now, this function compares case-insensitive to cope with all kinds of + * servers. This also means that "dns 0x20 bit encoding" must be checked + * externally, if we want to implement it. + * Currently, the request is sent exactly as passed in by he user request. + * * @param query hostname (not encoded) from the dns_table * @param p pbuf containing the encoded hostname in the DNS response * @param start_offset offset into p where the name starts * @return 0xFFFF: names differ, other: names equal -> offset behind name */ static u16_t -dns_compare_name(const char *query, struct pbuf* p, u16_t start_offset) +dns_compare_name(const char *query, struct pbuf *p, u16_t start_offset) { int n; u16_t response_offset = start_offset; do { - n = pbuf_try_get_at(p, response_offset++); - if (n < 0) { + n = pbuf_try_get_at(p, response_offset); + if ((n < 0) || (response_offset == 0xFFFF)) { + /* error or overflow */ return 0xFFFF; } + response_offset++; /** @see RFC 1035 - 4.1.4. Message compression */ if ((n & 0xc0) == 0xc0) { /* Compressed name: cannot be equal since we don't send them */ @@ -669,10 +671,14 @@ dns_compare_name(const char *query, struct pbuf* p, u16_t start_offset) if (c < 0) { return 0xFFFF; } - if ((*query) != (u8_t)c) { + if (lwip_tolower((*query)) != lwip_tolower((u8_t)c)) { return 0xFFFF; } - ++response_offset; + if (response_offset == 0xFFFF) { + /* would overflow */ + return 0xFFFF; + } + response_offset++; ++query; --n; } @@ -684,7 +690,11 @@ dns_compare_name(const char *query, struct pbuf* p, u16_t start_offset) } } while (n != 0); - return response_offset + 1; + if (response_offset == 0xFFFF) { + /* would overflow */ + return 0xFFFF; + } + return (u16_t)(response_offset + 1); } /** @@ -695,14 +705,14 @@ dns_compare_name(const char *query, struct pbuf* p, u16_t start_offset) * @return index to end of the name */ static u16_t -dns_skip_name(struct pbuf* p, u16_t query_idx) +dns_skip_name(struct pbuf *p, u16_t query_idx) { int n; u16_t offset = query_idx; do { n = pbuf_try_get_at(p, offset++); - if (n < 0) { + if ((n < 0) || (offset == 0)) { return 0xFFFF; } /** @see RFC 1035 - 4.1.4. Message compression */ @@ -722,7 +732,10 @@ dns_skip_name(struct pbuf* p, u16_t query_idx) } } while (n != 0); - return offset + 1; + if (offset == 0xFFFF) { + return 0xFFFF; + } + return (u16_t)(offset + 1); } /** @@ -742,16 +755,16 @@ dns_send(u8_t idx) const char *hostname, *hostname_part; u8_t n; u8_t pcb_idx; - struct dns_table_entry* entry = &dns_table[idx]; + struct dns_table_entry *entry = &dns_table[idx]; LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n", - (u16_t)(entry->server_idx), entry->name)); + (u16_t)(entry->server_idx), entry->name)); LWIP_ASSERT("dns server out of array", entry->server_idx < DNS_MAX_SERVERS); if (ip_addr_isany_val(dns_servers[entry->server_idx]) #if LWIP_DNS_SUPPORT_MDNS_QUERIES && !entry->is_mdns #endif - ) { + ) { /* DNS server not valid anymore, e.g. PPP netif has been shut down */ /* call specified callback function if provided */ dns_call_found(idx, NULL); @@ -762,9 +775,9 @@ dns_send(u8_t idx) /* if here, we have either a new query or a retry on a previous query to process */ p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(SIZEOF_DNS_HDR + strlen(entry->name) + 2 + - SIZEOF_DNS_QUERY), PBUF_RAM); + SIZEOF_DNS_QUERY), PBUF_RAM); if (p != NULL) { - const ip_addr_t* dst; + const ip_addr_t *dst; u16_t dst_port; /* fill dns header */ memset(&hdr, 0, SIZEOF_DNS_HDR); @@ -784,9 +797,13 @@ dns_send(u8_t idx) ++n; } copy_len = (u16_t)(hostname - hostname_part); + if (query_idx + n + 1 > 0xFFFF) { + /* u16_t overflow */ + goto overflow_return; + } pbuf_put_at(p, query_idx, n); - pbuf_take_at(p, hostname_part, copy_len, query_idx + 1); - query_idx += n + 1; + pbuf_take_at(p, hostname_part, copy_len, (u16_t)(query_idx + 1)); + query_idx = (u16_t)(query_idx + n + 1); } while (*hostname != 0); pbuf_put_at(p, query_idx, 0); query_idx++; @@ -807,13 +824,12 @@ dns_send(u8_t idx) #endif /* send dns packet */ LWIP_DEBUGF(DNS_DEBUG, ("sending DNS request ID %d for name \"%s\" to server %d\r\n", - entry->txid, entry->name, entry->server_idx)); + entry->txid, entry->name, entry->server_idx)); #if LWIP_DNS_SUPPORT_MDNS_QUERIES if (entry->is_mdns) { dst_port = DNS_MQUERY_PORT; #if LWIP_IPV6 - if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) - { + if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) { dst = &dns_mquery_v6group; } #endif @@ -840,35 +856,38 @@ dns_send(u8_t idx) } return err; +overflow_return: + pbuf_free(p); + return ERR_VAL; } #if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0) -static struct udp_pcb* +static struct udp_pcb * dns_alloc_random_port(void) { err_t err; - struct udp_pcb* ret; + struct udp_pcb *pcb; - ret = udp_new_ip_type(IPADDR_TYPE_ANY); - if (ret == NULL) { + pcb = udp_new_ip_type(IPADDR_TYPE_ANY); + if (pcb == NULL) { /* out of memory, have to reuse an existing pcb */ return NULL; } do { u16_t port = (u16_t)DNS_RAND_TXID(); - if (!DNS_PORT_ALLOWED(port)) { + if (DNS_PORT_ALLOWED(port)) { + err = udp_bind(pcb, IP_ANY_TYPE, port); + } else { /* this port is not allowed, try again */ err = ERR_USE; - continue; } - err = udp_bind(ret, IP_ANY_TYPE, port); } while (err == ERR_USE); if (err != ERR_OK) { - udp_remove(ret); + udp_remove(pcb); return NULL; } - udp_recv(ret, dns_recv, NULL); - return ret; + udp_recv(pcb, dns_recv, NULL); + return pcb; } /** @@ -897,8 +916,8 @@ dns_alloc_pcb(void) } } /* if we come here, creating a new UDP pcb failed, so we have to use - an already existing one */ - for (i = 0, idx = dns_last_pcb_idx + 1; i < DNS_MAX_SOURCE_PORTS; i++, idx++) { + an already existing one (so overflow is no issue) */ + for (i = 0, idx = (u8_t)(dns_last_pcb_idx + 1); i < DNS_MAX_SOURCE_PORTS; i++, idx++) { if (idx >= DNS_MAX_SOURCE_PORTS) { idx = 0; } @@ -920,7 +939,7 @@ dns_alloc_pcb(void) * @param addr IP address for the hostname (or NULL on error or memory shortage) */ static void -dns_call_found(u8_t idx, ip_addr_t* addr) +dns_call_found(u8_t idx, ip_addr_t *addr) { #if ((LWIP_DNS_SECURE & (LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)) != 0) u8_t i; @@ -998,6 +1017,23 @@ again: return txid; } +/** + * Check whether there are other backup DNS servers available to try + */ +static u8_t +dns_backupserver_available(struct dns_table_entry *pentry) +{ + u8_t ret = 0; + + if (pentry) { + if ((pentry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[pentry->server_idx + 1])) { + ret = 1; + } + } + + return ret; +} + /** * dns_check_entry() - see if entry has not yet been queried and, if so, sends out a query. * Check an entry in the dns_table: @@ -1034,11 +1070,11 @@ dns_check_entry(u8_t i) case DNS_STATE_ASKING: if (--entry->tmr == 0) { if (++entry->retries == DNS_MAX_RETRIES) { - if ((entry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[entry->server_idx + 1]) + if (dns_backupserver_available(entry) #if LWIP_DNS_SUPPORT_MDNS_QUERIES - && !entry->is_mdns + && !entry->is_mdns #endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */ - ) { + ) { /* change of server */ entry->server_idx++; entry->tmr = 1; @@ -1105,7 +1141,7 @@ dns_correct_response(u8_t idx, u32_t ttl) entry->state = DNS_STATE_DONE; LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", entry->name)); - ip_addr_debug_print(DNS_DEBUG, (&(entry->ipaddr))); + ip_addr_debug_print_val(DNS_DEBUG, entry->ipaddr); LWIP_DEBUGF(DNS_DEBUG, ("\n")); /* read the answer resource record's TTL, and maximize it if needed */ @@ -1126,6 +1162,7 @@ dns_correct_response(u8_t idx, u32_t ttl) } } } + /** * Receive input function for DNS response packets arriving for the dns UDP pcb. */ @@ -1148,7 +1185,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY)) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n")); /* free pbuf and return */ - goto memerr; + goto ignore_packet; } /* copy dns payload inside static buffer for processing */ @@ -1156,7 +1193,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, /* Match the ID in the DNS header with the name table. */ txid = lwip_htons(hdr.id); for (i = 0; i < DNS_TABLE_SIZE; i++) { - const struct dns_table_entry *entry = &dns_table[i]; + struct dns_table_entry *entry = &dns_table[i]; if ((entry->state == DNS_STATE_ASKING) && (entry->txid == txid)) { @@ -1168,11 +1205,11 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, /* Check for correct response. */ if ((hdr.flags1 & DNS_FLAG1_RESPONSE) == 0) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": not a response\n", entry->name)); - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } if (nquestions != 1) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name)); - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } #if LWIP_DNS_SUPPORT_MDNS_QUERIES @@ -1182,7 +1219,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, /* Check whether response comes from the same network address to which the question was sent. (RFC 5452) */ if (!ip_addr_cmp(addr, &dns_servers[entry->server_idx])) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } } @@ -1191,38 +1228,58 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, res_idx = dns_compare_name(entry->name, p, SIZEOF_DNS_HDR); if (res_idx == 0xFFFF) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name)); - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } /* check if "question" part matches the request */ if (pbuf_copy_partial(p, &qry, SIZEOF_DNS_QUERY, res_idx) != SIZEOF_DNS_QUERY) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } if ((qry.cls != PP_HTONS(DNS_RRCLASS_IN)) || - (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_AAAA))) || - (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_A)))) { + (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_AAAA))) || + (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_A)))) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", entry->name)); - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } /* skip the rest of the "question" part */ - res_idx += SIZEOF_DNS_QUERY; + if (res_idx + SIZEOF_DNS_QUERY > 0xFFFF) { + goto ignore_packet; + } + res_idx = (u16_t)(res_idx + SIZEOF_DNS_QUERY); /* Check for error. If so, call callback to inform. */ if (hdr.flags2 & DNS_FLAG2_ERR_MASK) { LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", entry->name)); + + /* if there is another backup DNS server to try + * then don't stop the DNS request + */ + if (dns_backupserver_available(entry)) { + /* avoid retrying the same server */ + entry->retries = DNS_MAX_RETRIES-1; + entry->tmr = 1; + + /* contact next available server for this entry */ + dns_check_entry(i); + + goto ignore_packet; + } } else { while ((nanswers > 0) && (res_idx < p->tot_len)) { /* skip answer resource record's host name */ res_idx = dns_skip_name(p, res_idx); if (res_idx == 0xFFFF) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } /* Check for IP address type and Internet class. Others are discarded. */ if (pbuf_copy_partial(p, &ans, SIZEOF_DNS_ANSWER, res_idx) != SIZEOF_DNS_ANSWER) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } - res_idx += SIZEOF_DNS_ANSWER; + if (res_idx + SIZEOF_DNS_ANSWER > 0xFFFF) { + goto ignore_packet; + } + res_idx = (u16_t)(res_idx + SIZEOF_DNS_ANSWER); if (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) { #if LWIP_IPV4 @@ -1234,7 +1291,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, ip4_addr_t ip4addr; /* read the IP address after answer resource record's header */ if (pbuf_copy_partial(p, &ip4addr, sizeof(ip4_addr_t), res_idx) != sizeof(ip4_addr_t)) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } ip_addr_copy_from_ip4(dns_table[i].ipaddr, ip4addr); pbuf_free(p); @@ -1245,17 +1302,18 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, } #endif /* LWIP_IPV4 */ #if LWIP_IPV6 - if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_t)))) { + if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_p_t)))) { #if LWIP_IPV4 && LWIP_IPV6 if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) #endif /* LWIP_IPV4 && LWIP_IPV6 */ { - ip6_addr_t ip6addr; + ip6_addr_p_t ip6addr; /* read the IP address after answer resource record's header */ - if (pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_t), res_idx) != sizeof(ip6_addr_t)) { - goto memerr; /* ignore this packet */ + if (pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_p_t), res_idx) != sizeof(ip6_addr_p_t)) { + goto ignore_packet; /* ignore this packet */ } - ip_addr_copy_from_ip6(dns_table[i].ipaddr, ip6addr); + /* @todo: scope ip6addr? Might be required for link-local addresses at least? */ + ip_addr_copy_from_ip6_packed(dns_table[i].ipaddr, ip6addr); pbuf_free(p); /* handle correct response */ dns_correct_response(i, lwip_ntohl(ans.ttl)); @@ -1266,9 +1324,9 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, } /* skip this answer */ if ((int)(res_idx + lwip_htons(ans.len)) > 0xFFFF) { - goto memerr; /* ignore this packet */ + goto ignore_packet; /* ignore this packet */ } - res_idx += lwip_htons(ans.len); + res_idx = (u16_t)(res_idx + lwip_htons(ans.len)); --nanswers; } #if LWIP_IPV4 && LWIP_IPV6 @@ -1298,7 +1356,7 @@ dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, } } -memerr: +ignore_packet: /* deallocate memory and return */ pbuf_free(p); return; @@ -1321,7 +1379,7 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found, u8_t lseq, lseqi; struct dns_table_entry *entry = NULL; size_t namelen; - struct dns_req_entry* req; + struct dns_req_entry *req; #if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0) u8_t r; @@ -1364,7 +1422,7 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found, } /* check if this is the oldest completed entry */ if (entry->state == DNS_STATE_DONE) { - u8_t age = dns_seqno - entry->seqno; + u8_t age = (u8_t)(dns_seqno - entry->seqno); if (age > lseq) { lseq = age; lseqi = i; @@ -1415,7 +1473,7 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found, LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype); req->found = found; req->arg = callback_arg; - namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH-1); + namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1); MEMCPY(entry->name, name, namelen); entry->name[namelen] = 0; @@ -1567,7 +1625,7 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call /* queue query with specified callback */ return dns_enqueue(hostname, hostnamelen, found, callback_arg LWIP_DNS_ADDRTYPE_ARG(dns_addrtype) - LWIP_DNS_ISMDNS_ARG(is_mdns)); + LWIP_DNS_ISMDNS_ARG(is_mdns)); } #endif /* LWIP_DNS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/inet_chksum.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/inet_chksum.c similarity index 91% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/inet_chksum.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/inet_chksum.c index 917f3e4..818c68f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/inet_chksum.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/inet_chksum.c @@ -1,6 +1,6 @@ /** * @file - * Incluse internet checksum functions.\n + * Internet checksum functions.\n * * These are some reference implementations of the checksum algorithm, with the * aim of being simple, correct and fully portable. Checksumming is the @@ -8,7 +8,7 @@ * your own version, link it in and in your cc.h put: * * \#define LWIP_CHKSUM your_checksum_routine - * + * * Or you can select from the implementations below by defining * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. */ @@ -85,7 +85,7 @@ lwip_standard_chksum(const void *dataptr, int len) acc = 0; /* dataptr may be at odd or even addresses */ - octetptr = (const u8_t*)dataptr; + octetptr = (const u8_t *)dataptr; while (len > 1) { /* declare first octet as most significant thus assume network order, ignoring host order */ @@ -201,14 +201,14 @@ lwip_standard_chksum(const void *dataptr, int len) len--; } - ps = (const u16_t *)(const void*)pb; + ps = (const u16_t *)(const void *)pb; if (((mem_ptr_t)ps & 3) && len > 1) { sum += *ps++; len -= 2; } - pl = (const u32_t *)(const void*)ps; + pl = (const u32_t *)(const void *)ps; while (len > 7) { tmp = sum + *pl++; /* ping */ @@ -260,19 +260,19 @@ static u16_t inet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc) { struct pbuf *q; - u8_t swapped = 0; + int swapped = 0; /* iterate through all pbuf in chain */ for (q = p; q != NULL; q = q->next) { LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", - (void *)q, (void *)q->next)); + (void *)q, (void *)q->next)); acc += LWIP_CHKSUM(q->payload, q->len); /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ /* just executing this next line is probably faster that the if statement needed to check whether we really need to execute it, and does no harm */ acc = FOLD_U32T(acc); if (q->len % 2 != 0) { - swapped = 1 - swapped; + swapped = !swapped; acc = SWAP_BYTES_IN_WORD(acc); } /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ @@ -308,17 +308,17 @@ inet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc) */ u16_t inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - const ip4_addr_t *src, const ip4_addr_t *dest) + const ip4_addr_t *src, const ip4_addr_t *dest) { u32_t acc; u32_t addr; addr = ip4_addr_get_u32(src); acc = (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); addr = ip4_addr_get_u32(dest); - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); /* fold down to 16 bits */ acc = FOLD_U32T(acc); acc = FOLD_U32T(acc); @@ -341,7 +341,7 @@ inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, */ u16_t ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - const ip6_addr_t *src, const ip6_addr_t *dest) + const ip6_addr_t *src, const ip6_addr_t *dest) { u32_t acc = 0; u32_t addr; @@ -349,11 +349,11 @@ ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, for (addr_part = 0; addr_part < 4; addr_part++) { addr = src->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); addr = dest->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); } /* fold down to 16 bits */ acc = FOLD_U32T(acc); @@ -377,7 +377,7 @@ ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, */ u16_t ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - const ip_addr_t *src, const ip_addr_t *dest) + const ip_addr_t *src, const ip_addr_t *dest) { #if LWIP_IPV6 if (IP_IS_V6(dest)) { @@ -397,28 +397,28 @@ ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, /** Parts of the pseudo checksum which are common to IPv4 and IPv6 */ static u16_t inet_cksum_pseudo_partial_base(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, u32_t acc) + u16_t chksum_len, u32_t acc) { struct pbuf *q; - u8_t swapped = 0; + int swapped = 0; u16_t chklen; /* iterate through all pbuf in chain */ for (q = p; (q != NULL) && (chksum_len > 0); q = q->next) { LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", - (void *)q, (void *)q->next)); + (void *)q, (void *)q->next)); chklen = q->len; if (chklen > chksum_len) { chklen = chksum_len; } acc += LWIP_CHKSUM(q->payload, chklen); - chksum_len -= chklen; + chksum_len = (u16_t)(chksum_len - chklen); LWIP_ASSERT("delete me", chksum_len < 0x7fff); /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ /* fold the upper bit down */ acc = FOLD_U32T(acc); if (q->len % 2 != 0) { - swapped = 1 - swapped; + swapped = !swapped; acc = SWAP_BYTES_IN_WORD(acc); } /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ @@ -454,17 +454,17 @@ inet_cksum_pseudo_partial_base(struct pbuf *p, u8_t proto, u16_t proto_len, */ u16_t inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest) + u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest) { u32_t acc; u32_t addr; addr = ip4_addr_get_u32(src); acc = (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); addr = ip4_addr_get_u32(dest); - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); /* fold down to 16 bits */ acc = FOLD_U32T(acc); acc = FOLD_U32T(acc); @@ -489,7 +489,7 @@ inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, */ u16_t ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest) + u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest) { u32_t acc = 0; u32_t addr; @@ -497,11 +497,11 @@ ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, for (addr_part = 0; addr_part < 4; addr_part++) { addr = src->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); addr = dest->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); + acc = (u32_t)(acc + (addr & 0xffffUL)); + acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL)); } /* fold down to 16 bits */ acc = FOLD_U32T(acc); @@ -524,7 +524,7 @@ ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, */ u16_t ip_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest) + u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest) { #if LWIP_IPV6 if (IP_IS_V6(dest)) { @@ -569,15 +569,14 @@ inet_chksum_pbuf(struct pbuf *p) { u32_t acc; struct pbuf *q; - u8_t swapped; + int swapped = 0; acc = 0; - swapped = 0; for (q = p; q != NULL; q = q->next) { acc += LWIP_CHKSUM(q->payload, q->len); acc = FOLD_U32T(acc); if (q->len % 2 != 0) { - swapped = 1 - swapped; + swapped = !swapped; acc = SWAP_BYTES_IN_WORD(acc); } } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/init.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/init.c similarity index 55% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/init.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/init.c index ade09d9..3620e1d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/init.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/init.c @@ -57,7 +57,6 @@ #include "lwip/nd6.h" #include "lwip/mld6.h" #include "lwip/api.h" -#include "lwip/alg.h" #include "netif/ppp/ppp_opts.h" #include "netif/ppp/ppp_impl.h" @@ -68,8 +67,7 @@ # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN -struct packed_struct_test -{ +struct packed_struct_test { PACK_STRUCT_FLD_8(u8_t dummy1); PACK_STRUCT_FIELD(u32_t dummy2); } PACK_STRUCT_STRUCT; @@ -85,187 +83,184 @@ PACK_STRUCT_END * These can be done independently of LWIP_DEBUG, without penalty. */ #ifndef BYTE_ORDER - #error "BYTE_ORDER is not defined, you have to define it in your cc.h" +#error "BYTE_ORDER is not defined, you have to define it in your cc.h" #endif #if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) - #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" +#error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_UDPLITE) - #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" +#error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_DHCP) - #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" +#error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" #endif -#if (!LWIP_UDP && LWIP_MULTICAST_TX_OPTIONS) - #error "If you want to use IGMP/LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 in your lwipopts.h" +#if (!LWIP_UDP && !LWIP_RAW && LWIP_MULTICAST_TX_OPTIONS) +#error "If you want to use LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 and/or LWIP_RAW=1 in your lwipopts.h" #endif #if (!LWIP_UDP && LWIP_DNS) - #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" +#error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" #endif #if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */ #if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) - #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" +#error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" #endif #if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) - #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" +#error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" #endif #if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) - #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" +#error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" #endif #if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) - #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" +#error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" #endif #if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) - #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" +#error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" #endif #if (LWIP_IGMP && !LWIP_MULTICAST_TX_OPTIONS) - #error "If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h" +#error "If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h" #endif #if (LWIP_IGMP && !LWIP_IPV4) - #error "IGMP needs LWIP_IPV4 enabled in your lwipopts.h" -#endif -#if (LWIP_MULTICAST_TX_OPTIONS && !LWIP_IPV4) - #error "LWIP_MULTICAST_TX_OPTIONS needs LWIP_IPV4 enabled in your lwipopts.h" +#error "IGMP needs LWIP_IPV4 enabled in your lwipopts.h" #endif #if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) - #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" +#error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" #endif /* There must be sufficient timeouts, taking into account requirements of the subsystems. */ -#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))) - #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" +#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < LWIP_NUM_SYS_TIMEOUT_INTERNAL) +#error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" #endif #if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) - #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" +#error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" #endif #endif /* !MEMP_MEM_MALLOC */ #if LWIP_WND_SCALE #if (LWIP_TCP && (TCP_WND > 0xffffffff)) - #error "If you want to use TCP, TCP_WND must fit in an u32_t, so, you have to reduce it in your lwipopts.h" +#error "If you want to use TCP, TCP_WND must fit in an u32_t, so, you have to reduce it in your lwipopts.h" #endif #if (LWIP_TCP && (TCP_RCV_SCALE > 14)) - #error "The maximum valid window scale value is 14!" +#error "The maximum valid window scale value is 14!" #endif #if (LWIP_TCP && (TCP_WND > (0xFFFFU << TCP_RCV_SCALE))) - #error "TCP_WND is bigger than the configured LWIP_WND_SCALE allows!" +#error "TCP_WND is bigger than the configured LWIP_WND_SCALE allows!" #endif #if (LWIP_TCP && ((TCP_WND >> TCP_RCV_SCALE) == 0)) - #error "TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!" +#error "TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!" #endif #else /* LWIP_WND_SCALE */ #if (LWIP_TCP && (TCP_WND > 0xffff)) - #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h (or enable window scaling)" +#error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h (or enable window scaling)" #endif #endif /* LWIP_WND_SCALE */ #if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) - #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" +#error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" #endif #if (LWIP_TCP && (TCP_SND_QUEUELEN < 2)) - #error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work" +#error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work" #endif #if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) - #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" +#error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" #endif #if (LWIP_TCP && TCP_LISTEN_BACKLOG && ((TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff))) - #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" +#error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" +#endif +#if (LWIP_TCP && LWIP_TCP_SACK_OUT && !TCP_QUEUE_OOSEQ) +#error "To use LWIP_TCP_SACK_OUT, TCP_QUEUE_OOSEQ needs to be enabled" +#endif +#if (LWIP_TCP && LWIP_TCP_SACK_OUT && (LWIP_TCP_MAX_SACK_NUM < 1)) +#error "LWIP_TCP_MAX_SACK_NUM must be greater than 0" #endif #if (LWIP_NETIF_API && (NO_SYS==1)) - #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" +#error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" #endif #if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) - #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" +#error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" #endif #if (LWIP_PPP_API && (NO_SYS==1)) - #error "If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h" +#error "If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h" #endif #if (LWIP_PPP_API && (PPP_SUPPORT==0)) - #error "If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h" +#error "If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h" #endif #if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) - #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" +#error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" #endif #if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) - #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" +#error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" #endif #if (!LWIP_ARP && LWIP_AUTOIP) - #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" +#error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" #endif #if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) - #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" +#error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" +#endif +#if (LWIP_ALTCP && LWIP_EVENT_API) +#error "The application layered tcp API does not work with LWIP_EVENT_API" #endif #if (MEM_LIBC_MALLOC && MEM_USE_POOLS) - #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" +#error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" #endif #if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) - #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" +#error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" #endif #if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) - #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" +#error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" #endif #if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) - #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" +#error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" #endif #if PPP_SUPPORT && !PPPOS_SUPPORT && !PPPOE_SUPPORT && !PPPOL2TP_SUPPORT - #error "PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on" +#error "PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on" #endif #if PPP_SUPPORT && !PPP_IPV4_SUPPORT && !PPP_IPV6_SUPPORT - #error "PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on" +#error "PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on" #endif #if PPP_SUPPORT && PPP_IPV4_SUPPORT && !LWIP_IPV4 - #error "PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on" +#error "PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on" #endif #if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6 - #error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on" +#error "PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on" #endif #if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT) - #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT" +#error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT" #endif #if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING - #error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too" +#error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too" #endif #if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE - #error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets" +#error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets" #endif #if LWIP_NETCONN && LWIP_TCP #if NETCONN_COPY != TCP_WRITE_FLAG_COPY - #error "NETCONN_COPY != TCP_WRITE_FLAG_COPY" +#error "NETCONN_COPY != TCP_WRITE_FLAG_COPY" #endif #if NETCONN_MORE != TCP_WRITE_FLAG_MORE - #error "NETCONN_MORE != TCP_WRITE_FLAG_MORE" +#error "NETCONN_MORE != TCP_WRITE_FLAG_MORE" #endif #endif /* LWIP_NETCONN && LWIP_TCP */ -#if LWIP_SOCKET -/* Check that the SO_* socket options and SOF_* lwIP-internal flags match */ -#if SO_REUSEADDR != SOF_REUSEADDR - #error "WARNING: SO_REUSEADDR != SOF_REUSEADDR" +#if LWIP_NETCONN_FULLDUPLEX && !LWIP_NETCONN_SEM_PER_THREAD +#error "For LWIP_NETCONN_FULLDUPLEX to work, LWIP_NETCONN_SEM_PER_THREAD is required" #endif -#if SO_KEEPALIVE != SOF_KEEPALIVE - #error "WARNING: SO_KEEPALIVE != SOF_KEEPALIVE" -#endif -#if SO_BROADCAST != SOF_BROADCAST - #error "WARNING: SO_BROADCAST != SOF_BROADCAST" -#endif -#endif /* LWIP_SOCKET */ /* Compile-time checks for deprecated options. */ #ifdef MEMP_NUM_TCPIP_MSG - #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." +#error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." #endif #ifdef TCP_REXMIT_DEBUG - #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." +#error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." #endif #ifdef RAW_STATS - #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." +#error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." #endif #ifdef ETHARP_QUEUE_FIRST - #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." +#error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." #endif #ifdef ETHARP_ALWAYS_INSERT - #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." +#error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." #endif #if !NO_SYS && LWIP_TCPIP_CORE_LOCKING && LWIP_COMPAT_MUTEX && !defined(LWIP_COMPAT_MUTEX_ALLOWED) - #error "LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)" +#error "LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)" #endif #ifndef LWIP_DISABLE_TCP_SANITY_CHECKS @@ -300,31 +295,31 @@ PACK_STRUCT_END #if !LWIP_DISABLE_TCP_SANITY_CHECKS #if LWIP_TCP #if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) - #error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if TCP_SND_BUF < (2 * TCP_MSS) - #error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS)) - #error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if TCP_SNDLOWAT >= TCP_SND_BUF - #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if TCP_SNDLOWAT >= (0xFFFF - (4 * TCP_MSS)) - #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!" +#error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!" #endif #if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN - #error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) - #error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)))) - #error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #if TCP_WND < TCP_MSS - #error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." #endif #endif /* LWIP_TCP */ #endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */ @@ -340,7 +335,7 @@ lwip_init(void) #ifndef LWIP_SKIP_CONST_CHECK int a = 0; LWIP_UNUSED_ARG(a); - LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void*, &a) == &a); + LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void *, &a) == &a); #endif #ifndef LWIP_SKIP_PACKING_CHECK LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE); @@ -379,7 +374,7 @@ lwip_init(void) #if PPP_SUPPORT ppp_init(); #endif - + #if LWIP_TIMERS sys_timeouts_init(); #endif /* LWIP_TIMERS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ip.c similarity index 80% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ip.c index cdf9f85..7b6d448 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ip.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ip.c @@ -4,19 +4,19 @@ * * @defgroup ip IP * @ingroup callbackstyle_api - * + * * @defgroup ip4 IPv4 * @ingroup ip * * @defgroup ip6 IPv6 * @ingroup ip - * + * * @defgroup ipaddr IP address handling * @ingroup infrastructure - * + * * @defgroup ip4addr IPv4 only * @ingroup ipaddr - * + * * @defgroup ip6addr IPv6 only * @ingroup ipaddr */ @@ -67,6 +67,49 @@ struct ip_globals ip_data; const ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT; +/** + * @ingroup ipaddr + * Convert numeric IP address (both versions) into ASCII representation. + * returns ptr to static buffer; not reentrant! + * + * @param addr ip address in network order to convert + * @return pointer to a global static (!) buffer that holds the ASCII + * representation of addr + */ +char *ipaddr_ntoa(const ip_addr_t *addr) +{ + if (addr == NULL) { + return NULL; + } + if (IP_IS_V6(addr)) { + return ip6addr_ntoa(ip_2_ip6(addr)); + } else { + return ip4addr_ntoa(ip_2_ip4(addr)); + } +} + +/** + * @ingroup ipaddr + * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * + * @param addr ip address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen) +{ + if (addr == NULL) { + return NULL; + } + if (IP_IS_V6(addr)) { + return ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen); + } else { + return ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen); + } +} + /** * @ingroup ipaddr * Convert IP address string (both versions) to numeric. @@ -80,7 +123,7 @@ int ipaddr_aton(const char *cp, ip_addr_t *addr) { if (cp != NULL) { - const char* c; + const char *c; for (c = cp; *c != 0; c++) { if (*c == ':') { /* contains a colon: IPv6 address */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/Makefile similarity index 69% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/Makefile index c3b09d0..54ae473 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/Makefile +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/Makefile @@ -1,10 +1,6 @@ TOP_DIR = ../../../../.. sinclude $(TOP_DIR)/tools/w800/conf.mk -EXCLUDES = ip_frag.c - -CSRCS = $(filter-out $(EXCLUDES), $(wildcard *.c)) - ifndef PDIR GEN_LIBS = libipv4$(LIB_EXT) endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/autoip.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/autoip.c similarity index 76% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/autoip.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/autoip.c index 10db8a3..9f7139b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/autoip.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/autoip.c @@ -22,7 +22,7 @@ * With DHCP: * - define @ref LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h. * - Configure your DHCP Client. - * + * * @see netifapi_autoip */ @@ -95,7 +95,7 @@ static err_t autoip_arp_announce(struct netif *netif); static void autoip_start_probing(struct netif *netif); /** - * @ingroup autoip + * @ingroup autoip * Set a statically allocated struct autoip to work with. * Using this prevents autoip_start to allocate it using mem_malloc. * @@ -105,6 +105,7 @@ static void autoip_start_probing(struct netif *netif); void autoip_set_struct(struct netif *netif, struct autoip *autoip) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("autoip != NULL", autoip != NULL); LWIP_ASSERT("netif already has a struct autoip set", @@ -123,7 +124,7 @@ autoip_set_struct(struct netif *netif, struct autoip *autoip) static void autoip_restart(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); autoip->tried_llipaddr++; autoip_start(netif); } @@ -134,7 +135,7 @@ autoip_restart(struct netif *netif) static void autoip_handle_arp_conflict(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); /* RFC3927, 2.5 "Conflict Detection and Defense" allows two options where a) means retreat on the first conflict and @@ -146,13 +147,13 @@ autoip_handle_arp_conflict(struct netif *netif) if (autoip->lastconflict > 0) { /* retreat, there was a conflicting ARP in the last DEFEND_INTERVAL seconds */ LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); + ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); /* Active TCP sessions are aborted when removing the ip addresss */ autoip_restart(netif); } else { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); + ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); autoip_arp_announce(netif); autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND; } @@ -167,7 +168,7 @@ autoip_handle_arp_conflict(struct netif *netif) static void autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 * compliant to RFC 3927 Section 2.1 @@ -185,13 +186,13 @@ autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr) addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; } LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) && - (addr <= AUTOIP_RANGE_END)); + (addr <= AUTOIP_RANGE_END)); ip4_addr_set_u32(ipaddr, lwip_htonl(addr)); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - (u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), - ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); + ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + (u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), + ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); } /** @@ -202,7 +203,7 @@ autoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr) static err_t autoip_arp_probe(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); /* this works because netif->ip_addr is ANY */ return etharp_request(netif, &autoip->llipaddr); } @@ -226,14 +227,14 @@ autoip_arp_announce(struct netif *netif) static err_t autoip_bind(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); ip4_addr_t sn_mask, gw_addr; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, - ("autoip_bind(netif=%p) %c%c%"U16_F" %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num, - ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), - ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); + ("autoip_bind(netif=%p) %c%c%"U16_F" %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num, + ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), + ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); IP4_ADDR(&sn_mask, 255, 255, 0, 0); IP4_ADDR(&gw_addr, 0, 0, 0, 0); @@ -245,7 +246,7 @@ autoip_bind(struct netif *netif) } /** - * @ingroup autoip + * @ingroup autoip * Start AutoIP client * * @param netif network interface on which start the AutoIP client @@ -253,9 +254,10 @@ autoip_bind(struct netif *netif) err_t autoip_start(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); err_t result = ERR_OK; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;); /* Set IP-Address, Netmask and Gateway to 0 to make sure that @@ -264,19 +266,18 @@ autoip_start(struct netif *netif) netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], - netif->name[1], (u16_t)netif->num)); + ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], + netif->name[1], (u16_t)netif->num)); if (autoip == NULL) { /* no AutoIP client attached yet? */ LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, - ("autoip_start(): starting new AUTOIP client\n")); - autoip = (struct autoip *)mem_malloc(sizeof(struct autoip)); + ("autoip_start(): starting new AUTOIP client\n")); + autoip = (struct autoip *)mem_calloc(1, sizeof(struct autoip)); if (autoip == NULL) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, - ("autoip_start(): could not allocate autoip\n")); + ("autoip_start(): could not allocate autoip\n")); return ERR_MEM; } - memset(autoip, 0, sizeof(struct autoip)); /* store this AutoIP client in the netif */ netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip")); @@ -297,14 +298,14 @@ autoip_start(struct netif *netif) static void autoip_start_probing(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); autoip->state = AUTOIP_STATE_PROBING; autoip->sent_num = 0; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_start_probing(): changing state to PROBING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), - ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); + ("autoip_start_probing(): changing state to PROBING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), + ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); /* time to wait to first probe, this is randomly * chosen out of 0 to PROBE_WAIT seconds. @@ -331,7 +332,7 @@ autoip_start_probing(struct netif *netif) void autoip_network_changed(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); if (autoip && (autoip->state != AUTOIP_STATE_OFF)) { autoip_start_probing(netif); @@ -339,7 +340,7 @@ autoip_network_changed(struct netif *netif) } /** - * @ingroup autoip + * @ingroup autoip * Stop AutoIP client * * @param netif network interface on which stop the AutoIP client @@ -347,8 +348,9 @@ autoip_network_changed(struct netif *netif) err_t autoip_stop(struct netif *netif) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); + LWIP_ASSERT_CORE_LOCKED(); if (autoip != NULL) { autoip->state = AUTOIP_STATE_OFF; if (ip4_addr_islinklocal(netif_ip4_addr(netif))) { @@ -364,10 +366,10 @@ autoip_stop(struct netif *netif) void autoip_tmr(void) { - struct netif *netif = netif_list; + struct netif *netif; /* loop through netif's */ - while (netif != NULL) { - struct autoip* autoip = netif_autoip_data(netif); + NETIF_FOREACH(netif) { + struct autoip *autoip = netif_autoip_data(netif); /* only act on AutoIP configured interfaces */ if (autoip != NULL) { if (autoip->lastconflict > 0) { @@ -375,14 +377,14 @@ autoip_tmr(void) } LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, - ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", - (u16_t)(autoip->state), autoip->ttw)); + ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", + (u16_t)(autoip->state), autoip->ttw)); if (autoip->ttw > 0) { autoip->ttw--; } - switch(autoip->state) { + switch (autoip->state) { case AUTOIP_STATE_PROBING: if (autoip->ttw == 0) { if (autoip->sent_num >= PROBE_NUM) { @@ -394,9 +396,9 @@ autoip_tmr(void) autoip->sent_num = 1; autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND; LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), - ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); + ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), + ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); } else { autoip_arp_probe(netif); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_tmr() PROBING Sent Probe\n")); @@ -407,8 +409,8 @@ autoip_tmr(void) } else { /* calculate time to wait to next probe */ autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) % - ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + - PROBE_MIN * AUTOIP_TICKS_PER_SECOND); + ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + + PROBE_MIN * AUTOIP_TICKS_PER_SECOND); } } } @@ -422,13 +424,13 @@ autoip_tmr(void) autoip->sent_num++; if (autoip->sent_num >= ANNOUNCE_NUM) { - autoip->state = AUTOIP_STATE_BOUND; - autoip->sent_num = 0; - autoip->ttw = 0; - LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), - ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); + autoip->state = AUTOIP_STATE_BOUND; + autoip->sent_num = 0; + autoip->ttw = 0; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), + ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); } } break; @@ -438,8 +440,6 @@ autoip_tmr(void) break; } } - /* proceed to next network interface */ - netif = netif->next; } } @@ -452,49 +452,49 @@ autoip_tmr(void) void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n")); if ((autoip != NULL) && (autoip->state != AUTOIP_STATE_OFF)) { - /* when ip.src == llipaddr && hw.src != netif->hwaddr - * - * when probing ip.dst == llipaddr && hw.src != netif->hwaddr - * we have a conflict and must solve it - */ + /* when ip.src == llipaddr && hw.src != netif->hwaddr + * + * when probing ip.dst == llipaddr && hw.src != netif->hwaddr + * we have a conflict and must solve it + */ ip4_addr_t sipaddr, dipaddr; struct eth_addr netifaddr; - ETHADDR16_COPY(netifaddr.addr, netif->hwaddr); + SMEMCPY(netifaddr.addr, netif->hwaddr, ETH_HWADDR_LEN); - /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without + /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without * structure packing (not using structure copy which breaks strict-aliasing rules). */ - IPADDR2_COPY(&sipaddr, &hdr->sipaddr); - IPADDR2_COPY(&dipaddr, &hdr->dipaddr); + IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr); + IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr); if (autoip->state == AUTOIP_STATE_PROBING) { - /* RFC 3927 Section 2.2.1: - * from beginning to after ANNOUNCE_WAIT - * seconds we have a conflict if - * ip.src == llipaddr OR - * ip.dst == llipaddr && hw.src != own hwaddr - */ + /* RFC 3927 Section 2.2.1: + * from beginning to after ANNOUNCE_WAIT + * seconds we have a conflict if + * ip.src == llipaddr OR + * ip.dst == llipaddr && hw.src != own hwaddr + */ if ((ip4_addr_cmp(&sipaddr, &autoip->llipaddr)) || (ip4_addr_isany_val(sipaddr) && ip4_addr_cmp(&dipaddr, &autoip->llipaddr) && !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, - ("autoip_arp_reply(): Probe Conflict detected\n")); + ("autoip_arp_reply(): Probe Conflict detected\n")); autoip_restart(netif); } } else { - /* RFC 3927 Section 2.5: - * in any state we have a conflict if - * ip.src == llipaddr && hw.src != own hwaddr - */ + /* RFC 3927 Section 2.5: + * in any state we have a conflict if + * ip.src == llipaddr && hw.src != own hwaddr + */ if (ip4_addr_cmp(&sipaddr, &autoip->llipaddr) && !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) { LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, - ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); + ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); autoip_handle_arp_conflict(netif); } } @@ -511,7 +511,7 @@ u8_t autoip_supplied_address(const struct netif *netif) { if ((netif != NULL) && (netif_autoip_data(netif) != NULL)) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); return (autoip->state == AUTOIP_STATE_BOUND) || (autoip->state == AUTOIP_STATE_ANNOUNCING); } return 0; @@ -520,7 +520,7 @@ autoip_supplied_address(const struct netif *netif) u8_t autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr) { - struct autoip* autoip = netif_autoip_data(netif); + struct autoip *autoip = netif_autoip_data(netif); return (autoip != NULL) && ip4_addr_cmp(addr, &(autoip->llipaddr)); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/dhcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/dhcp.c similarity index 65% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/dhcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/dhcp.c index fc01ac6..ec20c09 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/dhcp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/dhcp.c @@ -21,6 +21,9 @@ * Use dhcp_release() to end the lease and use dhcp_stop() * to remove the DHCP client. * + * @see LWIP_HOOK_DHCP_APPEND_OPTIONS + * @see LWIP_HOOK_DHCP_PARSE_OPTION + * * @see netifapi_dhcp4 */ @@ -75,9 +78,20 @@ #include "lwip/dns.h" #include "lwip/etharp.h" #include "lwip/prot/dhcp.h" +#include "lwip/prot/iana.h" #include +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif +#ifndef LWIP_HOOK_DHCP_APPEND_OPTIONS +#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr) +#endif +#ifndef LWIP_HOOK_DHCP_PARSE_OPTION +#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) do { LWIP_UNUSED_ARG(msg); } while(0) +#endif + /** DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using * LWIP_RAND() (this overrides DHCP_GLOBAL_XID) */ @@ -113,6 +127,11 @@ #define LWIP_DHCP_PROVIDE_DNS_SERVERS 0 #endif +#ifndef LWIP_DHCP_INPUT_ERROR +#define LWIP_DHCP_INPUT_ERROR(message, expression, handler) do { if (!(expression)) { \ + handler;} } while(0) +#endif + /** Option handling: options are parsed in dhcp_parse_reply * and saved in an array where other functions can load them from. * This might be moved into the struct dhcp (not necessarily since @@ -156,7 +175,7 @@ static u8_t dhcp_discover_request_options[] = { #if LWIP_DHCP_GET_NTP_SRV , DHCP_OPTION_NTP #endif /* LWIP_DHCP_GET_NTP_SRV */ - }; +}; #ifdef DHCP_GLOBAL_XID static u32_t xid; @@ -194,20 +213,18 @@ static void dhcp_t2_timeout(struct netif *netif); /* build outgoing messages */ /* create a DHCP message, fill in common headers */ -static err_t dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type); -/* free a DHCP request */ -static void dhcp_delete_msg(struct dhcp *dhcp); +static struct pbuf *dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len); /* add a DHCP option (type, then length in bytes) */ -static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len); +static u16_t dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len); /* add option values */ -static void dhcp_option_byte(struct dhcp *dhcp, u8_t value); -static void dhcp_option_short(struct dhcp *dhcp, u16_t value); -static void dhcp_option_long(struct dhcp *dhcp, u32_t value); +static u16_t dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value); +static u16_t dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value); +static u16_t dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value); #if LWIP_NETIF_HOSTNAME -static void dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif); +static u16_t dhcp_option_hostname(u16_t options_out_len, u8_t *options, struct netif *netif); #endif /* LWIP_NETIF_HOSTNAME */ /* always add the DHCP options trailer to end and pad */ -static void dhcp_option_trailer(struct dhcp *dhcp); +static void dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out); /** Ensure DHCP PCB is allocated and bound */ static err_t @@ -226,8 +243,8 @@ dhcp_inc_pcb_refcount(void) ip_set_option(dhcp_pcb, SOF_BROADCAST); /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */ - udp_bind(dhcp_pcb, IP4_ADDR_ANY, DHCP_CLIENT_PORT); - udp_connect(dhcp_pcb, IP4_ADDR_ANY, DHCP_SERVER_PORT); + udp_bind(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_CLIENT); + udp_connect(dhcp_pcb, IP4_ADDR_ANY, LWIP_IANA_PORT_DHCP_SERVER); udp_recv(dhcp_pcb, dhcp_recv, NULL); } @@ -267,7 +284,7 @@ dhcp_handle_nak(struct netif *netif) struct dhcp *dhcp = netif_dhcp_data(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n", - (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* Change to a defined state - set this before assigning the address to ensure the callback can use dhcp_supplied_address() */ dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF); @@ -294,7 +311,7 @@ dhcp_check(struct netif *netif) err_t result; u16_t msecs; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0], - (s16_t)netif->name[1])); + (s16_t)netif->name[1])); dhcp_set_state(dhcp, DHCP_STATE_CHECKING); /* create an ARP query for the offered IP address, expecting that no host responds, as the IP address should not be in use. */ @@ -306,7 +323,7 @@ dhcp_check(struct netif *netif) dhcp->tries++; } msecs = 500; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs)); } #endif /* DHCP_DOES_ARP_CHECK */ @@ -317,26 +334,28 @@ dhcp_check(struct netif *netif) * @param netif the netif under DHCP control */ static void -dhcp_handle_offer(struct netif *netif) +dhcp_handle_offer(struct netif *netif, struct dhcp_msg *msg_in) { struct dhcp *dhcp = netif_dhcp_data(netif); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n", - (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* obtain the server address */ if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) { + dhcp->request_timeout = 0; /* stop timer */ + ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID))); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n", - ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); + ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); /* remember offered address */ - ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr); + ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n", - ip4_addr_get_u32(&dhcp->offered_ip_addr))); + ip4_addr_get_u32(&dhcp->offered_ip_addr))); dhcp_select(netif); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void*)netif)); + ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void *)netif)); } } @@ -351,58 +370,59 @@ dhcp_handle_offer(struct netif *netif) static err_t dhcp_select(struct netif *netif) { - struct dhcp *dhcp = netif_dhcp_data(netif); + struct dhcp *dhcp; err_t result; u16_t msecs; u8_t i; + struct pbuf *p_out; + u16_t options_out_len; - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + LWIP_ERROR("dhcp_select: netif != NULL", (netif != NULL), return ERR_ARG;); + dhcp = netif_dhcp_data(netif); + LWIP_ERROR("dhcp_select: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); dhcp_set_state(dhcp, DHCP_STATE_REQUESTING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); /* MUST request the offered IP address */ - dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); - dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); + options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); - dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); - dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4); + options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr)))); - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); - } - - dhcp_option(dhcp, DHCP_OPTION_US, strlen(TLS_CONFIG_DHCP_OPTION60)); - for (i = 0; i < strlen(TLS_CONFIG_DHCP_OPTION60); i++) - { - dhcp_option_byte(dhcp, *((u8 *)TLS_CONFIG_DHCP_OPTION60 + i)); + options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); } #if LWIP_NETIF_HOSTNAME - dhcp_option_hostname(dhcp, netif); + options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif); #endif /* LWIP_NETIF_HOSTNAME */ - dhcp_option_trailer(dhcp); - /* shrink the pbuf to the actual content length */ - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REQUESTING, msg_out, DHCP_REQUEST, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); /* send broadcast to any DHCP server */ - udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY); - dhcp_delete_msg(dhcp); + result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n")); + result = ERR_MEM; } if (dhcp->tries < 255) { dhcp->tries++; } - msecs = (dhcp->tries < 3 ? 1 << dhcp->tries : 3) * 500; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000); + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs)); return result; } @@ -414,10 +434,10 @@ dhcp_select(struct netif *netif) void dhcp_coarse_tmr(void) { - struct netif *netif = netif_list; + struct netif *netif; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n")); /* iterate through all network interfaces */ - while (netif != NULL) { + NETIF_FOREACH(netif) { /* only act on DHCP configured interfaces */ struct dhcp *dhcp = netif_dhcp_data(netif); if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) { @@ -425,22 +445,20 @@ dhcp_coarse_tmr(void) if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t0 timeout\n")); /* this clients' lease time has expired */ - dhcp_release(netif); - dhcp_discover(netif); - /* timer is active (non zero), and triggers (zeroes) now? */ + dhcp_release_and_stop(netif); + dhcp_start(netif); + /* timer is active (non zero), and triggers (zeroes) now? */ } else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n")); /* this clients' rebind timeout triggered */ dhcp_t2_timeout(netif); - /* timer is active (non zero), and triggers (zeroes) now */ + /* timer is active (non zero), and triggers (zeroes) now */ } else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n")); /* this clients' renewal timeout triggered */ dhcp_t1_timeout(netif); } } - /* proceed to next netif */ - netif = netif->next; } } @@ -454,26 +472,23 @@ dhcp_coarse_tmr(void) void dhcp_fine_tmr(void) { - struct netif *netif = netif_list; + struct netif *netif; /* loop through netif's */ - while (netif != NULL) { + NETIF_FOREACH(netif) { struct dhcp *dhcp = netif_dhcp_data(netif); /* only act on DHCP configured interfaces */ if (dhcp != NULL) { /* timer is active (non zero), and is about to trigger now */ if (dhcp->request_timeout > 1) { dhcp->request_timeout--; - } - else if (dhcp->request_timeout == 1) { + } else if (dhcp->request_timeout == 1) { dhcp->request_timeout--; - /* { netif->dhcp->request_timeout == 0 } */ + /* { dhcp->request_timeout == 0 } */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n")); /* this client's request timeout triggered */ dhcp_timeout(netif); } } - /* proceed to next network interface */ - netif = netif->next; } } @@ -495,24 +510,24 @@ dhcp_timeout(struct netif *netif) if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n")); dhcp_discover(netif); - /* receiving the requested lease timed out */ + /* receiving the requested lease timed out */ } else if (dhcp->state == DHCP_STATE_REQUESTING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n")); if (dhcp->tries <= 5) { dhcp_select(netif); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n")); - dhcp_release(netif); - dhcp_discover(netif); + dhcp_release_and_stop(netif); + dhcp_start(netif); } #if DHCP_DOES_ARP_CHECK - /* received no ARP reply for the offered address (which is good) */ + /* received no ARP reply for the offered address (which is good) */ } else if (dhcp->state == DHCP_STATE_CHECKING) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n")); if (dhcp->tries <= 1) { dhcp_check(netif); - /* no ARP replies on the offered address, - looks like the IP address is indeed free */ + /* no ARP replies on the offered address, + looks like the IP address is indeed free */ } else { /* bind the interface to the offered address */ dhcp_bind(netif); @@ -524,18 +539,6 @@ dhcp_timeout(struct netif *netif) } else { dhcp_discover(netif); } - }else if (dhcp->state == DHCP_STATE_RENEWING){ - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n")); - dhcp_renew(netif); - }else if (dhcp->state == DHCP_STATE_REBINDING) { - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n")); - if (dhcp->tries <= 8) { - dhcp_rebind(netif); - } else { - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n")); - dhcp_release(netif); - dhcp_discover(netif); - } } } @@ -560,9 +563,8 @@ dhcp_t1_timeout(struct netif *netif) DHCP_STATE_RENEWING, not DHCP_STATE_BOUND */ dhcp_renew(netif); /* Calculate next timeout */ - if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) - { - dhcp->t1_renew_time = ((dhcp->t2_timeout - dhcp->lease_used) / 2); + if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) { + dhcp->t1_renew_time = (u16_t)((dhcp->t2_timeout - dhcp->lease_used) / 2); } } } @@ -587,9 +589,8 @@ dhcp_t2_timeout(struct netif *netif) DHCP_STATE_REBINDING, not DHCP_STATE_BOUND */ dhcp_rebind(netif); /* Calculate next timeout */ - if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) - { - dhcp->t2_rebind_time = ((dhcp->t0_timeout - dhcp->lease_used) / 2); + if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS)) { + dhcp->t2_rebind_time = (u16_t)((dhcp->t0_timeout - dhcp->lease_used) / 2); } } } @@ -600,7 +601,7 @@ dhcp_t2_timeout(struct netif *netif) * @param netif the netif under DHCP control */ static void -dhcp_handle_ack(struct netif *netif) +dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in) { struct dhcp *dhcp = netif_dhcp_data(netif); @@ -642,12 +643,12 @@ dhcp_handle_ack(struct netif *netif) } /* (y)our internet address */ - ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr); + ip4_addr_copy(dhcp->offered_ip_addr, msg_in->yiaddr); #if LWIP_DHCP_BOOTP_FILE /* copy boot server address, boot file name copied in dhcp_parse_reply if not overloaded */ - ip4_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr); + ip4_addr_copy(dhcp->offered_si_addr, msg_in->siaddr); #endif /* LWIP_DHCP_BOOTP_FILE */ /* subnet mask given? */ @@ -676,7 +677,7 @@ dhcp_handle_ack(struct netif *netif) /* DNS servers */ for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) { ip_addr_t dns_addr; - ip_addr_set_ip4_u32(&dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n))); + ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n))); dns_setserver(n, &dns_addr); } #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */ @@ -693,6 +694,7 @@ dhcp_handle_ack(struct netif *netif) void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("dhcp != NULL", dhcp != NULL); LWIP_ASSERT("netif already has a struct dhcp set", netif_dhcp_data(netif) == NULL); @@ -714,6 +716,7 @@ dhcp_set_struct(struct netif *netif, struct dhcp *dhcp) */ void dhcp_cleanup(struct netif *netif) { + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); if (netif_dhcp_data(netif) != NULL) { @@ -741,10 +744,11 @@ dhcp_start(struct netif *netif) struct dhcp *dhcp; err_t result; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); LWIP_ERROR("netif is not up, old style port?", netif_is_up(netif), return ERR_ARG;); dhcp = netif_dhcp_data(netif); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* check MTU of the netif */ if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { @@ -764,11 +768,9 @@ dhcp_start(struct netif *netif) /* store this dhcp client in the netif */ netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp")); - /* already has DHCP client attached */ + /* already has DHCP client attached */ } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n")); - LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL); - LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL ); if (dhcp->pcb_allocated != 0) { dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */ @@ -787,20 +789,17 @@ dhcp_start(struct netif *netif) } dhcp->pcb_allocated = 1; -#if LWIP_DHCP_CHECK_LINK_UP if (!netif_is_link_up(netif)) { /* set state INIT and wait for dhcp_network_changed() to call dhcp_discover() */ dhcp_set_state(dhcp, DHCP_STATE_INIT); return ERR_OK; } -#endif /* LWIP_DHCP_CHECK_LINK_UP */ - /* (re)start the DHCP negotiation */ result = dhcp_discover(netif); if (result != ERR_OK) { /* free resources allocated above */ - dhcp_stop(netif); + dhcp_release_and_stop(netif); return ERR_MEM; } return result; @@ -820,8 +819,10 @@ void dhcp_inform(struct netif *netif) { struct dhcp dhcp; - err_t result = ERR_OK; + struct pbuf *p_out; + u16_t options_out_len; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ERROR("netif != NULL", (netif != NULL), return;); if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */ @@ -832,20 +833,20 @@ dhcp_inform(struct netif *netif) dhcp_set_state(&dhcp, DHCP_STATE_INFORMING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, &dhcp, DHCP_INFORM); - if (result == ERR_OK) { - dhcp_option(&dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(&dhcp, DHCP_MAX_MSG_LEN(netif)); + p_out = dhcp_create_msg(netif, &dhcp, DHCP_INFORM, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); - dhcp_option_trailer(&dhcp); - - pbuf_realloc(dhcp.p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp.options_out_len); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, &dhcp, DHCP_STATE_INFORMING, msg_out, DHCP_INFORM, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_inform: INFORMING\n")); - udp_sendto_if(dhcp_pcb, dhcp.p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif); - dhcp_delete_msg(&dhcp); + pbuf_free(p_out); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n")); } @@ -863,33 +864,35 @@ dhcp_network_changed(struct netif *netif) { struct dhcp *dhcp = netif_dhcp_data(netif); - if (!dhcp) + if (!dhcp) { return; + } switch (dhcp->state) { - case DHCP_STATE_REBINDING: - case DHCP_STATE_RENEWING: - case DHCP_STATE_BOUND: - case DHCP_STATE_REBOOTING: - dhcp->tries = 0; - dhcp_reboot(netif); - break; - case DHCP_STATE_OFF: - /* stay off */ - break; - default: - /* INIT/REQUESTING/CHECKING/BACKING_OFF restart with new 'rid' because the - state changes, SELECTING: continue with current 'rid' as we stay in the - same state */ + case DHCP_STATE_REBINDING: + case DHCP_STATE_RENEWING: + case DHCP_STATE_BOUND: + case DHCP_STATE_REBOOTING: + dhcp->tries = 0; + dhcp_reboot(netif); + break; + case DHCP_STATE_OFF: + /* stay off */ + break; + default: + LWIP_ASSERT("invalid dhcp->state", dhcp->state <= DHCP_STATE_BACKING_OFF); + /* INIT/REQUESTING/CHECKING/BACKING_OFF restart with new 'rid' because the + state changes, SELECTING: continue with current 'rid' as we stay in the + same state */ #if LWIP_DHCP_AUTOIP_COOP - if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { - autoip_stop(netif); - dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; - } + if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } #endif /* LWIP_DHCP_AUTOIP_COOP */ - /* ensure we start with short timeouts, even if already discovering */ - dhcp->tries = 0; - dhcp_discover(netif); - break; + /* ensure we start with short timeouts, even if already discovering */ + dhcp->tries = 0; + dhcp_discover(netif); + break; } } @@ -912,13 +915,13 @@ dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr) /* is a DHCP client doing an ARP check? */ if ((dhcp != NULL) && (dhcp->state == DHCP_STATE_CHECKING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n", - ip4_addr_get_u32(addr))); + ip4_addr_get_u32(addr))); /* did a host respond with the address we were offered by the DHCP server? */ if (ip4_addr_cmp(addr, &dhcp->offered_ip_addr)) { /* we will not accept the offered address */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, - ("dhcp_arp_reply(): arp reply matched with offered address, declining\n")); + ("dhcp_arp_reply(): arp reply matched with offered address, declining\n")); dhcp_decline(netif); } } @@ -937,33 +940,37 @@ static err_t dhcp_decline(struct netif *netif) { struct dhcp *dhcp = netif_dhcp_data(netif); - err_t result = ERR_OK; + err_t result; u16_t msecs; + struct pbuf *p_out; + u16_t options_out_len; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n")); dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); - dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + p_out = dhcp_create_msg(netif, dhcp, DHCP_DECLINE, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); + options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); - dhcp_option_trailer(dhcp); - /* resize pbuf to reflect true size of options */ - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_BACKING_OFF, msg_out, DHCP_DECLINE, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); /* per section 4.4.4, broadcast DECLINE messages */ - udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY); - dhcp_delete_msg(dhcp); + result = udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("dhcp_decline: could not allocate DHCP request\n")); + ("dhcp_decline: could not allocate DHCP request\n")); + result = ERR_MEM; } if (dhcp->tries < 255) { dhcp->tries++; } - msecs = 10*1000; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = 10 * 1000; + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs)); return result; } @@ -989,6 +996,8 @@ dhcp_discover(struct netif *netif) err_t result = ERR_OK; u16_t msecs; u8_t i; + struct pbuf *p_out; + u16_t options_out_len; dhcp_timeout_flag = 0; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n")); #if !LWIP_DHCP_AUTOIP_COOP @@ -1001,52 +1010,40 @@ dhcp_discover(struct netif *netif) ip4_addr_set_any(&dhcp->offered_ip_addr); dhcp_set_state(dhcp, DHCP_STATE_SELECTING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER); - if (result == ERR_OK) { + p_out = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n")); - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); -#if LWIP_NETIF_HOSTNAME - dhcp_option_hostname(dhcp, netif); -#endif /* LWIP_NETIF_HOSTNAME */ - - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); + options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); } + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_SELECTING, msg_out, DHCP_DISCOVER, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); - dhcp_option(dhcp, DHCP_OPTION_US, strlen(TLS_CONFIG_DHCP_OPTION60)); - for (i = 0; i < strlen(TLS_CONFIG_DHCP_OPTION60); i++) - { - dhcp_option_byte(dhcp, *((u8 *)TLS_CONFIG_DHCP_OPTION60 + i)); - } - - dhcp_option_trailer(dhcp); - - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n")); - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); - - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n")); - udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER)\n")); + udp_sendto_if_src(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif, IP4_ADDR_ANY); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n")); - dhcp_delete_msg(dhcp); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n")); } - - dhcp->tries++; - + if (dhcp->tries < 255) { + dhcp->tries++; + } #if LWIP_DHCP_AUTOIP_COOP if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) { dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON; autoip_start(netif); } #endif /* LWIP_DHCP_AUTOIP_COOP */ - msecs = (dhcp->tries < 3 ? 1 << dhcp->tries : 4) * 500; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000); + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); return result; } @@ -1066,23 +1063,23 @@ dhcp_bind(struct netif *netif) LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;); dhcp = netif_dhcp_data(netif); LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); /* reset time used of lease */ dhcp->lease_used = 0; if (dhcp->offered_t0_lease != 0xffffffffUL) { - /* set renewal period timer */ - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t0 renewal timer %"U32_F" secs\n", dhcp->offered_t0_lease)); - timeout = (dhcp->offered_t0_lease + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; - if (timeout > 0xffff) { - timeout = 0xffff; - } - dhcp->t0_timeout = (u16_t)timeout; - if (dhcp->t0_timeout == 0) { - dhcp->t0_timeout = 1; - } - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease*1000)); + /* set renewal period timer */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t0 renewal timer %"U32_F" secs\n", dhcp->offered_t0_lease)); + timeout = (dhcp->offered_t0_lease + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; + if (timeout > 0xffff) { + timeout = 0xffff; + } + dhcp->t0_timeout = (u16_t)timeout; + if (dhcp->t0_timeout == 0) { + dhcp->t0_timeout = 1; + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t0_lease * 1000)); } /* temporary DHCP lease? */ @@ -1097,7 +1094,7 @@ dhcp_bind(struct netif *netif) if (dhcp->t1_timeout == 0) { dhcp->t1_timeout = 1; } - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew * 1000)); dhcp->t1_renew_time = dhcp->t1_timeout; } /* set renewal period timer */ @@ -1111,7 +1108,7 @@ dhcp_bind(struct netif *netif) if (dhcp->t2_timeout == 0) { dhcp->t2_timeout = 1; } - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind * 1000)); dhcp->t2_rebind_time = dhcp->t2_timeout; } @@ -1136,13 +1133,6 @@ dhcp_bind(struct netif *netif) } ip4_addr_copy(gw_addr, dhcp->offered_gw_addr); - /* gateway address not given? */ - if (ip4_addr_isany_val(gw_addr)) { - /* copy network address */ - ip4_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask); - /* use first host address on network as gateway */ - ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL)); - } #if LWIP_DHCP_AUTOIP_COOP if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { @@ -1152,7 +1142,7 @@ dhcp_bind(struct netif *netif) #endif /* LWIP_DHCP_AUTOIP_COOP */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F" SN: 0x%08"X32_F" GW: 0x%08"X32_F"\n", - ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr))); + ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr))); /* netif is now bound to DHCP leased address - set this before assigning the address to ensure the callback can use dhcp_supplied_address() */ dhcp_set_state(dhcp, DHCP_STATE_BOUND); @@ -1174,48 +1164,46 @@ dhcp_renew(struct netif *netif) err_t result; u16_t msecs; u8_t i; + struct pbuf *p_out; + u16_t options_out_len; + + LWIP_ASSERT_CORE_LOCKED(); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n")); dhcp_set_state(dhcp, DHCP_STATE_RENEWING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); - } - - dhcp_option(dhcp, DHCP_OPTION_US, strlen(TLS_CONFIG_DHCP_OPTION60)); - for (i = 0; i < strlen(TLS_CONFIG_DHCP_OPTION60); i++) - { - dhcp_option_byte(dhcp, *((u8 *)TLS_CONFIG_DHCP_OPTION60 + i)); + options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); } #if LWIP_NETIF_HOSTNAME - dhcp_option_hostname(dhcp, netif); + options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif); #endif /* LWIP_NETIF_HOSTNAME */ - /* append DHCP message trailer */ - dhcp_option_trailer(dhcp); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_RENEWING, msg_out, DHCP_REQUEST, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); - - udp_sendto_if(dhcp_pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); - dhcp_delete_msg(dhcp); + result = udp_sendto_if(dhcp_pcb, p_out, &dhcp->server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n")); + result = ERR_MEM; } if (dhcp->tries < 255) { dhcp->tries++; } /* back-off on retries, but to a maximum of 20 seconds */ - msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000); + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs)); return result; } @@ -1232,46 +1220,44 @@ dhcp_rebind(struct netif *netif) err_t result; u16_t msecs; u8_t i; + struct pbuf *p_out; + u16_t options_out_len; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n")); dhcp_set_state(dhcp, DHCP_STATE_REBINDING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN(netif)); - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); - } - - dhcp_option(dhcp, DHCP_OPTION_US, strlen(TLS_CONFIG_DHCP_OPTION60)); - for (i = 0; i < strlen(TLS_CONFIG_DHCP_OPTION60); i++) - { - dhcp_option_byte(dhcp, *((u8 *)TLS_CONFIG_DHCP_OPTION60 + i)); + options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); } #if LWIP_NETIF_HOSTNAME - dhcp_option_hostname(dhcp, netif); + options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif); #endif /* LWIP_NETIF_HOSTNAME */ - dhcp_option_trailer(dhcp); - - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBINDING, msg_out, DHCP_DISCOVER, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); /* broadcast to server */ - udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); - dhcp_delete_msg(dhcp); + result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n")); + result = ERR_MEM; } if (dhcp->tries < 255) { dhcp->tries++; } - msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs)); return result; } @@ -1288,74 +1274,76 @@ dhcp_reboot(struct netif *netif) err_t result; u16_t msecs; u8_t i; + struct pbuf *p_out; + u16_t options_out_len; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n")); dhcp_set_state(dhcp, DHCP_STATE_REBOOTING); /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN_MIN_REQUIRED); + p_out = dhcp_create_msg(netif, dhcp, DHCP_REQUEST, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + options_out_len = dhcp_option_short(options_out_len, msg_out->options, DHCP_MAX_MSG_LEN_MIN_REQUIRED); - dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); - dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_REQUESTED_IP, 4); + options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); - } - - dhcp_option(dhcp, DHCP_OPTION_US, strlen(TLS_CONFIG_DHCP_OPTION60)); - for (i = 0; i < strlen(TLS_CONFIG_DHCP_OPTION60); i++) - { - dhcp_option_byte(dhcp, *((u8 *)TLS_CONFIG_DHCP_OPTION60 + i)); + options_out_len = dhcp_option_byte(options_out_len, msg_out->options, dhcp_discover_request_options[i]); } - dhcp_option_trailer(dhcp); +#if LWIP_NETIF_HOSTNAME + options_out_len = dhcp_option_hostname(options_out_len, msg_out->options, netif); +#endif /* LWIP_NETIF_HOSTNAME */ - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_REBOOTING, msg_out, DHCP_REQUEST, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); /* broadcast to server */ - udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); - dhcp_delete_msg(dhcp); + result = udp_sendto_if(dhcp_pcb, p_out, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER, netif); + pbuf_free(p_out); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n")); } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n")); + result = ERR_MEM; } if (dhcp->tries < 255) { dhcp->tries++; } - msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; - dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); + dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs)); return result; } - /** * @ingroup dhcp4 - * Release a DHCP lease (usually called before @ref dhcp_stop). + * Release a DHCP lease and stop DHCP statemachine (and AUTOIP if LWIP_DHCP_AUTOIP_COOP). * - * @param netif network interface which must release its lease + * @param netif network interface */ -err_t -dhcp_release(struct netif *netif) +void +dhcp_release_and_stop(struct netif *netif) { struct dhcp *dhcp = netif_dhcp_data(netif); - err_t result; ip_addr_t server_ip_addr; - u8_t is_dhcp_supplied_address; - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n")); + LWIP_ASSERT_CORE_LOCKED(); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release_and_stop()\n")); if (dhcp == NULL) { - return ERR_ARG; + return; } + + /* already off? -> nothing to do */ + if (dhcp->state == DHCP_STATE_OFF) { + return; + } + ip_addr_copy(server_ip_addr, dhcp->server_ip_addr); - is_dhcp_supplied_address = dhcp_supplied_address(netif); - - /* idle DHCP client */ - dhcp_set_state(dhcp, DHCP_STATE_OFF); /* clean old DHCP offer */ ip_addr_set_zero_ip4(&dhcp->server_ip_addr); ip4_addr_set_zero(&dhcp->offered_ip_addr); @@ -1367,65 +1355,69 @@ dhcp_release(struct netif *netif) dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0; dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0; - if (!is_dhcp_supplied_address) { - /* don't issue release message when address is not dhcp-assigned */ - return ERR_OK; - } + /* send release message when current IP was assigned via DHCP */ + if (dhcp_supplied_address(netif)) { + /* create and initialize the DHCP message header */ + struct pbuf *p_out; + u16_t options_out_len; + dhcp_set_state(dhcp, DHCP_STATE_OFF); + p_out = dhcp_create_msg(netif, dhcp, DHCP_RELEASE, &options_out_len); + if (p_out != NULL) { + struct dhcp_msg *msg_out = (struct dhcp_msg *)p_out->payload; + options_out_len = dhcp_option(options_out_len, msg_out->options, DHCP_OPTION_SERVER_ID, 4); + options_out_len = dhcp_option_long(options_out_len, msg_out->options, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr)))); - /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE); - if (result == ERR_OK) { - dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); - dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr)))); + LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, dhcp->state, msg_out, DHCP_RELEASE, &options_out_len); + dhcp_option_trailer(options_out_len, msg_out->options, p_out); - dhcp_option_trailer(dhcp); + udp_sendto_if(dhcp_pcb, p_out, &server_ip_addr, LWIP_IANA_PORT_DHCP_SERVER, netif); + pbuf_free(p_out); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_STATE_OFF\n")); + } else { + /* sending release failed, but that's not a problem since the correct behaviour of dhcp does not rely on release */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n")); + } - pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); - - udp_sendto_if(dhcp_pcb, dhcp->p_out, &server_ip_addr, DHCP_SERVER_PORT, netif); - dhcp_delete_msg(dhcp); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_STATE_OFF\n")); + /* remove IP address from interface (prevents routing from selecting this interface) */ + netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); } else { - /* sending release failed, but that's not a problem since the correct behaviour of dhcp does not rely on release */ - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n")); + dhcp_set_state(dhcp, DHCP_STATE_OFF); } - /* remove IP address from interface (prevents routing from selecting this interface) */ - netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4); - return result; +#if LWIP_DHCP_AUTOIP_COOP + if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + + if (dhcp->pcb_allocated != 0) { + dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */ + dhcp->pcb_allocated = 0; + } } /** * @ingroup dhcp4 - * Remove the DHCP client from the interface. - * - * @param netif The network interface to stop DHCP on + * This function calls dhcp_release_and_stop() internally. + * @deprecated Use dhcp_release_and_stop() instead. + */ +err_t +dhcp_release(struct netif *netif) +{ + dhcp_release_and_stop(netif); + return ERR_OK; +} + +/** + * @ingroup dhcp4 + * This function calls dhcp_release_and_stop() internally. + * @deprecated Use dhcp_release_and_stop() instead. */ void dhcp_stop(struct netif *netif) { - struct dhcp *dhcp; - LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;); - dhcp = netif_dhcp_data(netif); - - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n")); - /* netif is DHCP configured? */ - if (dhcp != NULL) { -#if LWIP_DHCP_AUTOIP_COOP - if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { - autoip_stop(netif); - dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; - } -#endif /* LWIP_DHCP_AUTOIP_COOP */ - - LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL); - dhcp_set_state(dhcp, DHCP_STATE_OFF); - - if (dhcp->pcb_allocated != 0) { - dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */ - dhcp->pcb_allocated = 0; - } - } + dhcp_release_and_stop(netif); } /* @@ -1448,45 +1440,49 @@ dhcp_set_state(struct dhcp *dhcp, u8_t new_state) * DHCP message. * */ -static void -dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len) +static u16_t +dhcp_option(u16_t options_out_len, u8_t *options, u8_t option_type, u8_t option_len) { - LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); - dhcp->msg_out->options[dhcp->options_out_len++] = option_type; - dhcp->msg_out->options[dhcp->options_out_len++] = option_len; + LWIP_ASSERT("dhcp_option: options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); + options[options_out_len++] = option_type; + options[options_out_len++] = option_len; + return options_out_len; } /* * Concatenate a single byte to the outgoing DHCP message. * */ -static void -dhcp_option_byte(struct dhcp *dhcp, u8_t value) +static u16_t +dhcp_option_byte(u16_t options_out_len, u8_t *options, u8_t value) { - LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN); - dhcp->msg_out->options[dhcp->options_out_len++] = value; + LWIP_ASSERT("dhcp_option_byte: options_out_len < DHCP_OPTIONS_LEN", options_out_len < DHCP_OPTIONS_LEN); + options[options_out_len++] = value; + return options_out_len; } -static void -dhcp_option_short(struct dhcp *dhcp, u16_t value) +static u16_t +dhcp_option_short(u16_t options_out_len, u8_t *options, u16_t value) { - LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU); + LWIP_ASSERT("dhcp_option_short: options_out_len + 2 <= DHCP_OPTIONS_LEN", options_out_len + 2U <= DHCP_OPTIONS_LEN); + options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8); + options[options_out_len++] = (u8_t) (value & 0x00ffU); + return options_out_len; } -static void -dhcp_option_long(struct dhcp *dhcp, u32_t value) +static u16_t +dhcp_option_long(u16_t options_out_len, u8_t *options, u32_t value) { - LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); - dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL)); + LWIP_ASSERT("dhcp_option_long: options_out_len + 4 <= DHCP_OPTIONS_LEN", options_out_len + 4U <= DHCP_OPTIONS_LEN); + options[options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); + options[options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); + options[options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); + options[options_out_len++] = (u8_t)((value & 0x000000ffUL)); + return options_out_len; } #if LWIP_NETIF_HOSTNAME -static void -dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif) +static u16_t +dhcp_option_hostname(u16_t options_out_len, u8_t *options, struct netif *netif) { if (netif->hostname != NULL) { size_t namelen = strlen(netif->hostname); @@ -1495,16 +1491,17 @@ dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif) const char *p = netif->hostname; /* Shrink len to available bytes (need 2 bytes for OPTION_HOSTNAME and 1 byte for trailer) */ - size_t available = DHCP_OPTIONS_LEN - dhcp->options_out_len - 3; + size_t available = DHCP_OPTIONS_LEN - options_out_len - 3; LWIP_ASSERT("DHCP: hostname is too long!", namelen <= available); len = LWIP_MIN(namelen, available); LWIP_ASSERT("DHCP: hostname is too long!", len <= 0xFF); - dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, (u8_t)len); + options_out_len = dhcp_option(options_out_len, options, DHCP_OPTION_HOSTNAME, (u8_t)len); while (len--) { - dhcp_option_byte(dhcp, *p++); + options_out_len = dhcp_option_byte(options_out_len, options, *p++); } } } + return options_out_len; } #endif /* LWIP_NETIF_HOSTNAME */ @@ -1519,16 +1516,23 @@ dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif) * */ static err_t -dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p) +dhcp_parse_reply(struct pbuf *p, struct dhcp *dhcp) { u8_t *options; u16_t offset; u16_t offset_max; + u16_t options_offset; u16_t options_idx; u16_t options_idx_max; struct pbuf *q; int parse_file_as_options = 0; int parse_sname_as_options = 0; + struct dhcp_msg *msg_in; +#if LWIP_DHCP_BOOTP_FILE + int file_overloaded = 0; +#endif + + LWIP_UNUSED_ARG(dhcp); /* clear received options */ dhcp_clear_all_options(dhcp); @@ -1536,7 +1540,7 @@ dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p) if (p->len < DHCP_SNAME_OFS) { return ERR_BUF; } - dhcp->msg_in = (struct dhcp_msg *)p->payload; + msg_in = (struct dhcp_msg *)p->payload; #if LWIP_DHCP_BOOTP_FILE /* clear boot file name */ dhcp->boot_file_name[0] = 0; @@ -1550,9 +1554,10 @@ dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p) options_idx_max = p->tot_len; again: q = p; + options_offset = options_idx; while ((q != NULL) && (options_idx >= q->len)) { - options_idx -= q->len; - options_idx_max -= q->len; + options_idx = (u16_t)(options_idx - q->len); + options_idx_max = (u16_t)(options_idx_max - q->len); q = q->next; } if (q == NULL) { @@ -1560,130 +1565,150 @@ again: } offset = options_idx; offset_max = options_idx_max; - options = (u8_t*)q->payload; + options = (u8_t *)q->payload; /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */ while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) { u8_t op = options[offset]; u8_t len; u8_t decode_len = 0; int decode_idx = -1; - u16_t val_offset = offset + 2; + u16_t val_offset = (u16_t)(offset + 2); + if (val_offset < offset) { + /* overflow */ + return ERR_BUF; + } /* len byte might be in the next pbuf */ if ((offset + 1) < q->len) { len = options[offset + 1]; } else { - len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0); + len = (q->next != NULL ? ((u8_t *)q->next->payload)[0] : 0); } /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */ decode_len = len; - switch(op) { + switch (op) { /* case(DHCP_OPTION_END): handled above */ - case(DHCP_OPTION_PAD): + case (DHCP_OPTION_PAD): /* special option: no len encoded */ decode_len = len = 0; /* will be increased below */ - offset--; break; - case(DHCP_OPTION_SUBNET_MASK): - LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + case (DHCP_OPTION_SUBNET_MASK): + LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_SUBNET_MASK; break; - case(DHCP_OPTION_ROUTER): + case (DHCP_OPTION_ROUTER): decode_len = 4; /* only copy the first given router */ - LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_ROUTER; break; #if LWIP_DHCP_PROVIDE_DNS_SERVERS - case(DHCP_OPTION_DNS_SERVER): + case (DHCP_OPTION_DNS_SERVER): /* special case: there might be more than one server */ - LWIP_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;); /* limit number of DNS servers */ decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS); - LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_DNS_SERVER; break; #endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */ - case(DHCP_OPTION_LEASE_TIME): - LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + case (DHCP_OPTION_LEASE_TIME): + LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_LEASE_TIME; break; #if LWIP_DHCP_GET_NTP_SRV - case(DHCP_OPTION_NTP): + case (DHCP_OPTION_NTP): /* special case: there might be more than one server */ - LWIP_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("len %% 4 == 0", len % 4 == 0, return ERR_VAL;); /* limit number of NTP servers */ decode_len = LWIP_MIN(len, 4 * LWIP_DHCP_MAX_NTP_SERVERS); - LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_NTP_SERVER; break; #endif /* LWIP_DHCP_GET_NTP_SRV*/ - case(DHCP_OPTION_OVERLOAD): - LWIP_ERROR("len == 1", len == 1, return ERR_VAL;); + case (DHCP_OPTION_OVERLOAD): + LWIP_DHCP_INPUT_ERROR("len == 1", len == 1, return ERR_VAL;); /* decode overload only in options, not in file/sname: invalid packet */ - LWIP_ERROR("overload in file/sname", options_idx == DHCP_OPTIONS_OFS, return ERR_VAL;); + LWIP_DHCP_INPUT_ERROR("overload in file/sname", options_offset == DHCP_OPTIONS_OFS, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_OVERLOAD; break; - case(DHCP_OPTION_MESSAGE_TYPE): - LWIP_ERROR("len == 1", len == 1, return ERR_VAL;); + case (DHCP_OPTION_MESSAGE_TYPE): + LWIP_DHCP_INPUT_ERROR("len == 1", len == 1, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_MSG_TYPE; break; - case(DHCP_OPTION_SERVER_ID): - LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + case (DHCP_OPTION_SERVER_ID): + LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_SERVER_ID; break; - case(DHCP_OPTION_T1): - LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + case (DHCP_OPTION_T1): + LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_T1; break; - case(DHCP_OPTION_T2): - LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + case (DHCP_OPTION_T2): + LWIP_DHCP_INPUT_ERROR("len == 4", len == 4, return ERR_VAL;); decode_idx = DHCP_OPTION_IDX_T2; break; default: decode_len = 0; LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", (u16_t)op)); + LWIP_HOOK_DHCP_PARSE_OPTION(ip_current_netif(), dhcp, dhcp->state, msg_in, + dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) ? (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) : 0, + op, len, q, val_offset); break; } - offset += len + 2; - if (decode_len > 0) { - u32_t value = 0; - u16_t copy_len; + if (op == DHCP_OPTION_PAD) { + offset++; + } else { + if (offset + len + 2 > 0xFFFF) { + /* overflow */ + return ERR_BUF; + } + offset = (u16_t)(offset + len + 2); + if (decode_len > 0) { + u32_t value = 0; + u16_t copy_len; decode_next: - LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX); - if (!dhcp_option_given(dhcp, decode_idx)) { - copy_len = LWIP_MIN(decode_len, 4); - if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) { - return ERR_BUF; - } - if (decode_len > 4) { - /* decode more than one u32_t */ - LWIP_ERROR("decode_len %% 4 == 0", decode_len % 4 == 0, return ERR_VAL;); + LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX); + if (!dhcp_option_given(dhcp, decode_idx)) { + copy_len = LWIP_MIN(decode_len, 4); + if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) { + return ERR_BUF; + } + if (decode_len > 4) { + /* decode more than one u32_t */ + u16_t next_val_offset; + LWIP_DHCP_INPUT_ERROR("decode_len %% 4 == 0", decode_len % 4 == 0, return ERR_VAL;); + dhcp_got_option(dhcp, decode_idx); + dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value)); + decode_len = (u8_t)(decode_len - 4); + next_val_offset = (u16_t)(val_offset + 4); + if (next_val_offset < val_offset) { + /* overflow */ + return ERR_BUF; + } + val_offset = next_val_offset; + decode_idx++; + goto decode_next; + } else if (decode_len == 4) { + value = lwip_ntohl(value); + } else { + LWIP_DHCP_INPUT_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;); + value = ((u8_t *)&value)[0]; + } dhcp_got_option(dhcp, decode_idx); - dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value)); - decode_len -= 4; - val_offset += 4; - decode_idx++; - goto decode_next; - } else if (decode_len == 4) { - value = lwip_ntohl(value); - } else { - LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;); - value = ((u8_t*)&value)[0]; + dhcp_set_option_value(dhcp, decode_idx, value); } - dhcp_got_option(dhcp, decode_idx); - dhcp_set_option_value(dhcp, decode_idx, value); } } if (offset >= q->len) { - offset -= q->len; - offset_max -= q->len; - if ((offset < offset_max) && offset_max) { + offset = (u16_t)(offset - q->len); + offset_max = (u16_t)(offset_max - q->len); + if (offset < offset_max) { q = q->next; - LWIP_ERROR("next pbuf was null", q != NULL, return ERR_VAL;); - options = (u8_t*)q->payload; + LWIP_DHCP_INPUT_ERROR("next pbuf was null", q != NULL, return ERR_VAL;); + options = (u8_t *)q->payload; } else { /* We've run out of bytes, probably no end marker. Don't proceed. */ - break; + return ERR_BUF; } } } @@ -1704,25 +1729,15 @@ decode_next: } else { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("invalid overload option: %d\n", (int)overload)); } -#if LWIP_DHCP_BOOTP_FILE - if (!parse_file_as_options) { - /* only do this for ACK messages */ - if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) && - (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK)) - /* copy bootp file name, don't care for sname (server hostname) */ - if (pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) { - return ERR_BUF; - } - /* make sure the string is really NULL-terminated */ - dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0; - } -#endif /* LWIP_DHCP_BOOTP_FILE */ } if (parse_file_as_options) { /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */ parse_file_as_options = 0; options_idx = DHCP_FILE_OFS; options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN; +#if LWIP_DHCP_BOOTP_FILE + file_overloaded = 1; +#endif goto again; } else if (parse_sname_as_options) { parse_sname_as_options = 0; @@ -1730,6 +1745,19 @@ decode_next: options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN; goto again; } +#if LWIP_DHCP_BOOTP_FILE + if (!file_overloaded) { + /* only do this for ACK messages */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) && + (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK)) + /* copy bootp file name, don't care for sname (server hostname) */ + if (pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) { + return ERR_BUF; + } + /* make sure the string is really NULL-terminated */ + dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0; + } +#endif /* LWIP_DHCP_BOOTP_FILE */ return ERR_OK; } @@ -1744,6 +1772,7 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload; u8_t msg_type; u8_t i; + struct dhcp_msg *msg_in; LWIP_UNUSED_ARG(arg); @@ -1754,8 +1783,8 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, LWIP_ASSERT("invalid server address type", IP_IS_V4(addr)); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p, - ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void *)p, + ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port)); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len)); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len)); /* prevent warnings about unused arguments */ @@ -1763,8 +1792,6 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, LWIP_UNUSED_ARG(addr); LWIP_UNUSED_ARG(port); - LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL); - if (p->len < DHCP_MIN_REPLY_LEN) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n")); goto free_pbuf_and_return; @@ -1775,24 +1802,24 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, goto free_pbuf_and_return; } /* iterate through hardware address and match against DHCP message */ - for (i = 0; i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN && i < DHCP_CHADDR_LEN; i++) { + for (i = 0; i < netif->hwaddr_len && i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) { if (netif->hwaddr[i] != reply_msg->chaddr[i]) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n", - (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i])); + ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n", + (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i])); goto free_pbuf_and_return; } } /* match transaction ID against what we expected */ if (lwip_ntohl(reply_msg->xid) != dhcp->xid) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",lwip_ntohl(reply_msg->xid),dhcp->xid)); + ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n", lwip_ntohl(reply_msg->xid), dhcp->xid)); goto free_pbuf_and_return; } /* option fields could be unfold? */ - if (dhcp_parse_reply(dhcp, p) != ERR_OK) { + if (dhcp_parse_reply(p, dhcp) != ERR_OK) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("problem unfolding DHCP message - too short on memory?\n")); + ("problem unfolding DHCP message - too short on memory?\n")); goto free_pbuf_and_return; } @@ -1803,6 +1830,7 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, goto free_pbuf_and_return; } + msg_in = (struct dhcp_msg *)p->payload; /* read DHCP message type */ msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE); /* message type is DHCP ACK? */ @@ -1810,7 +1838,7 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n")); /* in requesting state? */ if (dhcp->state == DHCP_STATE_REQUESTING) { - dhcp_handle_ack(netif); + dhcp_handle_ack(netif, msg_in); #if DHCP_DOES_ARP_CHECK if ((netif->flags & NETIF_FLAG_ETHARP) != 0) { /* check if the acknowledged lease address is already in use */ @@ -1827,29 +1855,25 @@ dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, /* already bound to the given lease address? */ else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING)) { - dhcp_handle_ack(netif); + dhcp_handle_ack(netif, msg_in); dhcp_bind(netif); } } /* received a DHCP_NAK in appropriate state? */ else if ((msg_type == DHCP_NAK) && - ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) || - (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING ))) { + ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) || + (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING ))) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n")); dhcp_handle_nak(netif); } /* received a DHCP_OFFER in DHCP_STATE_SELECTING state? */ else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_STATE_SELECTING state\n")); - dhcp->request_timeout = 0; /* remember offered lease */ - dhcp_handle_offer(netif); + dhcp_handle_offer(netif, msg_in); } free_pbuf_and_return: - if (dhcp != NULL) { - dhcp->msg_in = NULL; - } pbuf_free(p); } @@ -1860,10 +1884,14 @@ free_pbuf_and_return: * @param dhcp dhcp control struct * @param message_type message type of the request */ -static err_t -dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type) +static struct pbuf * +dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type, u16_t *options_out_len) { u16_t i; + struct pbuf *p_out; + struct dhcp_msg *msg_out; + u16_t options_out_len_loc; + #ifndef DHCP_GLOBAL_XID /** default global transaction identifier starting value (easy to match * with a packet analyser). We simply increment for each new request. @@ -1880,30 +1908,23 @@ dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type) xid_initialised = !xid_initialised; } #endif - LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;); - LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); - LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL); - LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL); - dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); - if (dhcp->p_out == NULL) { + LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return NULL;); + LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return NULL;); + p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); + if (p_out == NULL) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("dhcp_create_msg(): could not allocate pbuf\n")); - return ERR_MEM; + ("dhcp_create_msg(): could not allocate pbuf\n")); + return NULL; } LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg", - (dhcp->p_out->len >= sizeof(struct dhcp_msg))); + (p_out->len >= sizeof(struct dhcp_msg))); /* DHCP_REQUEST should reuse 'xid' from DHCPOFFER */ if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) { /* reuse transaction identifier in retransmissions */ if (dhcp->tries == 0) { #if DHCP_CREATE_RAND_XID && defined(LWIP_RAND) - { - extern unsigned int tls_random_seed_generation(void ); - i = (u16_t)tls_random_seed_generation(); - srand(i); - xid = LWIP_RAND(); - } + xid = LWIP_RAND(); #else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ xid++; #endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ @@ -1913,66 +1934,34 @@ dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type) LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("transaction id xid(%"X32_F")\n", xid)); - dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload; + msg_out = (struct dhcp_msg *)p_out->payload; + memset(msg_out, 0, sizeof(struct dhcp_msg)); - dhcp->msg_out->op = DHCP_BOOTREQUEST; + msg_out->op = DHCP_BOOTREQUEST; /* @todo: make link layer independent */ - dhcp->msg_out->htype = DHCP_HTYPE_ETH; - dhcp->msg_out->hlen = netif->hwaddr_len; - dhcp->msg_out->hops = 0; - dhcp->msg_out->xid = lwip_htonl(dhcp->xid); - dhcp->msg_out->secs = 0; + msg_out->htype = LWIP_IANA_HWTYPE_ETHERNET; + msg_out->hlen = netif->hwaddr_len; + msg_out->xid = lwip_htonl(dhcp->xid); /* we don't need the broadcast flag since we can receive unicast traffic before being fully configured! */ - dhcp->msg_out->flags = 0; - ip4_addr_set_zero(&dhcp->msg_out->ciaddr); /* set ciaddr to netif->ip_addr based on message_type and state */ if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) || ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */ - ((dhcp->state== DHCP_STATE_RENEWING) || dhcp->state== DHCP_STATE_REBINDING))) { - ip4_addr_copy(dhcp->msg_out->ciaddr, *netif_ip4_addr(netif)); + ((dhcp->state == DHCP_STATE_RENEWING) || dhcp->state == DHCP_STATE_REBINDING))) { + ip4_addr_copy(msg_out->ciaddr, *netif_ip4_addr(netif)); } - ip4_addr_set_zero(&dhcp->msg_out->yiaddr); - ip4_addr_set_zero(&dhcp->msg_out->siaddr); - ip4_addr_set_zero(&dhcp->msg_out->giaddr); - for (i = 0; i < DHCP_CHADDR_LEN; i++) { - /* copy netif hardware address, pad with zeroes */ - dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN) ? netif->hwaddr[i] : 0/* pad byte*/; - } - for (i = 0; i < DHCP_SNAME_LEN; i++) { - dhcp->msg_out->sname[i] = 0; - } - for (i = 0; i < DHCP_FILE_LEN; i++) { - dhcp->msg_out->file[i] = 0; - } - dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE); - dhcp->options_out_len = 0; - /* fill options field with an incrementing array (for debugging purposes) */ - for (i = 0; i < DHCP_OPTIONS_LEN; i++) { - dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */ + for (i = 0; i < LWIP_MIN(DHCP_CHADDR_LEN, NETIF_MAX_HWADDR_LEN); i++) { + /* copy netif hardware address (padded with zeroes through memset already) */ + msg_out->chaddr[i] = netif->hwaddr[i]; } + msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE); /* Add option MESSAGE_TYPE */ - dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); - dhcp_option_byte(dhcp, message_type); - return ERR_OK; -} - -/** - * Free previously allocated memory used to send a DHCP request. - * - * @param dhcp the dhcp struct to free the request from - */ -static void -dhcp_delete_msg(struct dhcp *dhcp) -{ - LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;); - LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL); - LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL); - if (dhcp->p_out != NULL) { - pbuf_free(dhcp->p_out); + options_out_len_loc = dhcp_option(0, msg_out->options, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + options_out_len_loc = dhcp_option_byte(options_out_len_loc, msg_out->options, message_type); + if (options_out_len) { + *options_out_len = options_out_len_loc; } - dhcp->p_out = NULL; - dhcp->msg_out = NULL; + return p_out; } /** @@ -1980,22 +1969,19 @@ dhcp_delete_msg(struct dhcp *dhcp) * * Adds the END option to the DHCP message, and if * necessary, up to three padding bytes. - * - * @param dhcp DHCP state structure */ static void -dhcp_option_trailer(struct dhcp *dhcp) +dhcp_option_trailer(u16_t options_out_len, u8_t *options, struct pbuf *p_out) { - LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;); - LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL); - LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); - dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END; + options[options_out_len++] = DHCP_OPTION_END; /* packet is too small, or not 4 byte aligned? */ - while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) && - (dhcp->options_out_len < DHCP_OPTIONS_LEN)) { + while (((options_out_len < DHCP_MIN_OPTIONS_LEN) || (options_out_len & 3)) && + (options_out_len < DHCP_OPTIONS_LEN)) { /* add a fill/padding byte */ - dhcp->msg_out->options[dhcp->options_out_len++] = 0; + options[options_out_len++] = 0; } + /* shrink the pbuf to the actual content length */ + pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + options_out_len)); } /** check if DHCP supplied netif->ip_addr @@ -2008,7 +1994,7 @@ u8_t dhcp_supplied_address(const struct netif *netif) { if ((netif != NULL) && (netif_dhcp_data(netif) != NULL)) { - struct dhcp* dhcp = netif_dhcp_data(netif); + struct dhcp *dhcp = netif_dhcp_data(netif); return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/etharp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/etharp.c similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/etharp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/etharp.c index d6e2d6f..1a4c47d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/etharp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/etharp.c @@ -45,13 +45,14 @@ #include "lwip/opt.h" -#if LWIP_ARP || LWIP_ETHERNET +#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */ #include "lwip/etharp.h" #include "lwip/stats.h" #include "lwip/snmp.h" #include "lwip/dhcp.h" #include "lwip/autoip.h" +#include "lwip/prot/iana.h" #include "netif/ethernet.h" #include @@ -60,8 +61,6 @@ #include LWIP_HOOK_FILENAME #endif -#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */ - /** Re-request a used ARP entry 1 minute before it would expire to prevent * breaking a steadily used connection because the ARP entry timed out. */ #define ARP_AGE_REREQUEST_USED_UNICAST (ARP_MAXAGE - 30) @@ -84,7 +83,7 @@ enum etharp_state { ETHARP_STATE_STABLE_REREQUESTING_1, ETHARP_STATE_STABLE_REREQUESTING_2 #if ETHARP_SUPPORT_STATIC_ENTRIES - ,ETHARP_STATE_STATIC + , ETHARP_STATE_STATIC #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ }; @@ -106,7 +105,7 @@ struct etharp_entry { static struct etharp_entry arp_table[ARP_TABLE_SIZE]; #if !LWIP_NETIF_HWADDRHINT -static u8_t etharp_cached_entry; +static netif_addr_idx_t etharp_cached_entry; #endif /* !LWIP_NETIF_HWADDRHINT */ /** Try hard to create a new entry - we want the IP address to appear in @@ -118,20 +117,20 @@ static u8_t etharp_cached_entry; #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ #if LWIP_NETIF_HWADDRHINT -#define ETHARP_SET_HINT(netif, hint) if (((netif) != NULL) && ((netif)->addr_hint != NULL)) \ - *((netif)->addr_hint) = (hint); +#define ETHARP_SET_ADDRHINT(netif, addrhint) do { if (((netif) != NULL) && ((netif)->hints != NULL)) { \ + (netif)->hints->addr_hint = (addrhint); }} while(0) #else /* LWIP_NETIF_HWADDRHINT */ -#define ETHARP_SET_HINT(netif, hint) (etharp_cached_entry = (hint)) +#define ETHARP_SET_ADDRHINT(netif, addrhint) (etharp_cached_entry = (addrhint)) #endif /* LWIP_NETIF_HWADDRHINT */ -/* Some checks, instead of etharp_init(): */ -#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) - #error "ARP_TABLE_SIZE must fit in an s8_t, you have to reduce it in your lwipopts.h" +/* Check for maximum ARP_TABLE_SIZE */ +#if (ARP_TABLE_SIZE > NETIF_ADDR_IDX_MAX) +#error "ARP_TABLE_SIZE must fit in an s16_t, you have to reduce it in your lwipopts.h" #endif -static err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr); +static err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr); static err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr, const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr, @@ -149,7 +148,6 @@ free_etharp_q(struct etharp_q_entry *q) { struct etharp_q_entry *r; LWIP_ASSERT("q != NULL", q != NULL); - LWIP_ASSERT("q->p != NULL", q->p != NULL); while (q) { r = q; q = q->next; @@ -198,7 +196,7 @@ etharp_free_entry(int i) void etharp_tmr(void) { - u8_t i; + int i; LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); /* remove expired entries from the ARP table */ @@ -206,16 +204,16 @@ etharp_tmr(void) u8_t state = arp_table[i].state; if (state != ETHARP_STATE_EMPTY #if ETHARP_SUPPORT_STATIC_ENTRIES - && (state != ETHARP_STATE_STATIC) + && (state != ETHARP_STATE_STATIC) #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - ) { + ) { arp_table[i].ctime++; if ((arp_table[i].ctime >= ARP_MAXAGE) || ((arp_table[i].state == ETHARP_STATE_PENDING) && (arp_table[i].ctime >= ARP_MAXPENDING))) { /* pending or stable entry has become old! */ - LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n", - arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %d.\n", + arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", i)); /* clean up entries that have just been expired */ etharp_free_entry(i); } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) { @@ -254,14 +252,14 @@ etharp_tmr(void) * @return The ARP entry index that matched or is created, ERR_MEM if no * entry is found or could be recycled. */ -static s8_t -etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) +static s16_t +etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif *netif) { - s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; - s8_t empty = ARP_TABLE_SIZE; - u8_t i = 0; + s16_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; + s16_t empty = ARP_TABLE_SIZE; + s16_t i = 0; /* oldest entry with packets on queue */ - s8_t old_queue = ARP_TABLE_SIZE; + s16_t old_queue = ARP_TABLE_SIZE; /* its age */ u16_t age_queue = 0, age_pending = 0, age_stable = 0; @@ -286,19 +284,19 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) u8_t state = arp_table[i].state; /* no empty entry found yet and now we do find one? */ if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) { - LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %d\n", (int)i)); /* remember first empty entry */ empty = i; } else if (state != ETHARP_STATE_EMPTY) { LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE", - state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE); + state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE); /* if given, does IP address match IP address in ARP entry? */ if (ipaddr && ip4_addr_cmp(ipaddr, &arp_table[i].ipaddr) #if ETHARP_TABLE_MATCH_NETIF && ((netif == NULL) || (netif == arp_table[i].netif)) #endif /* ETHARP_TABLE_MATCH_NETIF */ - ) { - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i)); + ) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %d\n", (int)i)); /* found exact IP address match, simply bail out */ return i; } @@ -311,14 +309,14 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) age_queue = arp_table[i].ctime; } } else - /* pending without queued packets? */ + /* pending without queued packets? */ { if (arp_table[i].ctime >= age_pending) { old_pending = i; age_pending = arp_table[i].ctime; } } - /* stable entry? */ + /* stable entry? */ } else if (state >= ETHARP_STATE_STABLE) { #if ETHARP_SUPPORT_STATIC_ENTRIES /* don't record old_stable for static entries since they never expire */ @@ -341,7 +339,7 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) /* or no empty entry found and not allowed to recycle? */ ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n")); - return (s8_t)ERR_MEM; + return (s16_t)ERR_MEM; } /* b) choose the least destructive entry to recycle: @@ -356,29 +354,29 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) /* 1) empty entry available? */ if (empty < ARP_TABLE_SIZE) { i = empty; - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %d\n", (int)i)); } else { /* 2) found recyclable stable entry? */ if (old_stable < ARP_TABLE_SIZE) { /* recycle oldest stable*/ i = old_stable; - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %d\n", (int)i)); /* no queued packets should exist on stable entries */ LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL); - /* 3) found recyclable pending entry without queued packets? */ + /* 3) found recyclable pending entry without queued packets? */ } else if (old_pending < ARP_TABLE_SIZE) { /* recycle oldest pending */ i = old_pending; - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i)); - /* 4) found recyclable pending entry with queued packets? */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d (without queue)\n", (int)i)); + /* 4) found recyclable pending entry with queued packets? */ } else if (old_queue < ARP_TABLE_SIZE) { /* recycle oldest pending (queued packets are free in etharp_free_entry) */ i = old_queue; - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].q))); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", (int)i, (void *)(arp_table[i].q))); /* no empty or recyclable entries found */ } else { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty or recyclable entries found\n")); - return (s8_t)ERR_MEM; + return (s16_t)ERR_MEM; } /* { empty or recyclable entry found } */ @@ -388,7 +386,7 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE); LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY", - arp_table[i].state == ETHARP_STATE_EMPTY); + arp_table[i].state == ETHARP_STATE_EMPTY); /* IP address given? */ if (ipaddr != NULL) { @@ -398,8 +396,8 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) arp_table[i].ctime = 0; #if ETHARP_TABLE_MATCH_NETIF arp_table[i].netif = netif; -#endif /* ETHARP_TABLE_MATCH_NETIF*/ - return (err_t)i; +#endif /* ETHARP_TABLE_MATCH_NETIF */ + return (s16_t)i; } /** @@ -423,12 +421,12 @@ etharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif) err_t etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags) { - s8_t i; + s16_t i; LWIP_ASSERT("netif->hwaddr_len == ETH_HWADDR_LEN", netif->hwaddr_len == ETH_HWADDR_LEN); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", - ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), - (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2], - (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5])); + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), + (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2], + (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5])); /* non-unicast address? */ if (ip4_addr_isany(ipaddr) || ip4_addr_isbroadcast(ipaddr, netif) || @@ -462,9 +460,9 @@ etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct et /* insert in SNMP ARP index tree */ mib2_add_arp_entry(netif, &arp_table[i].ipaddr); - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", i)); /* update address */ - ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr); + SMEMCPY(&arp_table[i].ethaddr, ethaddr, ETH_HWADDR_LEN); /* reset time stamp */ arp_table[i].ctime = 0; /* this is where we will send out queued packets! */ @@ -485,7 +483,7 @@ etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct et arp_table[i].q = NULL; #endif /* ARP_QUEUEING */ /* send the queued IP packet */ - ethernet_output(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr, ETHTYPE_IP); + ethernet_output(netif, p, (struct eth_addr *)(netif->hwaddr), ethaddr, ETHTYPE_IP); /* free the queued IP packet */ pbuf_free(p); } @@ -505,10 +503,11 @@ err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr) { struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_add_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", - ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), - (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2], - (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5])); + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), + (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2], + (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5])); netif = ip4_route(ipaddr); if (netif == NULL) { @@ -529,9 +528,10 @@ etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr) err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr) { - s8_t i; + s16_t i; + LWIP_ASSERT_CORE_LOCKED(); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_remove_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); /* find or create ARP entry */ i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, NULL); @@ -558,7 +558,7 @@ etharp_remove_static_entry(const ip4_addr_t *ipaddr) void etharp_cleanup_netif(struct netif *netif) { - u8_t i; + int i; for (i = 0; i < ARP_TABLE_SIZE; ++i) { u8_t state = arp_table[i].state; @@ -579,22 +579,22 @@ etharp_cleanup_netif(struct netif *netif) * @param ip_ret points to return pointer * @return table index if found, -1 otherwise */ -s8_t +ssize_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, - struct eth_addr **eth_ret, const ip4_addr_t **ip_ret) + struct eth_addr **eth_ret, const ip4_addr_t **ip_ret) { - s8_t i; + s16_t i; LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL", - eth_ret != NULL && ip_ret != NULL); + eth_ret != NULL && ip_ret != NULL); LWIP_UNUSED_ARG(netif); i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, netif); if ((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) { - *eth_ret = &arp_table[i].ethaddr; - *ip_ret = &arp_table[i].ipaddr; - return i; + *eth_ret = &arp_table[i].ethaddr; + *ip_ret = &arp_table[i].ipaddr; + return i; } return -1; } @@ -608,14 +608,14 @@ etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, * @param eth_ret return value: ETH address * @return 1 on valid index, 0 otherwise */ -u8_t -etharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret) +int +etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret) { LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("eth_ret != NULL", eth_ret != NULL); - if((i < ARP_TABLE_SIZE) && (arp_table[i].state >= ETHARP_STATE_STABLE)) { + if ((i < ARP_TABLE_SIZE) && (arp_table[i].state >= ETHARP_STATE_STABLE)) { *ipaddr = &arp_table[i].ipaddr; *netif = arp_table[i].netif; *eth_ret = &arp_table[i].ethaddr; @@ -645,18 +645,20 @@ etharp_input(struct pbuf *p, struct netif *netif) ip4_addr_t sipaddr, dipaddr; u8_t for_us; + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ERROR("netif != NULL", (netif != NULL), return;); hdr = (struct etharp_hdr *)p->payload; /* RFC 826 "Packet Reception": */ - if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) || + if ((hdr->hwtype != PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET)) || (hdr->hwlen != ETH_HWADDR_LEN) || (hdr->protolen != sizeof(ip4_addr_t)) || (hdr->proto != PP_HTONS(ETHTYPE_IP))) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n", - hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen)); + ("etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n", + hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen)); ETHARP_STATS_INC(etharp.proterr); ETHARP_STATS_INC(etharp.drop); pbuf_free(p); @@ -671,10 +673,10 @@ etharp_input(struct pbuf *p, struct netif *netif) autoip_arp_reply(netif, hdr); #endif /* LWIP_AUTOIP */ - /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without + /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without * structure packing (not using structure copy which breaks strict-aliasing rules). */ - IPADDR2_COPY(&sipaddr, &hdr->sipaddr); - IPADDR2_COPY(&dipaddr, &hdr->dipaddr); + IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&sipaddr, &hdr->sipaddr); + IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(&dipaddr, &hdr->dipaddr); /* this interface is not configured? */ if (ip4_addr_isany_val(*netif_ip4_addr(netif))) { @@ -690,50 +692,50 @@ etharp_input(struct pbuf *p, struct netif *netif) ARP message not directed to us? -> update the source IP address in the cache, if present */ etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), - for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY); + for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY); /* now act on the message itself */ switch (hdr->opcode) { - /* ARP request? */ - case PP_HTONS(ARP_REQUEST): - /* ARP request. If it asked for our address, we send out a - * reply. In any case, we time-stamp any existing ARP entry, - * and possibly send out an IP packet that was queued on it. */ + /* ARP request? */ + case PP_HTONS(ARP_REQUEST): + /* ARP request. If it asked for our address, we send out a + * reply. In any case, we time-stamp any existing ARP entry, + * and possibly send out an IP packet that was queued on it. */ - LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP request\n")); - /* ARP request for our address? */ - if (for_us) { - /* send ARP response */ - etharp_raw(netif, - (struct eth_addr *)netif->hwaddr, &hdr->shwaddr, - (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), - &hdr->shwaddr, &sipaddr, - ARP_REPLY); - /* we are not configured? */ - } else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) { - /* { for_us == 0 and netif->ip_addr.addr == 0 } */ - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: we are unconfigured, ARP request ignored.\n")); - /* request was not directed to us */ - } else { - /* { for_us == 0 and netif->ip_addr.addr != 0 } */ - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP request was not for us.\n")); - } - break; - case PP_HTONS(ARP_REPLY): - /* ARP reply. We already updated the ARP cache earlier. */ - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP reply\n")); + LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP request\n")); + /* ARP request for our address? */ + if (for_us) { + /* send ARP response */ + etharp_raw(netif, + (struct eth_addr *)netif->hwaddr, &hdr->shwaddr, + (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), + &hdr->shwaddr, &sipaddr, + ARP_REPLY); + /* we are not configured? */ + } else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) { + /* { for_us == 0 and netif->ip_addr.addr == 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: we are unconfigured, ARP request ignored.\n")); + /* request was not directed to us */ + } else { + /* { for_us == 0 and netif->ip_addr.addr != 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP request was not for us.\n")); + } + break; + case PP_HTONS(ARP_REPLY): + /* ARP reply. We already updated the ARP cache earlier. */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: incoming ARP reply\n")); #if (LWIP_DHCP && DHCP_DOES_ARP_CHECK) - /* DHCP wants to know about ARP replies from any host with an - * IP address also offered to us by the DHCP server. We do not - * want to take a duplicate IP address on a single network. - * @todo How should we handle redundant (fail-over) interfaces? */ - dhcp_arp_reply(netif, &sipaddr); + /* DHCP wants to know about ARP replies from any host with an + * IP address also offered to us by the DHCP server. We do not + * want to take a duplicate IP address on a single network. + * @todo How should we handle redundant (fail-over) interfaces? */ + dhcp_arp_reply(netif, &sipaddr); #endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */ - break; - default: - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode))); - ETHARP_STATS_INC(etharp.err); - break; + break; + default: + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_input: ARP unknown opcode type %"S16_F"\n", lwip_htons(hdr->opcode))); + ETHARP_STATS_INC(etharp.err); + break; } /* free ARP packet */ pbuf_free(p); @@ -743,7 +745,7 @@ etharp_input(struct pbuf *p, struct netif *netif) * in the arp_table specified by the index 'arp_idx'. */ static err_t -etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx) +etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, netif_addr_idx_t arp_idx) { LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", arp_table[arp_idx].state >= ETHARP_STATE_STABLE); @@ -764,7 +766,7 @@ etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx) } } - return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP); + return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP); } /** @@ -792,6 +794,7 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) struct eth_addr mcastaddr; const ip4_addr_t *dst_addr = ipaddr; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("q != NULL", q != NULL); LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL); @@ -803,7 +806,7 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) if (ip4_addr_isbroadcast(ipaddr, netif)) { /* broadcast on Ethernet also */ dest = (const struct eth_addr *)ðbroadcast; - /* multicast destination IP address? */ + /* multicast destination IP address? */ } else if (ip4_addr_ismulticast(ipaddr)) { /* Hash IP multicast address to MAC address.*/ mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0; @@ -814,15 +817,15 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) mcastaddr.addr[5] = ip4_addr4(ipaddr); /* destination Ethernet address is multicast */ dest = &mcastaddr; - /* unicast destination IP address? */ + /* unicast destination IP address? */ } else { - s8_t i; + netif_addr_idx_t i; /* outside local network? if so, this can neither be a global broadcast nor a subnet broadcast. */ if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) && !ip4_addr_islinklocal(ipaddr)) { #if LWIP_AUTOIP - struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr*, q->payload); + struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr *, q->payload); /* According to RFC 3297, chapter 2.6.2 (Forwarding Rules), a packet with a link-local source address must always be "directly to its destination on the same physical link. The host MUST NOT send the packet to any @@ -841,7 +844,7 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) { /* send to hardware address of default gateway IP address */ dst_addr = netif_ip4_gw(netif); - /* no default gateway available */ + /* no default gateway available */ } else { /* no route to destination error (default gateway missing) */ return ERR_RTE; @@ -850,9 +853,9 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) } } #if LWIP_NETIF_HWADDRHINT - if (netif->addr_hint != NULL) { + if (netif->hints != NULL) { /* per-pcb cached entry was given */ - u8_t etharp_cached_entry = *(netif->addr_hint); + netif_addr_idx_t etharp_cached_entry = netif->hints->addr_hint; if (etharp_cached_entry < ARP_TABLE_SIZE) { #endif /* LWIP_NETIF_HWADDRHINT */ if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) && @@ -878,7 +881,7 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) #endif (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) { /* found an existing, stable entry */ - ETHARP_SET_HINT(netif, i); + ETHARP_SET_ADDRHINT(netif, i); return etharp_output_to_arp_index(netif, q, i); } } @@ -890,7 +893,7 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) /* continuation for multicast/broadcast destinations */ /* obtain source Ethernet address of the given interface */ /* send packet directly on the link */ - return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), dest, ETHTYPE_IP); + return ethernet_output(netif, q, (struct eth_addr *)(netif->hwaddr), dest, ETHTYPE_IP); } /** @@ -929,10 +932,11 @@ etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) err_t etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) { - struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr; + struct eth_addr *srcaddr = (struct eth_addr *)netif->hwaddr; err_t result = ERR_MEM; int is_new_entry = 0; - s8_t i; /* ARP entry index */ + s16_t i_err; + netif_addr_idx_t i; /* non-unicast address? */ if (ip4_addr_isbroadcast(ipaddr, netif) || @@ -943,17 +947,19 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) } /* find entry in ARP cache, ask to create entry if queueing packet */ - i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif); + i_err = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif); /* could not find or create entry? */ - if (i < 0) { + if (i_err < 0) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n")); if (q) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n")); ETHARP_STATS_INC(etharp.memerr); } - return (err_t)i; + return (err_t)i_err; } + LWIP_ASSERT("type overflow", (size_t)i_err < NETIF_ADDR_IDX_MAX); + i = (netif_addr_idx_t)i_err; /* mark a fresh entry as pending (we just sent a request) */ if (arp_table[i].state == ETHARP_STATE_EMPTY) { @@ -965,8 +971,8 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) /* { i is either a STABLE or (new or existing) PENDING entry } */ LWIP_ASSERT("arp_table[i].state == PENDING or STABLE", - ((arp_table[i].state == ETHARP_STATE_PENDING) || - (arp_table[i].state >= ETHARP_STATE_STABLE))); + ((arp_table[i].state == ETHARP_STATE_PENDING) || + (arp_table[i].state >= ETHARP_STATE_STABLE))); /* do we have a new entry? or an implicit query request? */ if (is_new_entry || (q == NULL)) { @@ -977,6 +983,14 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) /* We don't re-send arp request in etharp_tmr, but we still queue packets, since this failure could be temporary, and the next packet calling etharp_query again could lead to sending the queued packets. */ + } else { + /* ARP request successfully sent */ + if ((arp_table[i].state == ETHARP_STATE_PENDING) && !is_new_entry) { + /* A new ARP request has been sent for a pending entry. Reset the ctime to + not let it expire too fast. */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: reset ctime for entry %"S16_F"\n", (s16_t)i)); + arp_table[i].ctime = 0; + } } if (q == NULL) { return result; @@ -988,21 +1002,20 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) /* stable entry? */ if (arp_table[i].state >= ETHARP_STATE_STABLE) { /* we have a valid IP->Ethernet address mapping */ - ETHARP_SET_HINT(netif, i); + ETHARP_SET_ADDRHINT(netif, i); /* send the packet */ result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP); - /* pending entry? (either just created or already pending */ + /* pending entry? (either just created or already pending */ } else if (arp_table[i].state == ETHARP_STATE_PENDING) { /* entry is still pending, queue the given packet 'q' */ struct pbuf *p; int copy_needed = 0; - /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but - * to copy the whole queue into a new PBUF_RAM (see bug #11400) - * PBUF_ROMs can be left as they are, since ROM must not get changed. */ + /* IF q includes a pbuf that must be copied, copy the whole chain into a + * new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */ p = q; while (p) { LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0)); - if (p->type != PBUF_ROM) { + if (PBUF_NEEDS_COPY(p)) { copy_needed = 1; break; } @@ -1010,13 +1023,7 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) } if (copy_needed) { /* copy the whole packet into new pbufs */ - p = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); - if (p != NULL) { - if (pbuf_copy(p, q) != ERR_OK) { - pbuf_free(p); - p = NULL; - } - } + p = pbuf_clone(PBUF_LINK, PBUF_RAM, q); } else { /* referencing the old pbuf is enough */ p = q; @@ -1056,7 +1063,7 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) memp_free(MEMP_ARP_QUEUE, old); } #endif - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, i)); result = ERR_OK; } else { /* the pool MEMP_ARP_QUEUE is empty */ @@ -1067,12 +1074,12 @@ etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q) #else /* ARP_QUEUEING */ /* always queue one packet per ARP request only, freeing a previously queued packet */ if (arp_table[i].q != NULL) { - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"U16_F"\n", (void *)q, (u16_t)i)); pbuf_free(arp_table[i].q); } arp_table[i].q = p; result = ERR_OK; - LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"U16_F"\n", (void *)q, (u16_t)i)); #endif /* ARP_QUEUEING */ } else { ETHARP_STATS_INC(etharp.memerr); @@ -1116,7 +1123,7 @@ etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, /* could allocate a pbuf for an ARP request? */ if (p == NULL) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("etharp_raw: could not allocate pbuf for ARP request.\n")); + ("etharp_raw: could not allocate pbuf for ARP request.\n")); ETHARP_STATS_INC(etharp.memerr); return ERR_MEM; } @@ -1131,14 +1138,14 @@ etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, (netif->hwaddr_len == ETH_HWADDR_LEN)); /* Write the ARP MAC-Addresses */ - ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr); - ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr); - /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without + SMEMCPY(&hdr->shwaddr, hwsrc_addr, ETH_HWADDR_LEN); + SMEMCPY(&hdr->dhwaddr, hwdst_addr, ETH_HWADDR_LEN); + /* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without * structure packing. */ - IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr); - IPADDR2_COPY(&hdr->dipaddr, ipdst_addr); + IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, ipsrc_addr); + IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, ipdst_addr); - hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET); + hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET); hdr->proto = PP_HTONS(ETHTYPE_IP); /* set hwlen and protolen */ hdr->hwlen = ETH_HWADDR_LEN; @@ -1149,7 +1156,7 @@ etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, /* If we are using Link-Local, all ARP packets that contain a Link-Local * 'sender IP address' MUST be sent using link-layer broadcast instead of * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */ - if(ip4_addr_islinklocal(ipsrc_addr)) { + if (ip4_addr_islinklocal(ipsrc_addr)) { ethernet_output(netif, p, ethsrc_addr, ðbroadcast, ETHTYPE_ARP); } else #endif /* LWIP_AUTOIP */ @@ -1179,7 +1186,7 @@ etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, * any other err_t on failure */ static err_t -etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr) +etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr *hw_dst_addr) { return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr, (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), ðzero, @@ -1201,6 +1208,5 @@ etharp_request(struct netif *netif, const ip4_addr_t *ipaddr) LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n")); return etharp_request_dst(netif, ipaddr, ðbroadcast); } -#endif /* LWIP_IPV4 && LWIP_ARP */ -#endif /* LWIP_ARP || LWIP_ETHERNET */ +#endif /* LWIP_IPV4 && LWIP_ARP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/icmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/icmp.c similarity index 51% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/icmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/icmp.c index 5ee24ee..59b493a 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/icmp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/icmp.c @@ -57,12 +57,12 @@ /** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be * used to modify and send a response packet (and to 1 if this is not the case, - * e.g. when link header is stripped of when receiving) */ + * e.g. when link header is stripped off when receiving) */ #ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN #define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1 #endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ -/* The amount of data from the original packet to return in a dest-unreachable */ +/* The maximum amount of data from the original packet to return in a dest-unreachable */ #define ICMP_DEST_UNREACH_DATASIZE 8 static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code); @@ -86,191 +86,198 @@ icmp_input(struct pbuf *p, struct netif *inp) struct icmp_echo_hdr *iecho; const struct ip_hdr *iphdr_in; u16_t hlen; - const ip4_addr_t* src; + const ip4_addr_t *src; ICMP_STATS_INC(icmp.recv); MIB2_STATS_INC(mib2.icmpinmsgs); iphdr_in = ip4_current_header(); - hlen = IPH_HL(iphdr_in) * 4; + hlen = IPH_HL_BYTES(iphdr_in); if (hlen < IP_HLEN) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short IP header (%"S16_F" bytes) received\n", hlen)); goto lenerr; } - if (p->len < sizeof(u16_t)*2) { + if (p->len < sizeof(u16_t) * 2) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len)); goto lenerr; } type = *((u8_t *)p->payload); #ifdef LWIP_DEBUG - code = *(((u8_t *)p->payload)+1); + code = *(((u8_t *)p->payload) + 1); + /* if debug is enabled but debug statement below is somehow disabled: */ + LWIP_UNUSED_ARG(code); #endif /* LWIP_DEBUG */ switch (type) { - case ICMP_ER: - /* This is OK, echo reply might have been parsed by a raw PCB - (as obviously, an echo request has been sent, too). */ - MIB2_STATS_INC(mib2.icmpinechoreps); - break; - case ICMP_ECHO: - MIB2_STATS_INC(mib2.icmpinechos); - src = ip4_current_dest_addr(); - /* multicast destination address? */ - if (ip4_addr_ismulticast(ip4_current_dest_addr())) { + case ICMP_ER: + /* This is OK, echo reply might have been parsed by a raw PCB + (as obviously, an echo request has been sent, too). */ + MIB2_STATS_INC(mib2.icmpinechoreps); + break; + case ICMP_ECHO: + MIB2_STATS_INC(mib2.icmpinechos); + src = ip4_current_dest_addr(); + /* multicast destination address? */ + if (ip4_addr_ismulticast(ip4_current_dest_addr())) { #if LWIP_MULTICAST_PING - /* For multicast, use address of receiving interface as source address */ - src = netif_ip4_addr(inp); + /* For multicast, use address of receiving interface as source address */ + src = netif_ip4_addr(inp); #else /* LWIP_MULTICAST_PING */ - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n")); - goto icmperr; + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast pings\n")); + goto icmperr; #endif /* LWIP_MULTICAST_PING */ - } - /* broadcast destination address? */ - if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) { + } + /* broadcast destination address? */ + if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) { #if LWIP_BROADCAST_PING - /* For broadcast, use address of receiving interface as source address */ - src = netif_ip4_addr(inp); + /* For broadcast, use address of receiving interface as source address */ + src = netif_ip4_addr(inp); #else /* LWIP_BROADCAST_PING */ - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n")); - goto icmperr; + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to broadcast pings\n")); + goto icmperr; #endif /* LWIP_BROADCAST_PING */ - } - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); - if (p->tot_len < sizeof(struct icmp_echo_hdr)) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); - goto lenerr; - } + } + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); + if (p->tot_len < sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); + goto lenerr; + } #if CHECKSUM_CHECK_ICMP - IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) { - if (inet_chksum_pbuf(p) != 0) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); - pbuf_free(p); - ICMP_STATS_INC(icmp.chkerr); - MIB2_STATS_INC(mib2.icmpinerrors); - return; - } - } -#endif -#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN - if (pbuf_header(p, (s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) { - /* p is not big enough to contain link headers - * allocate a new one and copy p into it - */ - struct pbuf *r; - /* allocate new packet buffer with space for link headers */ - r = pbuf_alloc(PBUF_LINK, p->tot_len + hlen, PBUF_RAM); - if (r == NULL) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); - goto icmperr; - } - if (r->len < hlen + sizeof(struct icmp_echo_hdr)) { - LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header")); - pbuf_free(r); - goto icmperr; - } - /* copy the ip header */ - MEMCPY(r->payload, iphdr_in, hlen); - /* switch r->payload back to icmp header (cannot fail) */ - if (pbuf_header(r, (s16_t)-hlen)) { - LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 0); - pbuf_free(r); - goto icmperr; - } - /* copy the rest of the packet without ip header */ - if (pbuf_copy(r, p) != ERR_OK) { - LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed")); - pbuf_free(r); - goto icmperr; - } - /* free the original p */ - pbuf_free(p); - /* we now have an identical copy of p that has room for link headers */ - p = r; - } else { - /* restore p->payload to point to icmp header (cannot fail) */ - if (pbuf_header(p, -(s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) { - LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); - goto icmperr; - } - } -#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ - /* At this point, all checks are OK. */ - /* We generate an answer by switching the dest and src ip addresses, - * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ - iecho = (struct icmp_echo_hdr *)p->payload; - if (pbuf_header(p, (s16_t)hlen)) { - LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet")); - } else { - err_t ret; - struct ip_hdr *iphdr = (struct ip_hdr*)p->payload; - ip4_addr_copy(iphdr->src, *src); - ip4_addr_copy(iphdr->dest, *ip4_current_src_addr()); - ICMPH_TYPE_SET(iecho, ICMP_ER); -#if CHECKSUM_GEN_ICMP - IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) { - /* adjust the checksum */ - if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { - iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1; - } else { - iecho->chksum += PP_HTONS(ICMP_ECHO << 8); + IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) { + if (inet_chksum_pbuf(p) != 0) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); + pbuf_free(p); + ICMP_STATS_INC(icmp.chkerr); + MIB2_STATS_INC(mib2.icmpinerrors); + return; } } -#if LWIP_CHECKSUM_CTRL_PER_NETIF - else { - iecho->chksum = 0; +#endif +#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN + if (pbuf_add_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) { + /* p is not big enough to contain link headers + * allocate a new one and copy p into it + */ + struct pbuf *r; + u16_t alloc_len = (u16_t)(p->tot_len + hlen); + if (alloc_len < p->tot_len) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed (tot_len overflow)\n")); + goto icmperr; + } + /* allocate new packet buffer with space for link headers */ + r = pbuf_alloc(PBUF_LINK, alloc_len, PBUF_RAM); + if (r == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); + goto icmperr; + } + if (r->len < hlen + sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("first pbuf cannot hold the ICMP header")); + pbuf_free(r); + goto icmperr; + } + /* copy the ip header */ + MEMCPY(r->payload, iphdr_in, hlen); + /* switch r->payload back to icmp header (cannot fail) */ + if (pbuf_remove_header(r, hlen)) { + LWIP_ASSERT("icmp_input: moving r->payload to icmp header failed\n", 0); + pbuf_free(r); + goto icmperr; + } + /* copy the rest of the packet without ip header */ + if (pbuf_copy(r, p) != ERR_OK) { + LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("icmp_input: copying to new pbuf failed")); + pbuf_free(r); + goto icmperr; + } + /* free the original p */ + pbuf_free(p); + /* we now have an identical copy of p that has room for link headers */ + p = r; + } else { + /* restore p->payload to point to icmp header (cannot fail) */ + if (pbuf_remove_header(p, hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN)) { + LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); + goto icmperr; + } } +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ + /* At this point, all checks are OK. */ + /* We generate an answer by switching the dest and src ip addresses, + * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ + iecho = (struct icmp_echo_hdr *)p->payload; + if (pbuf_add_header(p, hlen)) { + LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Can't move over header in packet")); + } else { + err_t ret; + struct ip_hdr *iphdr = (struct ip_hdr *)p->payload; + ip4_addr_copy(iphdr->src, *src); + ip4_addr_copy(iphdr->dest, *ip4_current_src_addr()); + ICMPH_TYPE_SET(iecho, ICMP_ER); +#if CHECKSUM_GEN_ICMP + IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) { + /* adjust the checksum */ + if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { + iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS((u16_t)(ICMP_ECHO << 8)) + 1); + } else { + iecho->chksum = (u16_t)(iecho->chksum + PP_HTONS(ICMP_ECHO << 8)); + } + } +#if LWIP_CHECKSUM_CTRL_PER_NETIF + else { + iecho->chksum = 0; + } #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */ #else /* CHECKSUM_GEN_ICMP */ - iecho->chksum = 0; + iecho->chksum = 0; #endif /* CHECKSUM_GEN_ICMP */ - /* Set the correct TTL and recalculate the header checksum. */ - IPH_TTL_SET(iphdr, ICMP_TTL); - IPH_CHKSUM_SET(iphdr, 0); + /* Set the correct TTL and recalculate the header checksum. */ + IPH_TTL_SET(iphdr, ICMP_TTL); + IPH_CHKSUM_SET(iphdr, 0); #if CHECKSUM_GEN_IP - IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) { - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen)); - } + IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) { + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen)); + } #endif /* CHECKSUM_GEN_IP */ - ICMP_STATS_INC(icmp.xmit); - /* increase number of messages attempted to send */ - MIB2_STATS_INC(mib2.icmpoutmsgs); - /* increase number of echo replies attempted to send */ - MIB2_STATS_INC(mib2.icmpoutechoreps); + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + MIB2_STATS_INC(mib2.icmpoutmsgs); + /* increase number of echo replies attempted to send */ + MIB2_STATS_INC(mib2.icmpoutechoreps); - /* send an ICMP packet */ - ret = ip4_output_if(p, src, LWIP_IP_HDRINCL, - ICMP_TTL, 0, IP_PROTO_ICMP, inp); - if (ret != ERR_OK) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret))); + /* send an ICMP packet */ + ret = ip4_output_if(p, src, LWIP_IP_HDRINCL, + ICMP_TTL, 0, IP_PROTO_ICMP, inp); + if (ret != ERR_OK) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %s\n", lwip_strerr(ret))); + } } - } - break; - default: - if (type == ICMP_DUR) { - MIB2_STATS_INC(mib2.icmpindestunreachs); - } else if (type == ICMP_TE) { - MIB2_STATS_INC(mib2.icmpintimeexcds); - } else if (type == ICMP_PP) { - MIB2_STATS_INC(mib2.icmpinparmprobs); - } else if (type == ICMP_SQ) { - MIB2_STATS_INC(mib2.icmpinsrcquenchs); - } else if (type == ICMP_RD) { - MIB2_STATS_INC(mib2.icmpinredirects); - } else if (type == ICMP_TS) { - MIB2_STATS_INC(mib2.icmpintimestamps); - } else if (type == ICMP_TSR) { - MIB2_STATS_INC(mib2.icmpintimestampreps); - } else if (type == ICMP_AM) { - MIB2_STATS_INC(mib2.icmpinaddrmasks); - } else if (type == ICMP_AMR) { - MIB2_STATS_INC(mib2.icmpinaddrmaskreps); - } - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", - (s16_t)type, (s16_t)code)); - ICMP_STATS_INC(icmp.proterr); - ICMP_STATS_INC(icmp.drop); + break; + default: + if (type == ICMP_DUR) { + MIB2_STATS_INC(mib2.icmpindestunreachs); + } else if (type == ICMP_TE) { + MIB2_STATS_INC(mib2.icmpintimeexcds); + } else if (type == ICMP_PP) { + MIB2_STATS_INC(mib2.icmpinparmprobs); + } else if (type == ICMP_SQ) { + MIB2_STATS_INC(mib2.icmpinsrcquenchs); + } else if (type == ICMP_RD) { + MIB2_STATS_INC(mib2.icmpinredirects); + } else if (type == ICMP_TS) { + MIB2_STATS_INC(mib2.icmpintimestamps); + } else if (type == ICMP_TSR) { + MIB2_STATS_INC(mib2.icmpintimestampreps); + } else if (type == ICMP_AM) { + MIB2_STATS_INC(mib2.icmpinaddrmasks); + } else if (type == ICMP_AMR) { + MIB2_STATS_INC(mib2.icmpinaddrmaskreps); + } + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", + (s16_t)type, (s16_t)code)); + ICMP_STATS_INC(icmp.proterr); + ICMP_STATS_INC(icmp.drop); } pbuf_free(p); return; @@ -338,20 +345,26 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code) struct icmp_echo_hdr *icmphdr; ip4_addr_t iphdr_src; struct netif *netif; + u16_t response_pkt_len; /* increase number of messages attempted to send */ MIB2_STATS_INC(mib2.icmpoutmsgs); - /* ICMP header + IP header + 8 bytes of data */ - q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, - PBUF_RAM); + /* Keep IP header + up to 8 bytes */ + response_pkt_len = IP_HLEN + ICMP_DEST_UNREACH_DATASIZE; + if (p->tot_len < response_pkt_len) { + response_pkt_len = p->tot_len; + } + + /* ICMP header + part of original packet */ + q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + response_pkt_len, PBUF_RAM); if (q == NULL) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); MIB2_STATS_INC(mib2.icmpouterrors); return; } LWIP_ASSERT("check that first pbuf can hold icmp message", - (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE))); + (q->len >= (sizeof(struct icmp_echo_hdr) + response_pkt_len))); iphdr = (struct ip_hdr *)p->payload; LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); @@ -368,14 +381,14 @@ icmp_send_response(struct pbuf *p, u8_t type, u8_t code) /* copy fields from original packet */ SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, - IP_HLEN + ICMP_DEST_UNREACH_DATASIZE); + response_pkt_len); ip4_addr_copy(iphdr_src, iphdr->src); #ifdef LWIP_HOOK_IP4_ROUTE_SRC { ip4_addr_t iphdr_dst; ip4_addr_copy(iphdr_dst, iphdr->dest); - netif = ip4_route_src(&iphdr_src, &iphdr_dst); + netif = ip4_route_src(&iphdr_dst, &iphdr_src); } #else netif = ip4_route(&iphdr_src); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/igmp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/igmp.c similarity index 81% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/igmp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/igmp.c index 74a6c37..b655aa3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/igmp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/igmp.c @@ -94,10 +94,10 @@ Steve Reynolds #include "lwip/stats.h" #include "lwip/prot/igmp.h" -#include "string.h" +#include static struct igmp_group *igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr); -static err_t igmp_remove_group(struct netif* netif, struct igmp_group *group); +static err_t igmp_remove_group(struct netif *netif, struct igmp_group *group); static void igmp_timeout(struct netif *netif, struct igmp_group *group); static void igmp_start_timer(struct igmp_group *group, u8_t max_time); static void igmp_delaying_member(struct igmp_group *group, u8_t maxresp); @@ -127,9 +127,9 @@ igmp_init(void) err_t igmp_start(struct netif *netif) { - struct igmp_group* group; + struct igmp_group *group; - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", (void*)netif)); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", (void *)netif)); group = igmp_lookup_group(netif, &allsystems); @@ -141,7 +141,7 @@ igmp_start(struct netif *netif) if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: igmp_mac_filter(ADD ")); ip4_addr_debug_print_val(IGMP_DEBUG, allsystems); - LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif)); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif)); netif->igmp_mac_filter(netif, &allsystems, NETIF_ADD_MAC_FILTER); } @@ -169,8 +169,8 @@ igmp_stop(struct netif *netif) /* disable the group at the MAC level */ if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL ")); - ip4_addr_debug_print(IGMP_DEBUG, &group->group_address); - LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif)); + ip4_addr_debug_print_val(IGMP_DEBUG, group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif)); netif->igmp_mac_filter(netif, &(group->group_address), NETIF_DEL_MAC_FILTER); } @@ -193,13 +193,13 @@ igmp_report_groups(struct netif *netif) { struct igmp_group *group = netif_igmp_data(netif); - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", (void*)netif)); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", (void *)netif)); /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */ - if(group != NULL) { + if (group != NULL) { group = group->next; } - + while (group != NULL) { igmp_delaying_member(group, IGMP_JOIN_DELAYING_MEMBER_TMR); group = group->next; @@ -207,7 +207,7 @@ igmp_report_groups(struct netif *netif) } /** - * Search for a group in the global igmp_group_list + * Search for a group in the netif's igmp group list * * @param ifp the network interface for which to look * @param addr the group ip address to search for @@ -252,7 +252,7 @@ igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr) /* Group already exists. */ return group; } - + /* Group doesn't exist yet, create a new one */ group = (struct igmp_group *)memp_malloc(MEMP_IGMP_GROUP); if (group != NULL) { @@ -262,37 +262,37 @@ igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr) group->last_reporter_flag = 0; group->use = 0; - /* Ensure allsystems group is always first in list */ + /* Ensure allsystems group is always first in list */ if (list_head == NULL) { /* this is the first entry in linked list */ LWIP_ASSERT("igmp_lookup_group: first group must be allsystems", - (ip4_addr_cmp(addr, &allsystems) != 0)); + (ip4_addr_cmp(addr, &allsystems) != 0)); group->next = NULL; netif_set_client_data(ifp, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, group); } else { /* append _after_ first entry */ LWIP_ASSERT("igmp_lookup_group: all except first group must not be allsystems", - (ip4_addr_cmp(addr, &allsystems) == 0)); + (ip4_addr_cmp(addr, &allsystems) == 0)); group->next = list_head->next; list_head->next = group; } } - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to "))); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group ? "" : "impossible to "))); ip4_addr_debug_print(IGMP_DEBUG, addr); - LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)ifp)); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)ifp)); return group; } /** - * Remove a group in the global igmp_group_list, but don't free it yet + * Remove a group from netif's igmp group list, but don't free it yet * - * @param group the group to remove from the global igmp_group_list + * @param group the group to remove from the netif's igmp group list * @return ERR_OK if group was removed from the list, an err_t otherwise */ static err_t -igmp_remove_group(struct netif* netif, struct igmp_group *group) +igmp_remove_group(struct netif *netif, struct igmp_group *group) { err_t err = ERR_OK; struct igmp_group *tmp_group; @@ -304,7 +304,7 @@ igmp_remove_group(struct netif* netif, struct igmp_group *group) break; } } - /* Group not found in the global igmp_group_list */ + /* Group not found in netif's igmp group list */ if (tmp_group == NULL) { err = ERR_ARG; } @@ -322,9 +322,9 @@ igmp_remove_group(struct netif* netif, struct igmp_group *group) void igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest) { - struct igmp_msg* igmp; - struct igmp_group* group; - struct igmp_group* groupref; + struct igmp_msg *igmp; + struct igmp_group *group; + struct igmp_group *groupref; IGMP_STATS_INC(igmp.recv); @@ -337,10 +337,10 @@ igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest) } LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from ")); - ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->src)); + ip4_addr_debug_print_val(IGMP_DEBUG, ip4_current_header()->src); LWIP_DEBUGF(IGMP_DEBUG, (" to address ")); - ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->dest)); - LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)inp)); + ip4_addr_debug_print_val(IGMP_DEBUG, ip4_current_header()->dest); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)inp)); /* Now calculate and check the checksum */ igmp = (struct igmp_msg *)p->payload; @@ -364,73 +364,73 @@ igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest) /* NOW ACT ON THE INCOMING MESSAGE TYPE... */ switch (igmp->igmp_msgtype) { - case IGMP_MEMB_QUERY: - /* IGMP_MEMB_QUERY to the "all systems" address ? */ - if ((ip4_addr_cmp(dest, &allsystems)) && ip4_addr_isany(&igmp->igmp_group_address)) { - /* THIS IS THE GENERAL QUERY */ - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + case IGMP_MEMB_QUERY: + /* IGMP_MEMB_QUERY to the "all systems" address ? */ + if ((ip4_addr_cmp(dest, &allsystems)) && ip4_addr_isany(&igmp->igmp_group_address)) { + /* THIS IS THE GENERAL QUERY */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); - if (igmp->igmp_maxresp == 0) { - IGMP_STATS_INC(igmp.rx_v1); - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n")); - igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR; - } else { - IGMP_STATS_INC(igmp.rx_general); - } - - groupref = netif_igmp_data(inp); - - /* Do not send messages on the all systems group address! */ - /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */ - if(groupref != NULL) { - groupref = groupref->next; - } - - while (groupref) { - igmp_delaying_member(groupref, igmp->igmp_maxresp); - groupref = groupref->next; - } - } else { - /* IGMP_MEMB_QUERY to a specific group ? */ - if (!ip4_addr_isany(&igmp->igmp_group_address)) { - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group ")); - ip4_addr_debug_print(IGMP_DEBUG, &igmp->igmp_group_address); - if (ip4_addr_cmp(dest, &allsystems)) { - ip4_addr_t groupaddr; - LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); - /* we first need to re-look for the group since we used dest last time */ - ip4_addr_copy(groupaddr, igmp->igmp_group_address); - group = igmp_lookfor_group(inp, &groupaddr); + if (igmp->igmp_maxresp == 0) { + IGMP_STATS_INC(igmp.rx_v1); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n")); + igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR; } else { - LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + IGMP_STATS_INC(igmp.rx_general); } - if (group != NULL) { - IGMP_STATS_INC(igmp.rx_group); - igmp_delaying_member(group, igmp->igmp_maxresp); - } else { - IGMP_STATS_INC(igmp.drop); + groupref = netif_igmp_data(inp); + + /* Do not send messages on the all systems group address! */ + /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */ + if (groupref != NULL) { + groupref = groupref->next; + } + + while (groupref) { + igmp_delaying_member(groupref, igmp->igmp_maxresp); + groupref = groupref->next; } } else { - IGMP_STATS_INC(igmp.proterr); + /* IGMP_MEMB_QUERY to a specific group ? */ + if (!ip4_addr_isany(&igmp->igmp_group_address)) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group ")); + ip4_addr_debug_print_val(IGMP_DEBUG, igmp->igmp_group_address); + if (ip4_addr_cmp(dest, &allsystems)) { + ip4_addr_t groupaddr; + LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + /* we first need to re-look for the group since we used dest last time */ + ip4_addr_copy(groupaddr, igmp->igmp_group_address); + group = igmp_lookfor_group(inp, &groupaddr); + } else { + LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + } + + if (group != NULL) { + IGMP_STATS_INC(igmp.rx_group); + igmp_delaying_member(group, igmp->igmp_maxresp); + } else { + IGMP_STATS_INC(igmp.drop); + } + } else { + IGMP_STATS_INC(igmp.proterr); + } } - } - break; - case IGMP_V2_MEMB_REPORT: - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n")); - IGMP_STATS_INC(igmp.rx_report); - if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { - /* This is on a specific group we have already looked up */ - group->timer = 0; /* stopped */ - group->group_state = IGMP_GROUP_IDLE_MEMBER; - group->last_reporter_flag = 0; - } - break; - default: - LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n", - igmp->igmp_msgtype, group->group_state, (void*)&group, (void*)inp)); - IGMP_STATS_INC(igmp.proterr); - break; + break; + case IGMP_V2_MEMB_REPORT: + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n")); + IGMP_STATS_INC(igmp.rx_report); + if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { + /* This is on a specific group we have already looked up */ + group->timer = 0; /* stopped */ + group->group_state = IGMP_GROUP_IDLE_MEMBER; + group->last_reporter_flag = 0; + } + break; + default: + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n", + igmp->igmp_msgtype, group->group_state, (void *)&group, (void *)inp)); + IGMP_STATS_INC(igmp.proterr); + break; } pbuf_free(p); @@ -451,13 +451,14 @@ igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr) err_t err = ERR_VAL; /* no matching interface */ struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); + /* make sure it is multicast address */ LWIP_ERROR("igmp_joingroup: attempt to join non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); /* loop through netif's */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { /* Should we join this interface ? */ if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) { err = igmp_joingroup_netif(netif, groupaddr); @@ -467,8 +468,6 @@ igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr) return err; } } - /* proceed to next network interface */ - netif = netif->next; } return err; @@ -487,6 +486,8 @@ igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) { struct igmp_group *group; + LWIP_ASSERT_CORE_LOCKED(); + /* make sure it is multicast address */ LWIP_ERROR("igmp_joingroup_netif: attempt to join non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_joingroup_netif: attempt to join allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); @@ -508,10 +509,10 @@ igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) LWIP_DEBUGF(IGMP_DEBUG, ("\n")); /* If first use of the group, allow the group at the MAC level */ - if ((group->use==0) && (netif->igmp_mac_filter != NULL)) { + if ((group->use == 0) && (netif->igmp_mac_filter != NULL)) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup_netif: igmp_mac_filter(ADD ")); ip4_addr_debug_print(IGMP_DEBUG, groupaddr); - LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif)); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif)); netif->igmp_mac_filter(netif, groupaddr, NETIF_ADD_MAC_FILTER); } @@ -547,13 +548,14 @@ igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr) err_t err = ERR_VAL; /* no matching interface */ struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); + /* make sure it is multicast address */ LWIP_ERROR("igmp_leavegroup: attempt to leave non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); /* loop through netif's */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { /* Should we leave this interface ? */ if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) { err_t res = igmp_leavegroup_netif(netif, groupaddr); @@ -562,8 +564,6 @@ igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr) err = res; } } - /* proceed to next network interface */ - netif = netif->next; } return err; @@ -582,6 +582,8 @@ igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) { struct igmp_group *group; + LWIP_ASSERT_CORE_LOCKED(); + /* make sure it is multicast address */ LWIP_ERROR("igmp_leavegroup_netif: attempt to leave non-multicast address", ip4_addr_ismulticast(groupaddr), return ERR_VAL;); LWIP_ERROR("igmp_leavegroup_netif: attempt to leave allsystems address", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); @@ -614,7 +616,7 @@ igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup_netif: igmp_mac_filter(DEL ")); ip4_addr_debug_print(IGMP_DEBUG, groupaddr); - LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif)); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void *)netif)); netif->igmp_mac_filter(netif, groupaddr, NETIF_DEL_MAC_FILTER); } @@ -638,9 +640,9 @@ igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) void igmp_tmr(void) { - struct netif *netif = netif_list; + struct netif *netif; - while (netif != NULL) { + NETIF_FOREACH(netif) { struct igmp_group *group = netif_igmp_data(netif); while (group != NULL) { @@ -652,7 +654,6 @@ igmp_tmr(void) } group = group->next; } - netif = netif->next; } } @@ -670,11 +671,11 @@ igmp_timeout(struct netif *netif, struct igmp_group *group) if ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address ")); - ip4_addr_debug_print(IGMP_DEBUG, &(group->group_address)); - LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)netif)); + ip4_addr_debug_print_val(IGMP_DEBUG, group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void *)netif)); group->group_state = IGMP_GROUP_IDLE_MEMBER; - + IGMP_STATS_INC(igmp.tx_report); igmp_send(netif, group, IGMP_V2_MEMB_REPORT); } @@ -691,7 +692,7 @@ static void igmp_start_timer(struct igmp_group *group, u8_t max_time) { #ifdef LWIP_RAND - group->timer = max_time > 2 ? (LWIP_RAND() % max_time) : 1; + group->timer = (u16_t)(max_time > 2 ? (LWIP_RAND() % max_time) : 1); #else /* LWIP_RAND */ /* ATTENTION: use this only if absolutely necessary! */ group->timer = max_time / 2; @@ -712,8 +713,8 @@ static void igmp_delaying_member(struct igmp_group *group, u8_t maxresp) { if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) || - ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && - ((group->timer == 0) || (maxresp < group->timer)))) { + ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && + ((group->timer == 0) || (maxresp < group->timer)))) { igmp_start_timer(group, maxresp); group->group_state = IGMP_GROUP_DELAYING_MEMBER; } @@ -756,10 +757,10 @@ igmp_ip_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, static void igmp_send(struct netif *netif, struct igmp_group *group, u8_t type) { - struct pbuf* p = NULL; - struct igmp_msg* igmp = NULL; + struct pbuf *p = NULL; + struct igmp_msg *igmp = NULL; ip4_addr_t src = *IP4_ADDR_ANY4; - ip4_addr_t* dest = NULL; + ip4_addr_t *dest = NULL; /* IP header + "router alert" option + IGMP header */ p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM); @@ -767,7 +768,7 @@ igmp_send(struct netif *netif, struct igmp_group *group, u8_t type) if (p) { igmp = (struct igmp_msg *)p->payload; LWIP_ASSERT("igmp_send: check that first pbuf can hold struct igmp_msg", - (p->len >= sizeof(struct igmp_msg))); + (p->len >= sizeof(struct igmp_msg))); ip4_addr_copy(src, *netif_ip4_addr(netif)); if (type == IGMP_V2_MEMB_REPORT) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4.c similarity index 74% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4.c index 481a35e..26c26a9 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4.c @@ -50,14 +50,13 @@ #include "lwip/netif.h" #include "lwip/icmp.h" #include "lwip/igmp.h" -#include "lwip/raw.h" +#include "lwip/priv/raw_priv.h" #include "lwip/udp.h" #include "lwip/priv/tcp_priv.h" #include "lwip/autoip.h" #include "lwip/stats.h" -#include "lwip/prot/dhcp.h" +#include "lwip/prot/iana.h" -#include "wm_sockets.h" #include #ifdef LWIP_HOOK_FILENAME @@ -90,14 +89,14 @@ */ #if LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) /* accept DHCP client port and custom port */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(DHCP_CLIENT_PORT)) \ +#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(LWIP_IANA_PORT_DHCP_CLIENT)) \ || (LWIP_IP_ACCEPT_UDP_PORT(port))) #elif defined(LWIP_IP_ACCEPT_UDP_PORT) /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ /* accept custom port only */ #define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (LWIP_IP_ACCEPT_UDP_PORT(port)) #else /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ /* accept DHCP client port only */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(DHCP_CLIENT_PORT)) +#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(LWIP_IANA_PORT_DHCP_CLIENT)) #endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ #else /* LWIP_DHCP */ @@ -109,13 +108,13 @@ static u16_t ip_id; #if LWIP_MULTICAST_TX_OPTIONS /** The default netif used for multicast */ -static struct netif* ip4_default_multicast_netif; +static struct netif *ip4_default_multicast_netif; /** * @ingroup ip4 * Set a default netif for IPv4 multicast. */ void -ip4_set_default_multicast_netif(struct netif* default_multicast_netif) +ip4_set_default_multicast_netif(struct netif *default_multicast_netif) { ip4_default_multicast_netif = default_multicast_netif; } @@ -124,14 +123,14 @@ ip4_set_default_multicast_netif(struct netif* default_multicast_netif) #ifdef LWIP_HOOK_IP4_ROUTE_SRC /** * Source based IPv4 routing must be fully implemented in - * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides he parameters. + * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides the parameters. */ struct netif * -ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src) +ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest) { if (src != NULL) { /* when src==NULL, the hook is called from ip4_route(dest) */ - struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, src); + struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(src, dest); if (netif != NULL) { return netif; } @@ -152,8 +151,11 @@ ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src) struct netif * ip4_route(const ip4_addr_t *dest) { +#if !LWIP_SINGLE_NETIF struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); + #if LWIP_MULTICAST_TX_OPTIONS /* Use administratively selected interface for multicast by default */ if (ip4_addr_ismulticast(dest) && ip4_default_multicast_netif) { @@ -161,8 +163,11 @@ ip4_route(const ip4_addr_t *dest) } #endif /* LWIP_MULTICAST_TX_OPTIONS */ + /* bug #54569: in case LWIP_SINGLE_NETIF=1 and LWIP_DEBUGF() disabled, the following loop is optimized away */ + LWIP_UNUSED_ARG(dest); + /* iterate through netifs */ - for (netif = netif_list; netif != NULL; netif = netif->next) { + NETIF_FOREACH(netif) { /* is the netif up, does it have a link and a valid address? */ if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) { /* network mask matches? */ @@ -186,7 +191,7 @@ ip4_route(const ip4_addr_t *dest) return netif_default; } /* default netif is not up, just use any netif for loopback traffic */ - for (netif = netif_list; netif != NULL; netif = netif->next) { + NETIF_FOREACH(netif) { if (netif_is_up(netif)) { return netif; } @@ -196,7 +201,7 @@ ip4_route(const ip4_addr_t *dest) #endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */ #ifdef LWIP_HOOK_IP4_ROUTE_SRC - netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, NULL); + netif = LWIP_HOOK_IP4_ROUTE_SRC(NULL, dest); if (netif != NULL) { return netif; } @@ -206,13 +211,14 @@ ip4_route(const ip4_addr_t *dest) return netif; } #endif +#endif /* !LWIP_SINGLE_NETIF */ if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) || - ip4_addr_isany_val(*netif_ip4_addr(netif_default))) { + ip4_addr_isany_val(*netif_ip4_addr(netif_default)) || ip4_addr_isloopback(dest)) { /* No matching netif found and default netif is not usable. If this is not good enough for you, use LWIP_HOOK_IP4_ROUTE() */ LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); IP_STATS_INC(ip.rterr); MIB2_STATS_INC(mib2.ipoutnoroutes); return NULL; @@ -234,13 +240,19 @@ ip4_canforward(struct pbuf *p) { u32_t addr = lwip_htonl(ip4_addr_get_u32(ip4_current_dest_addr())); +#ifdef LWIP_HOOK_IP4_CANFORWARD + int ret = LWIP_HOOK_IP4_CANFORWARD(p, addr); + if (ret >= 0) { + return ret; + } +#endif /* LWIP_HOOK_IP4_CANFORWARD */ + if (p->flags & PBUF_FLAG_LLBCAST) { /* don't route link-layer broadcasts */ return 0; } - if ((p->flags & PBUF_FLAG_LLMCAST) && !IP_MULTICAST(addr)) { - /* don't route link-layer multicasts unless the destination address is an IP - multicast address */ + if ((p->flags & PBUF_FLAG_LLMCAST) || IP_MULTICAST(addr)) { + /* don't route link-layer multicasts (use LWIP_HOOK_IP4_CANFORWARD instead) */ return 0; } if (IP_EXPERIMENTAL(addr)) { @@ -280,17 +292,17 @@ ip4_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) /* RFC3927 2.7: do not forward link-local addresses */ if (ip4_addr_islinklocal(ip4_current_dest_addr())) { LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: not forwarding LLA %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), - ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); + ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), + ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); goto return_noroute; } /* Find network interface where to forward this IP packet to. */ - netif = ip4_route_src(ip4_current_dest_addr(), ip4_current_src_addr()); + netif = ip4_route_src(ip4_current_src_addr(), ip4_current_dest_addr()); if (netif == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: no forwarding route for %"U16_F".%"U16_F".%"U16_F".%"U16_F" found\n", - ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), - ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); + ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), + ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); /* @todo: send ICMP_DUR_NET? */ goto return_noroute; } @@ -319,14 +331,14 @@ ip4_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) /* Incrementally update the IP checksum. */ if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) { - IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1); + IPH_CHKSUM_SET(iphdr, (u16_t)(IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1)); } else { - IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100)); + IPH_CHKSUM_SET(iphdr, (u16_t)(IPH_CHKSUM(iphdr) + PP_HTONS(0x100))); } LWIP_DEBUGF(IP_DEBUG, ("ip4_forward: forwarding packet to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), - ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); + ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()), + ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr()))); IP_STATS_INC(ip.fw); MIB2_STATS_INC(mib2.ipforwdatagrams); @@ -357,6 +369,45 @@ return_noroute: } #endif /* IP_FORWARD */ +/** Return true if the current input packet should be accepted on this netif */ +static int +ip4_input_accept(struct netif *netif) +{ + LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", + ip4_addr_get_u32(ip4_current_dest_addr()), ip4_addr_get_u32(netif_ip4_addr(netif)), + ip4_addr_get_u32(ip4_current_dest_addr()) & ip4_addr_get_u32(netif_ip4_netmask(netif)), + ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)), + ip4_addr_get_u32(ip4_current_dest_addr()) & ~ip4_addr_get_u32(netif_ip4_netmask(netif)))); + + /* interface is up and configured? */ + if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) { + /* unicast to this interface address? */ + if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) || + /* or broadcast on this interface network address? */ + ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) +#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF + || (ip4_addr_get_u32(ip4_current_dest_addr()) == PP_HTONL(IPADDR_LOOPBACK)) +#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */ + ) { + LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* accept on this netif */ + return 1; + } +#if LWIP_AUTOIP + /* connections to link-local addresses must persist after changing + the netif's address (RFC3927 ch. 1.9) */ + if (autoip_accept_packet(netif, ip4_current_dest_addr())) { + LWIP_DEBUGF(IP_DEBUG, ("ip4_input: LLA packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* accept on this netif */ + return 1; + } +#endif /* LWIP_AUTOIP */ + } + return 0; +} + /** * This function is called by the network interface device driver when * an IP packet is received. The function does the basic checks of the @@ -374,13 +425,18 @@ return_noroute: err_t ip4_input(struct pbuf *p, struct netif *inp) { - struct ip_hdr *iphdr; + const struct ip_hdr *iphdr; struct netif *netif; u16_t iphdr_hlen; u16_t iphdr_len; #if IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP int check_ip_src = 1; #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP */ +#if LWIP_RAW + raw_input_state_t raw_status; +#endif /* LWIP_RAW */ + + LWIP_ASSERT_CORE_LOCKED(); IP_STATS_INC(ip.recv); MIB2_STATS_INC(mib2.ipinreceives); @@ -404,10 +460,8 @@ ip4_input(struct pbuf *p, struct netif *inp) } #endif - /* obtain IP header length in number of 32-bit words */ - iphdr_hlen = IPH_HL(iphdr); - /* calculate IP header length in bytes */ - iphdr_hlen *= 4; + /* obtain IP header length in bytes */ + iphdr_hlen = IPH_HL_BYTES(iphdr); /* obtain ip length in bytes */ iphdr_len = lwip_ntohs(IPH_LEN(iphdr)); @@ -420,17 +474,17 @@ ip4_input(struct pbuf *p, struct netif *inp) if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) { if (iphdr_hlen < IP_HLEN) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("ip4_input: short IP header (%"U16_F" bytes) received, IP packet dropped\n", iphdr_hlen)); + ("ip4_input: short IP header (%"U16_F" bytes) received, IP packet dropped\n", iphdr_hlen)); } if (iphdr_hlen > p->len) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", - iphdr_hlen, p->len)); + ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_hlen, p->len)); } if (iphdr_len > p->tot_len) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", - iphdr_len, p->tot_len)); + ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_len, p->tot_len)); } /* free (drop) packet pbufs */ pbuf_free(p); @@ -446,7 +500,7 @@ ip4_input(struct pbuf *p, struct netif *inp) if (inet_chksum(iphdr, iphdr_hlen) != 0) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); + ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); ip4_debug_print(p); pbuf_free(p); IP_STATS_INC(ip.chkerr); @@ -485,62 +539,31 @@ ip4_input(struct pbuf *p, struct netif *inp) #endif /* LWIP_IGMP */ } else { /* start trying with inp. if that's not acceptable, start walking the - list of configured netifs. - 'first' is used as a boolean to mark whether we started walking the list */ - int first = 1; - netif = inp; - do { - LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", - ip4_addr_get_u32(&iphdr->dest), ip4_addr_get_u32(netif_ip4_addr(netif)), - ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(netif_ip4_netmask(netif)), - ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)), - ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(netif_ip4_netmask(netif)))); - - /* interface is up and configured? */ - if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) { - /* unicast to this interface address? */ - if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) || - /* or broadcast on this interface network address? */ - ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) -#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF - || (ip4_addr_get_u32(ip4_current_dest_addr()) == PP_HTONL(IPADDR_LOOPBACK)) -#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */ - ) { - LWIP_DEBUGF(IP_DEBUG, ("ip4_input: packet accepted on interface %c%c\n", - netif->name[0], netif->name[1])); - /* break out of for loop */ - break; - } -#if LWIP_AUTOIP - /* connections to link-local addresses must persist after changing - the netif's address (RFC3927 ch. 1.9) */ - if (autoip_accept_packet(netif, ip4_current_dest_addr())) { - LWIP_DEBUGF(IP_DEBUG, ("ip4_input: LLA packet accepted on interface %c%c\n", - netif->name[0], netif->name[1])); - /* break out of for loop */ - break; - } -#endif /* LWIP_AUTOIP */ - } - if (first) { + list of configured netifs. */ + if (ip4_input_accept(inp)) { + netif = inp; + } else { + netif = NULL; #if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF - /* Packets sent to the loopback address must not be accepted on an - * interface that does not have the loopback address assigned to it, - * unless a non-loopback interface is used for loopback traffic. */ - if (ip4_addr_isloopback(ip4_current_dest_addr())) { - netif = NULL; - break; - } + /* Packets sent to the loopback address must not be accepted on an + * interface that does not have the loopback address assigned to it, + * unless a non-loopback interface is used for loopback traffic. */ + if (!ip4_addr_isloopback(ip4_current_dest_addr())) #endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */ - first = 0; - netif = netif_list; - } else { - netif = netif->next; + { +#if !LWIP_SINGLE_NETIF + NETIF_FOREACH(netif) { + if (netif == inp) { + /* we checked that before already */ + continue; + } + if (ip4_input_accept(netif)) { + break; + } + } +#endif /* !LWIP_SINGLE_NETIF */ } - if (netif == inp) { - netif = netif->next; - } - } while (netif != NULL); + } } #if IP_ACCEPT_LINK_LAYER_ADDRESSING @@ -556,9 +579,9 @@ ip4_input(struct pbuf *p, struct netif *inp) if (netif == NULL) { /* remote port is DHCP server? */ if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { - struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen); + const struct udp_hdr *udphdr = (const struct udp_hdr *)((const u8_t *)iphdr + iphdr_hlen); LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: UDP packet to DHCP client port %"U16_F"\n", - lwip_ntohs(udphdr->dest))); + lwip_ntohs(udphdr->dest))); if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip4_input: DHCP packet accepted.\n")); netif = inp; @@ -572,7 +595,7 @@ ip4_input(struct pbuf *p, struct netif *inp) #if LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING if (check_ip_src #if IP_ACCEPT_LINK_LAYER_ADDRESSING - /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ + /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ && !ip4_addr_isany_val(*ip4_current_src_addr()) #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ ) @@ -599,7 +622,7 @@ ip4_input(struct pbuf *p, struct netif *inp) /* non-broadcast packet? */ if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), inp)) { /* try to forward IP packet on (other) interfaces */ - ip4_forward(p, iphdr, inp); + ip4_forward(p, (struct ip_hdr *)p->payload, inp); } else #endif /* IP_FORWARD */ { @@ -614,18 +637,18 @@ ip4_input(struct pbuf *p, struct netif *inp) if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) { #if IP_REASSEMBLY /* packet fragment reassembly code present? */ LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip4_reass()\n", - lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8))); + lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK) * 8))); /* reassemble the packet*/ p = ip4_reass(p); /* packet not fully reassembled yet? */ if (p == NULL) { return ERR_OK; } - iphdr = (struct ip_hdr *)p->payload; + iphdr = (const struct ip_hdr *)p->payload; #else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */ pbuf_free(p); LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n", - lwip_ntohs(IPH_OFFSET(iphdr)))); + lwip_ntohs(IPH_OFFSET(iphdr)))); IP_STATS_INC(ip.opterr); IP_STATS_INC(ip.drop); /* unsupported protocol feature */ @@ -660,59 +683,67 @@ ip4_input(struct pbuf *p, struct netif *inp) ip_data.current_netif = netif; ip_data.current_input_netif = inp; ip_data.current_ip4_header = iphdr; - ip_data.current_ip_header_tot_len = IPH_HL(iphdr) * 4; + ip_data.current_ip_header_tot_len = IPH_HL_BYTES(iphdr); #if LWIP_RAW /* raw input did not eat the packet? */ - if (raw_input(p, inp) == 0) + raw_status = raw_input(p, inp); + if (raw_status != RAW_INPUT_EATEN) #endif /* LWIP_RAW */ { - pbuf_header(p, -(s16_t)iphdr_hlen); /* Move to payload, no check necessary. */ + pbuf_remove_header(p, iphdr_hlen); /* Move to payload, no check necessary. */ switch (IPH_PROTO(iphdr)) { #if LWIP_UDP - case IP_PROTO_UDP: + case IP_PROTO_UDP: #if LWIP_UDPLITE - case IP_PROTO_UDPLITE: + case IP_PROTO_UDPLITE: #endif /* LWIP_UDPLITE */ - MIB2_STATS_INC(mib2.ipindelivers); - udp_input(p, inp); - break; + MIB2_STATS_INC(mib2.ipindelivers); + udp_input(p, inp); + break; #endif /* LWIP_UDP */ #if LWIP_TCP - case IP_PROTO_TCP: - MIB2_STATS_INC(mib2.ipindelivers); - tcp_input(p, inp); - break; + case IP_PROTO_TCP: + MIB2_STATS_INC(mib2.ipindelivers); + tcp_input(p, inp); + break; #endif /* LWIP_TCP */ #if LWIP_ICMP - case IP_PROTO_ICMP: - MIB2_STATS_INC(mib2.ipindelivers); - icmp_input(p, inp); - break; + case IP_PROTO_ICMP: + MIB2_STATS_INC(mib2.ipindelivers); + icmp_input(p, inp); + break; #endif /* LWIP_ICMP */ #if LWIP_IGMP - case IP_PROTO_IGMP: - igmp_input(p, inp, ip4_current_dest_addr()); - break; + case IP_PROTO_IGMP: + igmp_input(p, inp, ip4_current_dest_addr()); + break; #endif /* LWIP_IGMP */ - default: + default: +#if LWIP_RAW + if (raw_status == RAW_INPUT_DELIVERED) { + MIB2_STATS_INC(mib2.ipindelivers); + } else +#endif /* LWIP_RAW */ + { #if LWIP_ICMP - /* send ICMP destination protocol unreachable unless is was a broadcast */ - if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) && - !ip4_addr_ismulticast(ip4_current_dest_addr())) { - pbuf_header_force(p, iphdr_hlen); /* Move to ip header, no check necessary. */ - p->payload = iphdr; - icmp_dest_unreach(p, ICMP_DUR_PROTO); - } + /* send ICMP destination protocol unreachable unless is was a broadcast */ + if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) && + !ip4_addr_ismulticast(ip4_current_dest_addr())) { + pbuf_header_force(p, (s16_t)iphdr_hlen); /* Move to ip header, no check necessary. */ + icmp_dest_unreach(p, ICMP_DUR_PROTO); + } #endif /* LWIP_ICMP */ - pbuf_free(p); - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", (u16_t)IPH_PROTO(iphdr))); + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", (u16_t)IPH_PROTO(iphdr))); - IP_STATS_INC(ip.proterr); - IP_STATS_INC(ip.drop); - MIB2_STATS_INC(mib2.ipinunknownprotos); + IP_STATS_INC(ip.proterr); + IP_STATS_INC(ip.drop); + MIB2_STATS_INC(mib2.ipinunknownprotos); + } + pbuf_free(p); + break; } } @@ -754,8 +785,8 @@ ip4_input(struct pbuf *p, struct netif *inp) */ err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, - u8_t proto, struct netif *netif) + u8_t ttl, u8_t tos, + u8_t proto, struct netif *netif) { #if IP_OPTIONS_SEND return ip4_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0); @@ -769,8 +800,8 @@ ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, */ err_t ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, - u16_t optlen) + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen) { #endif /* IP_OPTIONS_SEND */ const ip4_addr_t *src_used = src; @@ -782,7 +813,7 @@ ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, #if IP_OPTIONS_SEND return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif, - ip_options, optlen); + ip_options, optlen); #else /* IP_OPTIONS_SEND */ return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif); #endif /* IP_OPTIONS_SEND */ @@ -794,8 +825,8 @@ ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, */ err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, - u8_t proto, struct netif *netif) + u8_t ttl, u8_t tos, + u8_t proto, struct netif *netif) { #if IP_OPTIONS_SEND return ip4_output_if_opt_src(p, src, dest, ttl, tos, proto, netif, NULL, 0); @@ -807,8 +838,8 @@ ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, */ err_t ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, - u16_t optlen) + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen) { #endif /* IP_OPTIONS_SEND */ struct ip_hdr *iphdr; @@ -817,6 +848,7 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d u32_t chk_sum = 0; #endif /* CHECKSUM_GEN_IP_INLINE */ + LWIP_ASSERT_CORE_LOCKED(); LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); MIB2_STATS_INC(mib2.ipoutrequests); @@ -830,11 +862,18 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d #if CHECKSUM_GEN_IP_INLINE int i; #endif /* CHECKSUM_GEN_IP_INLINE */ + if (optlen > (IP_HLEN_MAX - IP_HLEN)) { + /* optlen too long */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output_if_opt: optlen too long\n")); + IP_STATS_INC(ip.err); + MIB2_STATS_INC(mib2.ipoutdiscards); + return ERR_VAL; + } /* round up to a multiple of 4 */ - optlen_aligned = ((optlen + 3) & ~3); - ip_hlen += optlen_aligned; + optlen_aligned = (u16_t)((optlen + 3) & ~3); + ip_hlen = (u16_t)(ip_hlen + optlen_aligned); /* First write in the IP options */ - if (pbuf_header(p, optlen_aligned)) { + if (pbuf_add_header(p, optlen_aligned)) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output_if_opt: not enough room for IP options in pbuf\n")); IP_STATS_INC(ip.err); MIB2_STATS_INC(mib2.ipoutdiscards); @@ -843,17 +882,17 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d MEMCPY(p->payload, ip_options, optlen); if (optlen < optlen_aligned) { /* zero the remaining bytes */ - memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen); + memset(((char *)p->payload) + optlen, 0, (size_t)(optlen_aligned - optlen)); } #if CHECKSUM_GEN_IP_INLINE - for (i = 0; i < optlen_aligned/2; i++) { - chk_sum += ((u16_t*)p->payload)[i]; + for (i = 0; i < optlen_aligned / 2; i++) { + chk_sum += ((u16_t *)p->payload)[i]; } #endif /* CHECKSUM_GEN_IP_INLINE */ } #endif /* IP_OPTIONS_SEND */ /* generate IP header */ - if (pbuf_header(p, IP_HLEN)) { + if (pbuf_add_header(p, IP_HLEN)) { LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: not enough room for IP header in pbuf\n")); IP_STATS_INC(ip.err); @@ -863,7 +902,7 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d iphdr = (struct ip_hdr *)p->payload; LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", - (p->len >= sizeof(struct ip_hdr))); + (p->len >= sizeof(struct ip_hdr))); IPH_TTL_SET(iphdr, ttl); IPH_PROTO_SET(iphdr, proto); @@ -925,6 +964,12 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d #endif /* CHECKSUM_GEN_IP_INLINE */ } else { /* IP header already included in p */ + if (p->len < IP_HLEN) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip4_output: LWIP_IP_HDRINCL but pbuf is too short\n")); + IP_STATS_INC(ip.err); + MIB2_STATS_INC(mib2.ipoutdiscards); + return ERR_BUF; + } iphdr = (struct ip_hdr *)p->payload; ip4_addr_copy(dest_addr, iphdr->dest); dest = &dest_addr; @@ -940,7 +985,7 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d #if !LWIP_HAVE_LOOPIF || ip4_addr_isloopback(dest) #endif /* !LWIP_HAVE_LOOPIF */ - ) { + ) { /* Packet to self, enqueue it for loopback */ LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); return netif_loop_output(netif, p); @@ -981,15 +1026,15 @@ ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *d */ err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto) + u8_t ttl, u8_t tos, u8_t proto) { struct netif *netif; LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); - if ((netif = ip4_route_src(dest, src)) == NULL) { + if ((netif = ip4_route_src(src, dest)) == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip4_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); IP_STATS_INC(ip.rterr); return ERR_RTE; } @@ -997,7 +1042,7 @@ ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, return ip4_output_if(p, src, dest, ttl, tos, proto, netif); } -#if LWIP_NETIF_HWADDRHINT +#if LWIP_NETIF_USE_HINTS /** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint * before calling ip_output_if. * @@ -1010,7 +1055,7 @@ ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, * @param ttl the TTL value to be set in the IP header * @param tos the TOS value to be set in the IP header * @param proto the PROTOCOL to be set in the IP header - * @param addr_hint address hint pointer set to netif->addr_hint before + * @param netif_hint netif output hint pointer set to netif->hint before * calling ip_output_if() * * @return ERR_RTE if no route is found @@ -1018,27 +1063,27 @@ ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, */ err_t ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) + u8_t ttl, u8_t tos, u8_t proto, struct netif_hint *netif_hint) { struct netif *netif; err_t err; LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); - if ((netif = ip4_route_src(dest, src)) == NULL) { + if ((netif = ip4_route_src(src, dest)) == NULL) { LWIP_DEBUGF(IP_DEBUG, ("ip4_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); IP_STATS_INC(ip.rterr); return ERR_RTE; } - NETIF_SET_HWADDRHINT(netif, addr_hint); + NETIF_SET_HINTS(netif, netif_hint); err = ip4_output_if(p, src, dest, ttl, tos, proto, netif); - NETIF_SET_HWADDRHINT(netif, NULL); + NETIF_RESET_HINTS(netif); return err; } -#endif /* LWIP_NETIF_HWADDRHINT*/ +#endif /* LWIP_NETIF_USE_HINTS*/ #if IP_DEBUG /* Print an IP header by using LWIP_DEBUGF @@ -1052,34 +1097,34 @@ ip4_debug_print(struct pbuf *p) LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n", - (u16_t)IPH_V(iphdr), - (u16_t)IPH_HL(iphdr), - (u16_t)IPH_TOS(iphdr), - lwip_ntohs(IPH_LEN(iphdr)))); + (u16_t)IPH_V(iphdr), + (u16_t)IPH_HL(iphdr), + (u16_t)IPH_TOS(iphdr), + lwip_ntohs(IPH_LEN(iphdr)))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n", - lwip_ntohs(IPH_ID(iphdr)), - (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 15 & 1), - (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 14 & 1), - (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 13 & 1), - (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK))); + lwip_ntohs(IPH_ID(iphdr)), + (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 15 & 1), + (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 14 & 1), + (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 13 & 1), + (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n", - (u16_t)IPH_TTL(iphdr), - (u16_t)IPH_PROTO(iphdr), - lwip_ntohs(IPH_CHKSUM(iphdr)))); + (u16_t)IPH_TTL(iphdr), + (u16_t)IPH_PROTO(iphdr), + lwip_ntohs(IPH_CHKSUM(iphdr)))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n", - ip4_addr1_16(&iphdr->src), - ip4_addr2_16(&iphdr->src), - ip4_addr3_16(&iphdr->src), - ip4_addr4_16(&iphdr->src))); + ip4_addr1_16_val(iphdr->src), + ip4_addr2_16_val(iphdr->src), + ip4_addr3_16_val(iphdr->src), + ip4_addr4_16_val(iphdr->src))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n", - ip4_addr1_16(&iphdr->dest), - ip4_addr2_16(&iphdr->dest), - ip4_addr3_16(&iphdr->dest), - ip4_addr4_16(&iphdr->dest))); + ip4_addr1_16_val(iphdr->dest), + ip4_addr2_16_val(iphdr->dest), + ip4_addr3_16_val(iphdr->dest), + ip4_addr4_16_val(iphdr->dest))); LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); } #endif /* IP_DEBUG */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_addr.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_addr.c similarity index 77% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_addr.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_addr.c index 2d47992..f99d8dd 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_addr.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_addr.c @@ -64,19 +64,19 @@ ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif) if ((~addr == IPADDR_ANY) || (addr == IPADDR_ANY)) { return 1; - /* no broadcast support on this network interface? */ + /* no broadcast support on this network interface? */ } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) { /* the given address cannot be a broadcast address * nor can we check against any broadcast addresses */ return 0; - /* address matches network interface address exactly? => no broadcast */ + /* address matches network interface address exactly? => no broadcast */ } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) { return 0; - /* on the same (sub) network... */ + /* on the same (sub) network... */ } else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) - /* ...and host identifier bits are all ones? =>... */ - && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) == - (IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) { + /* ...and host identifier bits are all ones? =>... */ + && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) == + (IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) { /* => network broadcast address */ return 1; } else { @@ -112,16 +112,6 @@ ip4_addr_netmask_valid(u32_t netmask) return 1; } -/* Here for now until needed in other places in lwIP */ -#ifndef isprint -#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) -#define isprint(c) in_range(c, 0x20, 0x7f) -#define isdigit(c) in_range(c, '0', '9') -#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) -#define islower(c) in_range(c, 'a', 'z') -#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') -#endif - /** * Ascii internet address interpretation routine. * The value returned is in network order. @@ -167,7 +157,7 @@ ip4addr_aton(const char *cp, ip4_addr_t *addr) * Values are specified as for C: * 0x=hex, 0=octal, 1-9=decimal. */ - if (!isdigit(c)) { + if (!lwip_isdigit(c)) { return 0; } val = 0; @@ -182,11 +172,13 @@ ip4addr_aton(const char *cp, ip4_addr_t *addr) } } for (;;) { - if (isdigit(c)) { + if (lwip_isdigit(c)) { + if((base == 8) && ((u32_t)(c - '0') >= 8)) + break; val = (val * base) + (u32_t)(c - '0'); c = *++cp; - } else if (base == 16 && isxdigit(c)) { - val = (val << 4) | (u32_t)(c + 10 - (islower(c) ? 'a' : 'A')); + } else if (base == 16 && lwip_isxdigit(c)) { + val = (val << 4) | (u32_t)(c + 10 - (lwip_islower(c) ? 'a' : 'A')); c = *++cp; } else { break; @@ -211,7 +203,7 @@ ip4addr_aton(const char *cp, ip4_addr_t *addr) /* * Check for trailing characters. */ - if (c != '\0' && !isspace(c)) { + if (c != '\0' && !lwip_isspace(c)) { return 0; } /* @@ -220,44 +212,44 @@ ip4addr_aton(const char *cp, ip4_addr_t *addr) */ switch (pp - parts + 1) { - case 0: - return 0; /* initial nondigit */ + case 0: + return 0; /* initial nondigit */ - case 1: /* a -- 32 bits */ - break; + case 1: /* a -- 32 bits */ + break; - case 2: /* a.b -- 8.24 bits */ - if (val > 0xffffffUL) { - return 0; - } - if (parts[0] > 0xff) { - return 0; - } - val |= parts[0] << 24; - break; + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffffUL) { + return 0; + } + if (parts[0] > 0xff) { + return 0; + } + val |= parts[0] << 24; + break; - case 3: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffff) { - return 0; - } - if ((parts[0] > 0xff) || (parts[1] > 0xff)) { - return 0; - } - val |= (parts[0] << 24) | (parts[1] << 16); - break; + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff) { + return 0; + } + if ((parts[0] > 0xff) || (parts[1] > 0xff)) { + return 0; + } + val |= (parts[0] << 24) | (parts[1] << 16); + break; - case 4: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xff) { - return 0; - } - if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) { - return 0; - } - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - default: - LWIP_ASSERT("unhandled", 0); - break; + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff) { + return 0; + } + if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) { + return 0; + } + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + default: + LWIP_ASSERT("unhandled", 0); + break; } if (addr) { ip4_addr_set_u32(addr, lwip_htonl(val)); @@ -273,7 +265,7 @@ ip4addr_aton(const char *cp, ip4_addr_t *addr) * @return pointer to a global static (!) buffer that holds the ASCII * representation of addr */ -char* +char * ip4addr_ntoa(const ip4_addr_t *addr) { static char str[IP4ADDR_STRLEN_MAX]; @@ -281,7 +273,7 @@ ip4addr_ntoa(const ip4_addr_t *addr) } /** - * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * Same as ip4addr_ntoa, but reentrant since a user-supplied buffer is used. * * @param addr ip address in network order to convert * @param buf target buffer where the string is stored @@ -289,7 +281,7 @@ ip4addr_ntoa(const ip4_addr_t *addr) * @return either pointer to buf which now holds the ASCII * representation of addr or NULL if buf was too small */ -char* +char * ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen) { u32_t s_addr; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_frag.c similarity index 84% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_frag.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_frag.c index fdb2088..a445530 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv4/ip4_frag.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv4/ip4_frag.c @@ -135,7 +135,7 @@ ip_reass_tmr(void) * clean up the incomplete fragment assembly */ if (r->timer > 0) { r->timer--; - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n", (u16_t)r->timer)); prev = r; r = r->next; } else { @@ -147,8 +147,8 @@ ip_reass_tmr(void) r = r->next; /* free the helper struct and all enqueued pbufs */ ip_reass_free_complete_datagram(tmp, prev); - } - } + } + } } /** @@ -186,7 +186,7 @@ ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *p icmp_time_exceeded(p, ICMP_TE_FRAG); clen = pbuf_clen(p); LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; + pbufs_freed = (u16_t)(pbufs_freed + clen); pbuf_free(p); } #endif /* LWIP_ICMP */ @@ -202,13 +202,13 @@ ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *p p = iprh->next_pbuf; clen = pbuf_clen(pcur); LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; + pbufs_freed = (u16_t)(pbufs_freed + clen); pbuf_free(pcur); } /* Then, unchain the struct ip_reassdata from the list and free it. */ ip_reass_dequeue_datagram(ipr, prev); - LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); - ip_reass_pbufcount -= pbufs_freed; + LWIP_ASSERT("ip_reass_pbufcount >= pbufs_freed", ip_reass_pbufcount >= pbufs_freed); + ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - pbufs_freed); return pbufs_freed; } @@ -274,10 +274,10 @@ ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) * @return A pointer to the queue location into which the fragment was enqueued */ -static struct ip_reassdata* +static struct ip_reassdata * ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) { - struct ip_reassdata* ipr; + struct ip_reassdata *ipr; #if ! IP_REASS_FREE_OLDEST LWIP_UNUSED_ARG(clen); #endif @@ -293,7 +293,7 @@ ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) #endif /* IP_REASS_FREE_OLDEST */ { IPFRAG_STATS_INC(ip_frag.memerr); - LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); + LWIP_DEBUGF(IP_REASS_DEBUG, ("Failed to alloc reassdata struct\n")); return NULL; } } @@ -343,31 +343,42 @@ ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) static int ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p, int is_last) { - struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; + struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev = NULL; struct pbuf *q; u16_t offset, len; + u8_t hlen; struct ip_hdr *fraghdr; int valid = 1; /* Extract length and fragment offset from current fragment */ - fraghdr = (struct ip_hdr*)new_p->payload; - len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; - offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; + fraghdr = (struct ip_hdr *)new_p->payload; + len = lwip_ntohs(IPH_LEN(fraghdr)); + hlen = IPH_HL_BYTES(fraghdr); + if (hlen > len) { + /* invalid datagram */ + return IP_REASS_VALIDATE_PBUF_DROPPED; + } + len = (u16_t)(len - hlen); + offset = IPH_OFFSET_BYTES(fraghdr); /* overwrite the fragment's ip header from the pbuf with our helper struct, * and setup the embedded helper structure. */ /* make sure the struct ip_reass_helper fits into the IP header */ LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", sizeof(struct ip_reass_helper) <= IP_HLEN); - iprh = (struct ip_reass_helper*)new_p->payload; + iprh = (struct ip_reass_helper *)new_p->payload; iprh->next_pbuf = NULL; iprh->start = offset; - iprh->end = offset + len; + iprh->end = (u16_t)(offset + len); + if (iprh->end < offset) { + /* u16_t overflow, cannot handle this */ + return IP_REASS_VALIDATE_PBUF_DROPPED; + } /* Iterate through until we either get to the end of the list (append), * or we find one with a larger offset (insert). */ for (q = ipr->p; q != NULL;) { - iprh_tmp = (struct ip_reass_helper*)q->payload; + iprh_tmp = (struct ip_reass_helper *)q->payload; if (iprh->start < iprh_tmp->start) { /* the new pbuf should be inserted before this */ iprh->next_pbuf = q; @@ -376,7 +387,7 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct #if IP_REASS_CHECK_OVERLAP if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { /* fragment overlaps with previous or following, throw away */ - goto freepbuf; + return IP_REASS_VALIDATE_PBUF_DROPPED; } #endif /* IP_REASS_CHECK_OVERLAP */ iprh_prev->next_pbuf = new_p; @@ -389,7 +400,7 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct #if IP_REASS_CHECK_OVERLAP if (iprh->end > iprh_tmp->start) { /* fragment overlaps with following, throw away */ - goto freepbuf; + return IP_REASS_VALIDATE_PBUF_DROPPED; } #endif /* IP_REASS_CHECK_OVERLAP */ /* fragment with the lowest offset */ @@ -398,11 +409,11 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct break; } else if (iprh->start == iprh_tmp->start) { /* received the same datagram twice: no need to keep the datagram */ - goto freepbuf; + return IP_REASS_VALIDATE_PBUF_DROPPED; #if IP_REASS_CHECK_OVERLAP } else if (iprh->start < iprh_tmp->end) { /* overlap: no need to keep the new datagram */ - goto freepbuf; + return IP_REASS_VALIDATE_PBUF_DROPPED; #endif /* IP_REASS_CHECK_OVERLAP */ } else { /* Check if the fragments received so far have no holes. */ @@ -433,7 +444,7 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct } else { #if IP_REASS_CHECK_OVERLAP LWIP_ASSERT("no previous fragment, this must be the first fragment!", - ipr->p == NULL); + ipr->p == NULL); #endif /* IP_REASS_CHECK_OVERLAP */ /* this is the first fragment we ever received for this ip datagram */ ipr->p = new_p; @@ -447,14 +458,14 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct if (valid) { /* then check if the rest of the fragments is here */ /* Check if the queue starts with the first datagram */ - if ((ipr->p == NULL) || (((struct ip_reass_helper*)ipr->p->payload)->start != 0)) { + if ((ipr->p == NULL) || (((struct ip_reass_helper *)ipr->p->payload)->start != 0)) { valid = 0; } else { /* and check that there are no holes after this datagram */ iprh_prev = iprh; q = iprh->next_pbuf; while (q != NULL) { - iprh = (struct ip_reass_helper*)q->payload; + iprh = (struct ip_reass_helper *)q->payload; if (iprh_prev->end != iprh->start) { valid = 0; break; @@ -467,9 +478,9 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct if (valid) { LWIP_ASSERT("sanity check", ipr->p != NULL); LWIP_ASSERT("sanity check", - ((struct ip_reass_helper*)ipr->p->payload) != iprh); + ((struct ip_reass_helper *)ipr->p->payload) != iprh); LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", - iprh->next_pbuf == NULL); + iprh->next_pbuf == NULL); } } } @@ -480,12 +491,6 @@ ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct } /* If we come here, not all fragments were received, yet! */ return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */ -#if IP_REASS_CHECK_OVERLAP -freepbuf: - ip_reass_pbufcount -= pbuf_clen(new_p); - pbuf_free(new_p); - return IP_REASS_VALIDATE_PBUF_DROPPED; -#endif /* IP_REASS_CHECK_OVERLAP */ } /** @@ -502,22 +507,29 @@ ip4_reass(struct pbuf *p) struct ip_reassdata *ipr; struct ip_reass_helper *iprh; u16_t offset, len, clen; + u8_t hlen; int valid; int is_last; IPFRAG_STATS_INC(ip_frag.recv); MIB2_STATS_INC(mib2.ipreasmreqds); - fraghdr = (struct ip_hdr*)p->payload; + fraghdr = (struct ip_hdr *)p->payload; - if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: IP options currently not supported!\n")); + if (IPH_HL_BYTES(fraghdr) != IP_HLEN) { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: IP options currently not supported!\n")); IPFRAG_STATS_INC(ip_frag.err); goto nullreturn; } - offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; - len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; + offset = IPH_OFFSET_BYTES(fraghdr); + len = lwip_ntohs(IPH_LEN(fraghdr)); + hlen = IPH_HL_BYTES(fraghdr); + if (hlen > len) { + /* invalid datagram */ + goto nullreturn; + } + len = (u16_t)(len - hlen); /* Check if we are allowed to enqueue more datagrams. */ clen = pbuf_clen(p); @@ -528,8 +540,8 @@ ip4_reass(struct pbuf *p) #endif /* IP_REASS_FREE_OLDEST */ { /* No datagram could be freed and still too many pbufs enqueued */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", - ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", + ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); IPFRAG_STATS_INC(ip_frag.memerr); /* @todo: send ICMP time exceeded here? */ /* drop this pbuf */ @@ -545,14 +557,14 @@ ip4_reass(struct pbuf *p) fragment into the buffer. */ if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: matching previous fragment ID=%"X16_F"\n", - lwip_ntohs(IPH_ID(fraghdr)))); + lwip_ntohs(IPH_ID(fraghdr)))); IPFRAG_STATS_INC(ip_frag.cachehit); break; } } if (ipr == NULL) { - /* Enqueue a new datagram into the datagram queue */ + /* Enqueue a new datagram into the datagram queue */ ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); /* Bail if unable to enqueue */ if (ipr == NULL) { @@ -560,7 +572,7 @@ ip4_reass(struct pbuf *p) } } else { if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && - ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { + ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { /* ipr->iphdr is not the header from the first fragment, but fraghdr is * -> copy fraghdr into ipr->iphdr since we want to have the header * of the first fragment (for ICMP time exceeded and later, for copying @@ -578,14 +590,14 @@ ip4_reass(struct pbuf *p) u16_t datagram_len = (u16_t)(offset + len); if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) { /* u16_t overflow, cannot handle this */ - goto nullreturn; + goto nullreturn_ipr; } } /* find the right place to insert this pbuf */ /* @todo: trim pbufs if fragments are overlapping */ valid = ip_reass_chain_frag_into_datagram_and_validate(ipr, p, is_last); if (valid == IP_REASS_VALIDATE_PBUF_DROPPED) { - goto nullreturn; + goto nullreturn_ipr; } /* if we come here, the pbuf has been enqueued */ @@ -598,23 +610,23 @@ ip4_reass(struct pbuf *p) ipr->datagram_len = datagram_len; ipr->flags |= IP_REASS_FLAG_LASTFRAG; LWIP_DEBUGF(IP_REASS_DEBUG, - ("ip4_reass: last fragment seen, total len %"S16_F"\n", - ipr->datagram_len)); + ("ip4_reass: last fragment seen, total len %"S16_F"\n", + ipr->datagram_len)); } if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) { struct ip_reassdata *ipr_prev; /* the totally last fragment (flag more fragments = 0) was received at least * once AND all fragments are received */ - ipr->datagram_len += IP_HLEN; + u16_t datagram_len = (u16_t)(ipr->datagram_len + IP_HLEN); /* save the second pbuf before copying the header over the pointer */ - r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; + r = ((struct ip_reass_helper *)ipr->p->payload)->next_pbuf; /* copy the original ip header back to the first pbuf */ - fraghdr = (struct ip_hdr*)(ipr->p->payload); + fraghdr = (struct ip_hdr *)(ipr->p->payload); SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); - IPH_LEN_SET(fraghdr, lwip_htons(ipr->datagram_len)); + IPH_LEN_SET(fraghdr, lwip_htons(datagram_len)); IPH_OFFSET_SET(fraghdr, 0); IPH_CHKSUM_SET(fraghdr, 0); /* @todo: do we need to set/calculate the correct checksum? */ @@ -628,10 +640,10 @@ ip4_reass(struct pbuf *p) /* chain together the pbufs contained within the reass_data list. */ while (r != NULL) { - iprh = (struct ip_reass_helper*)r->payload; + iprh = (struct ip_reass_helper *)r->payload; /* hide the ip header for every succeeding fragment */ - pbuf_header(r, -IP_HLEN); + pbuf_remove_header(r, IP_HLEN); pbuf_cat(p, r); r = iprh->next_pbuf; } @@ -651,7 +663,9 @@ ip4_reass(struct pbuf *p) ip_reass_dequeue_datagram(ipr, ipr_prev); /* and adjust the number of pbufs currently queued for reassembly. */ - ip_reass_pbufcount -= pbuf_clen(p); + clen = pbuf_clen(p); + LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= clen); + ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount - clen); MIB2_STATS_INC(mib2.ipreasmoks); @@ -659,11 +673,19 @@ ip4_reass(struct pbuf *p) return p; } /* the datagram is not (yet?) reassembled completely */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); return NULL; +nullreturn_ipr: + LWIP_ASSERT("ipr != NULL", ipr != NULL); + if (ipr->p == NULL) { + /* dropped pbuf after creating a new datagram entry: remove the entry, too */ + LWIP_ASSERT("not firstalthough just enqueued", ipr == reassdatagrams); + ip_reass_dequeue_datagram(ipr, NULL); + } + nullreturn: - LWIP_DEBUGF(IP_REASS_DEBUG,("ip4_reass: nullreturn\n")); + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip4_reass: nullreturn\n")); IPFRAG_STATS_INC(ip_frag.drop); pbuf_free(p); return NULL; @@ -673,15 +695,15 @@ nullreturn: #if IP_FRAG #if !LWIP_NETIF_TX_SINGLE_PBUF /** Allocate a new struct pbuf_custom_ref */ -static struct pbuf_custom_ref* +static struct pbuf_custom_ref * ip_frag_alloc_pbuf_custom_ref(void) { - return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF); + return (struct pbuf_custom_ref *)memp_malloc(MEMP_FRAG_PBUF); } /** Free a struct pbuf_custom_ref */ static void -ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) +ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref *p) { LWIP_ASSERT("p != NULL", p != NULL); memp_free(MEMP_FRAG_PBUF, p); @@ -692,9 +714,9 @@ ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) static void ipfrag_free_pbuf_custom(struct pbuf *p) { - struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p; + struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref *)p; LWIP_ASSERT("pcr != NULL", pcr != NULL); - LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p); + LWIP_ASSERT("pcr == p", (void *)pcr == (void *)p); if (pcr->original != NULL) { pbuf_free(pcr->original); } @@ -725,27 +747,33 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) #endif struct ip_hdr *original_iphdr; struct ip_hdr *iphdr; - const u16_t nfb = (netif->mtu - IP_HLEN) / 8; + const u16_t nfb = (u16_t)((netif->mtu - IP_HLEN) / 8); u16_t left, fragsize; u16_t ofo; int last; u16_t poff = IP_HLEN; u16_t tmp; + int mf_set; original_iphdr = (struct ip_hdr *)p->payload; iphdr = original_iphdr; - LWIP_ERROR("ip4_frag() does not support IP options", IPH_HL(iphdr) * 4 == IP_HLEN, return ERR_VAL); + if (IPH_HL_BYTES(iphdr) != IP_HLEN) { + /* ip4_frag() does not support IP options */ + return ERR_VAL; + } + LWIP_ERROR("ip4_frag(): pbuf too short", p->len >= IP_HLEN, return ERR_VAL); /* Save original offset */ tmp = lwip_ntohs(IPH_OFFSET(iphdr)); ofo = tmp & IP_OFFMASK; - LWIP_ERROR("ip_frag(): MF already set", (tmp & IP_MF) == 0, return ERR_VAL); + /* already fragmented? if so, the last fragment we create must have MF, too */ + mf_set = tmp & IP_MF; - left = p->tot_len - IP_HLEN; + left = (u16_t)(p->tot_len - IP_HLEN); while (left) { /* Fill this fragment */ - fragsize = LWIP_MIN(left, nfb * 8); + fragsize = LWIP_MIN(left, (u16_t)(nfb * 8)); #if LWIP_NETIF_TX_SINGLE_PBUF rambuf = pbuf_alloc(PBUF_IP, fragsize, PBUF_RAM); @@ -753,16 +781,16 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) goto memerr; } LWIP_ASSERT("this needs a pbuf in one piece!", - (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); + (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); poff += pbuf_copy_partial(p, rambuf->payload, fragsize, poff); /* make room for the IP header */ - if (pbuf_header(rambuf, IP_HLEN)) { + if (pbuf_add_header(rambuf, IP_HLEN)) { pbuf_free(rambuf); goto memerr; } /* fill in the IP header */ SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); - iphdr = (struct ip_hdr*)rambuf->payload; + iphdr = (struct ip_hdr *)rambuf->payload; #else /* LWIP_NETIF_TX_SINGLE_PBUF */ /* When not using a static buffer, create a chain of pbufs. * The first will be a PBUF_RAM holding the link and IP header. @@ -774,14 +802,15 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) goto memerr; } LWIP_ASSERT("this needs a pbuf in one piece!", - (p->len >= (IP_HLEN))); + (rambuf->len >= (IP_HLEN))); SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); iphdr = (struct ip_hdr *)rambuf->payload; left_to_copy = fragsize; while (left_to_copy) { struct pbuf_custom_ref *pcr; - u16_t plen = p->len - poff; + u16_t plen = (u16_t)(p->len - poff); + LWIP_ASSERT("p->len >= poff", p->len >= poff); newpbuflen = LWIP_MIN(left_to_copy, plen); /* Is this pbuf already empty? */ if (!newpbuflen) { @@ -796,7 +825,7 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) } /* Mirror this pbuf, although we might not need all of it. */ newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, - (u8_t*)p->payload + poff, newpbuflen); + (u8_t *)p->payload + poff, newpbuflen); if (newpbuf == NULL) { ip_frag_free_pbuf_custom_ref(pcr); pbuf_free(rambuf); @@ -810,13 +839,13 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) * so that it is removed when pbuf_dechain is later called on rambuf. */ pbuf_cat(rambuf, newpbuf); - left_to_copy -= newpbuflen; + left_to_copy = (u16_t)(left_to_copy - newpbuflen); if (left_to_copy) { poff = 0; p = p->next; } } - poff += newpbuflen; + poff = (u16_t)(poff + newpbuflen); #endif /* LWIP_NETIF_TX_SINGLE_PBUF */ /* Correct header */ @@ -824,11 +853,12 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) /* Set new offset and MF flag */ tmp = (IP_OFFMASK & (ofo)); - if (!last) { + if (!last || mf_set) { + /* the last fragment has MF set if the input frame had it */ tmp = tmp | IP_MF; } IPH_OFFSET_SET(iphdr, lwip_htons(tmp)); - IPH_LEN_SET(iphdr, lwip_htons(fragsize + IP_HLEN)); + IPH_LEN_SET(iphdr, lwip_htons((u16_t)(fragsize + IP_HLEN))); IPH_CHKSUM_SET(iphdr, 0); #if CHECKSUM_GEN_IP IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) { @@ -850,8 +880,8 @@ ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest) */ pbuf_free(rambuf); - left -= fragsize; - ofo += nfb; + left = (u16_t)(left - fragsize); + ofo = (u16_t)(ofo + nfb); } MIB2_STATS_INC(mib2.ipfragoks); return ERR_OK; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/Makefile similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/Makefile diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/dhcp6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/dhcp6.c new file mode 100644 index 0000000..41444a4 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/dhcp6.c @@ -0,0 +1,821 @@ +/** + * @file + * + * @defgroup dhcp6 DHCPv6 + * @ingroup ip6 + * DHCPv6 client: IPv6 address autoconfiguration as per + * RFC 3315 (stateful DHCPv6) and + * RFC 3736 (stateless DHCPv6). + * + * For now, only stateless DHCPv6 is implemented! + * + * TODO: + * - enable/disable API to not always start when RA is received + * - stateful DHCPv6 (for now, only stateless DHCPv6 for DNS and NTP servers works) + * - create Client Identifier? + * - only start requests if a valid local address is available on the netif + * - only start information requests if required (not for every RA) + * + * dhcp6_enable_stateful() enables stateful DHCPv6 for a netif (stateless disabled)\n + * dhcp6_enable_stateless() enables stateless DHCPv6 for a netif (stateful disabled)\n + * dhcp6_disable() disable DHCPv6 for a netif + * + * When enabled, requests are only issued after receipt of RA with the + * corresponding bits set. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + */ + +#include "lwip/opt.h" + +#if LWIP_IPV6 && LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/dhcp6.h" +#include "lwip/prot/dhcp6.h" +#include "lwip/def.h" +#include "lwip/udp.h" +#include "lwip/dns.h" + +#include + +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif +#ifndef LWIP_HOOK_DHCP6_APPEND_OPTIONS +#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len) +#endif +#ifndef LWIP_HOOK_DHCP6_PARSE_OPTION +#define LWIP_HOOK_DHCP6_PARSE_OPTION(netif, dhcp6, state, msg, msg_type, option, len, pbuf, offset) do { LWIP_UNUSED_ARG(msg); } while(0) +#endif + +#if LWIP_DNS && LWIP_DHCP6_MAX_DNS_SERVERS +#if DNS_MAX_SERVERS > LWIP_DHCP6_MAX_DNS_SERVERS +#define LWIP_DHCP6_PROVIDE_DNS_SERVERS LWIP_DHCP6_MAX_DNS_SERVERS +#else +#define LWIP_DHCP6_PROVIDE_DNS_SERVERS DNS_MAX_SERVERS +#endif +#else +#define LWIP_DHCP6_PROVIDE_DNS_SERVERS 0 +#endif + + +/** Option handling: options are parsed in dhcp6_parse_reply + * and saved in an array where other functions can load them from. + * This might be moved into the struct dhcp6 (not necessarily since + * lwIP is single-threaded and the array is only used while in recv + * callback). */ +enum dhcp6_option_idx { + DHCP6_OPTION_IDX_CLI_ID = 0, + DHCP6_OPTION_IDX_SERVER_ID, +#if LWIP_DHCP6_PROVIDE_DNS_SERVERS + DHCP6_OPTION_IDX_DNS_SERVER, + DHCP6_OPTION_IDX_DOMAIN_LIST, +#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */ +#if LWIP_DHCP6_GET_NTP_SRV + DHCP6_OPTION_IDX_NTP_SERVER, +#endif /* LWIP_DHCP_GET_NTP_SRV */ + DHCP6_OPTION_IDX_MAX +}; + +struct dhcp6_option_info { + u8_t option_given; + u16_t val_start; + u16_t val_length; +}; + +/** Holds the decoded option info, only valid while in dhcp6_recv. */ +struct dhcp6_option_info dhcp6_rx_options[DHCP6_OPTION_IDX_MAX]; + +#define dhcp6_option_given(dhcp6, idx) (dhcp6_rx_options[idx].option_given != 0) +#define dhcp6_got_option(dhcp6, idx) (dhcp6_rx_options[idx].option_given = 1) +#define dhcp6_clear_option(dhcp6, idx) (dhcp6_rx_options[idx].option_given = 0) +#define dhcp6_clear_all_options(dhcp6) (memset(dhcp6_rx_options, 0, sizeof(dhcp6_rx_options))) +#define dhcp6_get_option_start(dhcp6, idx) (dhcp6_rx_options[idx].val_start) +#define dhcp6_get_option_length(dhcp6, idx) (dhcp6_rx_options[idx].val_length) +#define dhcp6_set_option(dhcp6, idx, start, len) do { dhcp6_rx_options[idx].val_start = (start); dhcp6_rx_options[idx].val_length = (len); }while(0) + + +const ip_addr_t dhcp6_All_DHCP6_Relay_Agents_and_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010002); +const ip_addr_t dhcp6_All_DHCP6_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010003); + +static struct udp_pcb *dhcp6_pcb; +static u8_t dhcp6_pcb_refcount; + + +/* receive, unfold, parse and free incoming messages */ +static void dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); + +/** Ensure DHCP PCB is allocated and bound */ +static err_t +dhcp6_inc_pcb_refcount(void) +{ + if (dhcp6_pcb_refcount == 0) { + LWIP_ASSERT("dhcp6_inc_pcb_refcount(): memory leak", dhcp6_pcb == NULL); + + /* allocate UDP PCB */ + dhcp6_pcb = udp_new_ip6(); + + if (dhcp6_pcb == NULL) { + return ERR_MEM; + } + + ip_set_option(dhcp6_pcb, SOF_BROADCAST); + + /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */ + udp_bind(dhcp6_pcb, IP6_ADDR_ANY, DHCP6_CLIENT_PORT); + udp_recv(dhcp6_pcb, dhcp6_recv, NULL); + } + + dhcp6_pcb_refcount++; + + return ERR_OK; +} + +/** Free DHCP PCB if the last netif stops using it */ +static void +dhcp6_dec_pcb_refcount(void) +{ + LWIP_ASSERT("dhcp6_pcb_refcount(): refcount error", (dhcp6_pcb_refcount > 0)); + dhcp6_pcb_refcount--; + + if (dhcp6_pcb_refcount == 0) { + udp_remove(dhcp6_pcb); + dhcp6_pcb = NULL; + } +} + +/** + * @ingroup dhcp6 + * Set a statically allocated struct dhcp6 to work with. + * Using this prevents dhcp6_start to allocate it using mem_malloc. + * + * @param netif the netif for which to set the struct dhcp + * @param dhcp6 (uninitialised) dhcp6 struct allocated by the application + */ +void +dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + LWIP_ASSERT("dhcp6 != NULL", dhcp6 != NULL); + LWIP_ASSERT("netif already has a struct dhcp6 set", netif_dhcp6_data(netif) == NULL); + + /* clear data structure */ + memset(dhcp6, 0, sizeof(struct dhcp6)); + /* dhcp6_set_state(&dhcp, DHCP6_STATE_OFF); */ + netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6); +} + +/** + * @ingroup dhcp6 + * Removes a struct dhcp6 from a netif. + * + * ATTENTION: Only use this when not using dhcp6_set_struct() to allocate the + * struct dhcp6 since the memory is passed back to the heap. + * + * @param netif the netif from which to remove the struct dhcp + */ +void dhcp6_cleanup(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + + if (netif_dhcp6_data(netif) != NULL) { + mem_free(netif_dhcp6_data(netif)); + netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL); + } +} + +static struct dhcp6* +dhcp6_get_struct(struct netif *netif, const char *dbg_requester) +{ + struct dhcp6 *dhcp6 = netif_dhcp6_data(netif); + if (dhcp6 == NULL) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: mallocing new DHCPv6 client\n", dbg_requester)); + dhcp6 = (struct dhcp6 *)mem_malloc(sizeof(struct dhcp6)); + if (dhcp6 == NULL) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: could not allocate dhcp6\n", dbg_requester)); + return NULL; + } + + /* clear data structure, this implies DHCP6_STATE_OFF */ + memset(dhcp6, 0, sizeof(struct dhcp6)); + /* store this dhcp6 client in the netif */ + netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6); + } else { + /* already has DHCP6 client attached */ + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("%s: using existing DHCPv6 client\n", dbg_requester)); + } + + if (!dhcp6->pcb_allocated) { + if (dhcp6_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP6 PCB is allocated */ + mem_free(dhcp6); + netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL); + return NULL; + } + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: allocated dhcp6", dbg_requester)); + dhcp6->pcb_allocated = 1; + } + return dhcp6; +} + +/* + * Set the DHCPv6 state + * If the state changed, reset the number of tries. + */ +static void +dhcp6_set_state(struct dhcp6 *dhcp6, u8_t new_state, const char *dbg_caller) +{ + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("DHCPv6 state: %d -> %d (%s)\n", + dhcp6->state, new_state, dbg_caller)); + if (new_state != dhcp6->state) { + dhcp6->state = new_state; + dhcp6->tries = 0; + dhcp6->request_timeout = 0; + } +} + +static int +dhcp6_stateless_enabled(struct dhcp6 *dhcp6) +{ + if ((dhcp6->state == DHCP6_STATE_STATELESS_IDLE) || + (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG)) { + return 1; + } + return 0; +} + +/*static int +dhcp6_stateful_enabled(struct dhcp6 *dhcp6) +{ + if (dhcp6->state == DHCP6_STATE_OFF) { + return 0; + } + if (dhcp6_stateless_enabled(dhcp6)) { + return 0; + } + return 1; +}*/ + +/** + * @ingroup dhcp6 + * Enable stateful DHCPv6 on this netif + * Requests are sent on receipt of an RA message with the + * ND6_RA_FLAG_MANAGED_ADDR_CONFIG flag set. + * + * A struct dhcp6 will be allocated for this netif if not + * set via @ref dhcp6_set_struct before. + * + * @todo: stateful DHCPv6 not supported, yet + */ +err_t +dhcp6_enable_stateful(struct netif *netif) +{ + LWIP_UNUSED_ARG(netif); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("stateful dhcp6 not implemented yet")); + return ERR_VAL; +} + +/** + * @ingroup dhcp6 + * Enable stateless DHCPv6 on this netif + * Requests are sent on receipt of an RA message with the + * ND6_RA_FLAG_OTHER_CONFIG flag set. + * + * A struct dhcp6 will be allocated for this netif if not + * set via @ref dhcp6_set_struct before. + */ +err_t +dhcp6_enable_stateless(struct netif *netif) +{ + struct dhcp6 *dhcp6; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_enable_stateless(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + + dhcp6 = dhcp6_get_struct(netif, "dhcp6_enable_stateless()"); + if (dhcp6 == NULL) { + return ERR_MEM; + } + if (dhcp6_stateless_enabled(dhcp6)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 already enabled")); + return ERR_OK; + } else if (dhcp6->state != DHCP6_STATE_OFF) { + /* stateful running */ + /* @todo: stop stateful once it is implemented */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): switching from stateful to stateless DHCPv6")); + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_enable_stateless(): stateless DHCPv6 enabled\n")); + dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_enable_stateless"); + return ERR_OK; +} + +/** + * @ingroup dhcp6 + * Disable stateful or stateless DHCPv6 on this netif + * Requests are sent on receipt of an RA message with the + * ND6_RA_FLAG_OTHER_CONFIG flag set. + */ +void +dhcp6_disable(struct netif *netif) +{ + struct dhcp6 *dhcp6; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_disable(netif=%p) %c%c%"U16_F"\n", (void *)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + + dhcp6 = netif_dhcp6_data(netif); + if (dhcp6 != NULL) { + if (dhcp6->state != DHCP6_STATE_OFF) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_disable(): DHCPv6 disabled (old state: %s)\n", + (dhcp6_stateless_enabled(dhcp6) ? "stateless" : "stateful"))); + dhcp6_set_state(dhcp6, DHCP6_STATE_OFF, "dhcp6_disable"); + if (dhcp6->pcb_allocated != 0) { + dhcp6_dec_pcb_refcount(); /* free DHCPv6 PCB if not needed any more */ + dhcp6->pcb_allocated = 0; + } + } + } +} + +/** + * Create a DHCPv6 request, fill in common headers + * + * @param netif the netif under DHCPv6 control + * @param dhcp6 dhcp6 control struct + * @param message_type message type of the request + * @param opt_len_alloc option length to allocate + * @param options_out_len option length on exit + * @return a pbuf for the message + */ +static struct pbuf * +dhcp6_create_msg(struct netif *netif, struct dhcp6 *dhcp6, u8_t message_type, + u16_t opt_len_alloc, u16_t *options_out_len) +{ + struct pbuf *p_out; + struct dhcp6_msg *msg_out; + + LWIP_ERROR("dhcp6_create_msg: netif != NULL", (netif != NULL), return NULL;); + LWIP_ERROR("dhcp6_create_msg: dhcp6 != NULL", (dhcp6 != NULL), return NULL;); + p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp6_msg) + opt_len_alloc, PBUF_RAM); + if (p_out == NULL) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp6_create_msg(): could not allocate pbuf\n")); + return NULL; + } + LWIP_ASSERT("dhcp6_create_msg: check that first pbuf can hold struct dhcp6_msg", + (p_out->len >= sizeof(struct dhcp6_msg) + opt_len_alloc)); + + /* @todo: limit new xid for certain message types? */ + /* reuse transaction identifier in retransmissions */ + if (dhcp6->tries == 0) { + dhcp6->xid = LWIP_RAND() & 0xFFFFFF; + } + + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, + ("transaction id xid(%"X32_F")\n", dhcp6->xid)); + + msg_out = (struct dhcp6_msg *)p_out->payload; + memset(msg_out, 0, sizeof(struct dhcp6_msg) + opt_len_alloc); + + msg_out->msgtype = message_type; + msg_out->transaction_id[0] = (u8_t)(dhcp6->xid >> 16); + msg_out->transaction_id[1] = (u8_t)(dhcp6->xid >> 8); + msg_out->transaction_id[2] = (u8_t)dhcp6->xid; + *options_out_len = 0; + return p_out; +} + +static u16_t +dhcp6_option_short(u16_t options_out_len, u8_t *options, u16_t value) +{ + options[options_out_len++] = (u8_t)((value & 0xff00U) >> 8); + options[options_out_len++] = (u8_t) (value & 0x00ffU); + return options_out_len; +} + +static u16_t +dhcp6_option_optionrequest(u16_t options_out_len, u8_t *options, const u16_t *req_options, + u16_t num_req_options, u16_t max_len) +{ + size_t i; + u16_t ret; + + LWIP_ASSERT("dhcp6_option_optionrequest: options_out_len + sizeof(struct dhcp6_msg) + addlen <= max_len", + sizeof(struct dhcp6_msg) + options_out_len + 4U + (2U * num_req_options) <= max_len); + LWIP_UNUSED_ARG(max_len); + + ret = dhcp6_option_short(options_out_len, options, DHCP6_OPTION_ORO); + ret = dhcp6_option_short(ret, options, 2 * num_req_options); + for (i = 0; i < num_req_options; i++) { + ret = dhcp6_option_short(ret, options, req_options[i]); + } + return ret; +} + +/* All options are added, shrink the pbuf to the required size */ +static void +dhcp6_msg_finalize(u16_t options_out_len, struct pbuf *p_out) +{ + /* shrink the pbuf to the actual content length */ + pbuf_realloc(p_out, (u16_t)(sizeof(struct dhcp6_msg) + options_out_len)); +} + + +#if LWIP_IPV6_DHCP6_STATELESS +static void +dhcp6_information_request(struct netif *netif, struct dhcp6 *dhcp6) +{ + const u16_t requested_options[] = { +#if LWIP_DHCP6_PROVIDE_DNS_SERVERS + DHCP6_OPTION_DNS_SERVERS, + DHCP6_OPTION_DOMAIN_LIST +#endif +#if LWIP_DHCP6_GET_NTP_SRV + , DHCP6_OPTION_SNTP_SERVERS +#endif + }; + + u16_t msecs; + struct pbuf *p_out; + u16_t options_out_len; + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_information_request()\n")); + /* create and initialize the DHCP message header */ + p_out = dhcp6_create_msg(netif, dhcp6, DHCP6_INFOREQUEST, 4 + sizeof(requested_options), &options_out_len); + if (p_out != NULL) { + err_t err; + struct dhcp6_msg *msg_out = (struct dhcp6_msg *)p_out->payload; + u8_t *options = (u8_t *)(msg_out + 1); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_information_request: making request\n")); + + options_out_len = dhcp6_option_optionrequest(options_out_len, options, requested_options, + LWIP_ARRAYSIZE(requested_options), p_out->len); + LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, DHCP6_STATE_REQUESTING_CONFIG, msg_out, + DHCP6_INFOREQUEST, options_out_len, p_out->len); + dhcp6_msg_finalize(options_out_len, p_out); + + err = udp_sendto_if(dhcp6_pcb, p_out, &dhcp6_All_DHCP6_Relay_Agents_and_Servers, DHCP6_SERVER_PORT, netif); + pbuf_free(p_out); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_information_request: INFOREQUESTING -> %d\n", (int)err)); + LWIP_UNUSED_ARG(err); + } else { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp6_information_request: could not allocate DHCP6 request\n")); + } + dhcp6_set_state(dhcp6, DHCP6_STATE_REQUESTING_CONFIG, "dhcp6_information_request"); + if (dhcp6->tries < 255) { + dhcp6->tries++; + } + msecs = (u16_t)((dhcp6->tries < 6 ? 1 << dhcp6->tries : 60) * 1000); + dhcp6->request_timeout = (u16_t)((msecs + DHCP6_TIMER_MSECS - 1) / DHCP6_TIMER_MSECS); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_information_request(): set request timeout %"U16_F" msecs\n", msecs)); +} + +static err_t +dhcp6_request_config(struct netif *netif, struct dhcp6 *dhcp6) +{ + /* stateless mode enabled and no request running? */ + if (dhcp6->state == DHCP6_STATE_STATELESS_IDLE) { + /* send Information-request and wait for answer; setup receive timeout */ + dhcp6_information_request(netif, dhcp6); + } + + return ERR_OK; +} + +static void +dhcp6_abort_config_request(struct dhcp6 *dhcp6) +{ + if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) { + /* abort running request */ + dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_abort_config_request"); + } +} + +/* Handle a REPLY to INFOREQUEST + * This parses DNS and NTP server addresses from the reply. + */ +static void +dhcp6_handle_config_reply(struct netif *netif, struct pbuf *p_msg_in) +{ + struct dhcp6 *dhcp6 = netif_dhcp6_data(netif); + + LWIP_UNUSED_ARG(dhcp6); + LWIP_UNUSED_ARG(p_msg_in); + +#if LWIP_DHCP6_PROVIDE_DNS_SERVERS + if (dhcp6_option_given(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER)) { + ip_addr_t dns_addr; + ip6_addr_t *dns_addr6; + u16_t op_start = dhcp6_get_option_start(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER); + u16_t op_len = dhcp6_get_option_length(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER); + u16_t idx; + u8_t n; + + ip_addr_set_zero_ip6(&dns_addr); + dns_addr6 = ip_2_ip6(&dns_addr); + for (n = 0, idx = op_start; (idx < op_start + op_len) && (n < LWIP_DHCP6_PROVIDE_DNS_SERVERS); + n++, idx += sizeof(struct ip6_addr_packed)) { + u16_t copied = pbuf_copy_partial(p_msg_in, dns_addr6, sizeof(struct ip6_addr_packed), idx); + if (copied != sizeof(struct ip6_addr_packed)) { + /* pbuf length mismatch */ + return; + } + ip6_addr_assign_zone(dns_addr6, IP6_UNKNOWN, netif); + /* @todo: do we need a different offset than DHCP(v4)? */ + dns_setserver(n, &dns_addr); + } + } + /* @ todo: parse and set Domain Search List */ +#endif /* LWIP_DHCP6_PROVIDE_DNS_SERVERS */ + +#if LWIP_DHCP6_GET_NTP_SRV + if (dhcp6_option_given(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER)) { + ip_addr_t ntp_server_addrs[LWIP_DHCP6_MAX_NTP_SERVERS]; + u16_t op_start = dhcp6_get_option_start(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER); + u16_t op_len = dhcp6_get_option_length(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER); + u16_t idx; + u8_t n; + + for (n = 0, idx = op_start; (idx < op_start + op_len) && (n < LWIP_DHCP6_MAX_NTP_SERVERS); + n++, idx += sizeof(struct ip6_addr_packed)) { + u16_t copied; + ip6_addr_t *ntp_addr6 = ip_2_ip6(&ntp_server_addrs[n]); + ip_addr_set_zero_ip6(&ntp_server_addrs[n]); + copied = pbuf_copy_partial(p_msg_in, ntp_addr6, sizeof(struct ip6_addr_packed), idx); + if (copied != sizeof(struct ip6_addr_packed)) { + /* pbuf length mismatch */ + return; + } + ip6_addr_assign_zone(ntp_addr6, IP6_UNKNOWN, netif); + } + dhcp6_set_ntp_servers(n, ntp_server_addrs); + } +#endif /* LWIP_DHCP6_GET_NTP_SRV */ +} +#endif /* LWIP_IPV6_DHCP6_STATELESS */ + +/** This function is called from nd6 module when an RA messsage is received + * It triggers DHCPv6 requests (if enabled). + */ +void +dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config) +{ + struct dhcp6 *dhcp6; + + LWIP_ASSERT("netif != NULL", netif != NULL); + dhcp6 = netif_dhcp6_data(netif); + + LWIP_UNUSED_ARG(managed_addr_config); + LWIP_UNUSED_ARG(other_config); + LWIP_UNUSED_ARG(dhcp6); + +#if LWIP_IPV6_DHCP6_STATELESS + if (dhcp6 != NULL) { + if (dhcp6_stateless_enabled(dhcp6)) { + if (other_config) { + dhcp6_request_config(netif, dhcp6); + } else { + dhcp6_abort_config_request(dhcp6); + } + } + } +#endif /* LWIP_IPV6_DHCP6_STATELESS */ +} + +/** + * Parse the DHCPv6 message and extract the DHCPv6 options. + * + * Extract the DHCPv6 options (offset + length) so that we can later easily + * check for them or extract the contents. + */ +static err_t +dhcp6_parse_reply(struct pbuf *p, struct dhcp6 *dhcp6) +{ + u16_t offset; + u16_t offset_max; + u16_t options_idx; + struct dhcp6_msg *msg_in; + + LWIP_UNUSED_ARG(dhcp6); + + /* clear received options */ + dhcp6_clear_all_options(dhcp6); + msg_in = (struct dhcp6_msg *)p->payload; + + /* parse options */ + + options_idx = sizeof(struct dhcp6_msg); + /* parse options to the end of the received packet */ + offset_max = p->tot_len; + + offset = options_idx; + /* at least 4 byte to read? */ + while ((offset + 4 <= offset_max)) { + u8_t op_len_buf[4]; + u8_t *op_len; + u16_t op; + u16_t len; + u16_t val_offset = (u16_t)(offset + 4); + if (val_offset < offset) { + /* overflow */ + return ERR_BUF; + } + /* copy option + length, might be split accross pbufs */ + op_len = (u8_t *)pbuf_get_contiguous(p, op_len_buf, 4, 4, offset); + if (op_len == NULL) { + /* failed to get option and length */ + return ERR_VAL; + } + op = (op_len[0] << 8) | op_len[1]; + len = (op_len[2] << 8) | op_len[3]; + offset = val_offset + len; + if (offset < val_offset) { + /* overflow */ + return ERR_BUF; + } + + switch (op) { + case (DHCP6_OPTION_CLIENTID): + dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_CLI_ID); + dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_CLI_ID, val_offset, len); + break; + case (DHCP6_OPTION_SERVERID): + dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_SERVER_ID); + dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_SERVER_ID, val_offset, len); + break; +#if LWIP_DHCP6_PROVIDE_DNS_SERVERS + case (DHCP6_OPTION_DNS_SERVERS): + dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER); + dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_DNS_SERVER, val_offset, len); + break; + case (DHCP6_OPTION_DOMAIN_LIST): + dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_DOMAIN_LIST); + dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_DOMAIN_LIST, val_offset, len); + break; +#endif /* LWIP_DHCP6_PROVIDE_DNS_SERVERS */ +#if LWIP_DHCP6_GET_NTP_SRV + case (DHCP6_OPTION_SNTP_SERVERS): + dhcp6_got_option(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER); + dhcp6_set_option(dhcp6, DHCP6_OPTION_IDX_NTP_SERVER, val_offset, len); + break; +#endif /* LWIP_DHCP6_GET_NTP_SRV*/ + default: + LWIP_DEBUGF(DHCP6_DEBUG, ("skipping option %"U16_F" in options\n", op)); + LWIP_HOOK_DHCP6_PARSE_OPTION(ip_current_netif(), dhcp6, dhcp6->state, msg_in, + msg_in->msgtype, op, len, q, val_offset); + break; + } + } + return ERR_OK; +} + +static void +dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) +{ + struct netif *netif = ip_current_input_netif(); + struct dhcp6 *dhcp6 = netif_dhcp6_data(netif); + struct dhcp6_msg *reply_msg = (struct dhcp6_msg *)p->payload; + u8_t msg_type; + u32_t xid; + + LWIP_UNUSED_ARG(arg); + + /* Caught DHCPv6 message from netif that does not have DHCPv6 enabled? -> not interested */ + if ((dhcp6 == NULL) || (dhcp6->pcb_allocated == 0)) { + goto free_pbuf_and_return; + } + + LWIP_ERROR("invalid server address type", IP_IS_V6(addr), goto free_pbuf_and_return;); + + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_recv(pbuf = %p) from DHCPv6 server %s port %"U16_F"\n", (void *)p, + ipaddr_ntoa(addr), port)); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len)); + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len)); + /* prevent warnings about unused arguments */ + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + + if (p->len < sizeof(struct dhcp6_msg)) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCPv6 reply message or pbuf too short\n")); + goto free_pbuf_and_return; + } + + /* match transaction ID against what we expected */ + xid = reply_msg->transaction_id[0] << 16; + xid |= reply_msg->transaction_id[1] << 8; + xid |= reply_msg->transaction_id[2]; + if (xid != dhcp6->xid) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("transaction id mismatch reply_msg->xid(%"X32_F")!= dhcp6->xid(%"X32_F")\n", xid, dhcp6->xid)); + goto free_pbuf_and_return; + } + /* option fields could be unfold? */ + if (dhcp6_parse_reply(p, dhcp6) != ERR_OK) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("problem unfolding DHCPv6 message - too short on memory?\n")); + goto free_pbuf_and_return; + } + + /* read DHCP message type */ + msg_type = reply_msg->msgtype; + /* message type is DHCP6 REPLY? */ + if (msg_type == DHCP6_REPLY) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("DHCP6_REPLY received\n")); +#if LWIP_IPV6_DHCP6_STATELESS + /* in info-requesting state? */ + if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) { + dhcp6_set_state(dhcp6, DHCP6_STATE_STATELESS_IDLE, "dhcp6_recv"); + dhcp6_handle_config_reply(netif, p); + } else +#endif /* LWIP_IPV6_DHCP6_STATELESS */ + { + /* @todo: handle reply in other states? */ + } + } else { + /* @todo: handle other message types */ + } + +free_pbuf_and_return: + pbuf_free(p); +} + +/** + * A DHCPv6 request has timed out. + * + * The timer that was started with the DHCPv6 request has + * timed out, indicating no response was received in time. + */ +static void +dhcp6_timeout(struct netif *netif, struct dhcp6 *dhcp6) +{ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp6_timeout()\n")); + + LWIP_UNUSED_ARG(netif); + LWIP_UNUSED_ARG(dhcp6); + +#if LWIP_IPV6_DHCP6_STATELESS + /* back-off period has passed, or server selection timed out */ + if (dhcp6->state == DHCP6_STATE_REQUESTING_CONFIG) { + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("dhcp6_timeout(): retrying information request\n")); + dhcp6_information_request(netif, dhcp6); + } +#endif /* LWIP_IPV6_DHCP6_STATELESS */ +} + +/** + * DHCPv6 timeout handling (this function must be called every 500ms, + * see @ref DHCP6_TIMER_MSECS). + * + * A DHCPv6 server is expected to respond within a short period of time. + * This timer checks whether an outstanding DHCPv6 request is timed out. + */ +void +dhcp6_tmr(void) +{ + struct netif *netif; + /* loop through netif's */ + NETIF_FOREACH(netif) { + struct dhcp6 *dhcp6 = netif_dhcp6_data(netif); + /* only act on DHCPv6 configured interfaces */ + if (dhcp6 != NULL) { + /* timer is active (non zero), and is about to trigger now */ + if (dhcp6->request_timeout > 1) { + dhcp6->request_timeout--; + } else if (dhcp6->request_timeout == 1) { + dhcp6->request_timeout--; + /* { dhcp6->request_timeout == 0 } */ + LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp6_tmr(): request timeout\n")); + /* this client's request timeout triggered */ + dhcp6_timeout(netif, dhcp6); + } + } + } +} + +#endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ethip6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ethip6.c similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ethip6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ethip6.c index 8f9a91b..fec8b28 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ethip6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ethip6.c @@ -82,6 +82,11 @@ ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr) const u8_t *hwaddr; err_t result; + LWIP_ASSERT_CORE_LOCKED(); + + /* The destination IP address must be properly zoned from here on down. */ + IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif); + /* multicast destination IP address? */ if (ip6_addr_ismulticast(ip6addr)) { /* Hash IP multicast address to MAC address.*/ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/icmp6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/icmp6.c similarity index 57% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/icmp6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/icmp6.c index 59ff4e2..4fd1021 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/icmp6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/icmp6.c @@ -57,15 +57,17 @@ #include -#ifndef LWIP_ICMP6_DATASIZE -#define LWIP_ICMP6_DATASIZE 8 -#endif -#if LWIP_ICMP6_DATASIZE == 0 -#define LWIP_ICMP6_DATASIZE 8 +#if !LWIP_ICMP6_DATASIZE || (LWIP_ICMP6_DATASIZE > (IP6_MIN_MTU_LENGTH - IP6_HLEN - ICMP6_HLEN)) +#undef LWIP_ICMP6_DATASIZE +#define LWIP_ICMP6_DATASIZE (IP6_MIN_MTU_LENGTH - IP6_HLEN - ICMP6_HLEN) #endif /* Forward declarations */ static void icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type); +static void icmp6_send_response_with_addrs(struct pbuf *p, u8_t code, u32_t data, + u8_t type, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr); +static void icmp6_send_response_with_addrs_and_netif(struct pbuf *p, u8_t code, u32_t data, + u8_t type, const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr, struct netif *netif); /** @@ -118,7 +120,6 @@ icmp6_input(struct pbuf *p, struct netif *inp) case ICMP6_TYPE_PTB: /* Packet too big */ nd6_input(p, inp); return; -// break; case ICMP6_TYPE_RS: #if LWIP_IPV6_FORWARD /* @todo implement router functionality */ @@ -130,7 +131,6 @@ icmp6_input(struct pbuf *p, struct netif *inp) case ICMP6_TYPE_MLD: mld6_input(p, inp); return; -// break; #endif case ICMP6_TYPE_EREQ: #if !LWIP_MULTICAST_PING @@ -209,6 +209,9 @@ icmp6_input(struct pbuf *p, struct netif *inp) /** * Send an icmpv6 'destination unreachable' packet. * + * This function must be used only in direct response to a packet that is being + * received right now. Otherwise, address zones would be lost. + * * @param p the input packet for which the 'unreachable' should be sent, * p->payload pointing to the IPv6 header * @param c ICMPv6 code for the unreachable type @@ -222,6 +225,9 @@ icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c) /** * Send an icmpv6 'packet too big' packet. * + * This function must be used only in direct response to a packet that is being + * received right now. Otherwise, address zones would be lost. + * * @param p the input packet for which the 'packet too big' should be sent, * p->payload pointing to the IPv6 header * @param mtu the maximum mtu that we can accept @@ -235,7 +241,10 @@ icmp6_packet_too_big(struct pbuf *p, u32_t mtu) /** * Send an icmpv6 'time exceeded' packet. * - * @param p the input packet for which the 'unreachable' should be sent, + * This function must be used only in direct response to a packet that is being + * received right now. Otherwise, address zones would be lost. + * + * @param p the input packet for which the 'time exceeded' should be sent, * p->payload pointing to the IPv6 header * @param c ICMPv6 code for the time exceeded type */ @@ -245,22 +254,50 @@ icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c) icmp6_send_response(p, c, 0, ICMP6_TYPE_TE); } +/** + * Send an icmpv6 'time exceeded' packet, with explicit source and destination + * addresses. + * + * This function may be used to send a response sometime after receiving the + * packet for which this response is meant. The provided source and destination + * addresses are used primarily to retain their zone information. + * + * @param p the input packet for which the 'time exceeded' should be sent, + * p->payload pointing to the IPv6 header + * @param c ICMPv6 code for the time exceeded type + * @param src_addr source address of the original packet, with zone information + * @param dest_addr destination address of the original packet, with zone + * information + */ +void +icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, + const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr) +{ + icmp6_send_response_with_addrs(p, c, 0, ICMP6_TYPE_TE, src_addr, dest_addr); +} + /** * Send an icmpv6 'parameter problem' packet. * + * This function must be used only in direct response to a packet that is being + * received right now. Otherwise, address zones would be lost and the calculated + * offset would be wrong (calculated against ip6_current_header()). + * * @param p the input packet for which the 'param problem' should be sent, * p->payload pointing to the IP header * @param c ICMPv6 code for the param problem type * @param pointer the pointer to the byte where the parameter is found */ void -icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer) +icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer) { - icmp6_send_response(p, c, pointer, ICMP6_TYPE_PP); + u32_t pointer_u32 = (u32_t)((const u8_t *)pointer - (const u8_t *)ip6_current_header()); + icmp6_send_response(p, c, pointer_u32, ICMP6_TYPE_PP); } /** * Send an ICMPv6 packet in response to an incoming packet. + * The packet is sent *to* ip_current_src_addr() on ip_current_netif(). * * @param p the input packet for which the response should be sent, * p->payload pointing to the IPv6 header @@ -271,66 +308,113 @@ icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer) static void icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type) { - struct pbuf *q; - struct icmp6_hdr *icmp6hdr; - const ip6_addr_t *reply_src; - ip6_addr_t *reply_dest; - ip6_addr_t reply_src_local, reply_dest_local; - struct ip6_hdr *ip6hdr; + const struct ip6_addr *reply_src, *reply_dest; + struct netif *netif = ip_current_netif(); + + LWIP_ASSERT("icmpv6 packet not a direct response", netif != NULL); + reply_dest = ip6_current_src_addr(); + + /* Select an address to use as source. */ + reply_src = ip_2_ip6(ip6_select_source_address(netif, reply_dest)); + if (reply_src == NULL) { + ICMP6_STATS_INC(icmp6.rterr); + return; + } + icmp6_send_response_with_addrs_and_netif(p, code, data, type, reply_src, reply_dest, netif); +} + +/** + * Send an ICMPv6 packet in response to an incoming packet. + * + * Call this function if the packet is NOT sent as a direct response to an + * incoming packet, but rather sometime later (e.g. for a fragment reassembly + * timeout). The caller must provide the zoned source and destination addresses + * from the original packet with the src_addr and dest_addr parameters. The + * reason for this approach is that while the addresses themselves are part of + * the original packet, their zone information is not, thus possibly resulting + * in a link-local response being sent over the wrong link. + * + * @param p the input packet for which the response should be sent, + * p->payload pointing to the IPv6 header + * @param code Code of the ICMPv6 header + * @param data Additional 32-bit parameter in the ICMPv6 header + * @param type Type of the ICMPv6 header + * @param src_addr original source address + * @param dest_addr original destination address + */ +static void +icmp6_send_response_with_addrs(struct pbuf *p, u8_t code, u32_t data, u8_t type, + const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr) +{ + const struct ip6_addr *reply_src, *reply_dest; struct netif *netif; - /* ICMPv6 header + IPv6 header + data */ - q = pbuf_alloc(PBUF_IP, sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE, + /* Get the destination address and netif for this ICMP message. */ + LWIP_ASSERT("must provide both source and destination", src_addr != NULL); + LWIP_ASSERT("must provide both source and destination", dest_addr != NULL); + + /* Special case, as ip6_current_xxx is either NULL, or points + to a different packet than the one that expired. */ + IP6_ADDR_ZONECHECK(src_addr); + IP6_ADDR_ZONECHECK(dest_addr); + /* Swap source and destination for the reply. */ + reply_dest = src_addr; + reply_src = dest_addr; + netif = ip6_route(reply_src, reply_dest); + if (netif == NULL) { + ICMP6_STATS_INC(icmp6.rterr); + return; + } + icmp6_send_response_with_addrs_and_netif(p, code, data, type, reply_src, + reply_dest, netif); +} + +/** + * Send an ICMPv6 packet (with srd/dst address and netif given). + * + * @param p the input packet for which the response should be sent, + * p->payload pointing to the IPv6 header + * @param code Code of the ICMPv6 header + * @param data Additional 32-bit parameter in the ICMPv6 header + * @param type Type of the ICMPv6 header + * @param reply_src source address of the packet to send + * @param reply_dest destination address of the packet to send + * @param netif netif to send the packet + */ +static void +icmp6_send_response_with_addrs_and_netif(struct pbuf *p, u8_t code, u32_t data, u8_t type, + const ip6_addr_t *reply_src, const ip6_addr_t *reply_dest, struct netif *netif) +{ + struct pbuf *q; + struct icmp6_hdr *icmp6hdr; + u16_t datalen = LWIP_MIN(p->tot_len, LWIP_ICMP6_DATASIZE); + u16_t offset; + + /* ICMPv6 header + datalen (as much of the offending packet as possible) */ + q = pbuf_alloc(PBUF_IP, sizeof(struct icmp6_hdr) + datalen, PBUF_RAM); if (q == NULL) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMPv6 packet.\n")); ICMP6_STATS_INC(icmp6.memerr); return; } - LWIP_ASSERT("check that first pbuf can hold icmp 6message", - (q->len >= (sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE))); + LWIP_ASSERT("check that first pbuf can hold icmp6 header", + (q->len >= (sizeof(struct icmp6_hdr)))); icmp6hdr = (struct icmp6_hdr *)q->payload; icmp6hdr->type = type; icmp6hdr->code = code; - icmp6hdr->data = data; + icmp6hdr->data = lwip_htonl(data); - /* copy fields from original packet */ - SMEMCPY((u8_t *)q->payload + sizeof(struct icmp6_hdr), (u8_t *)p->payload, - IP6_HLEN + LWIP_ICMP6_DATASIZE); - - /* Get the destination address and netif for this ICMP message. */ - if ((ip_current_netif() == NULL) || - ((code == ICMP6_TE_FRAG) && (type == ICMP6_TYPE_TE))) { - /* Special case, as ip6_current_xxx is either NULL, or points - * to a different packet than the one that expired. - * We must use the addresses that are stored in the expired packet. */ - ip6hdr = (struct ip6_hdr *)p->payload; - /* copy from packed address to aligned address */ - ip6_addr_copy(reply_dest_local, ip6hdr->src); - ip6_addr_copy(reply_src_local, ip6hdr->dest); - reply_dest = &reply_dest_local; - reply_src = &reply_src_local; - netif = ip6_route(reply_src, reply_dest); - if (netif == NULL) { - /* drop */ - pbuf_free(q); - ICMP6_STATS_INC(icmp6.rterr); - return; - } - } - else { - netif = ip_current_netif(); - reply_dest = ip6_current_src_addr(); - - /* Select an address to use as source. */ - reply_src = ip_2_ip6(ip6_select_source_address(netif, reply_dest)); - if (reply_src == NULL) { - /* drop */ - pbuf_free(q); - ICMP6_STATS_INC(icmp6.rterr); - return; - } + /* copy fields from original packet (which may be a chain of pbufs) */ + offset = sizeof(struct icmp6_hdr); + while (p && datalen) { + u16_t len = LWIP_MIN(datalen, p->len); + err_t res = pbuf_take_at(q, p->payload, len, offset); + if (res != ERR_OK) break; + datalen -= len; + offset += len; + p = p->next; } /* calculate checksum */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/inet6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/inet6.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/inet6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/inet6.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6.c similarity index 55% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6.c index f14e334..060d5f3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6.c @@ -51,7 +51,7 @@ #include "lwip/ip6_addr.h" #include "lwip/ip6_frag.h" #include "lwip/icmp6.h" -#include "lwip/raw.h" +#include "lwip/priv/raw_priv.h" #include "lwip/udp.h" #include "lwip/priv/tcp_priv.h" #include "lwip/dhcp6.h" @@ -68,13 +68,15 @@ * Finds the appropriate network interface for a given IPv6 address. It tries to select * a netif following a sequence of heuristics: * 1) if there is only 1 netif, return it - * 2) if the destination is a link-local address, try to match the src address to a netif. - * this is a tricky case because with multiple netifs, link-local addresses only have - * meaning within a particular subnet/link. - * 3) tries to match the destination subnet to a configured address - * 4) tries to find a router - * 5) tries to match the source address to the netif - * 6) returns the default netif, if configured + * 2) if the destination is a zoned address, match its zone to a netif + * 3) if the either the source or destination address is a scoped address, + * match the source address's zone (if set) or address (if not) to a netif + * 4) tries to match the destination subnet to a configured address + * 5) tries to find a router-announced route + * 6) tries to match the (unscoped) source address to the netif + * 7) returns the default netif, if configured + * + * Note that each of the two given addresses may or may not be properly zoned. * * @param src the source IPv6 address, if known * @param dest the destination IPv6 address for which to find the route @@ -83,50 +85,101 @@ struct netif * ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) { +#if LWIP_SINGLE_NETIF + LWIP_UNUSED_ARG(src); + LWIP_UNUSED_ARG(dest); +#else /* LWIP_SINGLE_NETIF */ struct netif *netif; s8_t i; + LWIP_ASSERT_CORE_LOCKED(); + /* If single netif configuration, fast return. */ if ((netif_list != NULL) && (netif_list->next == NULL)) { - if (!netif_is_up(netif_list) || !netif_is_link_up(netif_list)) { + if (!netif_is_up(netif_list) || !netif_is_link_up(netif_list) || + (ip6_addr_has_zone(dest) && !ip6_addr_test_zone(dest, netif_list))) { return NULL; } return netif_list; } - /* Special processing for link-local addresses. */ - if (ip6_addr_islinklocal(dest)) { - if (ip6_addr_isany(src)) { - /* Use default netif, if Up. */ - if (netif_default == NULL || !netif_is_up(netif_default) || - !netif_is_link_up(netif_default)) { - return NULL; +#if LWIP_IPV6_SCOPES + /* Special processing for zoned destination addresses. This includes link- + * local unicast addresses and interface/link-local multicast addresses. Use + * the zone to find a matching netif. If the address is not zoned, then there + * is technically no "wrong" netif to choose, and we leave routing to other + * rules; in most cases this should be the scoped-source rule below. */ + if (ip6_addr_has_zone(dest)) { + IP6_ADDR_ZONECHECK(dest); + /* Find a netif based on the zone. For custom mappings, one zone may map + * to multiple netifs, so find one that can actually send a packet. */ + NETIF_FOREACH(netif) { + if (ip6_addr_test_zone(dest, netif) && + netif_is_up(netif) && netif_is_link_up(netif)) { + return netif; } - return netif_default; } + /* No matching netif found. Do no try to route to a different netif, + * as that would be a zone violation, resulting in any packets sent to + * that netif being dropped on output. */ + return NULL; + } +#endif /* LWIP_IPV6_SCOPES */ - /* Try to find the netif for the source address, checking that link is up. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { - if (!netif_is_up(netif) || !netif_is_link_up(netif)) { - continue; - } - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(src, netif_ip6_addr(netif, i))) { + /* Special processing for scoped source and destination addresses. If we get + * here, the destination address does not have a zone, so either way we need + * to look at the source address, which may or may not have a zone. If it + * does, the zone is restrictive: there is (typically) only one matching + * netif for it, and we should avoid routing to any other netif as that would + * result in guaranteed zone violations. For scoped source addresses that do + * not have a zone, use (only) a netif that has that source address locally + * assigned. This case also applies to the loopback source address, which has + * an implied link-local scope. If only the destination address is scoped + * (but, again, not zoned), we still want to use only the source address to + * determine its zone because that's most likely what the user/application + * wants, regardless of whether the source address is scoped. Finally, some + * of this story also applies if scoping is disabled altogether. */ +#if LWIP_IPV6_SCOPES + if (ip6_addr_has_scope(dest, IP6_UNKNOWN) || + ip6_addr_has_scope(src, IP6_UNICAST) || +#else /* LWIP_IPV6_SCOPES */ + if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_iflocal(dest) || + ip6_addr_ismulticast_linklocal(dest) || ip6_addr_islinklocal(src) || +#endif /* LWIP_IPV6_SCOPES */ + ip6_addr_isloopback(src)) { +#if LWIP_IPV6_SCOPES + if (ip6_addr_has_zone(src)) { + /* Find a netif matching the source zone (relatively cheap). */ + NETIF_FOREACH(netif) { + if (netif_is_up(netif) && netif_is_link_up(netif) && + ip6_addr_test_zone(src, netif)) { return netif; } } + } else +#endif /* LWIP_IPV6_SCOPES */ + { + /* Find a netif matching the source address (relatively expensive). */ + NETIF_FOREACH(netif) { + if (!netif_is_up(netif) || !netif_is_link_up(netif)) { + continue; + } + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + ip6_addr_cmp_zoneless(src, netif_ip6_addr(netif, i))) { + return netif; + } + } + } } - - /* netif not found, use default netif, if up */ - if (netif_default == NULL || !netif_is_up(netif_default) || - !netif_is_link_up(netif_default)) { - return NULL; - } - return netif_default; + /* Again, do not use any other netif in this case, as that could result in + * zone boundary violations. */ + return NULL; } - /* we come here for non-link-local addresses */ + /* We come here only if neither source nor destination is scoped. */ + IP6_ADDR_ZONECHECK(src); + #ifdef LWIP_HOOK_IP6_ROUTE netif = LWIP_HOOK_IP6_ROUTE(src, dest); if (netif != NULL) { @@ -134,28 +187,36 @@ ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) } #endif - /* See if the destination subnet matches a configured address. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { + /* See if the destination subnet matches a configured address. In accordance + * with RFC 5942, dynamically configured addresses do not have an implied + * local subnet, and thus should be considered /128 assignments. However, as + * such, the destination address may still match a local address, and so we + * still need to check for exact matches here. By (lwIP) policy, statically + * configured addresses do always have an implied local /64 subnet. */ + NETIF_FOREACH(netif) { if (!netif_is_up(netif) || !netif_is_link_up(netif)) { continue; } for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { + ip6_addr_netcmp(dest, netif_ip6_addr(netif, i)) && + (netif_ip6_addr_isstatic(netif, i) || + ip6_addr_nethostcmp(dest, netif_ip6_addr(netif, i)))) { return netif; } } } - /* Get the netif for a suitable router. */ + /* Get the netif for a suitable router-announced route. */ netif = nd6_find_route(dest); - if ((netif != NULL) && netif_is_up(netif) && netif_is_link_up(netif)) { + if (netif != NULL) { return netif; } - /* try with the netif that matches the source address. */ + /* Try with the netif that matches the source address. Given the earlier rule + * for scoped source addresses, this applies to unscoped addresses only. */ if (!ip6_addr_isany(src)) { - for (netif = netif_list; netif != NULL; netif = netif->next) { + NETIF_FOREACH(netif) { if (!netif_is_up(netif) || !netif_is_link_up(netif)) { continue; } @@ -176,7 +237,7 @@ ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) return netif_default; } /* default netif is not up, just use any netif for loopback traffic */ - for (netif = netif_list; netif != NULL; netif = netif->next) { + NETIF_FOREACH(netif) { if (netif_is_up(netif)) { return netif; } @@ -184,6 +245,7 @@ ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) return NULL; } #endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */ +#endif /* !LWIP_SINGLE_NETIF */ /* no matching netif found, use default netif, if up */ if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default)) { @@ -194,85 +256,100 @@ ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest) /** * @ingroup ip6 - * Select the best IPv6 source address for a given destination - * IPv6 address. Loosely follows RFC 3484. "Strong host" behavior - * is assumed. + * Select the best IPv6 source address for a given destination IPv6 address. + * + * This implementation follows RFC 6724 Sec. 5 to the following extent: + * - Rules 1, 2, 3: fully implemented + * - Rules 4, 5, 5.5: not applicable + * - Rule 6: not implemented + * - Rule 7: not applicable + * - Rule 8: limited to "prefer /64 subnet match over non-match" + * + * For Rule 2, we deliberately deviate from RFC 6724 Sec. 3.1 by considering + * ULAs to be of smaller scope than global addresses, to avoid that a preferred + * ULA is picked over a deprecated global address when given a global address + * as destination, as that would likely result in broken two-way communication. + * + * As long as temporary addresses are not supported (as used in Rule 7), a + * proper implementation of Rule 8 would obviate the need to implement Rule 6. * * @param netif the netif on which to send a packet - * @param dest the destination we are trying to reach + * @param dest the destination we are trying to reach (possibly not properly + * zoned) * @return the most suitable source address to use, or NULL if no suitable * source address is found */ const ip_addr_t * ip6_select_source_address(struct netif *netif, const ip6_addr_t *dest) { - const ip_addr_t *src = NULL; - u8_t i; + const ip_addr_t *best_addr; + const ip6_addr_t *cand_addr; + s8_t dest_scope, cand_scope; + s8_t best_scope = IP6_MULTICAST_SCOPE_RESERVED; + u8_t i, cand_pref, cand_bits; + u8_t best_pref = 0; + u8_t best_bits = 0; - /* If dest is link-local, choose a link-local source. */ - if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_linklocal(dest) || ip6_addr_ismulticast_iflocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_islinklocal(netif_ip6_addr(netif, i))) { - return netif_ip_addr6(netif, i); - } - } + /* Start by determining the scope of the given destination address. These + * tests are hopefully (roughly) in order of likeliness to match. */ + if (ip6_addr_isglobal(dest)) { + dest_scope = IP6_MULTICAST_SCOPE_GLOBAL; + } else if (ip6_addr_islinklocal(dest) || ip6_addr_isloopback(dest)) { + dest_scope = IP6_MULTICAST_SCOPE_LINK_LOCAL; + } else if (ip6_addr_isuniquelocal(dest)) { + dest_scope = IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL; + } else if (ip6_addr_ismulticast(dest)) { + dest_scope = ip6_addr_multicast_scope(dest); + } else if (ip6_addr_issitelocal(dest)) { + dest_scope = IP6_MULTICAST_SCOPE_SITE_LOCAL; + } else { + /* no match, consider scope global */ + dest_scope = IP6_MULTICAST_SCOPE_GLOBAL; } - /* Choose a site-local with matching prefix. */ - if (ip6_addr_issitelocal(dest) || ip6_addr_ismulticast_sitelocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_issitelocal(netif_ip6_addr(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip_addr6(netif, i); - } - } - } + best_addr = NULL; - /* Choose a unique-local with matching prefix. */ - if (ip6_addr_isuniquelocal(dest) || ip6_addr_ismulticast_orglocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_isuniquelocal(netif_ip6_addr(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip_addr6(netif, i); - } - } - } - - /* Choose a global with best matching prefix. */ - if (ip6_addr_isglobal(dest) || ip6_addr_ismulticast_global(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_isglobal(netif_ip6_addr(netif, i))) { - if (src == NULL) { - src = netif_ip_addr6(netif, i); - } - else { - /* Replace src only if we find a prefix match. */ - /* @todo find longest matching prefix. */ - if ((!(ip6_addr_netcmp(ip_2_ip6(src), dest))) && - ip6_addr_netcmp(netif_ip6_addr(netif, i), dest)) { - src = netif_ip_addr6(netif, i); - } - } - } - } - if (src != NULL) { - return src; - } - } - - /* Last resort: see if arbitrary prefix matches. */ for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip_addr6(netif, i); + /* Consider only valid (= preferred and deprecated) addresses. */ + if (!ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) { + continue; + } + /* Determine the scope of this candidate address. Same ordering idea. */ + cand_addr = netif_ip6_addr(netif, i); + if (ip6_addr_isglobal(cand_addr)) { + cand_scope = IP6_MULTICAST_SCOPE_GLOBAL; + } else if (ip6_addr_islinklocal(cand_addr)) { + cand_scope = IP6_MULTICAST_SCOPE_LINK_LOCAL; + } else if (ip6_addr_isuniquelocal(cand_addr)) { + cand_scope = IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL; + } else if (ip6_addr_issitelocal(cand_addr)) { + cand_scope = IP6_MULTICAST_SCOPE_SITE_LOCAL; + } else { + /* no match, treat as low-priority global scope */ + cand_scope = IP6_MULTICAST_SCOPE_RESERVEDF; + } + cand_pref = ip6_addr_ispreferred(netif_ip6_addr_state(netif, i)); + /* @todo compute the actual common bits, for longest matching prefix. */ + /* We cannot count on the destination address having a proper zone + * assignment, so do not compare zones in this case. */ + cand_bits = ip6_addr_netcmp_zoneless(cand_addr, dest); /* just 1 or 0 for now */ + if (cand_bits && ip6_addr_nethostcmp(cand_addr, dest)) { + return netif_ip_addr6(netif, i); /* Rule 1 */ + } + if ((best_addr == NULL) || /* no alternative yet */ + ((cand_scope < best_scope) && (cand_scope >= dest_scope)) || + ((cand_scope > best_scope) && (best_scope < dest_scope)) || /* Rule 2 */ + ((cand_scope == best_scope) && ((cand_pref > best_pref) || /* Rule 3 */ + ((cand_pref == best_pref) && (cand_bits > best_bits))))) { /* Rule 8 */ + /* We found a new "winning" candidate. */ + best_addr = netif_ip_addr6(netif, i); + best_scope = cand_scope; + best_pref = cand_pref; + best_bits = cand_bits; } } - return NULL; + return best_addr; /* may be NULL */ } #if LWIP_IPV6_FORWARD @@ -321,6 +398,20 @@ ip6_forward(struct pbuf *p, struct ip6_hdr *iphdr, struct netif *inp) IP6_STATS_INC(ip6.drop); return; } +#if LWIP_IPV6_SCOPES + /* Do not forward packets with a zoned (e.g., link-local) source address + * outside of their zone. We determined the zone a bit earlier, so we know + * that the address is properly zoned here, so we can safely use has_zone. + * Also skip packets with a loopback source address (link-local implied). */ + if ((ip6_addr_has_zone(ip6_current_src_addr()) && + !ip6_addr_test_zone(ip6_current_src_addr(), netif)) || + ip6_addr_isloopback(ip6_current_src_addr())) { + LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not forwarding packet beyond its source address zone.\n")); + IP6_STATS_INC(ip6.rterr); + IP6_STATS_INC(ip6.drop); + return; + } +#endif /* LWIP_IPV6_SCOPES */ /* Do not forward packets onto the same network interface on which * they arrived. */ if (netif == inp) { @@ -373,6 +464,33 @@ ip6_forward(struct pbuf *p, struct ip6_hdr *iphdr, struct netif *inp) } #endif /* LWIP_IPV6_FORWARD */ +/** Return true if the current input packet should be accepted on this netif */ +static int +ip6_input_accept(struct netif *netif) +{ + /* interface is up? */ + if (netif_is_up(netif)) { + u8_t i; + /* unicast to this interface address? address configured? */ + /* If custom scopes are used, the destination zone will be tested as + * part of the local-address comparison, but we need to test the source + * scope as well (e.g., is this interface on the same link?). */ + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(netif, i)) +#if IPV6_CUSTOM_SCOPES + && (!ip6_addr_has_zone(ip6_current_src_addr()) || + ip6_addr_test_zone(ip6_current_src_addr(), netif)) +#endif /* IPV6_CUSTOM_SCOPES */ + ) { + /* accept on this netif */ + return 1; + } + } + } + return 0; +} + /** * This function is called by the network interface device driver when * an IPv6 packet is received. The function does the basic checks of the @@ -392,13 +510,17 @@ ip6_input(struct pbuf *p, struct netif *inp) { struct ip6_hdr *ip6hdr; struct netif *netif; - u8_t nexth; - u16_t hlen; /* the current header length */ - u8_t i; + const u8_t *nexth; + u16_t hlen, hlen_tot; /* the current header length */ #if 0 /*IP_ACCEPT_LINK_LAYER_ADDRESSING*/ @todo int check_ip_src=1; #endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ +#if LWIP_RAW + raw_input_state_t raw_status; +#endif /* LWIP_RAW */ + + LWIP_ASSERT_CORE_LOCKED(); IP6_STATS_INC(ip6.recv); @@ -421,7 +543,7 @@ ip6_input(struct pbuf *p, struct netif *inp) #endif /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ - if ((IP6_HLEN > p->len) || ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len)) { + if ((IP6_HLEN > p->len) || (IP6H_PLEN(ip6hdr) > (p->tot_len - IP6_HLEN))) { if (IP6_HLEN > p->len) { LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IPv6 header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", @@ -441,22 +563,28 @@ ip6_input(struct pbuf *p, struct netif *inp) /* Trim pbuf. This should have been done at the netif layer, * but we'll do it anyway just to be sure that its done. */ - pbuf_realloc(p, IP6_HLEN + IP6H_PLEN(ip6hdr)); + pbuf_realloc(p, (u16_t)(IP6_HLEN + IP6H_PLEN(ip6hdr))); /* copy IP addresses to aligned ip6_addr_t */ - ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest); - ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src); + ip_addr_copy_from_ip6_packed(ip_data.current_iphdr_dest, ip6hdr->dest); + ip_addr_copy_from_ip6_packed(ip_data.current_iphdr_src, ip6hdr->src); /* Don't accept virtual IPv4 mapped IPv6 addresses. * Don't accept multicast source addresses. */ if (ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_dest)) || ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_src)) || ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_src))) { + /* free (drop) packet pbufs */ + pbuf_free(p); IP6_STATS_INC(ip6.err); IP6_STATS_INC(ip6.drop); return ERR_OK; } + /* Set the appropriate zone identifier on the addresses. */ + ip6_addr_assign_zone(ip_2_ip6(&ip_data.current_iphdr_dest), IP6_UNKNOWN, inp); + ip6_addr_assign_zone(ip_2_ip6(&ip_data.current_iphdr_src), IP6_UNICAST, inp); + /* current header pointer. */ ip_data.current_ip6_header = ip6hdr; @@ -477,6 +605,7 @@ ip6_input(struct pbuf *p, struct netif *inp) } #else /* LWIP_IPV6_MLD */ else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) { + u8_t i; /* Filter solicited node packets when MLD is not enabled * (for Neighbor discovery). */ netif = NULL; @@ -496,46 +625,44 @@ ip6_input(struct pbuf *p, struct netif *inp) } } else { /* start trying with inp. if that's not acceptable, start walking the - list of configured netifs. - 'first' is used as a boolean to mark whether we started walking the list */ - int first = 1; - netif = inp; - do { - /* interface is up? */ - if (netif_is_up(netif)) { - /* unicast to this interface address? address configured? */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(netif, i))) { - /* exit outer loop */ - goto netif_found; - } - } + list of configured netifs. */ + if (ip6_input_accept(inp)) { + netif = inp; + } else { + netif = NULL; +#if !IPV6_CUSTOM_SCOPES + /* Shortcut: stop looking for other interfaces if either the source or + * the destination has a scope constrained to this interface. Custom + * scopes may break the 1:1 link/interface mapping, however. */ + if (ip6_addr_islinklocal(ip6_current_dest_addr()) || + ip6_addr_islinklocal(ip6_current_src_addr())) { + goto netif_found; } - if (first) { - if (ip6_addr_islinklocal(ip6_current_dest_addr()) +#endif /* !IPV6_CUSTOM_SCOPES */ #if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF - || ip6_addr_isloopback(ip6_current_dest_addr()) + /* The loopback address is to be considered link-local. Packets to it + * should be dropped on other interfaces, as per RFC 4291 Sec. 2.5.3. + * Its implied scope means packets *from* the loopback address should + * not be accepted on other interfaces, either. These requirements + * cannot be implemented in the case that loopback traffic is sent + * across a non-loopback interface, however. */ + if (ip6_addr_isloopback(ip6_current_dest_addr()) || + ip6_addr_isloopback(ip6_current_src_addr())) { + goto netif_found; + } #endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */ - ) { - /* Do not match link-local addresses to other netifs. The loopback - * address is to be considered link-local and packets to it should be - * dropped on other interfaces, as per RFC 4291 Sec. 2.5.3. This - * requirement cannot be implemented in the case that loopback - * traffic is sent across a non-loopback interface, however. - */ - netif = NULL; +#if !LWIP_SINGLE_NETIF + NETIF_FOREACH(netif) { + if (netif == inp) { + /* we checked that before already */ + continue; + } + if (ip6_input_accept(netif)) { break; } - first = 0; - netif = netif_list; - } else { - netif = netif->next; } - if (netif == inp) { - netif = netif->next; - } - } while (netif != NULL); +#endif /* !LWIP_SINGLE_NETIF */ + } netif_found: LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet accepted on interface %c%c\n", netif ? netif->name[0] : 'X', netif? netif->name[1] : 'X')); @@ -571,29 +698,35 @@ netif_found: ip_data.current_netif = netif; /* Save next header type. */ - nexth = IP6H_NEXTH(ip6hdr); + nexth = &IP6H_NEXTH(ip6hdr); /* Init header length. */ - hlen = ip_data.current_ip_header_tot_len = IP6_HLEN; + hlen = hlen_tot = IP6_HLEN; /* Move to payload. */ - pbuf_header(p, -IP6_HLEN); + pbuf_remove_header(p, IP6_HLEN); /* Process known option extension headers, if present. */ - while (nexth != IP6_NEXTH_NONE) + while (*nexth != IP6_NEXTH_NONE) { - switch (nexth) { + switch (*nexth) { case IP6_NEXTH_HOPBYHOP: + { + s32_t opt_offset; + struct ip6_hbh_hdr *hbh_hdr; + struct ip6_opt_hdr *opt_hdr; LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header\n")); + + /* Get and check the header length, while staying in packet bounds. */ + hbh_hdr = (struct ip6_hbh_hdr *)p->payload; + /* Get next header type. */ - nexth = *((u8_t *)p->payload); + nexth = &IP6_HBH_NEXTH(hbh_hdr); /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; + hlen = (u16_t)(8 * (1 + hbh_hdr->_hlen)); - /* Skip over this header. */ - if (hlen > p->len) { + if ((p->len < 8) || (hlen > p->len)) { LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", hlen, p->len)); @@ -604,19 +737,85 @@ netif_found: goto ip6_input_cleanup; } - pbuf_header(p, -(s16_t)hlen); + hlen_tot = (u16_t)(hlen_tot + hlen); + + /* The extended option header starts right after Hop-by-Hop header. */ + opt_offset = IP6_HBH_HLEN; + while (opt_offset < hlen) + { + s32_t opt_dlen = 0; + + opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + opt_offset); + + switch (IP6_OPT_TYPE(opt_hdr)) { + /* @todo: process IPV6 Hop-by-Hop option data */ + case IP6_PAD1_OPTION: + /* PAD1 option doesn't have length and value field */ + opt_dlen = -1; + break; + case IP6_PADN_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + case IP6_ROUTER_ALERT_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + case IP6_JUMBO_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + default: + /* Check 2 MSB of Hop-by-Hop header type. */ + switch (IP6_OPT_TYPE_ACTION(opt_hdr)) { + case 1: + /* Discard the packet. */ + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + case 2: + /* Send ICMP Parameter Problem */ + icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + case 3: + /* Send ICMP Parameter Problem if destination address is not a multicast address */ + if (!ip6_addr_ismulticast(ip6_current_dest_addr())) { + icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr); + } + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid Hop-by-Hop option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + default: + /* Skip over this option. */ + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + } + break; + } + + /* Adjust the offset to move to the next extended option header */ + opt_offset = opt_offset + IP6_OPT_HLEN + opt_dlen; + } + pbuf_remove_header(p, hlen); break; + } case IP6_NEXTH_DESTOPTS: + { + s32_t opt_offset; + struct ip6_dest_hdr *dest_hdr; + struct ip6_opt_hdr *opt_hdr; LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Destination options header\n")); + + dest_hdr = (struct ip6_dest_hdr *)p->payload; + /* Get next header type. */ - nexth = *((u8_t *)p->payload); + nexth = &IP6_DEST_NEXTH(dest_hdr); /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; - - /* Skip over this header. */ - if (hlen > p->len) { + hlen = 8 * (1 + dest_hdr->_hlen); + if ((p->len < 8) || (hlen > p->len)) { LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", hlen, p->len)); @@ -627,19 +826,90 @@ netif_found: goto ip6_input_cleanup; } - pbuf_header(p, -(s16_t)hlen); + hlen_tot = (u16_t)(hlen_tot + hlen); + + /* The extended option header starts right after Destination header. */ + opt_offset = IP6_DEST_HLEN; + while (opt_offset < hlen) + { + s32_t opt_dlen = 0; + + opt_hdr = (struct ip6_opt_hdr *)((u8_t *)dest_hdr + opt_offset); + + switch (IP6_OPT_TYPE(opt_hdr)) + { + /* @todo: process IPV6 Destination option data */ + case IP6_PAD1_OPTION: + /* PAD1 option deosn't have length and value field */ + opt_dlen = -1; + break; + case IP6_PADN_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + case IP6_ROUTER_ALERT_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + case IP6_JUMBO_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + case IP6_HOME_ADDRESS_OPTION: + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + default: + /* Check 2 MSB of Destination header type. */ + switch (IP6_OPT_TYPE_ACTION(opt_hdr)) + { + case 1: + /* Discard the packet. */ + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + case 2: + /* Send ICMP Parameter Problem */ + icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + case 3: + /* Send ICMP Parameter Problem if destination address is not a multicast address */ + if (!ip6_addr_ismulticast(ip6_current_dest_addr())) { + icmp6_param_problem(p, ICMP6_PP_OPTION, opt_hdr); + } + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid destination option type dropped.\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + default: + /* Skip over this option. */ + opt_dlen = IP6_OPT_DLEN(opt_hdr); + break; + } + break; + } + + /* Adjust the offset to move to the next extended option header */ + opt_offset = opt_offset + IP6_OPT_HLEN + opt_dlen; + } + + pbuf_remove_header(p, hlen); break; + } case IP6_NEXTH_ROUTING: + { + struct ip6_rout_hdr *rout_hdr; LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Routing header\n")); + + rout_hdr = (struct ip6_rout_hdr *)p->payload; + /* Get next header type. */ - nexth = *((u8_t *)p->payload); + nexth = &IP6_ROUT_NEXTH(rout_hdr); /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; + hlen = 8 * (1 + rout_hdr->_hlen); - /* Skip over this header. */ - if (hlen > p->len) { + if ((p->len < 8) || (hlen > p->len)) { LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", hlen, p->len)); @@ -650,9 +920,41 @@ netif_found: goto ip6_input_cleanup; } - pbuf_header(p, -(s16_t)hlen); - break; + /* Skip over this header. */ + hlen_tot = (u16_t)(hlen_tot + hlen); + /* if segment left value is 0 in routing header, ignore the option */ + if (IP6_ROUT_SEG_LEFT(rout_hdr)) { + /* The length field of routing option header must be even */ + if (rout_hdr->_hlen & 0x1) { + /* Discard and send parameter field error */ + icmp6_param_problem(p, ICMP6_PP_FIELD, &rout_hdr->_hlen); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + } + + switch (IP6_ROUT_TYPE(rout_hdr)) + { + /* TODO: process routing by the type */ + case IP6_ROUT_TYPE2: + break; + case IP6_ROUT_RPL: + break; + default: + /* Discard unrecognized routing type and send parameter field error */ + icmp6_param_problem(p, ICMP6_PP_FIELD, &IP6_ROUT_TYPE(rout_hdr)); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid routing type dropped\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + } + } + + pbuf_remove_header(p, hlen); + break; + } case IP6_NEXTH_FRAGMENT: { struct ip6_frag_hdr *frag_hdr; @@ -661,11 +963,10 @@ netif_found: frag_hdr = (struct ip6_frag_hdr *)p->payload; /* Get next header type. */ - nexth = frag_hdr->_nexth; + nexth = &IP6_FRAG_NEXTH(frag_hdr); /* Fragment Header length. */ hlen = 8; - ip_data.current_ip_header_tot_len += hlen; /* Make sure this header fits in current pbuf. */ if (hlen > p->len) { @@ -679,16 +980,27 @@ netif_found: goto ip6_input_cleanup; } + hlen_tot = (u16_t)(hlen_tot + hlen); + + /* check payload length is multiple of 8 octets when mbit is set */ + if (IP6_FRAG_MBIT(frag_hdr) && (IP6H_PLEN(ip6hdr) & 0x7)) { + /* ipv6 payload length is not multiple of 8 octets */ + icmp6_param_problem(p, ICMP6_PP_FIELD, LWIP_PACKED_CAST(const void *, &ip6hdr->_plen)); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid payload length dropped\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; + } + /* Offset == 0 and more_fragments == 0? */ if ((frag_hdr->_fragment_offset & PP_HTONS(IP6_FRAG_OFFSET_MASK | IP6_FRAG_MORE_FLAG)) == 0) { - /* This is a 1-fragment packet, usually a packet that we have - * already reassembled. Skip this header anc continue. */ - pbuf_header(p, -(s16_t)hlen); + /* This is a 1-fragment packet. Skip this header and continue. */ + pbuf_remove_header(p, hlen); } else { #if LWIP_IPV6_REASS - /* reassemble the packet */ + ip_data.current_ip_header_tot_len = hlen_tot; p = ip6_reass(p); /* packet not fully reassembled yet? */ if (p == NULL) { @@ -698,9 +1010,9 @@ netif_found: /* Returned p point to IPv6 header. * Update all our variables and pointers and continue. */ ip6hdr = (struct ip6_hdr *)p->payload; - nexth = IP6H_NEXTH(ip6hdr); - hlen = ip_data.current_ip_header_tot_len = IP6_HLEN; - pbuf_header(p, -IP6_HLEN); + nexth = &IP6H_NEXTH(ip6hdr); + hlen = hlen_tot = IP6_HLEN; + pbuf_remove_header(p, IP6_HLEN); #else /* LWIP_IPV6_REASS */ /* free (drop) packet pbufs */ @@ -715,25 +1027,40 @@ netif_found: } default: goto options_done; - break; + } + + if (*nexth == IP6_NEXTH_HOPBYHOP) { + /* Hop-by-Hop header comes only as a first option */ + icmp6_param_problem(p, ICMP6_PP_HEADER, nexth); + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header dropped (only valid as a first option)\n")); + pbuf_free(p); + IP6_STATS_INC(ip6.drop); + goto ip6_input_cleanup; } } -options_done: - /* p points to IPv6 header again. */ - pbuf_header_force(p, (s16_t)ip_data.current_ip_header_tot_len); +options_done: /* send to upper layers */ LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: \n")); ip6_debug_print(p); LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); + ip_data.current_ip_header_tot_len = hlen_tot; + #if LWIP_RAW + /* p points to IPv6 header again for raw_input. */ + pbuf_add_header_force(p, hlen_tot); /* raw input did not eat the packet? */ - if (raw_input(p, inp) == 0) -#endif /* LWIP_RAW */ + raw_status = raw_input(p, inp); + if (raw_status != RAW_INPUT_EATEN) { - switch (nexth) { + /* Point to payload. */ + pbuf_remove_header(p, hlen_tot); +#else /* LWIP_RAW */ + { +#endif /* LWIP_RAW */ + switch (*nexth) { case IP6_NEXTH_NONE: pbuf_free(p); break; @@ -742,37 +1069,40 @@ options_done: #if LWIP_UDPLITE case IP6_NEXTH_UDPLITE: #endif /* LWIP_UDPLITE */ - /* Point to payload. */ - pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len); udp_input(p, inp); break; #endif /* LWIP_UDP */ #if LWIP_TCP case IP6_NEXTH_TCP: - /* Point to payload. */ - pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len); tcp_input(p, inp); break; #endif /* LWIP_TCP */ #if LWIP_ICMP6 case IP6_NEXTH_ICMP6: - /* Point to payload. */ - pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len); icmp6_input(p, inp); break; #endif /* LWIP_ICMP */ default: +#if LWIP_RAW + if (raw_status == RAW_INPUT_DELIVERED) { + /* @todo: ipv6 mib in-delivers? */ + } else +#endif /* LWIP_RAW */ + { #if LWIP_ICMP6 - /* send ICMP parameter problem unless it was a multicast or ICMPv6 */ - if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) && - (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) { - icmp6_param_problem(p, ICMP6_PP_HEADER, ip_data.current_ip_header_tot_len - hlen); - } + /* p points to IPv6 header again for raw_input. */ + pbuf_add_header_force(p, hlen_tot); + /* send ICMP parameter problem unless it was a multicast or ICMPv6 */ + if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) && + (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) { + icmp6_param_problem(p, ICMP6_PP_HEADER, nexth); + } #endif /* LWIP_ICMP */ - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", (u16_t)IP6H_NEXTH(ip6hdr))); + LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", (u16_t)IP6H_NEXTH(ip6hdr))); + IP6_STATS_INC(ip6.proterr); + IP6_STATS_INC(ip6.drop); + } pbuf_free(p); - IP6_STATS_INC(ip6.proterr); - IP6_STATS_INC(ip6.drop); break; } } @@ -803,15 +1133,17 @@ ip6_input_cleanup: IPv6 header and p->payload points to that IPv6 header) * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an * IP address of the netif is selected and used as source address. - * if src == NULL, IP6_ADDR_ANY is used as source) - * @param dest the destination IPv6 address to send the packet to + * if src == NULL, IP6_ADDR_ANY is used as source) (src is possibly not + * properly zoned) + * @param dest the destination IPv6 address to send the packet to (possibly not + * properly zoned) * @param hl the Hop Limit value to be set in the IPv6 header * @param tc the Traffic Class value to be set in the IPv6 header * @param nexth the Next Header to be set in the IPv6 header * @param netif the netif on which to send this packet * @return ERR_OK if the packet was sent OK * ERR_BUF if p doesn't have enough space for IPv6/LINK headers - * returns errors returned by netif->output + * returns errors returned by netif->output_ip6 */ err_t ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, @@ -845,12 +1177,27 @@ ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, struct ip6_hdr *ip6hdr; ip6_addr_t dest_addr; + LWIP_ASSERT_CORE_LOCKED(); LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p); /* Should the IPv6 header be generated or is it already included in p? */ if (dest != LWIP_IP_HDRINCL) { +#if LWIP_IPV6_SCOPES + /* If the destination address is scoped but lacks a zone, add a zone now, + * based on the outgoing interface. The lower layers (e.g., nd6) absolutely + * require addresses to be properly zoned for correctness. In some cases, + * earlier attempts will have been made to add a zone to the destination, + * but this function is the only one that is called in all (other) cases, + * so we must do this here. */ + if (ip6_addr_lacks_zone(dest, IP6_UNKNOWN)) { + ip6_addr_copy(dest_addr, *dest); + ip6_addr_assign_zone(&dest_addr, IP6_UNKNOWN, netif); + dest = &dest_addr; + } +#endif /* LWIP_IPV6_SCOPES */ + /* generate IPv6 header */ - if (pbuf_header(p, IP6_HLEN)) { + if (pbuf_add_header(p, IP6_HLEN)) { LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_output: not enough room for IPv6 header in pbuf\n")); IP6_STATS_INC(ip6.err); return ERR_BUF; @@ -864,21 +1211,22 @@ ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, IP6H_NEXTH_SET(ip6hdr, nexth); /* dest cannot be NULL here */ - ip6_addr_copy(ip6hdr->dest, *dest); + ip6_addr_copy_to_packed(ip6hdr->dest, *dest); IP6H_VTCFL_SET(ip6hdr, 6, tc, 0); - IP6H_PLEN_SET(ip6hdr, p->tot_len - IP6_HLEN); + IP6H_PLEN_SET(ip6hdr, (u16_t)(p->tot_len - IP6_HLEN)); if (src == NULL) { src = IP6_ADDR_ANY6; } /* src cannot be NULL here */ - ip6_addr_copy(ip6hdr->src, *src); + ip6_addr_copy_to_packed(ip6hdr->src, *src); } else { /* IP header already included in p */ ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(dest_addr, ip6hdr->dest); + ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest); + ip6_addr_assign_zone(&dest_addr, IP6_UNKNOWN, netif); dest = &dest_addr; } @@ -904,10 +1252,15 @@ ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, } } } +#if LWIP_MULTICAST_TX_OPTIONS + if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) { + netif_loop_output(netif, p); + } +#endif /* LWIP_MULTICAST_TX_OPTIONS */ #endif /* ENABLE_LOOPBACK */ #if LWIP_IPV6_FRAG /* don't fragment if interface has mtu set to 0 [loopif] */ - if (netif->mtu && (p->tot_len > nd6_get_destination_mtu(dest, netif))) { + if (netif_mtu6(netif) && (p->tot_len > nd6_get_destination_mtu(dest, netif))) { return ip6_frag(p, netif, dest); } #endif /* LWIP_IPV6_FRAG */ @@ -949,9 +1302,10 @@ ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, } else { /* IP header included in p, read addresses. */ ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(src_addr, ip6hdr->src); - ip6_addr_copy(dest_addr, ip6hdr->dest); + ip6_addr_copy_from_packed(src_addr, ip6hdr->src); + ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest); netif = ip6_route(&src_addr, &dest_addr); + dest = &dest_addr; } if (netif == NULL) { @@ -972,7 +1326,7 @@ ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, } -#if LWIP_NETIF_HWADDRHINT +#if LWIP_NETIF_USE_HINTS /** Like ip6_output, but takes and addr_hint pointer that is passed on to netif->addr_hint * before calling ip6_output_if. * @@ -986,7 +1340,7 @@ ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, * @param hl the Hop Limit value to be set in the IPv6 header * @param tc the Traffic Class value to be set in the IPv6 header * @param nexth the Next Header to be set in the IPv6 header - * @param addr_hint address hint pointer set to netif->addr_hint before + * @param netif_hint netif output hint pointer set to netif->hint before * calling ip_output_if() * * @return ERR_RTE if no route is found @@ -994,7 +1348,7 @@ ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, */ err_t ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, - u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint) + u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint) { struct netif *netif; struct ip6_hdr *ip6hdr; @@ -1008,9 +1362,10 @@ ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, } else { /* IP header included in p, read addresses. */ ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(src_addr, ip6hdr->src); - ip6_addr_copy(dest_addr, ip6hdr->dest); + ip6_addr_copy_from_packed(src_addr, ip6hdr->src); + ip6_addr_copy_from_packed(dest_addr, ip6hdr->dest); netif = ip6_route(&src_addr, &dest_addr); + dest = &dest_addr; } if (netif == NULL) { @@ -1027,13 +1382,13 @@ ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, return ERR_RTE; } - NETIF_SET_HWADDRHINT(netif, addr_hint); + NETIF_SET_HINTS(netif, netif_hint); err = ip6_output_if(p, src, dest, hl, tc, nexth, netif); - NETIF_SET_HWADDRHINT(netif, NULL); + NETIF_RESET_HINTS(netif); return err; } -#endif /* LWIP_NETIF_HWADDRHINT*/ +#endif /* LWIP_NETIF_USE_HINTS*/ #if LWIP_IPV6_MLD /** @@ -1049,25 +1404,42 @@ ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, err_t ip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value) { + u8_t *opt_data; + u32_t offset = 0; struct ip6_hbh_hdr *hbh_hdr; + struct ip6_opt_hdr *opt_hdr; + /* fixed 4 bytes for router alert option and 2 bytes padding */ + const u8_t hlen = (sizeof(struct ip6_opt_hdr) * 2) + IP6_ROUTER_ALERT_DLEN; /* Move pointer to make room for hop-by-hop options header. */ - if (pbuf_header(p, sizeof(struct ip6_hbh_hdr))) { + if (pbuf_add_header(p, sizeof(struct ip6_hbh_hdr) + hlen)) { LWIP_DEBUGF(IP6_DEBUG, ("ip6_options: no space for options header\n")); IP6_STATS_INC(ip6.err); return ERR_BUF; } + /* Set fields of Hop-by-Hop header */ hbh_hdr = (struct ip6_hbh_hdr *)p->payload; - - /* Set fields. */ - hbh_hdr->_nexth = nexth; + IP6_HBH_NEXTH(hbh_hdr) = nexth; hbh_hdr->_hlen = 0; - hbh_hdr->_ra_opt_type = IP6_ROUTER_ALERT_OPTION; - hbh_hdr->_ra_opt_dlen = 2; - hbh_hdr->_ra_opt_data = value; - hbh_hdr->_padn_opt_type = IP6_PADN_ALERT_OPTION; - hbh_hdr->_padn_opt_dlen = 0; + offset = IP6_HBH_HLEN; + + /* Set router alert options to Hop-by-Hop extended option header */ + opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + offset); + IP6_OPT_TYPE(opt_hdr) = IP6_ROUTER_ALERT_OPTION; + IP6_OPT_DLEN(opt_hdr) = IP6_ROUTER_ALERT_DLEN; + offset += IP6_OPT_HLEN; + + /* Set router alert option data */ + opt_data = (u8_t *)hbh_hdr + offset; + opt_data[0] = value; + opt_data[1] = 0; + offset += IP6_OPT_DLEN(opt_hdr); + + /* add 2 bytes padding to make 8 bytes Hop-by-Hop header length */ + opt_hdr = (struct ip6_opt_hdr *)((u8_t *)hbh_hdr + offset); + IP6_OPT_TYPE(opt_hdr) = IP6_PADN_OPTION; + IP6_OPT_DLEN(opt_hdr) = 0; return ERR_OK; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_addr.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_addr.c similarity index 78% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_addr.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_addr.c index a3ba91c..687c02f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_addr.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_addr.c @@ -47,20 +47,16 @@ #include "lwip/ip_addr.h" #include "lwip/def.h" +#include + +#if LWIP_IPV4 +#include "lwip/ip4_addr.h" /* for ip6addr_aton to handle IPv4-mapped addresses */ +#endif /* LWIP_IPV4 */ + /* used by IP6_ADDR_ANY(6) in ip6_addr.h */ const ip_addr_t ip6_addr_any = IPADDR6_INIT(0ul, 0ul, 0ul, 0ul); -#ifndef isprint -#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) -#define isprint(c) in_range(c, 0x20, 0x7f) -#define isdigit(c) in_range(c, '0', '9') -#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) -#define islower(c) in_range(c, 'a', 'z') -#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') -#endif -#ifndef xchar -#define xchar(i) ((i) < 10 ? '0' + (i) : 'A' + (i) - 10) -#endif +#define lwip_xchar(i) ((char)((i) < 10 ? '0' + (i) : 'A' + (i) - 10)) /** * Check whether "cp" is a valid ascii representation @@ -76,6 +72,9 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr) { u32_t addr_index, zero_blocks, current_block_index, current_block_value; const char *s; +#if LWIP_IPV4 + int check_ipv4_mapped = 0; +#endif /* LWIP_IPV4 */ /* Count the number of colons, to count the number of blocks in a "::" sequence zero_blocks may be 1 even if there are no :: sequences */ @@ -83,7 +82,19 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr) for (s = cp; *s != 0; s++) { if (*s == ':') { zero_blocks--; - } else if (!isxdigit(*s)) { +#if LWIP_IPV4 + } else if (*s == '.') { + if ((zero_blocks == 5) ||(zero_blocks == 2)) { + check_ipv4_mapped = 1; + /* last block could be the start of an IPv4 address */ + zero_blocks--; + } else { + /* invalid format */ + return 0; + } + break; +#endif /* LWIP_IPV4 */ + } else if (!lwip_isxdigit(*s)) { break; } } @@ -103,6 +114,22 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr) } } current_block_index++; +#if LWIP_IPV4 + if (check_ipv4_mapped) { + if (current_block_index == 6) { + ip4_addr_t ip4; + int ret = ip4addr_aton(s + 1, &ip4); + if (ret) { + if (addr) { + addr->addr[3] = lwip_htonl(ip4.addr); + current_block_index++; + goto fix_byte_order_and_return; + } + return 1; + } + } + } +#endif /* LWIP_IPV4 */ current_block_value = 0; if (current_block_index > 7) { /* address too long! */ @@ -131,11 +158,11 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr) } } } - } else if (isxdigit(*s)) { + } else if (lwip_isxdigit(*s)) { /* add current digit */ current_block_value = (current_block_value << 4) + - (isdigit(*s) ? (u32_t)(*s - '0') : - (u32_t)(10 + (islower(*s) ? *s - 'a' : *s - 'A'))); + (lwip_isdigit(*s) ? (u32_t)(*s - '0') : + (u32_t)(10 + (lwip_islower(*s) ? *s - 'a' : *s - 'A'))); } else { /* unexpected digit, space? CRLF? */ break; @@ -149,13 +176,15 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr) else { addr->addr[addr_index] = current_block_value << 16; } - } - - /* convert to network byte order. */ - if (addr) { +#if LWIP_IPV4 +fix_byte_order_and_return: +#endif + /* convert to network byte order. */ for (addr_index = 0; addr_index < 4; addr_index++) { addr->addr[addr_index] = lwip_htonl(addr->addr[addr_index]); } + + ip6_addr_clear_zone(addr); } if (current_block_index != 7) { @@ -196,6 +225,26 @@ ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) s32_t i; u8_t zero_flag, empty_block_flag; +#if LWIP_IPV4 + if (ip6_addr_isipv4mappedipv6(addr)) { + /* This is an IPv4 mapped address */ + ip4_addr_t addr4; + char *ret; +#define IP4MAPPED_HEADER "::FFFF:" + char *buf_ip4 = buf + sizeof(IP4MAPPED_HEADER) - 1; + int buflen_ip4 = buflen - sizeof(IP4MAPPED_HEADER) + 1; + if (buflen < (int)sizeof(IP4MAPPED_HEADER)) { + return NULL; + } + memcpy(buf, IP4MAPPED_HEADER, sizeof(IP4MAPPED_HEADER)); + addr4.addr = addr->addr[3]; + ret = ip4addr_ntoa_r(&addr4, buf_ip4, buflen_ip4); + if (ret != buf_ip4) { + return NULL; + } + return buf; + } +#endif /* LWIP_IPV4 */ i = 0; empty_block_flag = 0; /* used to indicate a zero chain for "::' */ @@ -252,7 +301,7 @@ ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) if ((current_block_value & 0xf000) == 0) { zero_flag = 1; } else { - buf[i++] = xchar(((current_block_value & 0xf000) >> 12)); + buf[i++] = lwip_xchar(((current_block_value & 0xf000) >> 12)); zero_flag = 0; if (i >= buflen) { return NULL; @@ -262,7 +311,7 @@ ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) if (((current_block_value & 0xf00) == 0) && (zero_flag)) { /* do nothing */ } else { - buf[i++] = xchar(((current_block_value & 0xf00) >> 8)); + buf[i++] = lwip_xchar(((current_block_value & 0xf00) >> 8)); zero_flag = 0; if (i >= buflen) { return NULL; @@ -273,14 +322,14 @@ ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) /* do nothing */ } else { - buf[i++] = xchar(((current_block_value & 0xf0) >> 4)); + buf[i++] = lwip_xchar(((current_block_value & 0xf0) >> 4)); zero_flag = 0; if (i >= buflen) { return NULL; } } - buf[i++] = xchar((current_block_value & 0xf)); + buf[i++] = lwip_xchar((current_block_value & 0xf)); if (i >= buflen) { return NULL; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_frag.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_frag.c similarity index 74% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_frag.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_frag.c index bc0b45b..8b352f5 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/ip6_frag.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/ip6_frag.c @@ -71,6 +71,8 @@ #endif /* IP_REASS_FREE_OLDEST */ #if IPV6_FRAG_COPYHEADER +/* The number of bytes we need to "borrow" from (i.e., overwrite in) the header + * that precedes the fragment header for reassembly pruposes. */ #define IPV6_FRAG_REQROOM ((s16_t)(sizeof(struct ip6_reass_helper) - IP6_FRAG_HLEN)) #endif @@ -98,7 +100,7 @@ PACK_STRUCT_END #endif /* static variables */ -static struct ip6_reassdata *ip6_reassdatagrams; +static struct ip6_reassdata *reassdatagrams; static u16_t ip6_reass_pbufcount; /* Forward declarations. */ @@ -117,7 +119,7 @@ ip6_reass_tmr(void) sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN); #endif /* !IPV6_FRAG_COPYHEADER */ - r = ip6_reassdatagrams; + r = reassdatagrams; while (r != NULL) { /* Decrement the timer. Once it reaches 0, * clean up the incomplete fragment assembly */ @@ -158,17 +160,28 @@ ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr) /* First, de-queue the first pbuf from r->p. */ p = ipr->p; ipr->p = iprh->next_pbuf; + /* Restore the part that we've overwritten with our helper structure, or we + * might send garbage (and disclose a pointer) in the ICMPv6 reply. */ + MEMCPY(p->payload, ipr->orig_hdr, sizeof(iprh)); /* Then, move back to the original ipv6 header (we are now pointing to Fragment header). This cannot fail since we already checked when receiving this fragment. */ - if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)IPV6_FRAG_HDRREF(ipr->iphdr)))) { + if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)ipr->iphdr))) { LWIP_ASSERT("ip6_reass_free: moving p->payload to ip6 header failed\n", 0); } else { - icmp6_time_exceeded(p, ICMP6_TE_FRAG); + /* Reconstruct the zoned source and destination addresses, so that we do + * not end up sending the ICMP response over the wrong link. */ + ip6_addr_t src_addr, dest_addr; + ip6_addr_copy_from_packed(src_addr, IPV6_FRAG_SRC(ipr)); + ip6_addr_set_zone(&src_addr, ipr->src_zone); + ip6_addr_copy_from_packed(dest_addr, IPV6_FRAG_DEST(ipr)); + ip6_addr_set_zone(&dest_addr, ipr->dest_zone); + /* Send the actual ICMP response. */ + icmp6_time_exceeded_with_addrs(p, ICMP6_TE_FRAG, &src_addr, &dest_addr); } clen = pbuf_clen(p); LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; + pbufs_freed = (u16_t)(pbufs_freed + clen); pbuf_free(p); } #endif /* LWIP_ICMP6 */ @@ -184,15 +197,15 @@ ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr) p = iprh->next_pbuf; clen = pbuf_clen(pcur); LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; + pbufs_freed = (u16_t)(pbufs_freed + clen); pbuf_free(pcur); } /* Then, unchain the struct ip6_reassdata from the list and free it. */ - if (ipr == ip6_reassdatagrams) { - ip6_reassdatagrams = ipr->next; + if (ipr == reassdatagrams) { + reassdatagrams = ipr->next; } else { - prev = ip6_reassdatagrams; + prev = reassdatagrams; while (prev != NULL) { if (prev->next == ipr) { break; @@ -207,7 +220,7 @@ ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr) /* Finally, update number of pbufs in reassembly queue */ LWIP_ASSERT("ip_reass_pbufcount >= clen", ip6_reass_pbufcount >= pbufs_freed); - ip6_reass_pbufcount -= pbufs_freed; + ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount - pbufs_freed); } #if IP_REASS_FREE_OLDEST @@ -227,7 +240,7 @@ ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed) /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, * but don't free the current datagram! */ do { - r = oldest = ip6_reassdatagrams; + r = oldest = reassdatagrams; while (r != NULL) { if (r != ipr) { if (r->timer <= oldest->timer) { @@ -244,7 +257,7 @@ ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed) if (oldest != NULL) { ip6_reass_free_complete_datagram(oldest); } - } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (ip6_reassdatagrams != NULL)); + } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (reassdatagrams != NULL)); } #endif /* IP_REASS_FREE_OLDEST */ @@ -261,19 +274,17 @@ ip6_reass(struct pbuf *p) struct ip6_reassdata *ipr, *ipr_prev; struct ip6_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; struct ip6_frag_hdr *frag_hdr; - u16_t offset, len; + u16_t offset, len, start, end; + ptrdiff_t hdrdiff; u16_t clen; u8_t valid = 1; - struct pbuf *q; + struct pbuf *q, *next_pbuf; IP6_FRAG_STATS_INC(ip6_frag.recv); - if ((const void*)ip6_current_header() != ((u8_t*)p->payload) - IP6_HLEN) { - /* ip6_frag_hdr must be in the first pbuf, not chained */ - IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; - } + /* ip6_frag_hdr must be in the first pbuf, not chained. Checked by caller. */ + LWIP_ASSERT("IPv6 fragment header does not fit in first pbuf", + p->len >= sizeof(struct ip6_frag_hdr)); frag_hdr = (struct ip6_frag_hdr *) p->payload; @@ -285,18 +296,32 @@ ip6_reass(struct pbuf *p) * Adjust for headers before Fragment Header. * And finally adjust by Fragment Header length. */ len = lwip_ntohs(ip6_current_header()->_plen); - len -= (u16_t)(((u8_t*)p->payload - (const u8_t*)ip6_current_header()) - IP6_HLEN); - len -= IP6_FRAG_HLEN; + hdrdiff = (u8_t*)p->payload - (const u8_t*)ip6_current_header(); + LWIP_ASSERT("not a valid pbuf (ip6_input check missing?)", hdrdiff <= 0xFFFF); + LWIP_ASSERT("not a valid pbuf (ip6_input check missing?)", hdrdiff >= IP6_HLEN); + hdrdiff -= IP6_HLEN; + hdrdiff += IP6_FRAG_HLEN; + if (hdrdiff > len) { + IP6_FRAG_STATS_INC(ip6_frag.proterr); + goto nullreturn; + } + len = (u16_t)(len - hdrdiff); + start = (offset & IP6_FRAG_OFFSET_MASK); + if (start > (0xFFFF - len)) { + /* u16_t overflow, cannot handle this */ + IP6_FRAG_STATS_INC(ip6_frag.proterr); + goto nullreturn; + } /* Look for the datagram the fragment belongs to in the current datagram queue, * remembering the previous in the queue for later dequeueing. */ - for (ipr = ip6_reassdatagrams, ipr_prev = NULL; ipr != NULL; ipr = ipr->next) { + for (ipr = reassdatagrams, ipr_prev = NULL; ipr != NULL; ipr = ipr->next) { /* Check if the incoming fragment matches the one currently present in the reassembly buffer. If so, we proceed with copying the fragment into the buffer. */ if ((frag_hdr->_identification == ipr->identification) && - ip6_addr_cmp(ip6_current_src_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->src)) && - ip6_addr_cmp(ip6_current_dest_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->dest))) { + ip6_addr_cmp_packed(ip6_current_src_addr(), &(IPV6_FRAG_SRC(ipr)), ipr->src_zone) && + ip6_addr_cmp_packed(ip6_current_dest_addr(), &(IPV6_FRAG_DEST(ipr)), ipr->dest_zone)) { IP6_FRAG_STATS_INC(ip6_frag.cachehit); break; } @@ -313,7 +338,7 @@ ip6_reass(struct pbuf *p) ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA); if (ipr != NULL) { /* re-search ipr_prev since it might have been removed */ - for (ipr_prev = ip6_reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { + for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { if (ipr_prev->next == ipr) { break; } @@ -322,28 +347,36 @@ ip6_reass(struct pbuf *p) #endif /* IP_REASS_FREE_OLDEST */ { IP6_FRAG_STATS_INC(ip6_frag.memerr); - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; } } memset(ipr, 0, sizeof(struct ip6_reassdata)); - ipr->timer = IP_REASS_MAXAGE; + ipr->timer = IPV6_REASS_MAXAGE; /* enqueue the new structure to the front of the list */ - ipr->next = ip6_reassdatagrams; - ip6_reassdatagrams = ipr; + ipr->next = reassdatagrams; + reassdatagrams = ipr; /* Use the current IPv6 header for src/dest address reference. * Eventually, we will replace it when we get the first fragment * (it might be this one, in any case, it is done later). */ -#if IPV6_FRAG_COPYHEADER - MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN); -#else /* IPV6_FRAG_COPYHEADER */ /* need to use the none-const pointer here: */ ipr->iphdr = ip_data.current_ip6_header; +#if IPV6_FRAG_COPYHEADER + MEMCPY(&ipr->src, &ip6_current_header()->src, sizeof(ipr->src)); + MEMCPY(&ipr->dest, &ip6_current_header()->dest, sizeof(ipr->dest)); #endif /* IPV6_FRAG_COPYHEADER */ - +#if LWIP_IPV6_SCOPES + /* Also store the address zone information. + * @todo It is possible that due to netif destruction and recreation, the + * stored zones end up resolving to a different interface. In that case, we + * risk sending a "time exceeded" ICMP response over the wrong link. + * Ideally, netif destruction would clean up matching pending reassembly + * structures, but custom zone mappings would make that non-trivial. */ + ipr->src_zone = ip6_addr_zone(ip6_current_src_addr()); + ipr->dest_zone = ip6_addr_zone(ip6_current_dest_addr()); +#endif /* LWIP_IPV6_SCOPES */ /* copy the fragmented packet id. */ ipr->identification = frag_hdr->_identification; @@ -357,7 +390,7 @@ ip6_reass(struct pbuf *p) ip6_reass_remove_oldest_datagram(ipr, clen); if ((ip6_reass_pbufcount + clen) <= IP_REASS_MAX_PBUFS) { /* re-search ipr_prev since it might have been removed */ - for (ipr_prev = ip6_reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { + for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) { if (ipr_prev->next == ipr) { break; } @@ -368,7 +401,6 @@ ip6_reass(struct pbuf *p) /* @todo: send ICMPv6 time exceeded here? */ /* drop this pbuf */ IP6_FRAG_STATS_INC(ip6_frag.memerr); - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; } } @@ -386,35 +418,37 @@ ip6_reass(struct pbuf *p) LWIP_ASSERT("sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1", sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN); #endif /* IPV6_FRAG_COPYHEADER */ + + /* Prepare the pointer to the helper structure, and its initial values. + * Do not yet write to the structure itself, as we still have to make a + * backup of the original data, and we should not do that until we know for + * sure that we are going to add this packet to the list. */ iprh = (struct ip6_reass_helper *)p->payload; - iprh->next_pbuf = NULL; - iprh->start = (offset & IP6_FRAG_OFFSET_MASK); - iprh->end = (offset & IP6_FRAG_OFFSET_MASK) + len; + next_pbuf = NULL; + end = (u16_t)(start + len); /* find the right place to insert this pbuf */ /* Iterate through until we either get to the end of the list (append), * or we find on with a larger offset (insert). */ for (q = ipr->p; q != NULL;) { iprh_tmp = (struct ip6_reass_helper*)q->payload; - if (iprh->start < iprh_tmp->start) { + if (start < iprh_tmp->start) { #if IP_REASS_CHECK_OVERLAP - if (iprh->end > iprh_tmp->start) { + if (end > iprh_tmp->start) { /* fragment overlaps with following, throw away */ IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; } if (iprh_prev != NULL) { - if (iprh->start < iprh_prev->end) { + if (start < iprh_prev->end) { /* fragment overlaps with previous, throw away */ IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; } } #endif /* IP_REASS_CHECK_OVERLAP */ /* the new pbuf should be inserted before this */ - iprh->next_pbuf = q; + next_pbuf = q; if (iprh_prev != NULL) { /* not the fragment with the lowest offset */ iprh_prev->next_pbuf = p; @@ -423,15 +457,13 @@ ip6_reass(struct pbuf *p) ipr->p = p; } break; - } else if (iprh->start == iprh_tmp->start) { + } else if (start == iprh_tmp->start) { /* received the same datagram twice: no need to keep the datagram */ - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; #if IP_REASS_CHECK_OVERLAP - } else if (iprh->start < iprh_tmp->end) { + } else if (start < iprh_tmp->end) { /* overlap: no need to keep the new datagram */ IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); goto nullreturn; #endif /* IP_REASS_CHECK_OVERLAP */ } else { @@ -454,10 +486,10 @@ ip6_reass(struct pbuf *p) /* this is (for now), the fragment with the highest offset: * chain it to the last fragment */ #if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); + LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= start); #endif /* IP_REASS_CHECK_OVERLAP */ iprh_prev->next_pbuf = p; - if (iprh_prev->end != iprh->start) { + if (iprh_prev->end != start) { valid = 0; } } else { @@ -472,19 +504,23 @@ ip6_reass(struct pbuf *p) /* Track the current number of pbufs current 'in-flight', in order to limit the number of fragments that may be enqueued at any one time */ - ip6_reass_pbufcount += clen; + ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount + clen); /* Remember IPv6 header if this is the first fragment. */ - if (iprh->start == 0) { -#if IPV6_FRAG_COPYHEADER - if (iprh->next_pbuf != NULL) { - MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN); - } -#else /* IPV6_FRAG_COPYHEADER */ + if (start == 0) { /* need to use the none-const pointer here: */ ipr->iphdr = ip_data.current_ip6_header; -#endif /* IPV6_FRAG_COPYHEADER */ + /* Make a backup of the part of the packet data that we are about to + * overwrite, so that we can restore the original later. */ + MEMCPY(ipr->orig_hdr, p->payload, sizeof(*iprh)); + /* For IPV6_FRAG_COPYHEADER there is no need to copy src/dst again, as they + * will be the same as they were. With LWIP_IPV6_SCOPES, the same applies + * to the source/destination zones. */ } + /* Only after the backup do we get to fill in the actual helper structure. */ + iprh->next_pbuf = next_pbuf; + iprh->start = start; + iprh->end = end; /* If this is the last fragment, calculate total packet length. */ if ((offset & IP6_FRAG_MORE_FLAG) == 0) { @@ -520,17 +556,17 @@ ip6_reass(struct pbuf *p) /* chain together the pbufs contained within the ip6_reassdata list. */ iprh = (struct ip6_reass_helper*) ipr->p->payload; while (iprh != NULL) { - struct pbuf* next_pbuf = iprh->next_pbuf; + next_pbuf = iprh->next_pbuf; if (next_pbuf != NULL) { /* Save next helper struct (will be hidden in next step). */ iprh_tmp = (struct ip6_reass_helper*)next_pbuf->payload; /* hide the fragment header for every succeeding fragment */ - pbuf_header(next_pbuf, -IP6_FRAG_HLEN); + pbuf_remove_header(next_pbuf, IP6_FRAG_HLEN); #if IPV6_FRAG_COPYHEADER if (IPV6_FRAG_REQROOM > 0) { /* hide the extra bytes borrowed from ip6_hdr for struct ip6_reass_helper */ - u8_t hdrerr = pbuf_header(next_pbuf, -(s16_t)(IPV6_FRAG_REQROOM)); + u8_t hdrerr = pbuf_remove_header(next_pbuf, IPV6_FRAG_REQROOM); LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */ LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == 0); } @@ -544,42 +580,64 @@ ip6_reass(struct pbuf *p) iprh = iprh_tmp; } + /* Get the first pbuf. */ + p = ipr->p; + #if IPV6_FRAG_COPYHEADER if (IPV6_FRAG_REQROOM > 0) { + u8_t hdrerr; + /* Restore (only) the bytes that we overwrote beyond the fragment header. + * Those bytes may belong to either the IPv6 header or an extension + * header placed before the fragment header. */ + MEMCPY(p->payload, ipr->orig_hdr, IPV6_FRAG_REQROOM); /* get back room for struct ip6_reass_helper (only required if sizeof(void*) > 4) */ - u8_t hdrerr = pbuf_header(ipr->p, -(s16_t)(IPV6_FRAG_REQROOM)); + hdrerr = pbuf_remove_header(p, IPV6_FRAG_REQROOM); LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */ LWIP_ASSERT("no room for struct ip6_reass_helper", hdrerr == 0); } - iphdr_ptr = (struct ip6_hdr*)((u8_t*)ipr->p->payload - IP6_HLEN); - MEMCPY(iphdr_ptr, &ipr->iphdr, IP6_HLEN); -#else - iphdr_ptr = ipr->iphdr; #endif + /* We need to get rid of the fragment header itself, which is somewhere in + * the middle of the packet (but still in the first pbuf of the chain). + * Getting rid of the header is required by RFC 2460 Sec. 4.5 and necessary + * in order to be able to reassemble packets that are close to full size + * (i.e., around 65535 bytes). We simply move up all the headers before the + * fragment header, including the IPv6 header, and adjust the payload start + * accordingly. This works because all these headers are in the first pbuf + * of the chain, and because the caller adjusts all its pointers on + * successful reassembly. */ + MEMMOVE((u8_t*)ipr->iphdr + sizeof(struct ip6_frag_hdr), ipr->iphdr, + (size_t)((u8_t*)p->payload - (u8_t*)ipr->iphdr)); + + /* This is where the IPv6 header is now. */ + iphdr_ptr = (struct ip6_hdr*)((u8_t*)ipr->iphdr + + sizeof(struct ip6_frag_hdr)); + /* Adjust datagram length by adding header lengths. */ - ipr->datagram_len += (u16_t)(((u8_t*)ipr->p->payload - (u8_t*)iphdr_ptr) - + IP6_FRAG_HLEN + ipr->datagram_len = (u16_t)(ipr->datagram_len + ((u8_t*)p->payload - (u8_t*)iphdr_ptr) - IP6_HLEN); /* Set payload length in ip header. */ iphdr_ptr->_plen = lwip_htons(ipr->datagram_len); - /* Get the first pbuf. */ - p = ipr->p; + /* With the fragment header gone, we now need to adjust the next-header + * field of whatever header was originally before it. Since the packet made + * it through the original header processing routines at least up to the + * fragment header, we do not need any further sanity checks here. */ + if (IP6H_NEXTH(iphdr_ptr) == IP6_NEXTH_FRAGMENT) { + iphdr_ptr->_nexth = ipr->nexth; + } else { + u8_t *ptr = (u8_t *)iphdr_ptr + IP6_HLEN; + while (*ptr != IP6_NEXTH_FRAGMENT) { + ptr += 8 * (1 + ptr[1]); + } + *ptr = ipr->nexth; + } - /* Restore Fragment Header in first pbuf. Mark as "single fragment" - * packet. Restore nexth. */ - frag_hdr = (struct ip6_frag_hdr *) p->payload; - frag_hdr->_nexth = ipr->nexth; - frag_hdr->reserved = 0; - frag_hdr->_fragment_offset = 0; - frag_hdr->_identification = 0; - - /* release the sources allocate for the fragment queue entry */ - if (ip6_reassdatagrams == ipr) { + /* release the resources allocated for the fragment queue entry */ + if (reassdatagrams == ipr) { /* it was the first in the list */ - ip6_reassdatagrams = ipr->next; + reassdatagrams = ipr->next; } else { /* it wasn't the first, so it must have a valid 'prev' */ LWIP_ASSERT("sanity check linked list", ipr_prev != NULL); @@ -588,10 +646,11 @@ ip6_reass(struct pbuf *p) memp_free(MEMP_IP6_REASSDATA, ipr); /* adjust the number of pbufs currently queued for reassembly. */ - ip6_reass_pbufcount -= pbuf_clen(p); + clen = pbuf_clen(p); + LWIP_ASSERT("ip6_reass_pbufcount >= clen", ip6_reass_pbufcount >= clen); + ip6_reass_pbufcount = (u16_t)(ip6_reass_pbufcount - clen); - /* Move pbuf back to IPv6 header. - This cannot fail since we already checked when receiving this fragment. */ + /* Move pbuf back to IPv6 header. This should never fail. */ if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)iphdr_ptr))) { LWIP_ASSERT("ip6_reass: moving p->payload to ip6 header failed\n", 0); pbuf_free(p); @@ -605,6 +664,7 @@ ip6_reass(struct pbuf *p) return NULL; nullreturn: + IP6_FRAG_STATS_INC(ip6_frag.drop); pbuf_free(p); return NULL; } @@ -669,9 +729,9 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) u16_t left_to_copy; #endif static u32_t identification; - u16_t nfb; u16_t left, cop; - u16_t mtu; + const u16_t mtu = nd6_get_destination_mtu(dest, netif); + const u16_t nfb = (u16_t)((mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK); u16_t fragment_offset = 0; u16_t last; u16_t poff = IP6_HLEN; @@ -680,12 +740,9 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) original_ip6hdr = (struct ip6_hdr *)p->payload; - mtu = nd6_get_destination_mtu(dest, netif); - /* @todo we assume there are no options in the unfragmentable part (IPv6 header). */ - left = p->tot_len - IP6_HLEN; - - nfb = (mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK; + LWIP_ASSERT("p->tot_len >= IP6_HLEN", p->tot_len >= IP6_HLEN); + left = (u16_t)(p->tot_len - IP6_HLEN); while (left) { last = (left <= nfb); @@ -703,7 +760,7 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); poff += pbuf_copy_partial(p, (u8_t*)rambuf->payload + IP6_FRAG_HLEN, cop, poff); /* make room for the IP header */ - if (pbuf_header(rambuf, IP6_HLEN)) { + if (pbuf_add_header(rambuf, IP6_HLEN)) { pbuf_free(rambuf); IP6_FRAG_STATS_INC(ip6_frag.memerr); return ERR_MEM; @@ -724,15 +781,15 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) return ERR_MEM; } LWIP_ASSERT("this needs a pbuf in one piece!", - (p->len >= (IP6_HLEN))); + (rambuf->len >= (IP6_HLEN))); SMEMCPY(rambuf->payload, original_ip6hdr, IP6_HLEN); ip6hdr = (struct ip6_hdr *)rambuf->payload; frag_hdr = (struct ip6_frag_hdr *)((u8_t*)rambuf->payload + IP6_HLEN); /* Can just adjust p directly for needed offset. */ p->payload = (u8_t *)p->payload + poff; - p->len -= poff; - p->tot_len -= poff; + p->len = (u16_t)(p->len - poff); + p->tot_len = (u16_t)(p->tot_len - poff); left_to_copy = cop; while (left_to_copy) { @@ -765,7 +822,7 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) * so that it is removed when pbuf_dechain is later called on rambuf. */ pbuf_cat(rambuf, newpbuf); - left_to_copy -= newpbuflen; + left_to_copy = (u16_t)(left_to_copy - newpbuflen); if (left_to_copy) { p = p->next; } @@ -776,11 +833,11 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) /* Set headers */ frag_hdr->_nexth = original_ip6hdr->_nexth; frag_hdr->reserved = 0; - frag_hdr->_fragment_offset = lwip_htons((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG)); + frag_hdr->_fragment_offset = lwip_htons((u16_t)((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG))); frag_hdr->_identification = lwip_htonl(identification); IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT); - IP6H_PLEN_SET(ip6hdr, cop + IP6_FRAG_HLEN); + IP6H_PLEN_SET(ip6hdr, (u16_t)(cop + IP6_FRAG_HLEN)); /* No need for separate header pbuf - we allowed room for it in rambuf * when allocated. @@ -796,8 +853,8 @@ ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest) */ pbuf_free(rambuf); - left -= cop; - fragment_offset += cop; + left = (u16_t)(left - cop); + fragment_offset = (u16_t)(fragment_offset + cop); } return ERR_OK; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/mld6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/mld6.c similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/mld6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/mld6.c index 9acb82f..a9c917d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/mld6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/mld6.c @@ -6,7 +6,12 @@ * @ingroup ip6 * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710. * No support for MLDv2.\n - * To be called from TCPIP thread + * Note: The allnodes (ff01::1, ff02::1) group is assumed be received by your + * netif since it must always be received for correct IPv6 operation (e.g. SLAAC). + * Ensure the netif filters are configured accordingly!\n + * The netif flags also need NETIF_FLAG_MLD6 flag set to enable MLD6 on a + * netif ("netif->flags |= NETIF_FLAG_MLD6;").\n + * To be called from TCPIP thread. */ /* @@ -248,7 +253,7 @@ mld6_input(struct pbuf *p, struct netif *inp) while (group != NULL) { if ((!(ip6_addr_ismulticast_iflocal(&(group->group_address)))) && (!(ip6_addr_isallnodes_linklocal(&(group->group_address))))) { - mld6_delayed_report(group, mld_hdr->max_resp_delay); + mld6_delayed_report(group, lwip_ntohs(mld_hdr->max_resp_delay)); } group = group->next; } @@ -260,7 +265,7 @@ mld6_input(struct pbuf *p, struct netif *inp) group = mld6_lookfor_group(inp, ip6_current_dest_addr()); if (group != NULL) { /* Schedule a report. */ - mld6_delayed_report(group, mld_hdr->max_resp_delay); + mld6_delayed_report(group, lwip_ntohs(mld_hdr->max_resp_delay)); } } break; /* ICMP6_TYPE_MLQ */ @@ -293,11 +298,17 @@ mld6_input(struct pbuf *p, struct netif *inp) /** * @ingroup mld6 - * Join a group on a network interface. + * Join a group on one or all network interfaces. * - * @param srcaddr ipv6 address of the network interface which should - * join a new group. If IP6_ADDR_ANY, join on all netifs - * @param groupaddr the ipv6 address of the group to join + * If the group is to be joined on all interfaces, the given group address must + * not have a zone set (i.e., it must have its zone index set to IP6_NO_ZONE). + * If the group is to be joined on one particular interface, the given group + * address may or may not have a zone set. + * + * @param srcaddr ipv6 address (zoned) of the network interface which should + * join a new group. If IP6_ADDR_ANY6, join on all netifs + * @param groupaddr the ipv6 address of the group to join (possibly but not + * necessarily zoned) * @return ERR_OK if group was joined on the netif(s), an err_t otherwise */ err_t @@ -306,9 +317,10 @@ mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) err_t err = ERR_VAL; /* no matching interface */ struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); + /* loop through netif's */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { /* Should we join this interface ? */ if (ip6_addr_isany(srcaddr) || netif_get_ip6_addr_match(netif, srcaddr) >= 0) { @@ -317,9 +329,6 @@ mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) return err; } } - - /* proceed to next network interface */ - netif = netif->next; } return err; @@ -330,13 +339,28 @@ mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) * Join a group on a network interface. * * @param netif the network interface which should join a new group. - * @param groupaddr the ipv6 address of the group to join + * @param groupaddr the ipv6 address of the group to join (possibly but not + * necessarily zoned) * @return ERR_OK if group was joined on the netif, an err_t otherwise */ err_t mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr) { struct mld_group *group; +#if LWIP_IPV6_SCOPES + ip6_addr_t ip6addr; + + /* If the address has a particular scope but no zone set, use the netif to + * set one now. Within the mld6 module, all addresses are properly zoned. */ + if (ip6_addr_lacks_zone(groupaddr, IP6_MULTICAST)) { + ip6_addr_set(&ip6addr, groupaddr); + ip6_addr_assign_zone(&ip6addr, IP6_MULTICAST, netif); + groupaddr = &ip6addr; + } + IP6_ADDR_ZONECHECK_NETIF(groupaddr, netif); +#endif /* LWIP_IPV6_SCOPES */ + + LWIP_ASSERT_CORE_LOCKED(); /* find group or create a new one if not found */ group = mld6_lookfor_group(netif, groupaddr); @@ -368,9 +392,12 @@ mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr) * @ingroup mld6 * Leave a group on a network interface. * - * @param srcaddr ipv6 address of the network interface which should - * leave the group. If IP6_ISANY, leave on all netifs - * @param groupaddr the ipv6 address of the group to leave + * Zoning of address follows the same rules as @ref mld6_joingroup. + * + * @param srcaddr ipv6 address (zoned) of the network interface which should + * leave the group. If IP6_ADDR_ANY6, leave on all netifs + * @param groupaddr the ipv6 address of the group to leave (possibly, but not + * necessarily zoned) * @return ERR_OK if group was left on the netif(s), an err_t otherwise */ err_t @@ -379,9 +406,10 @@ mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) err_t err = ERR_VAL; /* no matching interface */ struct netif *netif; + LWIP_ASSERT_CORE_LOCKED(); + /* loop through netif's */ - netif = netif_list; - while (netif != NULL) { + NETIF_FOREACH(netif) { /* Should we leave this interface ? */ if (ip6_addr_isany(srcaddr) || netif_get_ip6_addr_match(netif, srcaddr) >= 0) { @@ -391,8 +419,6 @@ mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) err = res; } } - /* proceed to next network interface */ - netif = netif->next; } return err; @@ -403,13 +429,26 @@ mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr) * Leave a group on a network interface. * * @param netif the network interface which should leave the group. - * @param groupaddr the ipv6 address of the group to leave + * @param groupaddr the ipv6 address of the group to leave (possibly, but not + * necessarily zoned) * @return ERR_OK if group was left on the netif, an err_t otherwise */ err_t mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr) { struct mld_group *group; +#if LWIP_IPV6_SCOPES + ip6_addr_t ip6addr; + + if (ip6_addr_lacks_zone(groupaddr, IP6_MULTICAST)) { + ip6_addr_set(&ip6addr, groupaddr); + ip6_addr_assign_zone(&ip6addr, IP6_MULTICAST, netif); + groupaddr = &ip6addr; + } + IP6_ADDR_ZONECHECK_NETIF(groupaddr, netif); +#endif /* LWIP_IPV6_SCOPES */ + + LWIP_ASSERT_CORE_LOCKED(); /* find group */ group = mld6_lookfor_group(netif, groupaddr); @@ -456,9 +495,9 @@ mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr) void mld6_tmr(void) { - struct netif *netif = netif_list; + struct netif *netif; - while (netif != NULL) { + NETIF_FOREACH(netif) { struct mld_group *group = netif_mld6_data(netif); while (group != NULL) { @@ -475,7 +514,6 @@ mld6_tmr(void) } group = group->next; } - netif = netif->next; } } @@ -484,20 +522,20 @@ mld6_tmr(void) * * @param group the mld_group for which "delaying" membership report * should be sent - * @param maxresp the max resp delay provided in the query + * @param maxresp_in the max resp delay provided in the query */ static void -mld6_delayed_report(struct mld_group *group, u16_t maxresp) +mld6_delayed_report(struct mld_group *group, u16_t maxresp_in) { /* Convert maxresp from milliseconds to tmr ticks */ - maxresp = maxresp / MLD6_TMR_INTERVAL; + u16_t maxresp = maxresp_in / MLD6_TMR_INTERVAL; if (maxresp == 0) { maxresp = 1; } #ifdef LWIP_RAND /* Randomize maxresp. (if LWIP_RAND is supported) */ - maxresp = LWIP_RAND() % maxresp; + maxresp = (u16_t)(LWIP_RAND() % maxresp); if (maxresp == 0) { maxresp = 1; } @@ -529,14 +567,14 @@ mld6_send(struct netif *netif, struct mld_group *group, u8_t type) const ip6_addr_t *src_addr; /* Allocate a packet. Size is MLD header + IPv6 Hop-by-hop options header. */ - p = pbuf_alloc(PBUF_IP, sizeof(struct mld_header) + sizeof(struct ip6_hbh_hdr), PBUF_RAM); + p = pbuf_alloc(PBUF_IP, sizeof(struct mld_header) + MLD6_HBH_HLEN, PBUF_RAM); if (p == NULL) { MLD6_STATS_INC(mld6.memerr); return; } /* Move to make room for Hop-by-hop options header. */ - if (pbuf_header(p, -IP6_HBH_HLEN)) { + if (pbuf_remove_header(p, MLD6_HBH_HLEN)) { pbuf_free(p); MLD6_STATS_INC(mld6.lenerr); return; @@ -561,7 +599,7 @@ mld6_send(struct netif *netif, struct mld_group *group, u8_t type) mld_hdr->chksum = 0; mld_hdr->max_resp_delay = 0; mld_hdr->reserved = 0; - ip6_addr_set(&(mld_hdr->multicast_address), &(group->group_address)); + ip6_addr_copy_to_packed(mld_hdr->multicast_address, group->group_address); #if CHECKSUM_GEN_ICMP6 IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/nd6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/nd6.c similarity index 66% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/nd6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/nd6.c index 0b36718..81992fa 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/nd6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/ipv6/nd6.c @@ -58,6 +58,7 @@ #include "lwip/netif.h" #include "lwip/icmp6.h" #include "lwip/mld6.h" +#include "lwip/dhcp6.h" #include "lwip/ip.h" #include "lwip/stats.h" #include "lwip/dns.h" @@ -84,31 +85,42 @@ u32_t retrans_timer = LWIP_ND6_RETRANS_TIMER; /* @todo implement this value in t /* Index for cache entries. */ static u8_t nd6_cached_neighbor_index; -static u8_t nd6_cached_destination_index; +static netif_addr_idx_t nd6_cached_destination_index; /* Multicast address holder. */ static ip6_addr_t multicast_address; -/* Static buffer to parse RA packet options (size of a prefix option, biggest option) */ -static u8_t nd6_ra_buffer[sizeof(struct prefix_option)]; +static u8_t nd6_tmr_rs_reduction; + +/* Static buffer to parse RA packet options */ +union ra_options { + struct lladdr_option lladdr; + struct mtu_option mtu; + struct prefix_option prefix; +#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS + struct rdnss_option rdnss; +#endif +}; +static union ra_options nd6_ra_buffer; /* Forward declarations. */ static s8_t nd6_find_neighbor_cache_entry(const ip6_addr_t *ip6addr); static s8_t nd6_new_neighbor_cache_entry(void); static void nd6_free_neighbor_cache_entry(s8_t i); -static s8_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr); -static s8_t nd6_new_destination_cache_entry(void); -static s8_t nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif); +static s16_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr); +static s16_t nd6_new_destination_cache_entry(void); +static int nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif); static s8_t nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif); static s8_t nd6_get_router(const ip6_addr_t *router_addr, struct netif *netif); static s8_t nd6_new_router(const ip6_addr_t *router_addr, struct netif *netif); -static s8_t nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif); -static s8_t nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif); +static s8_t nd6_get_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif); +static s8_t nd6_new_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif); static s8_t nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif); static err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf *q); #define ND6_SEND_FLAG_MULTICAST_DEST 0x01 #define ND6_SEND_FLAG_ALLNODES_DEST 0x02 +#define ND6_SEND_FLAG_ANY_SRC 0x04 static void nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags); static void nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags); static void nd6_send_neighbor_cache_probe(struct nd6_neighbor_cache_entry *entry, u8_t flags); @@ -124,6 +136,147 @@ static void nd6_free_q(struct nd6_q_entry *q); static void nd6_send_q(s8_t i); +/** + * A local address has been determined to be a duplicate. Take the appropriate + * action(s) on the address and the interface as a whole. + * + * @param netif the netif that owns the address + * @param addr_idx the index of the address detected to be a duplicate + */ +static void +nd6_duplicate_addr_detected(struct netif *netif, s8_t addr_idx) +{ + + /* Mark the address as duplicate, but leave its lifetimes alone. If this was + * a manually assigned address, it will remain in existence as duplicate, and + * as such be unusable for any practical purposes until manual intervention. + * If this was an autogenerated address, the address will follow normal + * expiration rules, and thus disappear once its valid lifetime expires. */ + netif_ip6_addr_set_state(netif, addr_idx, IP6_ADDR_DUPLICATED); + +#if LWIP_IPV6_AUTOCONFIG + /* If the affected address was the link-local address that we use to generate + * all other addresses, then we should not continue to use those derived + * addresses either, so mark them as duplicate as well. For autoconfig-only + * setups, this will make the interface effectively unusable, approaching the + * intention of RFC 4862 Sec. 5.4.5. @todo implement the full requirements */ + if (addr_idx == 0) { + s8_t i; + for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) && + !netif_ip6_addr_isstatic(netif, i)) { + netif_ip6_addr_set_state(netif, i, IP6_ADDR_DUPLICATED); + } + } + } +#endif /* LWIP_IPV6_AUTOCONFIG */ +} + +#if LWIP_IPV6_AUTOCONFIG +/** + * We received a router advertisement that contains a prefix with the + * autoconfiguration flag set. Add or update an associated autogenerated + * address. + * + * @param netif the netif on which the router advertisement arrived + * @param prefix_opt a pointer to the prefix option data + * @param prefix_addr an aligned copy of the prefix address + */ +static void +nd6_process_autoconfig_prefix(struct netif *netif, + struct prefix_option *prefix_opt, const ip6_addr_t *prefix_addr) +{ + ip6_addr_t ip6addr; + u32_t valid_life, pref_life; + u8_t addr_state; + s8_t i, free_idx; + + /* The caller already checks RFC 4862 Sec. 5.5.3 points (a) and (b). We do + * the rest, starting with checks for (c) and (d) here. */ + valid_life = lwip_htonl(prefix_opt->valid_lifetime); + pref_life = lwip_htonl(prefix_opt->preferred_lifetime); + if (pref_life > valid_life || prefix_opt->prefix_length != 64) { + return; /* silently ignore this prefix for autoconfiguration purposes */ + } + + /* If an autogenerated address already exists for this prefix, update its + * lifetimes. An address is considered autogenerated if 1) it is not static + * (i.e., manually assigned), and 2) there is an advertised autoconfiguration + * prefix for it (the one we are processing here). This does not necessarily + * exclude the possibility that the address was actually assigned by, say, + * DHCPv6. If that distinction becomes important in the future, more state + * must be kept. As explained elsewhere we also update lifetimes of tentative + * and duplicate addresses. Skip address slot 0 (the link-local address). */ + for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + addr_state = netif_ip6_addr_state(netif, i); + if (!ip6_addr_isinvalid(addr_state) && !netif_ip6_addr_isstatic(netif, i) && + ip6_addr_netcmp(prefix_addr, netif_ip6_addr(netif, i))) { + /* Update the valid lifetime, as per RFC 4862 Sec. 5.5.3 point (e). + * The valid lifetime will never drop to zero as a result of this. */ + u32_t remaining_life = netif_ip6_addr_valid_life(netif, i); + if (valid_life > ND6_2HRS || valid_life > remaining_life) { + netif_ip6_addr_set_valid_life(netif, i, valid_life); + } else if (remaining_life > ND6_2HRS) { + netif_ip6_addr_set_valid_life(netif, i, ND6_2HRS); + } + LWIP_ASSERT("bad valid lifetime", !netif_ip6_addr_isstatic(netif, i)); + /* Update the preferred lifetime. No bounds checks are needed here. In + * rare cases the advertisement may un-deprecate the address, though. + * Deprecation is left to the timer code where it is handled anyway. */ + if (pref_life > 0 && addr_state == IP6_ADDR_DEPRECATED) { + netif_ip6_addr_set_state(netif, i, IP6_ADDR_PREFERRED); + } + netif_ip6_addr_set_pref_life(netif, i, pref_life); + return; /* there should be at most one matching address */ + } + } + + /* No autogenerated address exists for this prefix yet. See if we can add a + * new one. However, if IPv6 autoconfiguration is administratively disabled, + * do not generate new addresses, but do keep updating lifetimes for existing + * addresses. Also, when adding new addresses, we must protect explicitly + * against a valid lifetime of zero, because again, we use that as a special + * value. The generated address would otherwise expire immediately anyway. + * Finally, the original link-local address must be usable at all. We start + * creating addresses even if the link-local address is still in tentative + * state though, and deal with the fallout of that upon DAD collision. */ + addr_state = netif_ip6_addr_state(netif, 0); + if (!netif->ip6_autoconfig_enabled || valid_life == IP6_ADDR_LIFE_STATIC || + ip6_addr_isinvalid(addr_state) || ip6_addr_isduplicated(addr_state)) { + return; + } + + /* Construct the new address that we intend to use, and then see if that + * address really does not exist. It might have been added manually, after + * all. As a side effect, find a free slot. Note that we cannot use + * netif_add_ip6_address() here, as it would return ERR_OK if the address + * already did exist, resulting in that address being given lifetimes. */ + IP6_ADDR(&ip6addr, prefix_addr->addr[0], prefix_addr->addr[1], + netif_ip6_addr(netif, 0)->addr[2], netif_ip6_addr(netif, 0)->addr[3]); + ip6_addr_assign_zone(&ip6addr, IP6_UNICAST, netif); + + free_idx = 0; + for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) { + if (ip6_addr_cmp(&ip6addr, netif_ip6_addr(netif, i))) { + return; /* formed address already exists */ + } + } else if (free_idx == 0) { + free_idx = i; + } + } + if (free_idx == 0) { + return; /* no address slots available, try again on next advertisement */ + } + + /* Assign the new address to the interface. */ + ip_addr_copy_from_ip6(netif->ip6_addr[free_idx], ip6addr); + netif_ip6_addr_set_valid_life(netif, free_idx, valid_life); + netif_ip6_addr_set_pref_life(netif, free_idx, pref_life); + netif_ip6_addr_set_state(netif, free_idx, IP6_ADDR_TENTATIVE); +} +#endif /* LWIP_IPV6_AUTOCONFIG */ + /** * Process an incoming neighbor discovery message * @@ -135,6 +288,7 @@ nd6_input(struct pbuf *p, struct netif *inp) { u8_t msg_type; s8_t i; + s16_t dest_idx; ND6_STATS_INC(nd6.recv); @@ -144,6 +298,7 @@ nd6_input(struct pbuf *p, struct netif *inp) { struct na_header *na_hdr; struct lladdr_option *lladdr_opt; + ip6_addr_t target_address; /* Check that na header fits in packet. */ if (p->len < (sizeof(struct na_header))) { @@ -156,36 +311,36 @@ nd6_input(struct pbuf *p, struct netif *inp) na_hdr = (struct na_header *)p->payload; + /* Create an aligned, zoned copy of the target address. */ + ip6_addr_copy_from_packed(target_address, na_hdr->target_address); + ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp); + + /* Check a subset of the other RFC 4861 Sec. 7.1.2 requirements. */ + if (IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || na_hdr->code != 0 || + ip6_addr_ismulticast(&target_address)) { + pbuf_free(p); + ND6_STATS_INC(nd6.proterr); + ND6_STATS_INC(nd6.drop); + return; + } + + /* @todo RFC MUST: if IP destination is multicast, Solicited flag is zero */ + /* @todo RFC MUST: all included options have a length greater than zero */ + /* Unsolicited NA?*/ if (ip6_addr_ismulticast(ip6_current_dest_addr())) { - ip6_addr_t target_address; - /* This is an unsolicited NA. * link-layer changed? * part of DAD mechanism? */ - /* Create an aligned copy. */ - ip6_addr_set(&target_address, &(na_hdr->target_address)); - #if LWIP_IPV6_DUP_DETECT_ATTEMPTS /* If the target address matches this netif, it is a DAD response. */ for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) && + !ip6_addr_isduplicated(netif_ip6_addr_state(inp, i)) && ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) { /* We are using a duplicate address. */ - netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID); - -#if LWIP_IPV6_AUTOCONFIG - /* Check to see if this address was autoconfigured. */ - if (!ip6_addr_islinklocal(&target_address)) { - i = nd6_get_onlink_prefix(&target_address, inp); - if (i >= 0) { - /* Mark this prefix as duplicate, so that we don't use it - * to generate this address again. */ - prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE; - } - } -#endif /* LWIP_IPV6_AUTOCONFIG */ + nd6_duplicate_addr_detected(inp, i); pbuf_free(p); return; @@ -220,15 +375,10 @@ nd6_input(struct pbuf *p, struct netif *inp) } } } else { - ip6_addr_t target_address; - /* This is a solicited NA. * neighbor address resolution response? * neighbor unreachability detection response? */ - /* Create an aligned copy. */ - ip6_addr_set(&target_address, &(na_hdr->target_address)); - /* Find the cache entry corresponding to this na. */ i = nd6_find_neighbor_cache_entry(&target_address); if (i < 0) { @@ -278,6 +428,7 @@ nd6_input(struct pbuf *p, struct netif *inp) { struct ns_header *ns_hdr; struct lladdr_option *lladdr_opt; + ip6_addr_t target_address; u8_t accepted; /* Check that ns header fits in packet. */ @@ -291,6 +442,23 @@ nd6_input(struct pbuf *p, struct netif *inp) ns_hdr = (struct ns_header *)p->payload; + /* Create an aligned, zoned copy of the target address. */ + ip6_addr_copy_from_packed(target_address, ns_hdr->target_address); + ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp); + + /* Check a subset of the other RFC 4861 Sec. 7.1.1 requirements. */ + if (IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || ns_hdr->code != 0 || + ip6_addr_ismulticast(&target_address)) { + pbuf_free(p); + ND6_STATS_INC(nd6.proterr); + ND6_STATS_INC(nd6.drop); + return; + } + + /* @todo RFC MUST: all included options have a length greater than zero */ + /* @todo RFC MUST: if IP source is 'any', destination is solicited-node multicast address */ + /* @todo RFC MUST: if IP source is 'any', there is no source LL address option */ + /* Check if there is a link-layer address provided. Only point to it if in this buffer. */ if (p->len >= (sizeof(struct ns_header) + 2)) { lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header)); @@ -307,7 +475,7 @@ nd6_input(struct pbuf *p, struct netif *inp) if ((ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) || (ip6_addr_istentative(netif_ip6_addr_state(inp, i)) && ip6_addr_isany(ip6_current_src_addr()))) && - ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) { + ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) { accepted = 1; break; } @@ -324,18 +492,16 @@ nd6_input(struct pbuf *p, struct netif *inp) /* Sender is validating this address. */ for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) && - ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) { + ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) { /* Send a NA back so that the sender does not use this address. */ nd6_send_na(inp, netif_ip6_addr(inp, i), ND6_FLAG_OVERRIDE | ND6_SEND_FLAG_ALLNODES_DEST); if (ip6_addr_istentative(netif_ip6_addr_state(inp, i))) { /* We shouldn't use this address either. */ - netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID); + nd6_duplicate_addr_detected(inp, i); } } } } else { - ip6_addr_t target_address; - /* Sender is trying to resolve our address. */ /* Verify that they included their own link-layer address. */ if (lladdr_opt == NULL) { @@ -379,9 +545,6 @@ nd6_input(struct pbuf *p, struct netif *inp) neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL; } - /* Create an aligned copy. */ - ip6_addr_set(&target_address, &(ns_hdr->target_address)); - /* Send back a NA for us. Allocate the reply pbuf. */ nd6_send_na(inp, &target_address, ND6_FLAG_SOLICITED | ND6_FLAG_OVERRIDE); } @@ -394,7 +557,7 @@ nd6_input(struct pbuf *p, struct netif *inp) u8_t *buffer; /* Used to copy options. */ u16_t offset; #if LWIP_ND6_RDNSS_MAX_DNS_SERVERS - /* There can by multiple RDNSS options per RA */ + /* There can be multiple RDNSS options per RA */ u8_t rdnss_server_idx = 0; #endif /* LWIP_ND6_RDNSS_MAX_DNS_SERVERS */ @@ -409,12 +572,25 @@ nd6_input(struct pbuf *p, struct netif *inp) ra_hdr = (struct ra_header *)p->payload; + /* Check a subset of the other RFC 4861 Sec. 6.1.2 requirements. */ + if (!ip6_addr_islinklocal(ip6_current_src_addr()) || + IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || ra_hdr->code != 0) { + pbuf_free(p); + ND6_STATS_INC(nd6.proterr); + ND6_STATS_INC(nd6.drop); + return; + } + + /* @todo RFC MUST: all included options have a length greater than zero */ + /* If we are sending RS messages, stop. */ #if LWIP_IPV6_SEND_ROUTER_SOLICIT - /* ensure at least one solicitation is sent */ + /* ensure at least one solicitation is sent (see RFC 4861, ch. 6.3.7) */ if ((inp->rs_count < LWIP_ND6_MAX_MULTICAST_SOLICIT) || (nd6_send_rs(inp) == ERR_OK)) { inp->rs_count = 0; + } else { + inp->rs_count = 1; } #endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ @@ -451,34 +627,54 @@ nd6_input(struct pbuf *p, struct netif *inp) /* Update flags in local entry (incl. preference). */ default_router_list[i].flags = ra_hdr->flags; +#if LWIP_IPV6_DHCP6 + /* Trigger DHCPv6 if enabled */ + dhcp6_nd6_ra_trigger(inp, ra_hdr->flags & ND6_RA_FLAG_MANAGED_ADDR_CONFIG, + ra_hdr->flags & ND6_RA_FLAG_OTHER_CONFIG); +#endif + /* Offset to options. */ offset = sizeof(struct ra_header); /* Process each option. */ - while ((p->tot_len - offset) > 0) { + while ((p->tot_len - offset) >= 2) { + u8_t option_type; + u16_t option_len; + int option_len8 = pbuf_try_get_at(p, offset + 1); + if (option_len8 <= 0) { + /* read beyond end or zero length */ + goto lenerr_drop_free_return; + } + option_len = ((u8_t)option_len8) << 3; + if (option_len > p->tot_len - offset) { + /* short packet (option does not fit in) */ + goto lenerr_drop_free_return; + } if (p->len == p->tot_len) { /* no need to copy from contiguous pbuf */ buffer = &((u8_t*)p->payload)[offset]; } else { - buffer = nd6_ra_buffer; - if (pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset) != sizeof(struct prefix_option)) { - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; + /* check if this option fits into our buffer */ + if (option_len > sizeof(nd6_ra_buffer)) { + option_type = pbuf_get_at(p, offset); + /* invalid option length */ + if (option_type != ND6_OPTION_TYPE_RDNSS) { + goto lenerr_drop_free_return; + } + /* we allow RDNSS option to be longer - we'll just drop some servers */ + option_len = sizeof(nd6_ra_buffer); } + buffer = (u8_t*)&nd6_ra_buffer; + option_len = pbuf_copy_partial(p, &nd6_ra_buffer, option_len, offset); } - if (buffer[1] == 0) { - /* zero-length extension. drop packet */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - switch (buffer[0]) { + option_type = buffer[0]; + switch (option_type) { case ND6_OPTION_TYPE_SOURCE_LLADDR: { struct lladdr_option *lladdr_opt; + if (option_len < sizeof(struct lladdr_option)) { + goto lenerr_drop_free_return; + } lladdr_opt = (struct lladdr_option *)buffer; if ((default_router_list[i].neighbor_entry != NULL) && (default_router_list[i].neighbor_entry->state == ND6_INCOMPLETE)) { @@ -491,10 +687,20 @@ nd6_input(struct pbuf *p, struct netif *inp) case ND6_OPTION_TYPE_MTU: { struct mtu_option *mtu_opt; + u32_t mtu32; + if (option_len < sizeof(struct mtu_option)) { + goto lenerr_drop_free_return; + } mtu_opt = (struct mtu_option *)buffer; - if (lwip_htonl(mtu_opt->mtu) >= 1280) { + mtu32 = lwip_htonl(mtu_opt->mtu); + if ((mtu32 >= IP6_MIN_MTU_LENGTH) && (mtu32 <= 0xffff)) { #if LWIP_ND6_ALLOW_RA_UPDATES - inp->mtu = (u16_t)lwip_htonl(mtu_opt->mtu); + if (inp->mtu) { + /* don't set the mtu for IPv6 higher than the netif driver supports */ + inp->mtu6 = LWIP_MIN(LWIP_MIN(inp->mtu, inp->mtu6), (u16_t)mtu32); + } else { + inp->mtu6 = (u16_t)mtu32; + } #endif /* LWIP_ND6_ALLOW_RA_UPDATES */ } break; @@ -502,35 +708,42 @@ nd6_input(struct pbuf *p, struct netif *inp) case ND6_OPTION_TYPE_PREFIX_INFO: { struct prefix_option *prefix_opt; + ip6_addr_t prefix_addr; + if (option_len < sizeof(struct prefix_option)) { + goto lenerr_drop_free_return; + } + prefix_opt = (struct prefix_option *)buffer; - if ((prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) && - (prefix_opt->prefix_length == 64) && - !ip6_addr_islinklocal(&(prefix_opt->prefix))) { - /* Add to on-link prefix list. */ - s8_t prefix; - ip6_addr_t prefix_addr; + /* Get a memory-aligned copy of the prefix. */ + ip6_addr_copy_from_packed(prefix_addr, prefix_opt->prefix); + ip6_addr_assign_zone(&prefix_addr, IP6_UNICAST, inp); - /* Get a memory-aligned copy of the prefix. */ - ip6_addr_set(&prefix_addr, &(prefix_opt->prefix)); + if (!ip6_addr_islinklocal(&prefix_addr)) { + if ((prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) && + (prefix_opt->prefix_length == 64)) { + /* Add to on-link prefix list. */ + u32_t valid_life; + s8_t prefix; - /* find cache entry for this prefix. */ - prefix = nd6_get_onlink_prefix(&prefix_addr, inp); - if (prefix < 0) { - /* Create a new cache entry. */ - prefix = nd6_new_onlink_prefix(&prefix_addr, inp); - } - if (prefix >= 0) { - prefix_list[prefix].invalidation_timer = lwip_htonl(prefix_opt->valid_lifetime); + valid_life = lwip_htonl(prefix_opt->valid_lifetime); -#if LWIP_IPV6_AUTOCONFIG - if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) { - /* Mark prefix as autonomous, so that address autoconfiguration can take place. - * Only OR flag, so that we don't over-write other flags (such as ADDRESS_DUPLICATE)*/ - prefix_list[prefix].flags |= ND6_PREFIX_AUTOCONFIG_AUTONOMOUS; + /* find cache entry for this prefix. */ + prefix = nd6_get_onlink_prefix(&prefix_addr, inp); + if (prefix < 0 && valid_life > 0) { + /* Create a new cache entry. */ + prefix = nd6_new_onlink_prefix(&prefix_addr, inp); + } + if (prefix >= 0) { + prefix_list[prefix].invalidation_timer = valid_life; } -#endif /* LWIP_IPV6_AUTOCONFIG */ } +#if LWIP_IPV6_AUTOCONFIG + if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) { + /* Perform processing for autoconfiguration. */ + nd6_process_autoconfig_prefix(inp, prefix_opt, &prefix_addr); + } +#endif /* LWIP_IPV6_AUTOCONFIG */ } break; @@ -545,26 +758,33 @@ nd6_input(struct pbuf *p, struct netif *inp) case ND6_OPTION_TYPE_RDNSS: { u8_t num, n; + u16_t copy_offset = offset + SIZEOF_RDNSS_OPTION_BASE; struct rdnss_option * rdnss_opt; + if (option_len < SIZEOF_RDNSS_OPTION_BASE) { + goto lenerr_drop_free_return; + } rdnss_opt = (struct rdnss_option *)buffer; num = (rdnss_opt->length - 1) / 2; - for (n = 0; (rdnss_server_idx < DNS_MAX_SERVERS) && (n < num); n++) { + for (n = 0; (rdnss_server_idx < DNS_MAX_SERVERS) && (n < num); n++, copy_offset += sizeof(ip6_addr_p_t)) { ip_addr_t rdnss_address; - /* Get a memory-aligned copy of the prefix. */ - ip_addr_copy_from_ip6(rdnss_address, rdnss_opt->rdnss_address[n]); + /* Copy directly from pbuf to get an aligned, zoned copy of the prefix. */ + if (pbuf_copy_partial(p, &rdnss_address, sizeof(ip6_addr_p_t), copy_offset) == sizeof(ip6_addr_p_t)) { + IP_SET_TYPE_VAL(rdnss_address, IPADDR_TYPE_V6); + ip6_addr_assign_zone(ip_2_ip6(&rdnss_address), IP6_UNKNOWN, inp); - if (htonl(rdnss_opt->lifetime) > 0) { - /* TODO implement Lifetime > 0 */ - dns_setserver(rdnss_server_idx++, &rdnss_address); - } else { - /* TODO implement DNS removal in dns.c */ - u8_t s; - for (s = 0; s < DNS_MAX_SERVERS; s++) { - const ip_addr_t *addr = dns_getserver(s); - if(ip_addr_cmp(addr, &rdnss_address)) { - dns_setserver(s, NULL); + if (htonl(rdnss_opt->lifetime) > 0) { + /* TODO implement Lifetime > 0 */ + dns_setserver(rdnss_server_idx++, &rdnss_address); + } else { + /* TODO implement DNS removal in dns.c */ + u8_t s; + for (s = 0; s < DNS_MAX_SERVERS; s++) { + const ip_addr_t *addr = dns_getserver(s); + if(ip_addr_cmp(addr, &rdnss_address)) { + dns_setserver(s, NULL); + } } } } @@ -578,7 +798,7 @@ nd6_input(struct pbuf *p, struct netif *inp) break; } /* option length is checked earlier to be non-zero to make sure loop ends */ - offset += 8 * ((u16_t)buffer[1]); + offset += 8 * (u8_t)option_len8; } break; /* ICMP6_TYPE_RA */ @@ -587,7 +807,7 @@ nd6_input(struct pbuf *p, struct netif *inp) { struct redirect_header *redir_hdr; struct lladdr_option *lladdr_opt; - ip6_addr_t tmp; + ip6_addr_t destination_address, target_address; /* Check that Redir header fits in packet. */ if (p->len < sizeof(struct redirect_header)) { @@ -600,6 +820,24 @@ nd6_input(struct pbuf *p, struct netif *inp) redir_hdr = (struct redirect_header *)p->payload; + /* Create an aligned, zoned copy of the destination address. */ + ip6_addr_copy_from_packed(destination_address, redir_hdr->destination_address); + ip6_addr_assign_zone(&destination_address, IP6_UNICAST, inp); + + /* Check a subset of the other RFC 4861 Sec. 8.1 requirements. */ + if (!ip6_addr_islinklocal(ip6_current_src_addr()) || + IP6H_HOPLIM(ip6_current_header()) != ND6_HOPLIM || + redir_hdr->code != 0 || ip6_addr_ismulticast(&destination_address)) { + pbuf_free(p); + ND6_STATS_INC(nd6.proterr); + ND6_STATS_INC(nd6.drop); + return; + } + + /* @todo RFC MUST: IP source address equals first-hop router for destination_address */ + /* @todo RFC MUST: ICMP target address is either link-local address or same as destination_address */ + /* @todo RFC MUST: all included options have a length greater than zero */ + if (p->len >= (sizeof(struct redirect_header) + 2)) { lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct redirect_header)); if (p->len < (sizeof(struct redirect_header) + (lladdr_opt->length << 3))) { @@ -609,33 +847,31 @@ nd6_input(struct pbuf *p, struct netif *inp) lladdr_opt = NULL; } - /* Copy original destination address to current source address, to have an aligned copy. */ - ip6_addr_set(&tmp, &(redir_hdr->destination_address)); - /* Find dest address in cache */ - i = nd6_find_destination_cache_entry(&tmp); - if (i < 0) { + dest_idx = nd6_find_destination_cache_entry(&destination_address); + if (dest_idx < 0) { /* Destination not in cache, drop packet. */ pbuf_free(p); return; } + /* Create an aligned, zoned copy of the target address. */ + ip6_addr_copy_from_packed(target_address, redir_hdr->target_address); + ip6_addr_assign_zone(&target_address, IP6_UNICAST, inp); + /* Set the new target address. */ - ip6_addr_set(&(destination_cache[i].next_hop_addr), &(redir_hdr->target_address)); + ip6_addr_copy(destination_cache[dest_idx].next_hop_addr, target_address); /* If Link-layer address of other router is given, try to add to neighbor cache. */ if (lladdr_opt != NULL) { if (lladdr_opt->type == ND6_OPTION_TYPE_TARGET_LLADDR) { - /* Copy target address to current source address, to have an aligned copy. */ - ip6_addr_set(&tmp, &(redir_hdr->target_address)); - - i = nd6_find_neighbor_cache_entry(&tmp); + i = nd6_find_neighbor_cache_entry(&target_address); if (i < 0) { i = nd6_new_neighbor_cache_entry(); if (i >= 0) { neighbor_cache[i].netif = inp; MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - ip6_addr_set(&(neighbor_cache[i].next_hop_address), &tmp); + ip6_addr_copy(neighbor_cache[i].next_hop_address, target_address); /* Receiving a message does not prove reachability: only in one direction. * Delay probe in case we get confirmation of reachability from upper layer (TCP). */ @@ -661,7 +897,7 @@ nd6_input(struct pbuf *p, struct netif *inp) struct icmp6_hdr *icmp6hdr; /* Packet too big message */ struct ip6_hdr *ip6hdr; /* IPv6 header of the packet which caused the error */ u32_t pmtu; - ip6_addr_t tmp; + ip6_addr_t destination_address; /* Check that ICMPv6 header + IPv6 header fit in payload */ if (p->len < (sizeof(struct icmp6_hdr) + IP6_HLEN)) { @@ -675,12 +911,13 @@ nd6_input(struct pbuf *p, struct netif *inp) icmp6hdr = (struct icmp6_hdr *)p->payload; ip6hdr = (struct ip6_hdr *)((u8_t*)p->payload + sizeof(struct icmp6_hdr)); - /* Copy original destination address to current source address, to have an aligned copy. */ - ip6_addr_set(&tmp, &(ip6hdr->dest)); + /* Create an aligned, zoned copy of the destination address. */ + ip6_addr_copy_from_packed(destination_address, ip6hdr->dest); + ip6_addr_assign_zone(&destination_address, IP6_UNKNOWN, inp); /* Look for entry in destination cache. */ - i = nd6_find_destination_cache_entry(&tmp); - if (i < 0) { + dest_idx = nd6_find_destination_cache_entry(&destination_address); + if (dest_idx < 0) { /* Destination not in cache, drop packet. */ pbuf_free(p); return; @@ -688,7 +925,7 @@ nd6_input(struct pbuf *p, struct netif *inp) /* Change the Path MTU. */ pmtu = lwip_htonl(icmp6hdr->data); - destination_cache[i].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF); + destination_cache[dest_idx].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF); break; /* ICMP6_TYPE_PTB */ } @@ -700,6 +937,11 @@ nd6_input(struct pbuf *p, struct netif *inp) } pbuf_free(p); + return; +lenerr_drop_free_return: + ND6_STATS_INC(nd6.lenerr); + ND6_STATS_INC(nd6.drop); + pbuf_free(p); } @@ -709,6 +951,7 @@ nd6_input(struct pbuf *p, struct netif *inp) * - Update neighbor reachability states * - Update destination cache entries age * - Update invalidation timers of default routers and on-link prefixes + * - Update lifetimes of our addresses * - Perform duplicate address detection (DAD) for our addresses * - Send router solicitations */ @@ -784,15 +1027,22 @@ nd6_tmr(void) for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { if (default_router_list[i].neighbor_entry != NULL) { /* Active entry. */ - if (default_router_list[i].invalidation_timer > 0) { - default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000; - } - if (default_router_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) { - /* Less than 1 second remaining. Clear this entry. */ + if (default_router_list[i].invalidation_timer <= ND6_TMR_INTERVAL / 1000) { + /* No more than 1 second remaining. Clear this entry. Also clear any of + * its destination cache entries, as per RFC 4861 Sec. 5.3 and 6.3.5. */ + s8_t j; + for (j = 0; j < LWIP_ND6_NUM_DESTINATIONS; j++) { + if (ip6_addr_cmp(&destination_cache[j].next_hop_addr, + &default_router_list[i].neighbor_entry->next_hop_address)) { + ip6_addr_set_any(&destination_cache[j].destination_addr); + } + } default_router_list[i].neighbor_entry->isrouter = 0; default_router_list[i].neighbor_entry = NULL; default_router_list[i].invalidation_timer = 0; default_router_list[i].flags = 0; + } else { + default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000; } } } @@ -800,81 +1050,89 @@ nd6_tmr(void) /* Process prefix entries. */ for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { if (prefix_list[i].netif != NULL) { - if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) { + if (prefix_list[i].invalidation_timer <= ND6_TMR_INTERVAL / 1000) { /* Entry timed out, remove it */ prefix_list[i].invalidation_timer = 0; - -#if LWIP_IPV6_AUTOCONFIG - /* If any addresses were configured with this prefix, remove them */ - if (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED) { - s8_t j; - - for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) { - if ((netif_ip6_addr_state(prefix_list[i].netif, j) != IP6_ADDR_INVALID) && - ip6_addr_netcmp(&prefix_list[i].prefix, netif_ip6_addr(prefix_list[i].netif, j))) { - netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_INVALID); - prefix_list[i].flags = 0; - - /* Exit loop. */ - break; - } - } - } -#endif /* LWIP_IPV6_AUTOCONFIG */ - prefix_list[i].netif = NULL; - prefix_list[i].flags = 0; } else { prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000; - -#if LWIP_IPV6_AUTOCONFIG - /* Initiate address autoconfiguration for this prefix, if conditions are met. */ - if (prefix_list[i].netif->ip6_autoconfig_enabled && - (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) && - !(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) { - s8_t j; - /* Try to get an address on this netif that is invalid. - * Skip 0 index (link-local address) */ - for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) { - if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDR_INVALID) { - /* Generate an address using this prefix and interface ID from link-local address. */ - netif_ip6_addr_set_parts(prefix_list[i].netif, j, - prefix_list[i].prefix.addr[0], prefix_list[i].prefix.addr[1], - netif_ip6_addr(prefix_list[i].netif, 0)->addr[2], netif_ip6_addr(prefix_list[i].netif, 0)->addr[3]); - - /* Mark it as tentative (DAD will be performed if configured). */ - netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE); - - /* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */ - prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED; - - /* Exit loop. */ - break; - } - } - } -#endif /* LWIP_IPV6_AUTOCONFIG */ } } } - - /* Process our own addresses, if DAD configured. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { + /* Process our own addresses, updating address lifetimes and/or DAD state. */ + NETIF_FOREACH(netif) { for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { - u8_t addr_state = netif_ip6_addr_state(netif, i); + u8_t addr_state; +#if LWIP_IPV6_ADDRESS_LIFETIMES + /* Step 1: update address lifetimes (valid and preferred). */ + addr_state = netif_ip6_addr_state(netif, i); + /* RFC 4862 is not entirely clear as to whether address lifetimes affect + * tentative addresses, and is even less clear as to what should happen + * with duplicate addresses. We choose to track and update lifetimes for + * both those types, although for different reasons: + * - for tentative addresses, the line of thought of Sec. 5.7 combined + * with the potentially long period that an address may be in tentative + * state (due to the interface being down) suggests that lifetimes + * should be independent of external factors which would include DAD; + * - for duplicate addresses, retiring them early could result in a new + * but unwanted attempt at marking them as valid, while retiring them + * late/never could clog up address slots on the netif. + * As a result, we may end up expiring addresses of either type here. + */ + if (!ip6_addr_isinvalid(addr_state) && + !netif_ip6_addr_isstatic(netif, i)) { + u32_t life = netif_ip6_addr_valid_life(netif, i); + if (life <= ND6_TMR_INTERVAL / 1000) { + /* The address has expired. */ + netif_ip6_addr_set_valid_life(netif, i, 0); + netif_ip6_addr_set_pref_life(netif, i, 0); + netif_ip6_addr_set_state(netif, i, IP6_ADDR_INVALID); + } else { + if (!ip6_addr_life_isinfinite(life)) { + life -= ND6_TMR_INTERVAL / 1000; + LWIP_ASSERT("bad valid lifetime", life != IP6_ADDR_LIFE_STATIC); + netif_ip6_addr_set_valid_life(netif, i, life); + } + /* The address is still here. Update the preferred lifetime too. */ + life = netif_ip6_addr_pref_life(netif, i); + if (life <= ND6_TMR_INTERVAL / 1000) { + /* This case must also trigger if 'life' was already zero, so as to + * deal correctly with advertised preferred-lifetime reductions. */ + netif_ip6_addr_set_pref_life(netif, i, 0); + if (addr_state == IP6_ADDR_PREFERRED) + netif_ip6_addr_set_state(netif, i, IP6_ADDR_DEPRECATED); + } else if (!ip6_addr_life_isinfinite(life)) { + life -= ND6_TMR_INTERVAL / 1000; + netif_ip6_addr_set_pref_life(netif, i, life); + } + } + } + /* The address state may now have changed, so reobtain it next. */ +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ + /* Step 2: update DAD state. */ + addr_state = netif_ip6_addr_state(netif, i); if (ip6_addr_istentative(addr_state)) { if ((addr_state & IP6_ADDR_TENTATIVE_COUNT_MASK) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) { - /* No NA received in response. Mark address as valid. */ - netif_ip6_addr_set_state(netif, i, IP6_ADDR_PREFERRED); - /* @todo implement preferred and valid lifetimes. */ - } else if (netif->flags & NETIF_FLAG_UP) { - /* Send a NS for this address. */ - nd6_send_ns(netif, netif_ip6_addr(netif, i), ND6_SEND_FLAG_MULTICAST_DEST); + /* No NA received in response. Mark address as valid. For dynamic + * addresses with an expired preferred lifetime, the state is set to + * deprecated right away. That should almost never happen, though. */ + addr_state = IP6_ADDR_PREFERRED; +#if LWIP_IPV6_ADDRESS_LIFETIMES + if (!netif_ip6_addr_isstatic(netif, i) && + netif_ip6_addr_pref_life(netif, i) == 0) { + addr_state = IP6_ADDR_DEPRECATED; + } +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ + netif_ip6_addr_set_state(netif, i, addr_state); + } else if (netif_is_up(netif) && netif_is_link_up(netif)) { /* tentative: set next state by increasing by one */ netif_ip6_addr_set_state(netif, i, addr_state + 1); - /* @todo send max 1 NS per tmr call? enable return*/ - /*return;*/ + /* Send a NS for this address. Use the unspecified address as source + * address in all cases (RFC 4862 Sec. 5.4.2), not in the least + * because as it is, we only consider multicast replies for DAD. */ + nd6_send_ns(netif, netif_ip6_addr(netif, i), + ND6_SEND_FLAG_MULTICAST_DEST | ND6_SEND_FLAG_ANY_SRC); } } } @@ -882,13 +1140,20 @@ nd6_tmr(void) #if LWIP_IPV6_SEND_ROUTER_SOLICIT /* Send router solicitation messages, if necessary. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { - if ((netif->rs_count > 0) && (netif->flags & NETIF_FLAG_UP) && - (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, 0)))) { - if (nd6_send_rs(netif) == ERR_OK) { - netif->rs_count--; + if (!nd6_tmr_rs_reduction) { + nd6_tmr_rs_reduction = (ND6_RTR_SOLICITATION_INTERVAL / ND6_TMR_INTERVAL) - 1; + NETIF_FOREACH(netif) { + if ((netif->rs_count > 0) && netif_is_up(netif) && + netif_is_link_up(netif) && + !ip6_addr_isinvalid(netif_ip6_addr_state(netif, 0)) && + !ip6_addr_isduplicated(netif_ip6_addr_state(netif, 0))) { + if (nd6_send_rs(netif) == ERR_OK) { + netif->rs_count--; + } } } + } else { + nd6_tmr_rs_reduction--; } #endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ @@ -917,12 +1182,27 @@ nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) { struct ns_header *ns_hdr; struct pbuf *p; - const ip6_addr_t *src_addr; + const ip6_addr_t *src_addr = NULL; u16_t lladdr_opt_len; - if (ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) { - /* Use link-local address as source address. */ - src_addr = netif_ip6_addr(netif, 0); + LWIP_ASSERT("target address is required", target_addr != NULL); + + if (!(flags & ND6_SEND_FLAG_ANY_SRC)) { + int i; + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + ip6_addr_netcmp(target_addr, netif_ip6_addr(netif, i))) { + src_addr = netif_ip6_addr(netif, i); + break; + } + } + + if (i == LWIP_IPV6_NUM_ADDRESSES) { + LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_WARNING, ("ICMPv6 NS: no available src address\n")); + ND6_STATS_INC(nd6.err); + return; + } + /* calculate option length (in 8-byte-blocks) */ lladdr_opt_len = ((netif->hwaddr_len + 2) + 7) >> 3; } else { @@ -945,7 +1225,7 @@ nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) ns_hdr->code = 0; ns_hdr->chksum = 0; ns_hdr->reserved = 0; - ip6_addr_set(&(ns_hdr->target_address), target_addr); + ip6_addr_copy_to_packed(ns_hdr->target_address, *target_addr); if (lladdr_opt_len != 0) { struct lladdr_option *lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header)); @@ -957,6 +1237,7 @@ nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) /* Generate the solicited node address for the target address. */ if (flags & ND6_SEND_FLAG_MULTICAST_DEST) { ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]); + ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif); target_addr = &multicast_address; } @@ -970,7 +1251,7 @@ nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) /* Send the packet out. */ ND6_STATS_INC(nd6.xmit); ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, target_addr, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); + ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif); pbuf_free(p); } @@ -991,6 +1272,8 @@ nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) const ip6_addr_t *dest_addr; u16_t lladdr_opt_len; + LWIP_ASSERT("target address is required", target_addr != NULL); + /* Use link-local address as source address. */ /* src_addr = netif_ip6_addr(netif, 0); */ /* Use target address as source address. */ @@ -1015,7 +1298,7 @@ nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) na_hdr->reserved[0] = 0; na_hdr->reserved[1] = 0; na_hdr->reserved[2] = 0; - ip6_addr_set(&(na_hdr->target_address), target_addr); + ip6_addr_copy_to_packed(na_hdr->target_address, *target_addr); lladdr_opt->type = ND6_OPTION_TYPE_TARGET_LLADDR; lladdr_opt->length = (u8_t)lladdr_opt_len; @@ -1024,9 +1307,11 @@ nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) /* Generate the solicited node address for the target address. */ if (flags & ND6_SEND_FLAG_MULTICAST_DEST) { ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]); + ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif); dest_addr = &multicast_address; } else if (flags & ND6_SEND_FLAG_ALLNODES_DEST) { ip6_addr_set_allnodes_linklocal(&multicast_address); + ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif); dest_addr = &multicast_address; } else { dest_addr = ip6_current_src_addr(); @@ -1042,7 +1327,7 @@ nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags) /* Send the packet out. */ ND6_STATS_INC(nd6.xmit); ip6_output_if(p, src_addr, dest_addr, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); + ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif); pbuf_free(p); } @@ -1071,6 +1356,7 @@ nd6_send_rs(struct netif *netif) /* Generate the all routers target address. */ ip6_addr_set_allrouters_linklocal(&multicast_address); + ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif); /* Allocate a packet. */ if (src_addr != IP6_ADDR_ANY6) { @@ -1109,7 +1395,7 @@ nd6_send_rs(struct netif *netif) ND6_STATS_INC(nd6.xmit); err = ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, &multicast_address, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); + ND6_HOPLIM, 0, IP6_NEXTH_ICMP6, netif); pbuf_free(p); return err; @@ -1282,10 +1568,13 @@ nd6_free_neighbor_cache_entry(s8_t i) * @return The destination cache entry index that matched, -1 if no * entry is found */ -static s8_t +static s16_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr) { - s8_t i; + s16_t i; + + IP6_ADDR_ZONECHECK(ip6addr); + for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) { if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) { return i; @@ -1301,10 +1590,10 @@ nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr) * @return The destination cache entry index that was created, -1 if no * entry was created */ -static s8_t +static s16_t nd6_new_destination_cache_entry(void) { - s8_t i, j; + s16_t i, j; u32_t age; /* Find an empty entry. */ @@ -1343,15 +1632,18 @@ nd6_clear_destination_cache(void) } /** - * Determine whether an address matches an on-link prefix. + * Determine whether an address matches an on-link prefix or the subnet of a + * statically assigned address. * * @param ip6addr the IPv6 address to match * @return 1 if the address is on-link, 0 otherwise */ -static s8_t +static int nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif) { s8_t i; + + /* Check to see if the address matches an on-link prefix. */ for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { if ((prefix_list[i].netif == netif) && (prefix_list[i].invalidation_timer > 0) && @@ -1359,9 +1651,13 @@ nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif) return 1; } } - /* Check to see if address prefix matches a (manually?) configured address. */ + /* Check to see if address prefix matches a manually configured (= static) + * address. Static addresses have an implied /64 subnet assignment. Dynamic + * addresses (from autoconfiguration) have no implied subnet assignment, and + * are thus effectively /128 assignments. See RFC 5942 for more on this. */ for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + netif_ip6_addr_isstatic(netif, i) && ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) { return 1; } @@ -1372,6 +1668,11 @@ nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif) /** * Select a default router for a destination. * + * This function is used both for routing and for finding a next-hop target for + * a packet. In the former case, the given netif is NULL, and the returned + * router entry must be for a netif suitable for sending packets (up, link up). + * In the latter case, the given netif is not NULL and restricts router choice. + * * @param ip6addr the destination address * @param netif the netif for the outgoing packet, if known * @return the default router entry index, or -1 if no suitable @@ -1380,48 +1681,58 @@ nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif) static s8_t nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif) { - s8_t i; - /* last_router is used for round-robin router selection (as recommended - * in RFC). This is more robust in case one router is not reachable, - * we are not stuck trying to resolve it. */ + struct netif *router_netif; + s8_t i, j, valid_router; static s8_t last_router; - (void)ip6addr; /* @todo match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */ + + LWIP_UNUSED_ARG(ip6addr); /* @todo match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */ /* @todo: implement default router preference */ - /* Look for reachable routers. */ + /* Look for valid routers. A reachable router is preferred. */ + valid_router = -1; for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; - } - if ((default_router_list[i].neighbor_entry != NULL) && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) && - (default_router_list[i].invalidation_timer > 0) && - (default_router_list[i].neighbor_entry->state == ND6_REACHABLE)) { - return i; + /* Is the router netif both set and apppropriate? */ + if (default_router_list[i].neighbor_entry != NULL) { + router_netif = default_router_list[i].neighbor_entry->netif; + if ((router_netif != NULL) && (netif != NULL ? netif == router_netif : + (netif_is_up(router_netif) && netif_is_link_up(router_netif)))) { + /* Is the router valid, i.e., reachable or probably reachable as per + * RFC 4861 Sec. 6.3.6? Note that we will never return a router that + * has no neighbor cache entry, due to the netif association tests. */ + if (default_router_list[i].neighbor_entry->state != ND6_INCOMPLETE) { + /* Is the router known to be reachable? */ + if (default_router_list[i].neighbor_entry->state == ND6_REACHABLE) { + return i; /* valid and reachable - done! */ + } else if (valid_router < 0) { + valid_router = i; /* valid but not known to be reachable */ + } + } + } } } - - /* Look for router in other reachability states, but still valid according to timer. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; - } - if ((default_router_list[i].neighbor_entry != NULL) && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) && - (default_router_list[i].invalidation_timer > 0)) { - return i; - } + if (valid_router >= 0) { + return valid_router; } /* Look for any router for which we have any information at all. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; + /* last_router is used for round-robin selection of incomplete routers, as + * recommended in RFC 4861 Sec. 6.3.6 point (2). Advance only when picking a + * route, to select the same router as next-hop target in the common case. */ + if ((netif == NULL) && (++last_router >= LWIP_ND6_NUM_ROUTERS)) { + last_router = 0; + } + i = last_router; + for (j = 0; j < LWIP_ND6_NUM_ROUTERS; j++) { + if (default_router_list[i].neighbor_entry != NULL) { + router_netif = default_router_list[i].neighbor_entry->netif; + if ((router_netif != NULL) && (netif != NULL ? netif == router_netif : + (netif_is_up(router_netif) && netif_is_link_up(router_netif)))) { + return i; + } } - if (default_router_list[i].neighbor_entry != NULL && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1)) { - return i; + if (++i >= LWIP_ND6_NUM_ROUTERS) { + i = 0; } } @@ -1430,10 +1741,11 @@ nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif) } /** - * Find a router-announced route to the given destination. + * Find a router-announced route to the given destination. This route may be + * based on an on-link prefix or a default router. * - * The caller is responsible for checking whether the returned netif, if any, - * is in a suitable state (up, link up) to be used for packet transmission. + * If a suitable route is found, the returned netif is guaranteed to be in a + * suitable state (up, link up) to be used for packet transmission. * * @param ip6addr the destination IPv6 address * @return the netif to use for the destination, or NULL if none found @@ -1441,13 +1753,27 @@ nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif) struct netif * nd6_find_route(const ip6_addr_t *ip6addr) { + struct netif *netif; s8_t i; + /* @todo decide if it makes sense to check the destination cache first */ + + /* Check if there is a matching on-link prefix. There may be multiple + * matches. Pick the first one that is associated with a suitable netif. */ + for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) { + netif = prefix_list[i].netif; + if ((netif != NULL) && ip6_addr_netcmp(&prefix_list[i].prefix, ip6addr) && + netif_is_up(netif) && netif_is_link_up(netif)) { + return netif; + } + } + + /* No on-link prefix match. Find a router that can forward the packet. */ i = nd6_select_router(ip6addr, NULL); if (i >= 0) { - if (default_router_list[i].neighbor_entry != NULL) { - return default_router_list[i].neighbor_entry->netif; /* may be NULL */ - } + LWIP_ASSERT("selected router must have a neighbor entry", + default_router_list[i].neighbor_entry != NULL); + return default_router_list[i].neighbor_entry->netif; } return NULL; @@ -1465,6 +1791,8 @@ nd6_get_router(const ip6_addr_t *router_addr, struct netif *netif) { s8_t i; + IP6_ADDR_ZONECHECK_NETIF(router_addr, netif); + /* Look for router. */ for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { if ((default_router_list[i].neighbor_entry != NULL) && @@ -1492,6 +1820,8 @@ nd6_new_router(const ip6_addr_t *router_addr, struct netif *netif) s8_t free_router_index; s8_t neighbor_index; + IP6_ADDR_ZONECHECK_NETIF(router_addr, netif); + /* Do we have a neighbor entry for this router? */ neighbor_index = nd6_find_neighbor_cache_entry(router_addr); if (neighbor_index < 0) { @@ -1547,7 +1877,7 @@ nd6_new_router(const ip6_addr_t *router_addr, struct netif *netif) * @return the index on the prefix table, or -1 if not found */ static s8_t -nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif) +nd6_get_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif) { s8_t i; @@ -1571,7 +1901,7 @@ nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif) * @return the index on the prefix table, or -1 if not created */ static s8_t -nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif) +nd6_new_onlink_prefix(const ip6_addr_t *prefix, struct netif *netif) { s8_t i; @@ -1582,9 +1912,6 @@ nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif) /* Found empty prefix entry. */ prefix_list[i].netif = netif; ip6_addr_set(&(prefix_list[i].prefix), prefix); -#if LWIP_IPV6_AUTOCONFIG - prefix_list[i].flags = 0; -#endif /* LWIP_IPV6_AUTOCONFIG */ return i; } } @@ -1612,11 +1939,14 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif) const ip6_addr_t *next_hop_addr; #endif /* LWIP_HOOK_ND6_GET_GW */ s8_t i; + s16_t dst_idx; + + IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif); #if LWIP_NETIF_HWADDRHINT - if (netif->addr_hint != NULL) { + if (netif->hints != NULL) { /* per-pcb cached entry was given */ - u8_t addr_hint = *(netif->addr_hint); + netif_addr_idx_t addr_hint = netif->hints->addr_hint; if (addr_hint < LWIP_ND6_NUM_DESTINATIONS) { nd6_cached_destination_index = addr_hint; } @@ -1630,16 +1960,18 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif) ND6_STATS_INC(nd6.cachehit); } else { /* Search destination cache. */ - i = nd6_find_destination_cache_entry(ip6addr); - if (i >= 0) { + dst_idx = nd6_find_destination_cache_entry(ip6addr); + if (dst_idx >= 0) { /* found destination entry. make it our new cached index. */ - nd6_cached_destination_index = i; + LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX); + nd6_cached_destination_index = (netif_addr_idx_t)dst_idx; } else { /* Not found. Create a new destination entry. */ - i = nd6_new_destination_cache_entry(); - if (i >= 0) { + dst_idx = nd6_new_destination_cache_entry(); + if (dst_idx >= 0) { /* got new destination entry. make it our new cached index. */ - nd6_cached_destination_index = i; + LWIP_ASSERT("type overflow", (size_t)dst_idx < NETIF_ADDR_IDX_MAX); + nd6_cached_destination_index = (netif_addr_idx_t)dst_idx; } else { /* Could not create a destination cache entry. */ return ERR_MEM; @@ -1652,7 +1984,7 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif) if (ip6_addr_islinklocal(ip6addr) || nd6_is_prefix_in_netif(ip6addr, netif)) { /* Destination in local link. */ - destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; + destination_cache[nd6_cached_destination_index].pmtu = netif_mtu6(netif); ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, destination_cache[nd6_cached_destination_index].destination_addr); #ifdef LWIP_HOOK_ND6_GET_GW } else if ((next_hop_addr = LWIP_HOOK_ND6_GET_GW(netif, ip6addr)) != NULL) { @@ -1668,16 +2000,16 @@ nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif) ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr)); return ERR_RTE; } - destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; /* Start with netif mtu, correct through ICMPv6 if necessary */ + destination_cache[nd6_cached_destination_index].pmtu = netif_mtu6(netif); /* Start with netif mtu, correct through ICMPv6 if necessary */ ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, default_router_list[i].neighbor_entry->next_hop_address); } } } #if LWIP_NETIF_HWADDRHINT - if (netif->addr_hint != NULL) { + if (netif->hints != NULL) { /* per-pcb cached entry was given */ - *(netif->addr_hint) = nd6_cached_destination_index; + netif->hints->addr_hint = nd6_cached_destination_index; } #endif /* LWIP_NETIF_HWADDRHINT */ @@ -1741,12 +2073,11 @@ nd6_queue_packet(s8_t neighbor_index, struct pbuf *q) return ERR_ARG; } - /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but - * to copy the whole queue into a new PBUF_RAM (see bug #11400) - * PBUF_ROMs can be left as they are, since ROM must not get changed. */ + /* IF q includes a pbuf that must be copied, we have to copy the whole chain + * into a new PBUF_RAM. See the definition of PBUF_NEEDS_COPY for details. */ p = q; while (p) { - if (p->type != PBUF_ROM) { + if (PBUF_NEEDS_COPY(p)) { copy_needed = 1; break; } @@ -1754,7 +2085,7 @@ nd6_queue_packet(s8_t neighbor_index, struct pbuf *q) } if (copy_needed) { /* copy the whole packet into new pbufs */ - p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM); + p = pbuf_clone(PBUF_LINK, PBUF_RAM, q); while ((p == NULL) && (neighbor_cache[neighbor_index].q != NULL)) { /* Free oldest packet (as per RFC recommendation) */ #if LWIP_ND6_QUEUEING @@ -1766,13 +2097,7 @@ nd6_queue_packet(s8_t neighbor_index, struct pbuf *q) pbuf_free(neighbor_cache[neighbor_index].q); neighbor_cache[neighbor_index].q = NULL; #endif /* LWIP_ND6_QUEUEING */ - p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM); - } - if (p != NULL) { - if (pbuf_copy(p, q) != ERR_OK) { - pbuf_free(p); - p = NULL; - } + p = pbuf_clone(PBUF_LINK, PBUF_RAM, q); } } else { /* referencing the old pbuf is enough */ @@ -1881,7 +2206,9 @@ nd6_send_q(s8_t i) /* Get ipv6 header. */ ip6hdr = (struct ip6_hdr *)(q->p->payload); /* Create an aligned copy. */ - ip6_addr_set(&dest, &(ip6hdr->dest)); + ip6_addr_copy_from_packed(dest, ip6hdr->dest); + /* Restore the zone, if applicable. */ + ip6_addr_assign_zone(&dest, IP6_UNKNOWN, neighbor_cache[i].netif); /* send the queued IPv6 packet */ (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, q->p, &dest); /* free the queued IP packet */ @@ -1894,7 +2221,9 @@ nd6_send_q(s8_t i) /* Get ipv6 header. */ ip6hdr = (struct ip6_hdr *)(neighbor_cache[i].q->payload); /* Create an aligned copy. */ - ip6_addr_set(&dest, &(ip6hdr->dest)); + ip6_addr_copy_from_packed(dest, ip6hdr->dest); + /* Restore the zone, if applicable. */ + ip6_addr_assign_zone(&dest, IP6_UNKNOWN, neighbor_cache[i].netif); /* send the queued IPv6 packet */ (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, neighbor_cache[i].q, &dest); /* free the queued IP packet */ @@ -1970,7 +2299,7 @@ nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_ad u16_t nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif) { - s8_t i; + s16_t i; i = nd6_find_destination_cache_entry(ip6addr); if (i >= 0) { @@ -1980,10 +2309,10 @@ nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif) } if (netif != NULL) { - return netif->mtu; + return netif_mtu6(netif); } - return 1280; /* Minimum MTU */ + return IP6_MIN_MTU_LENGTH; /* Minimum MTU */ } @@ -2001,24 +2330,25 @@ void nd6_reachability_hint(const ip6_addr_t *ip6addr) { s8_t i; + s16_t dst_idx; /* Find destination in cache. */ if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) { - i = nd6_cached_destination_index; + dst_idx = nd6_cached_destination_index; ND6_STATS_INC(nd6.cachehit); } else { - i = nd6_find_destination_cache_entry(ip6addr); + dst_idx = nd6_find_destination_cache_entry(ip6addr); } - if (i < 0) { + if (dst_idx < 0) { return; } /* Find next hop neighbor in cache. */ - if (ip6_addr_cmp(&(destination_cache[i].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) { + if (ip6_addr_cmp(&(destination_cache[dst_idx].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) { i = nd6_cached_neighbor_index; ND6_STATS_INC(nd6.cachehit); } else { - i = nd6_find_neighbor_cache_entry(&(destination_cache[i].next_hop_addr)); + i = nd6_find_neighbor_cache_entry(&(destination_cache[dst_idx].next_hop_addr)); } if (i < 0) { return; @@ -2048,7 +2378,6 @@ nd6_cleanup_netif(struct netif *netif) for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { if (prefix_list[i].netif == netif) { prefix_list[i].netif = NULL; - prefix_list[i].flags = 0; } } for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { @@ -2063,6 +2392,10 @@ nd6_cleanup_netif(struct netif *netif) nd6_free_neighbor_cache_entry(i); } } + /* Clear the destination cache, since many entries may now have become + * invalid for one of several reasons. As destination cache entries have no + * netif association, use a sledgehammer approach (this can be improved). */ + nd6_clear_destination_cache(); } #if LWIP_IPV6_MLD @@ -2084,11 +2417,12 @@ nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state) /* Determine whether we were, and should be, a member of the solicited-node * multicast group for this address. For tentative addresses, the group is * not joined until the address enters the TENTATIVE_1 (or VALID) state. */ - old_member = (old_state != IP6_ADDR_INVALID && old_state != IP6_ADDR_TENTATIVE); - new_member = (new_state != IP6_ADDR_INVALID && new_state != IP6_ADDR_TENTATIVE); + old_member = (old_state != IP6_ADDR_INVALID && old_state != IP6_ADDR_DUPLICATED && old_state != IP6_ADDR_TENTATIVE); + new_member = (new_state != IP6_ADDR_INVALID && new_state != IP6_ADDR_DUPLICATED && new_state != IP6_ADDR_TENTATIVE); if (old_member != new_member) { ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(netif, addr_idx)->addr[3]); + ip6_addr_assign_zone(&multicast_address, IP6_MULTICAST, netif); if (new_member) { mld6_joingroup_netif(netif, &multicast_address); @@ -2099,4 +2433,14 @@ nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state) } #endif /* LWIP_IPV6_MLD */ +/** Netif was added, set up, or reconnected (link up) */ +void +nd6_restart_netif(struct netif *netif) +{ +#if LWIP_IPV6_SEND_ROUTER_SOLICIT + /* Send Router Solicitation messages (see RFC 4861, ch. 6.3.7). */ + netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT; +#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ +} + #endif /* LWIP_IPV6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/mem.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/mem.c similarity index 64% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/mem.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/mem.c index 4ee9a4e..e3f536c 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/mem.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/mem.c @@ -60,14 +60,97 @@ #include "lwip/stats.h" #include "lwip/err.h" -#include "wm_mem.h" - #include #if MEM_LIBC_MALLOC #include /* for malloc()/free() */ #endif +/* This is overridable for tests only... */ +#ifndef LWIP_MEM_ILLEGAL_FREE +#define LWIP_MEM_ILLEGAL_FREE(msg) LWIP_ASSERT(msg, 0) +#endif + +#define MEM_STATS_INC_LOCKED(x) SYS_ARCH_LOCKED(MEM_STATS_INC(x)) +#define MEM_STATS_INC_USED_LOCKED(x, y) SYS_ARCH_LOCKED(MEM_STATS_INC_USED(x, y)) +#define MEM_STATS_DEC_USED_LOCKED(x, y) SYS_ARCH_LOCKED(MEM_STATS_DEC_USED(x, y)) + +#if MEM_OVERFLOW_CHECK +#define MEM_SANITY_OFFSET MEM_SANITY_REGION_BEFORE_ALIGNED +#define MEM_SANITY_OVERHEAD (MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED) +#else +#define MEM_SANITY_OFFSET 0 +#define MEM_SANITY_OVERHEAD 0 +#endif + +#if MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK +/** + * Check if a mep element was victim of an overflow or underflow + * (e.g. the restricted area after/before it has been altered) + * + * @param p the mem element to check + * @param size allocated size of the element + * @param descr1 description of the element source shown on error + * @param descr2 description of the element source shown on error + */ +void +mem_overflow_check_raw(void *p, size_t size, const char *descr1, const char *descr2) +{ +#if MEM_SANITY_REGION_AFTER_ALIGNED || MEM_SANITY_REGION_BEFORE_ALIGNED + u16_t k; + u8_t *m; + +#if MEM_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t *)p + size; + for (k = 0; k < MEM_SANITY_REGION_AFTER_ALIGNED; k++) { + if (m[k] != 0xcd) { + char errstr[128]; + snprintf(errstr, sizeof(errstr), "detected mem overflow in %s%s", descr1, descr2); + LWIP_ASSERT(errstr, 0); + } + } +#endif /* MEM_SANITY_REGION_AFTER_ALIGNED > 0 */ + +#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t *)p - MEM_SANITY_REGION_BEFORE_ALIGNED; + for (k = 0; k < MEM_SANITY_REGION_BEFORE_ALIGNED; k++) { + if (m[k] != 0xcd) { + char errstr[128]; + snprintf(errstr, sizeof(errstr), "detected mem underflow in %s%s", descr1, descr2); + LWIP_ASSERT(errstr, 0); + } + } +#endif /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 */ +#else + LWIP_UNUSED_ARG(p); + LWIP_UNUSED_ARG(desc); + LWIP_UNUSED_ARG(descr); +#endif +} + +/** + * Initialize the restricted area of a mem element. + */ +void +mem_overflow_init_raw(void *p, size_t size) +{ +#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0 + u8_t *m; +#if MEM_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t *)p - MEM_SANITY_REGION_BEFORE_ALIGNED; + memset(m, 0xcd, MEM_SANITY_REGION_BEFORE_ALIGNED); +#endif +#if MEM_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t *)p + size; + memset(m, 0xcd, MEM_SANITY_REGION_AFTER_ALIGNED); +#endif +#else /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0 */ + LWIP_UNUSED_ARG(p); + LWIP_UNUSED_ARG(desc); +#endif /* MEM_SANITY_REGION_BEFORE_ALIGNED > 0 || MEM_SANITY_REGION_AFTER_ALIGNED > 0 */ +} +#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */ + #if MEM_LIBC_MALLOC || MEM_USE_POOLS /** mem_init is not used when using pools instead of a heap or using @@ -82,7 +165,7 @@ mem_init(void) * C library malloc(): we can't free part of a pool element and the stack * support mem_trim() to return a different pointer */ -void* +void * mem_trim(void *mem, mem_size_t size) { LWIP_UNUSED_ARG(size); @@ -91,6 +174,7 @@ mem_trim(void *mem, mem_size_t size) #endif /* MEM_LIBC_MALLOC || MEM_USE_POOLS */ #if MEM_LIBC_MALLOC +#include "wm_mem.h" /* lwIP heap implemented using C library malloc() */ /* in case C library malloc() needs extra protection, @@ -123,15 +207,15 @@ mem_trim(void *mem, mem_size_t size) void * mem_malloc(mem_size_t size) { - void* ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE); + void *ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE); if (ret == NULL) { - MEM_STATS_INC(err); + MEM_STATS_INC_LOCKED(err); } else { LWIP_ASSERT("malloc() must return aligned memory", LWIP_MEM_ALIGN(ret) == ret); #if LWIP_STATS && MEM_STATS - *(mem_size_t*)ret = size; - ret = (u8_t*)ret + MEM_LIBC_STATSHELPER_SIZE; - MEM_STATS_INC_USED(used, size); + *(mem_size_t *)ret = size; + ret = (u8_t *)ret + MEM_LIBC_STATSHELPER_SIZE; + MEM_STATS_INC_USED_LOCKED(used, size); #endif } return ret; @@ -147,8 +231,8 @@ mem_free(void *rmem) LWIP_ASSERT("rmem != NULL", (rmem != NULL)); LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); #if LWIP_STATS && MEM_STATS - rmem = (u8_t*)rmem - MEM_LIBC_STATSHELPER_SIZE; - MEM_STATS_DEC_USED(used, *(mem_size_t*)rmem); + rmem = (u8_t *)rmem - MEM_LIBC_STATSHELPER_SIZE; + MEM_STATS_DEC_USED_LOCKED(used, *(mem_size_t *)rmem); #endif mem_clib_free(rmem); } @@ -176,7 +260,7 @@ mem_malloc(mem_size_t size) /* is this pool big enough to hold an element of the required size plus a struct memp_malloc_helper that saves the pool this element came from? */ if (required_size <= memp_pools[poolnr]->size) { - element = (struct memp_malloc_helper*)memp_malloc(poolnr); + element = (struct memp_malloc_helper *)memp_malloc(poolnr); if (element == NULL) { /* No need to DEBUGF or ASSERT: This error is already taken care of in memp.c */ #if MEM_USE_POOLS_TRY_BIGGER_POOL @@ -185,7 +269,7 @@ mem_malloc(mem_size_t size) continue; } #endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ - MEM_STATS_INC(err); + MEM_STATS_INC_LOCKED(err); return NULL; } break; @@ -193,23 +277,23 @@ mem_malloc(mem_size_t size) } if (poolnr > MEMP_POOL_LAST) { LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); - MEM_STATS_INC(err); + MEM_STATS_INC_LOCKED(err); return NULL; } /* save the pool number this element came from */ element->poolnr = poolnr; /* and return a pointer to the memory directly after the struct memp_malloc_helper */ - ret = (u8_t*)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); + ret = (u8_t *)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); #if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) /* truncating to u16_t is safe because struct memp_desc::size is u16_t */ element->size = (u16_t)size; - MEM_STATS_INC_USED(used, element->size); + MEM_STATS_INC_USED_LOCKED(used, element->size); #endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */ #if MEMP_OVERFLOW_CHECK /* initialize unused memory (diff between requested size and selected pool's size) */ - memset((u8_t*)ret + size, 0xcd, memp_pools[poolnr]->size - size); + memset((u8_t *)ret + size, 0xcd, memp_pools[poolnr]->size - size); #endif /* MEMP_OVERFLOW_CHECK */ return ret; } @@ -231,23 +315,23 @@ mem_free(void *rmem) /* get the original struct memp_malloc_helper */ /* cast through void* to get rid of alignment warnings */ - hmem = (struct memp_malloc_helper*)(void*)((u8_t*)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))); + hmem = (struct memp_malloc_helper *)(void *)((u8_t *)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))); LWIP_ASSERT("hmem != NULL", (hmem != NULL)); LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); - MEM_STATS_DEC_USED(used, hmem->size); + MEM_STATS_DEC_USED_LOCKED(used, hmem->size); #if MEMP_OVERFLOW_CHECK { - u16_t i; - LWIP_ASSERT("MEM_USE_POOLS: invalid chunk size", - hmem->size <= memp_pools[hmem->poolnr]->size); - /* check that unused memory remained untouched (diff between requested size and selected pool's size) */ - for (i = hmem->size; i < memp_pools[hmem->poolnr]->size; i++) { - u8_t data = *((u8_t*)rmem + i); - LWIP_ASSERT("MEM_USE_POOLS: mem overflow detected", data == 0xcd); - } + u16_t i; + LWIP_ASSERT("MEM_USE_POOLS: invalid chunk size", + hmem->size <= memp_pools[hmem->poolnr]->size); + /* check that unused memory remained untouched (diff between requested size and selected pool's size) */ + for (i = hmem->size; i < memp_pools[hmem->poolnr]->size; i++) { + u8_t data = *((u8_t *)rmem + i); + LWIP_ASSERT("MEM_USE_POOLS: mem overflow detected", data == 0xcd); + } } #endif /* MEMP_OVERFLOW_CHECK */ @@ -270,6 +354,10 @@ struct mem { mem_size_t prev; /** 1: this area is used; 0: this area is unused */ u8_t used; +#if MEM_OVERFLOW_CHECK + /** this keeps track of the user allocation size for guard checks */ + mem_size_t user_size; +#endif }; /** All allocated blocks will be MIN_SIZE bytes big, at least! @@ -289,7 +377,7 @@ struct mem { * how that space is calculated). */ #ifndef LWIP_RAM_HEAP_POINTER /** the heap. we need one struct mem at the end and some room for alignment */ -LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM)); +LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U * SIZEOF_STRUCT_MEM)); #define LWIP_RAM_HEAP_POINTER ram_heap #endif /* LWIP_RAM_HEAP_POINTER */ @@ -297,8 +385,6 @@ LWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM)) static u8_t *ram; /** the last entry, always unused! */ static struct mem *ram_end; -/** pointer to the lowest free block, this is used for faster search */ -static struct mem *lfree; /** concurrent access protection */ #if !NO_SYS @@ -316,20 +402,63 @@ static volatile u8_t mem_free_count; #define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) #define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) #define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) +#define LWIP_MEM_LFREE_VOLATILE volatile #else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ -/* Protect the heap only by using a semaphore */ +/* Protect the heap only by using a mutex */ #define LWIP_MEM_FREE_DECL_PROTECT() #define LWIP_MEM_FREE_PROTECT() sys_mutex_lock(&mem_mutex) #define LWIP_MEM_FREE_UNPROTECT() sys_mutex_unlock(&mem_mutex) -/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ +/* mem_malloc is protected using mutex AND LWIP_MEM_ALLOC_PROTECT */ #define LWIP_MEM_ALLOC_DECL_PROTECT() #define LWIP_MEM_ALLOC_PROTECT() #define LWIP_MEM_ALLOC_UNPROTECT() +#define LWIP_MEM_LFREE_VOLATILE #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ +/** pointer to the lowest free block, this is used for faster search */ +static struct mem * LWIP_MEM_LFREE_VOLATILE lfree; + +#if MEM_SANITY_CHECK +static void mem_sanity(void); +#define MEM_SANITY() mem_sanity() +#else +#define MEM_SANITY() +#endif + +#if MEM_OVERFLOW_CHECK +static void +mem_overflow_init_element(struct mem *mem, mem_size_t user_size) +{ + void *p = (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET; + mem->user_size = user_size; + mem_overflow_init_raw(p, user_size); +} + +static void +mem_overflow_check_element(struct mem *mem) +{ + void *p = (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET; + mem_overflow_check_raw(p, mem->user_size, "heap", ""); +} +#else /* MEM_OVERFLOW_CHECK */ +#define mem_overflow_init_element(mem, size) +#define mem_overflow_check_element(mem) +#endif /* MEM_OVERFLOW_CHECK */ + +static struct mem * +ptr_to_mem(mem_size_t ptr) +{ + return (struct mem *)(void *)&ram[ptr]; +} + +static mem_size_t +mem_to_ptr(void *mem) +{ + return (mem_size_t)((u8_t *)mem - ram); +} /** * "Plug holes" by combining adjacent empty struct mems. @@ -355,25 +484,29 @@ plug_holes(struct mem *mem) /* plug hole forward */ LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED); - nmem = (struct mem *)(void *)&ram[mem->next]; + nmem = ptr_to_mem(mem->next); if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) { /* if mem->next is unused and not end of ram, combine mem and mem->next */ if (lfree == nmem) { lfree = mem; } mem->next = nmem->next; - ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram); + if (nmem->next != MEM_SIZE_ALIGNED) { + ptr_to_mem(nmem->next)->prev = mem_to_ptr(mem); + } } /* plug hole backward */ - pmem = (struct mem *)(void *)&ram[mem->prev]; + pmem = ptr_to_mem(mem->prev); if (pmem != mem && pmem->used == 0) { /* if mem->prev is unused, combine mem and mem->prev */ if (lfree == mem) { lfree = pmem; } pmem->next = mem->next; - ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram); + if (mem->next != MEM_SIZE_ALIGNED) { + ptr_to_mem(mem->next)->prev = mem_to_ptr(pmem); + } } } @@ -386,7 +519,7 @@ mem_init(void) struct mem *mem; LWIP_ASSERT("Sanity check alignment", - (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0); + (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT - 1)) == 0); /* align the heap */ ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); @@ -396,10 +529,11 @@ mem_init(void) mem->prev = 0; mem->used = 0; /* initialize the end of the heap */ - ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED]; + ram_end = ptr_to_mem(MEM_SIZE_ALIGNED); ram_end->used = 1; ram_end->next = MEM_SIZE_ALIGNED; ram_end->prev = MEM_SIZE_ALIGNED; + MEM_SANITY(); /* initialize the lowest-free pointer to the start of the heap */ lfree = (struct mem *)(void *)ram; @@ -411,6 +545,69 @@ mem_init(void) } } +/* Check if a struct mem is correctly linked. + * If not, double-free is a possible reason. + */ +static int +mem_link_valid(struct mem *mem) +{ + struct mem *nmem, *pmem; + mem_size_t rmem_idx; + rmem_idx = mem_to_ptr(mem); + nmem = ptr_to_mem(mem->next); + pmem = ptr_to_mem(mem->prev); + if ((mem->next > MEM_SIZE_ALIGNED) || (mem->prev > MEM_SIZE_ALIGNED) || + ((mem->prev != rmem_idx) && (pmem->next != rmem_idx)) || + ((nmem != ram_end) && (nmem->prev != rmem_idx))) { + return 0; + } + return 1; +} + +#if MEM_SANITY_CHECK +static void +mem_sanity(void) +{ + struct mem *mem; + u8_t last_used; + + /* begin with first element here */ + mem = (struct mem *)ram; + LWIP_ASSERT("heap element used valid", (mem->used == 0) || (mem->used == 1)); + last_used = mem->used; + LWIP_ASSERT("heap element prev ptr valid", mem->prev == 0); + LWIP_ASSERT("heap element next ptr valid", mem->next <= MEM_SIZE_ALIGNED); + LWIP_ASSERT("heap element next ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->next) == ptr_to_mem(mem->next))); + + /* check all elements before the end of the heap */ + for (mem = ptr_to_mem(mem->next); + ((u8_t *)mem > ram) && (mem < ram_end); + mem = ptr_to_mem(mem->next)) { + LWIP_ASSERT("heap element aligned", LWIP_MEM_ALIGN(mem) == mem); + LWIP_ASSERT("heap element prev ptr valid", mem->prev <= MEM_SIZE_ALIGNED); + LWIP_ASSERT("heap element next ptr valid", mem->next <= MEM_SIZE_ALIGNED); + LWIP_ASSERT("heap element prev ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->prev) == ptr_to_mem(mem->prev))); + LWIP_ASSERT("heap element next ptr aligned", LWIP_MEM_ALIGN(ptr_to_mem(mem->next) == ptr_to_mem(mem->next))); + + if (last_used == 0) { + /* 2 unused elements in a row? */ + LWIP_ASSERT("heap element unused?", mem->used == 1); + } else { + LWIP_ASSERT("heap element unused member", (mem->used == 0) || (mem->used == 1)); + } + + LWIP_ASSERT("heap element link valid", mem_link_valid(mem)); + + /* used/unused altering */ + last_used = mem->used; + } + LWIP_ASSERT("heap end ptr sanity", mem == ptr_to_mem(MEM_SIZE_ALIGNED)); + LWIP_ASSERT("heap element used valid", mem->used == 1); + LWIP_ASSERT("heap element prev ptr valid", mem->prev == MEM_SIZE_ALIGNED); + LWIP_ASSERT("heap element next ptr valid", mem->next == MEM_SIZE_ALIGNED); +} +#endif /* MEM_SANITY_CHECK */ + /** * Put a struct mem back on the heap * @@ -427,28 +624,50 @@ mem_free(void *rmem) LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n")); return; } - LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); - - LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); - - if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { - SYS_ARCH_DECL_PROTECT(lev); - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); + if ((((mem_ptr_t)rmem) & (MEM_ALIGNMENT - 1)) != 0) { + LWIP_MEM_ILLEGAL_FREE("mem_free: sanity check alignment"); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: sanity check alignment\n")); /* protect mem stats from concurrent access */ - SYS_ARCH_PROTECT(lev); - MEM_STATS_INC(illegal); - SYS_ARCH_UNPROTECT(lev); + MEM_STATS_INC_LOCKED(illegal); return; } + + /* Get the corresponding struct mem: */ + /* cast through void* to get rid of alignment warnings */ + mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET)); + + if ((u8_t *)mem < ram || (u8_t *)rmem + MIN_SIZE_ALIGNED > (u8_t *)ram_end) { + LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory"); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); + /* protect mem stats from concurrent access */ + MEM_STATS_INC_LOCKED(illegal); + return; + } +#if MEM_OVERFLOW_CHECK + mem_overflow_check_element(mem); +#endif /* protect the heap from concurrent access */ LWIP_MEM_FREE_PROTECT(); - /* Get the corresponding struct mem ... */ - /* cast through void* to get rid of alignment warnings */ - mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); - /* ... which has to be in a used state ... */ - LWIP_ASSERT("mem_free: mem->used", mem->used); - /* ... and is now unused. */ + /* mem has to be in a used state */ + if (!mem->used) { + LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: double free"); + LWIP_MEM_FREE_UNPROTECT(); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: double free?\n")); + /* protect mem stats from concurrent access */ + MEM_STATS_INC_LOCKED(illegal); + return; + } + + if (!mem_link_valid(mem)) { + LWIP_MEM_ILLEGAL_FREE("mem_free: illegal memory: non-linked: double free"); + LWIP_MEM_FREE_UNPROTECT(); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory: non-linked: double free?\n")); + /* protect mem stats from concurrent access */ + MEM_STATS_INC_LOCKED(illegal); + return; + } + + /* mem is now unused. */ mem->used = 0; if (mem < lfree) { @@ -460,6 +679,7 @@ mem_free(void *rmem) /* finally, see if prev or next are free also */ plug_holes(mem); + MEM_SANITY(); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 1; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ @@ -470,16 +690,16 @@ mem_free(void *rmem) * Shrink memory returned by mem_malloc(). * * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked - * @param newsize required size after shrinking (needs to be smaller than or + * @param new_size required size after shrinking (needs to be smaller than or * equal to the previous size) * @return for compatibility reasons: is always == rmem, at the moment * or NULL if newsize is > old size, in which case rmem is NOT touched * or freed! */ void * -mem_trim(void *rmem, mem_size_t newsize) +mem_trim(void *rmem, mem_size_t new_size) { - mem_size_t size; + mem_size_t size, newsize; mem_size_t ptr, ptr2; struct mem *mem, *mem2; /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ @@ -487,36 +707,37 @@ mem_trim(void *rmem, mem_size_t newsize) /* Expand the size of the allocated memory region so that we can adjust for alignment. */ - newsize = LWIP_MEM_ALIGN_SIZE(newsize); - + newsize = (mem_size_t)LWIP_MEM_ALIGN_SIZE(new_size); if (newsize < MIN_SIZE_ALIGNED) { /* every data block must be at least MIN_SIZE_ALIGNED long */ newsize = MIN_SIZE_ALIGNED; } - - if (newsize > MEM_SIZE_ALIGNED) { +#if MEM_OVERFLOW_CHECK + newsize += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED; +#endif + if ((newsize > MEM_SIZE_ALIGNED) || (newsize < new_size)) { return NULL; } LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); + (u8_t *)rmem < (u8_t *)ram_end); if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { - SYS_ARCH_DECL_PROTECT(lev); LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n")); /* protect mem stats from concurrent access */ - SYS_ARCH_PROTECT(lev); - MEM_STATS_INC(illegal); - SYS_ARCH_UNPROTECT(lev); + MEM_STATS_INC_LOCKED(illegal); return rmem; } /* Get the corresponding struct mem ... */ /* cast through void* to get rid of alignment warnings */ - mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + mem = (struct mem *)(void *)((u8_t *)rmem - (SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET)); +#if MEM_OVERFLOW_CHECK + mem_overflow_check_element(mem); +#endif /* ... and its offset pointer */ - ptr = (mem_size_t)((u8_t *)mem - ram); + ptr = mem_to_ptr(mem); - size = mem->next - ptr - SIZEOF_STRUCT_MEM; + size = (mem_size_t)((mem_size_t)(mem->next - ptr) - (SIZEOF_STRUCT_MEM + MEM_SANITY_OVERHEAD)); LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size); if (newsize > size) { /* not supported */ @@ -530,18 +751,19 @@ mem_trim(void *rmem, mem_size_t newsize) /* protect the heap from concurrent access */ LWIP_MEM_FREE_PROTECT(); - mem2 = (struct mem *)(void *)&ram[mem->next]; + mem2 = ptr_to_mem(mem->next); if (mem2->used == 0) { /* The next struct is unused, we can simply move it at little */ mem_size_t next; + LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED); /* remember the old next pointer */ next = mem2->next; /* create new struct mem which is moved directly after the shrinked mem */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; + ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize); if (lfree == mem2) { - lfree = (struct mem *)(void *)&ram[ptr2]; + lfree = ptr_to_mem(ptr2); } - mem2 = (struct mem *)(void *)&ram[ptr2]; + mem2 = ptr_to_mem(ptr2); mem2->used = 0; /* restore the next pointer */ mem2->next = next; @@ -553,7 +775,7 @@ mem_trim(void *rmem, mem_size_t newsize) * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not * the end of the heap */ if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + ptr_to_mem(mem2->next)->prev = ptr2; } MEM_STATS_DEC_USED(used, (size - newsize)); /* no need to plug holes, we've already done that */ @@ -565,8 +787,9 @@ mem_trim(void *rmem, mem_size_t newsize) * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty * region that couldn't hold data, but when mem->next gets freed, * the 2 regions would be combined, resulting in more free memory */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; - mem2 = (struct mem *)(void *)&ram[ptr2]; + ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + newsize); + LWIP_ASSERT("invalid next ptr", mem->next != MEM_SIZE_ALIGNED); + mem2 = ptr_to_mem(ptr2); if (mem2 < lfree) { lfree = mem2; } @@ -575,7 +798,7 @@ mem_trim(void *rmem, mem_size_t newsize) mem2->prev = ptr; mem->next = ptr2; if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + ptr_to_mem(mem2->next)->prev = ptr2; } MEM_STATS_DEC_USED(used, (size - newsize)); /* the original mem->next is used, so no need to plug holes! */ @@ -586,6 +809,10 @@ mem_trim(void *rmem, mem_size_t newsize) -> don't do anyhting. -> the remaining space stays unused since it is too small } */ +#if MEM_OVERFLOW_CHECK + mem_overflow_init_element(mem, new_size); +#endif + MEM_SANITY(); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 1; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ @@ -596,35 +823,36 @@ mem_trim(void *rmem, mem_size_t newsize) /** * Allocate a block of memory with a minimum of 'size' bytes. * - * @param size is the minimum size of the requested block in bytes. + * @param size_in is the minimum size of the requested block in bytes. * @return pointer to allocated memory or NULL if no free memory was found. * * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). */ void * -mem_malloc(mem_size_t size) +mem_malloc(mem_size_t size_in) { - mem_size_t ptr, ptr2; + mem_size_t ptr, ptr2, size; struct mem *mem, *mem2; #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT u8_t local_mem_free_count = 0; #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ LWIP_MEM_ALLOC_DECL_PROTECT(); - if (size == 0) { + if (size_in == 0) { return NULL; } /* Expand the size of the allocated memory region so that we can adjust for alignment. */ - size = LWIP_MEM_ALIGN_SIZE(size); - + size = (mem_size_t)LWIP_MEM_ALIGN_SIZE(size_in); if (size < MIN_SIZE_ALIGNED) { /* every data block must be at least MIN_SIZE_ALIGNED long */ size = MIN_SIZE_ALIGNED; } - - if (size > MEM_SIZE_ALIGNED) { +#if MEM_OVERFLOW_CHECK + size += MEM_SANITY_REGION_BEFORE_ALIGNED + MEM_SANITY_REGION_AFTER_ALIGNED; +#endif + if ((size > MEM_SIZE_ALIGNED) || (size < size_in)) { return NULL; } @@ -640,9 +868,9 @@ mem_malloc(mem_size_t size) /* Scan through the heap searching for a free block that is big enough, * beginning with the lowest free block. */ - for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size; - ptr = ((struct mem *)(void *)&ram[ptr])->next) { - mem = (struct mem *)(void *)&ram[ptr]; + for (ptr = mem_to_ptr(lfree); ptr < MEM_SIZE_ALIGNED - size; + ptr = ptr_to_mem(ptr)->next) { + mem = ptr_to_mem(ptr); #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_free_count = 0; LWIP_MEM_ALLOC_UNPROTECT(); @@ -672,9 +900,10 @@ mem_malloc(mem_size_t size) * region that couldn't hold data, but when mem->next gets freed, * the 2 regions would be combined, resulting in more free memory */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + size; + ptr2 = (mem_size_t)(ptr + SIZEOF_STRUCT_MEM + size); + LWIP_ASSERT("invalid next ptr",ptr2 != MEM_SIZE_ALIGNED); /* create mem2 struct */ - mem2 = (struct mem *)(void *)&ram[ptr2]; + mem2 = ptr_to_mem(ptr2); mem2->used = 0; mem2->next = mem->next; mem2->prev = ptr; @@ -683,7 +912,7 @@ mem_malloc(mem_size_t size) mem->used = 1; if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + ptr_to_mem(mem2->next)->prev = ptr2; } MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); } else { @@ -695,7 +924,7 @@ mem_malloc(mem_size_t size) * will always be used at this point! */ mem->used = 1; - MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram)); + MEM_STATS_INC_USED(used, mem->next - mem_to_ptr(mem)); } #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT mem_malloc_adjust_lfree: @@ -715,7 +944,7 @@ mem_malloc_adjust_lfree: goto mem_malloc_adjust_lfree; } #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - cur = (struct mem *)(void *)&ram[cur->next]; + cur = ptr_to_mem(cur->next); } lfree = cur; LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); @@ -723,23 +952,27 @@ mem_malloc_adjust_lfree: LWIP_MEM_ALLOC_UNPROTECT(); sys_mutex_unlock(&mem_mutex); LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", - (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); + (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", - ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); + ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); LWIP_ASSERT("mem_malloc: sanity check alignment", - (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); + (((mem_ptr_t)mem) & (MEM_ALIGNMENT - 1)) == 0); - return (u8_t *)mem + SIZEOF_STRUCT_MEM; +#if MEM_OVERFLOW_CHECK + mem_overflow_init_element(mem, size_in); +#endif + MEM_SANITY(); + return (u8_t *)mem + SIZEOF_STRUCT_MEM + MEM_SANITY_OFFSET; } } #if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT /* if we got interrupted by a mem_free, try again */ } while (local_mem_free_count != 0); #endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); MEM_STATS_INC(err); LWIP_MEM_ALLOC_UNPROTECT(); sys_mutex_unlock(&mem_mutex); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); return NULL; } @@ -767,12 +1000,18 @@ void * mem_calloc(mem_size_t count, mem_size_t size) { void *p; + size_t alloc_size = (size_t)count * (size_t)size; + + if ((size_t)(mem_size_t)alloc_size != alloc_size) { + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_calloc: could not allocate %"SZT_F" bytes\n", alloc_size)); + return NULL; + } /* allocate 'count' objects of size 'size' */ - p = mem_malloc(count * size); + p = mem_malloc((mem_size_t)alloc_size); if (p) { /* zero the memory */ - memset(p, 0, (size_t)count * (size_t)size); + memset(p, 0, alloc_size); } return p; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/memp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/memp.c similarity index 73% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/memp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/memp.c index 58fab1a..352ce5a 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/memp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/memp.c @@ -57,13 +57,13 @@ #include "lwip/udp.h" #include "lwip/tcp.h" #include "lwip/priv/tcp_priv.h" +#include "lwip/altcp.h" #include "lwip/ip4_frag.h" #include "lwip/netbuf.h" #include "lwip/api.h" #include "lwip/priv/tcpip_priv.h" #include "lwip/priv/api_msg.h" -#include "lwip/sockets.h" -#include "lwip/netifapi.h" +#include "lwip/priv/sockets_priv.h" #include "lwip/etharp.h" #include "lwip/igmp.h" #include "lwip/timeouts.h" @@ -78,7 +78,7 @@ #define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc) #include "lwip/priv/memp_std.h" -const struct memp_desc* const memp_pools[MEMP_MAX] = { +const struct memp_desc *const memp_pools[MEMP_MAX] = { #define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name, #include "lwip/priv/memp_std.h" }; @@ -105,7 +105,7 @@ memp_sanity(const struct memp_desc *desc) t = *desc->tab; if (t != NULL) { for (h = t->next; (t != NULL) && (h != NULL); t = t->next, - h = ((h->next != NULL) ? h->next->next : NULL)) { + h = ((h->next != NULL) ? h->next->next : NULL)) { if (t == h) { return 0; } @@ -118,57 +118,16 @@ memp_sanity(const struct memp_desc *desc) #if MEMP_OVERFLOW_CHECK /** - * Check if a memp element was victim of an overflow - * (e.g. the restricted area after it has been altered) + * Check if a memp element was victim of an overflow or underflow + * (e.g. the restricted area after/before it has been altered) * * @param p the memp element to check * @param desc the pool p comes from */ static void -memp_overflow_check_element_overflow(struct memp *p, const struct memp_desc *desc) +memp_overflow_check_element(struct memp *p, const struct memp_desc *desc) { -#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 - u16_t k; - u8_t *m; - m = (u8_t*)p + MEMP_SIZE + desc->size; - for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) { - if (m[k] != 0xcd) { - char errstr[128] = "detected memp overflow in pool "; - strcat(errstr, desc->desc); - LWIP_ASSERT(errstr, 0); - } - } -#else /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */ - LWIP_UNUSED_ARG(p); - LWIP_UNUSED_ARG(desc); -#endif /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */ -} - -/** - * Check if a memp element was victim of an underflow - * (e.g. the restricted area before it has been altered) - * - * @param p the memp element to check - * @param desc the pool p comes from - */ -static void -memp_overflow_check_element_underflow(struct memp *p, const struct memp_desc *desc) -{ -#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 - u16_t k; - u8_t *m; - m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; - for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) { - if (m[k] != 0xcd) { - char errstr[128] = "detected memp underflow in pool "; - strcat(errstr, desc->desc); - LWIP_ASSERT(errstr, 0); - } - } -#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */ - LWIP_UNUSED_ARG(p); - LWIP_UNUSED_ARG(desc); -#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */ + mem_overflow_check_raw((u8_t *)p + MEMP_SIZE, desc->size, "pool ", desc->desc); } /** @@ -177,20 +136,7 @@ memp_overflow_check_element_underflow(struct memp *p, const struct memp_desc *de static void memp_overflow_init_element(struct memp *p, const struct memp_desc *desc) { -#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 - u8_t *m; -#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; - memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED); -#endif -#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE + desc->size; - memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED); -#endif -#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */ - LWIP_UNUSED_ARG(p); - LWIP_UNUSED_ARG(desc); -#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */ + mem_overflow_init_raw((u8_t *)p + MEMP_SIZE, desc->size); } #if MEMP_OVERFLOW_CHECK >= 2 @@ -208,11 +154,10 @@ memp_overflow_check_all(void) SYS_ARCH_PROTECT(old_level); for (i = 0; i < MEMP_MAX; ++i) { - p = (struct memp*)LWIP_MEM_ALIGN(memp_pools[i]->base); + p = (struct memp *)LWIP_MEM_ALIGN(memp_pools[i]->base); for (j = 0; j < memp_pools[i]->num; ++j) { - memp_overflow_check_element_overflow(p, memp_pools[i]); - memp_overflow_check_element_underflow(p, memp_pools[i]); - p = LWIP_ALIGNMENT_CAST(struct memp*, ((u8_t*)p + MEMP_SIZE + memp_pools[i]->size + MEMP_SANITY_REGION_AFTER_ALIGNED)); + memp_overflow_check_element(p, memp_pools[i]); + p = LWIP_ALIGNMENT_CAST(struct memp *, ((u8_t *)p + MEMP_SIZE + memp_pools[i]->size + MEM_SANITY_REGION_AFTER_ALIGNED)); } } SYS_ARCH_UNPROTECT(old_level); @@ -236,7 +181,15 @@ memp_init_pool(const struct memp_desc *desc) struct memp *memp; *desc->tab = NULL; - memp = (struct memp*)LWIP_MEM_ALIGN(desc->base); + memp = (struct memp *)LWIP_MEM_ALIGN(desc->base); +#if MEMP_MEM_INIT + /* force memset on pool memory */ + memset(memp, 0, (size_t)desc->num * (MEMP_SIZE + desc->size +#if MEMP_OVERFLOW_CHECK + + MEM_SANITY_REGION_AFTER_ALIGNED +#endif + )); +#endif /* create a linked list of memp elements */ for (i = 0; i < desc->num; ++i) { memp->next = *desc->tab; @@ -244,12 +197,12 @@ memp_init_pool(const struct memp_desc *desc) #if MEMP_OVERFLOW_CHECK memp_overflow_init_element(memp, desc); #endif /* MEMP_OVERFLOW_CHECK */ - /* cast through void* to get rid of alignment warnings */ - memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size + /* cast through void* to get rid of alignment warnings */ + memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size #if MEMP_OVERFLOW_CHECK - + MEMP_SANITY_REGION_AFTER_ALIGNED + + MEM_SANITY_REGION_AFTER_ALIGNED #endif - ); + ); } #if MEMP_STATS desc->stats->avail = desc->num; @@ -287,11 +240,11 @@ memp_init(void) #endif /* MEMP_OVERFLOW_CHECK >= 2 */ } -static void* +static void * #if !MEMP_OVERFLOW_CHECK do_memp_malloc_pool(const struct memp_desc *desc) #else -do_memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line) +do_memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line) #endif { struct memp *memp; @@ -309,8 +262,7 @@ do_memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int if (memp != NULL) { #if !MEMP_MEM_MALLOC #if MEMP_OVERFLOW_CHECK == 1 - memp_overflow_check_element_overflow(memp, desc); - memp_overflow_check_element_underflow(memp, desc); + memp_overflow_check_element(memp, desc); #endif /* MEMP_OVERFLOW_CHECK */ *desc->tab = memp->next; @@ -335,15 +287,15 @@ do_memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int #endif SYS_ARCH_UNPROTECT(old_level); /* cast through u8_t* to get rid of alignment warnings */ - return ((u8_t*)memp + MEMP_SIZE); + return ((u8_t *)memp + MEMP_SIZE); } else { - LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc)); #if MEMP_STATS desc->stats->err++; #endif + SYS_ARCH_UNPROTECT(old_level); + LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", desc->desc)); } - SYS_ARCH_UNPROTECT(old_level); return NULL; } @@ -358,7 +310,7 @@ void * #if !MEMP_OVERFLOW_CHECK memp_malloc_pool(const struct memp_desc *desc) #else -memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line) +memp_malloc_pool_fn(const struct memp_desc *desc, const char *file, const int line) #endif { LWIP_ASSERT("invalid pool desc", desc != NULL); @@ -384,7 +336,7 @@ void * #if !MEMP_OVERFLOW_CHECK memp_malloc(memp_t type) #else -memp_malloc_fn(memp_t type, const char* file, const int line) +memp_malloc_fn(memp_t type, const char *file, const int line) #endif { void *memp; @@ -404,22 +356,21 @@ memp_malloc_fn(memp_t type, const char* file, const int line) } static void -do_memp_free_pool(const struct memp_desc* desc, void *mem) +do_memp_free_pool(const struct memp_desc *desc, void *mem) { struct memp *memp; SYS_ARCH_DECL_PROTECT(old_level); LWIP_ASSERT("memp_free: mem properly aligned", - ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); + ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); /* cast through void* to get rid of alignment warnings */ - memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE); + memp = (struct memp *)(void *)((u8_t *)mem - MEMP_SIZE); SYS_ARCH_PROTECT(old_level); #if MEMP_OVERFLOW_CHECK == 1 - memp_overflow_check_element_overflow(memp, desc); - memp_overflow_check_element_underflow(memp, desc); + memp_overflow_check_element(memp, desc); #endif /* MEMP_OVERFLOW_CHECK */ #if MEMP_STATS @@ -449,7 +400,7 @@ do_memp_free_pool(const struct memp_desc* desc, void *mem) * @param mem the memp element to free */ void -memp_free_pool(const struct memp_desc* desc, void *mem) +memp_free_pool(const struct memp_desc *desc, void *mem) { LWIP_ASSERT("invalid pool desc", desc != NULL); if ((desc == NULL) || (mem == NULL)) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/netif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/netif.c similarity index 56% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/netif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/netif.c index 9600a9f..8f7530f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/netif.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/netif.c @@ -1,16 +1,16 @@ /** * @file * lwIP network interface abstraction - * + * * @defgroup netif Network interface (NETIF) * @ingroup callbackstyle_api - * + * * @defgroup netif_ip4 IPv4 address handling * @ingroup netif - * + * * @defgroup netif_ip6 IPv6 address handling * @ingroup netif - * + * * @defgroup netif_cd Client data handling * Store data (void*) on a netif for application usage. * @see @ref LWIP_NUM_NETIF_CLIENT_DATA @@ -50,7 +50,8 @@ #include "lwip/opt.h" -#include +#include /* memset */ +#include /* atoi */ #include "lwip/def.h" #include "lwip/ip_addr.h" @@ -58,7 +59,7 @@ #include "lwip/netif.h" #include "lwip/priv/tcp_priv.h" #include "lwip/udp.h" -#include "lwip/raw.h" +#include "lwip/priv/raw_priv.h" #include "lwip/snmp.h" #include "lwip/igmp.h" #include "lwip/etharp.h" @@ -89,6 +90,12 @@ #include "lwip/nd6.h" #endif +/* +#if LWIP_NETIF_STATUS_CALLBACK +#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0) +#else +#define NETIF_STATUS_CALLBACK(n) +#endif LWIP_NETIF_STATUS_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK #define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0) @@ -96,9 +103,16 @@ #define NETIF_LINK_CALLBACK(n) #endif /* LWIP_NETIF_LINK_CALLBACK */ +#if LWIP_NETIF_EXT_STATUS_CALLBACK +static netif_ext_callback_t *ext_callback; +#endif + +#if !LWIP_SINGLE_NETIF struct netif *netif_list; +#endif /* !LWIP_SINGLE_NETIF */ struct netif *netif_default; +#define netif_index_to_num(index) ((index) - 1) static u8_t netif_num; #if LWIP_NUM_NETIF_CLIENT_DATA > 0 @@ -107,18 +121,21 @@ static u8_t netif_client_id; #define NETIF_REPORT_TYPE_IPV4 0x01 #define NETIF_REPORT_TYPE_IPV6 0x02 -static void netif_issue_reports(struct netif* netif, u8_t report_type); +static void netif_issue_reports(struct netif *netif, u8_t report_type); #if LWIP_IPV6 static err_t netif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr); #endif /* LWIP_IPV6 */ +#if LWIP_IPV4 +static err_t netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr); +#endif /* LWIP_IPV4 */ #if LWIP_HAVE_LOOPIF #if LWIP_IPV4 -static err_t netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr); +static err_t netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t *addr); #endif #if LWIP_IPV6 -static err_t netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr); +static err_t netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr); #endif @@ -134,6 +151,8 @@ static struct netif loop_netif; static err_t netif_loopif_init(struct netif *netif) { + LWIP_ASSERT("netif_loopif_init: invalid netif", netif != NULL); + /* initialize the snmp variables and counters inside the struct netif * ifSpeed: no assumption can be made! */ @@ -148,8 +167,9 @@ netif_loopif_init(struct netif *netif) netif->output_ip6 = netif_loop_output_ipv6; #endif #if LWIP_LOOPIF_MULTICAST - netif->flags |= NETIF_FLAG_IGMP; + netif_set_flags(netif, NETIF_FLAG_IGMP); #endif + NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_DISABLE_ALL); return ERR_OK; } #endif /* LWIP_HAVE_LOOPIF */ @@ -161,9 +181,9 @@ netif_init(void) #if LWIP_IPV4 #define LOOPIF_ADDRINIT &loop_ipaddr, &loop_netmask, &loop_gw, ip4_addr_t loop_ipaddr, loop_netmask, loop_gw; - IP4_ADDR(&loop_gw, 127,0,0,1); - IP4_ADDR(&loop_ipaddr, 127,0,0,1); - IP4_ADDR(&loop_netmask, 255,0,0,0); + IP4_ADDR(&loop_gw, 127, 0, 0, 1); + IP4_ADDR(&loop_ipaddr, 127, 0, 0, 1); + IP4_ADDR(&loop_netmask, 255, 0, 0, 0); #else /* LWIP_IPV4 */ #define LOOPIF_ADDRINIT #endif /* LWIP_IPV4 */ @@ -191,18 +211,39 @@ netif_init(void) * ethernet_input() or ip_input() depending on netif flags. * Don't call directly, pass to netif_add() and call * netif->input(). - * Only works if the netif driver correctly sets + * Only works if the netif driver correctly sets * NETIF_FLAG_ETHARP and/or NETIF_FLAG_ETHERNET flag! */ err_t netif_input(struct pbuf *p, struct netif *inp) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("netif_input: invalid pbuf", p != NULL); + LWIP_ASSERT("netif_input: invalid netif", inp != NULL); + #if LWIP_ETHERNET if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) { return ethernet_input(p, inp); } else #endif /* LWIP_ETHERNET */ - return ip_input(p, inp); + return ip_input(p, inp); +} + +/** + * @ingroup netif + * Add a network interface to the list of lwIP netifs. + * + * Same as @ref netif_add but without IPv4 addresses + */ +struct netif * +netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input) +{ + return netif_add(netif, +#if LWIP_IPV4 + NULL, NULL, NULL, +#endif /* LWIP_IPV4*/ + state, init, input); } /** @@ -224,12 +265,12 @@ netif_input(struct pbuf *p, struct netif *inp) * to decide whether to forward to ethernet_input() or ip_input(). * In other words, the functions only work when the netif * driver is implemented correctly!\n - * Most members of struct netif should be be initialized by the + * Most members of struct netif should be be initialized by the * netif init function = netif driver (init parameter of this function).\n * IPv6: Don't forget to call netif_create_ip6_linklocal_address() after * setting the MAC address in struct netif.hwaddr * (IPv6 requires a link-local address). - * + * * @return netif, or NULL if failed. */ struct netif * @@ -243,33 +284,59 @@ netif_add(struct netif *netif, s8_t i; #endif - LWIP_ASSERT("No init function given", init != NULL); + LWIP_ASSERT_CORE_LOCKED(); + +#if LWIP_SINGLE_NETIF + if (netif_default != NULL) { + LWIP_ASSERT("single netif already set", 0); + return NULL; + } +#endif + + LWIP_ERROR("netif_add: invalid netif", netif != NULL, return NULL); + LWIP_ERROR("netif_add: No init function given", init != NULL, return NULL); + +#if LWIP_IPV4 + if (ipaddr == NULL) { + ipaddr = ip_2_ip4(IP4_ADDR_ANY); + } + if (netmask == NULL) { + netmask = ip_2_ip4(IP4_ADDR_ANY); + } + if (gw == NULL) { + gw = ip_2_ip4(IP4_ADDR_ANY); + } /* reset new interface configuration state */ -#if LWIP_IPV4 ip_addr_set_zero_ip4(&netif->ip_addr); ip_addr_set_zero_ip4(&netif->netmask); ip_addr_set_zero_ip4(&netif->gw); + netif->output = netif_null_output_ip4; #endif /* LWIP_IPV4 */ #if LWIP_IPV6 for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { ip_addr_set_zero_ip6(&netif->ip6_addr[i]); netif->ip6_addr_state[i] = IP6_ADDR_INVALID; +#if LWIP_IPV6_ADDRESS_LIFETIMES + netif->ip6_addr_valid_life[i] = IP6_ADDR_LIFE_STATIC; + netif->ip6_addr_pref_life[i] = IP6_ADDR_LIFE_STATIC; +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ } netif->output_ip6 = netif_null_output_ip6; #endif /* LWIP_IPV6 */ NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL); + netif->mtu = 0; netif->flags = 0; #ifdef netif_get_client_data memset(netif->client_data, 0, sizeof(netif->client_data)); #endif /* LWIP_NUM_NETIF_CLIENT_DATA */ +#if LWIP_IPV6 #if LWIP_IPV6_AUTOCONFIG /* IPv6 address autoconfiguration not enabled by default */ netif->ip6_autoconfig_enabled = 0; #endif /* LWIP_IPV6_AUTOCONFIG */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ + nd6_restart_netif(netif); +#endif /* LWIP_IPV6 */ #if LWIP_NETIF_STATUS_CALLBACK netif->status_callback = NULL; #endif /* LWIP_NETIF_STATUS_CALLBACK */ @@ -282,20 +349,23 @@ netif_add(struct netif *netif, #if LWIP_IPV6 && LWIP_IPV6_MLD netif->mld_mac_filter = NULL; #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ -#if ENABLE_LOOPBACK - netif->loop_first = NULL; - netif->loop_last = NULL; -#endif /* ENABLE_LOOPBACK */ /* remember netif specific state information data */ netif->state = state; - netif->num = netif_num++; + netif->num = netif_num; netif->input = input; - NETIF_SET_HWADDRHINT(netif, NULL); -#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS + NETIF_RESET_HINTS(netif); +#if ENABLE_LOOPBACK + netif->loop_first = NULL; + netif->loop_last = NULL; +#if LWIP_LOOPBACK_MAX_PBUFS netif->loop_cnt_current = 0; -#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + netif->reschedule_poll = 0; +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ #if LWIP_IPV4 netif_set_addr(netif, ipaddr, netmask, gw); @@ -305,10 +375,47 @@ netif_add(struct netif *netif, if (init(netif) != ERR_OK) { return NULL; } +#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES + /* Initialize the MTU for IPv6 to the one set by the netif driver. + This can be updated later by RA. */ + netif->mtu6 = netif->mtu; +#endif /* LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES */ + +#if !LWIP_SINGLE_NETIF + /* Assign a unique netif number in the range [0..254], so that (num+1) can + serve as an interface index that fits in a u8_t. + We assume that the new netif has not yet been added to the list here. + This algorithm is O(n^2), but that should be OK for lwIP. + */ + { + struct netif *netif2; + int num_netifs; + do { + if (netif->num == 255) { + netif->num = 0; + } + num_netifs = 0; + for (netif2 = netif_list; netif2 != NULL; netif2 = netif2->next) { + LWIP_ASSERT("netif already added", netif2 != netif); + num_netifs++; + LWIP_ASSERT("too many netifs, max. supported number is 255", num_netifs <= 255); + if (netif2->num == netif->num) { + netif->num++; + break; + } + } + } while (netif2 != NULL); + } + if (netif->num == 254) { + netif_num = 0; + } else { + netif_num = (u8_t)(netif->num + 1); + } /* add this netif to the list */ netif->next = netif_list; netif_list = netif; +#endif /* "LWIP_SINGLE_NETIF */ mib2_netif_added(netif); #if LWIP_IGMP @@ -319,7 +426,7 @@ netif_add(struct netif *netif, #endif /* LWIP_IGMP */ LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP", - netif->name[0], netif->name[1])); + netif->name[0], netif->name[1])); #if LWIP_IPV4 LWIP_DEBUGF(NETIF_DEBUG, (" addr ")); ip4_addr_debug_print(NETIF_DEBUG, ipaddr); @@ -329,10 +436,218 @@ netif_add(struct netif *netif, ip4_addr_debug_print(NETIF_DEBUG, gw); #endif /* LWIP_IPV4 */ LWIP_DEBUGF(NETIF_DEBUG, ("\n")); + + netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_ADDED, NULL); + return netif; } +static void +netif_do_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr) +{ +#if LWIP_TCP + tcp_netif_ip_addr_changed(old_addr, new_addr); +#endif /* LWIP_TCP */ +#if LWIP_UDP + udp_netif_ip_addr_changed(old_addr, new_addr); +#endif /* LWIP_UDP */ +#if LWIP_RAW + raw_netif_ip_addr_changed(old_addr, new_addr); +#endif /* LWIP_RAW */ +} + #if LWIP_IPV4 +static int +netif_do_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr, ip_addr_t *old_addr) +{ + LWIP_ASSERT("invalid pointer", ipaddr != NULL); + LWIP_ASSERT("invalid pointer", old_addr != NULL); + + /* address is actually being changed? */ + if (ip4_addr_cmp(ipaddr, netif_ip4_addr(netif)) == 0) { + ip_addr_t new_addr; + *ip_2_ip4(&new_addr) = *ipaddr; + IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4); + + ip_addr_copy(*old_addr, *netif_ip_addr4(netif)); + + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); + netif_do_ip_addr_changed(old_addr, &new_addr); + + mib2_remove_ip4(netif); + mib2_remove_route_ip4(0, netif); + /* set new IP address to netif */ + ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr); + IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4); + mib2_add_ip4(netif); + mib2_add_route_ip4(0, netif); + + netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4); + + NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV4); + return 1; /* address changed */ + } + return 0; /* address unchanged */ +} + +/** + * @ingroup netif_ip4 + * Change the IP address of a network interface + * + * @param netif the network interface to change + * @param ipaddr the new IP address + * + * @note call netif_set_addr() if you also want to change netmask and + * default gateway + */ +void +netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr) +{ + ip_addr_t old_addr; + + LWIP_ERROR("netif_set_ipaddr: invalid netif", netif != NULL, return); + + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (ipaddr == NULL) { + ipaddr = IP4_ADDR_ANY4; + } + + LWIP_ASSERT_CORE_LOCKED(); + + if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + netif_ext_callback_args_t args; + args.ipv4_changed.old_address = &old_addr; + netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_ADDRESS_CHANGED, &args); +#endif + } +} + +static int +netif_do_set_netmask(struct netif *netif, const ip4_addr_t *netmask, ip_addr_t *old_nm) +{ + /* address is actually being changed? */ + if (ip4_addr_cmp(netmask, netif_ip4_netmask(netif)) == 0) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + LWIP_ASSERT("invalid pointer", old_nm != NULL); + ip_addr_copy(*old_nm, *netif_ip_netmask4(netif)); +#else + LWIP_UNUSED_ARG(old_nm); +#endif + mib2_remove_route_ip4(0, netif); + /* set new netmask to netif */ + ip4_addr_set(ip_2_ip4(&netif->netmask), netmask); + IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4); + mib2_add_route_ip4(0, netif); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1_16(netif_ip4_netmask(netif)), + ip4_addr2_16(netif_ip4_netmask(netif)), + ip4_addr3_16(netif_ip4_netmask(netif)), + ip4_addr4_16(netif_ip4_netmask(netif)))); + return 1; /* netmask changed */ + } + return 0; /* netmask unchanged */ +} + +/** + * @ingroup netif_ip4 + * Change the netmask of a network interface + * + * @param netif the network interface to change + * @param netmask the new netmask + * + * @note call netif_set_addr() if you also want to change ip address and + * default gateway + */ +void +netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask) +{ +#if LWIP_NETIF_EXT_STATUS_CALLBACK + ip_addr_t old_nm_val; + ip_addr_t *old_nm = &old_nm_val; +#else + ip_addr_t *old_nm = NULL; +#endif + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("netif_set_netmask: invalid netif", netif != NULL, return); + + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (netmask == NULL) { + netmask = IP4_ADDR_ANY4; + } + + if (netif_do_set_netmask(netif, netmask, old_nm)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + netif_ext_callback_args_t args; + args.ipv4_changed.old_netmask = old_nm; + netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_NETMASK_CHANGED, &args); +#endif + } +} + +static int +netif_do_set_gw(struct netif *netif, const ip4_addr_t *gw, ip_addr_t *old_gw) +{ + /* address is actually being changed? */ + if (ip4_addr_cmp(gw, netif_ip4_gw(netif)) == 0) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + LWIP_ASSERT("invalid pointer", old_gw != NULL); + ip_addr_copy(*old_gw, *netif_ip_gw4(netif)); +#else + LWIP_UNUSED_ARG(old_gw); +#endif + + ip4_addr_set(ip_2_ip4(&netif->gw), gw); + IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1_16(netif_ip4_gw(netif)), + ip4_addr2_16(netif_ip4_gw(netif)), + ip4_addr3_16(netif_ip4_gw(netif)), + ip4_addr4_16(netif_ip4_gw(netif)))); + return 1; /* gateway changed */ + } + return 0; /* gateway unchanged */ +} + +/** + * @ingroup netif_ip4 + * Change the default gateway for a network interface + * + * @param netif the network interface to change + * @param gw the new default gateway + * + * @note call netif_set_addr() if you also want to change ip address and netmask + */ +void +netif_set_gw(struct netif *netif, const ip4_addr_t *gw) +{ +#if LWIP_NETIF_EXT_STATUS_CALLBACK + ip_addr_t old_gw_val; + ip_addr_t *old_gw = &old_gw_val; +#else + ip_addr_t *old_gw = NULL; +#endif + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("netif_set_gw: invalid netif", netif != NULL, return); + + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (gw == NULL) { + gw = IP4_ADDR_ANY4; + } + + if (netif_do_set_gw(netif, gw, old_gw)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + netif_ext_callback_args_t args; + args.ipv4_changed.old_gw = old_gw; + netif_invoke_ext_callback(netif, LWIP_NSC_IPV4_GATEWAY_CHANGED, &args); +#endif + } +} + /** * @ingroup netif_ip4 * Change IP address configuration for a network interface (including netmask @@ -345,20 +660,74 @@ netif_add(struct netif *netif, */ void netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, - const ip4_addr_t *gw) + const ip4_addr_t *gw) { - if (ip4_addr_isany(ipaddr)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + netif_nsc_reason_t change_reason = LWIP_NSC_NONE; + netif_ext_callback_args_t cb_args; + ip_addr_t old_nm_val; + ip_addr_t old_gw_val; + ip_addr_t *old_nm = &old_nm_val; + ip_addr_t *old_gw = &old_gw_val; +#else + ip_addr_t *old_nm = NULL; + ip_addr_t *old_gw = NULL; +#endif + ip_addr_t old_addr; + int remove; + + LWIP_ASSERT_CORE_LOCKED(); + + /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ + if (ipaddr == NULL) { + ipaddr = IP4_ADDR_ANY4; + } + if (netmask == NULL) { + netmask = IP4_ADDR_ANY4; + } + if (gw == NULL) { + gw = IP4_ADDR_ANY4; + } + + remove = ip4_addr_isany(ipaddr); + if (remove) { /* when removing an address, we have to remove it *before* changing netmask/gw to ensure that tcp RST segment can be sent correctly */ - netif_set_ipaddr(netif, ipaddr); - netif_set_netmask(netif, netmask); - netif_set_gw(netif, gw); - } else { - netif_set_netmask(netif, netmask); - netif_set_gw(netif, gw); - /* set ipaddr last to ensure netmask/gw have been set when status callback is called */ - netif_set_ipaddr(netif, ipaddr); + if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED; + cb_args.ipv4_changed.old_address = &old_addr; +#endif + } } + if (netif_do_set_netmask(netif, netmask, old_nm)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + change_reason |= LWIP_NSC_IPV4_NETMASK_CHANGED; + cb_args.ipv4_changed.old_netmask = old_nm; +#endif + } + if (netif_do_set_gw(netif, gw, old_gw)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + change_reason |= LWIP_NSC_IPV4_GATEWAY_CHANGED; + cb_args.ipv4_changed.old_gw = old_gw; +#endif + } + if (!remove) { + /* set ipaddr last to ensure netmask/gw have been set when status callback is called */ + if (netif_do_set_ipaddr(netif, ipaddr, &old_addr)) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + change_reason |= LWIP_NSC_IPV4_ADDRESS_CHANGED; + cb_args.ipv4_changed.old_address = &old_addr; +#endif + } + } + +#if LWIP_NETIF_EXT_STATUS_CALLBACK + if (change_reason != LWIP_NSC_NONE) { + change_reason |= LWIP_NSC_IPV4_SETTINGS_CHANGED; + netif_invoke_ext_callback(netif, change_reason, &cb_args); + } +#endif } #endif /* LWIP_IPV4*/ @@ -375,21 +744,17 @@ netif_remove(struct netif *netif) int i; #endif + LWIP_ASSERT_CORE_LOCKED(); + if (netif == NULL) { return; } + netif_invoke_ext_callback(netif, LWIP_NSC_NETIF_REMOVED, NULL); + #if LWIP_IPV4 if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) { -#if LWIP_TCP - tcp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL); -#endif /* LWIP_TCP */ -#if LWIP_UDP - udp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL); -#endif /* LWIP_UDP */ -#if LWIP_RAW - raw_netif_ip_addr_changed(netif_ip_addr4(netif), NULL); -#endif /* LWIP_RAW */ + netif_do_ip_addr_changed(netif_ip_addr4(netif), NULL); } #if LWIP_IGMP @@ -403,15 +768,7 @@ netif_remove(struct netif *netif) #if LWIP_IPV6 for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) { -#if LWIP_TCP - tcp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL); -#endif /* LWIP_TCP */ -#if LWIP_UDP - udp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL); -#endif /* LWIP_UDP */ -#if LWIP_RAW - raw_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL); -#endif /* LWIP_RAW */ + netif_do_ip_addr_changed(netif_ip_addr6(netif, i), NULL); } } #if LWIP_IPV6_MLD @@ -431,13 +788,14 @@ netif_remove(struct netif *netif) /* reset default netif */ netif_set_default(NULL); } +#if !LWIP_SINGLE_NETIF /* is it the first netif? */ if (netif_list == netif) { netif_list = netif->next; } else { /* look for netif further down the list */ - struct netif * tmp_netif; - for (tmp_netif = netif_list; tmp_netif != NULL; tmp_netif = tmp_netif->next) { + struct netif *tmp_netif; + NETIF_FOREACH(tmp_netif) { if (tmp_netif->next == netif) { tmp_netif->next = netif->next; break; @@ -447,6 +805,7 @@ netif_remove(struct netif *netif) return; /* netif is not on the list */ } } +#endif /* !LWIP_SINGLE_NETIF */ mib2_netif_removed(netif); #if LWIP_NETIF_REMOVE_CALLBACK if (netif->remove_callback) { @@ -456,138 +815,6 @@ netif_remove(struct netif *netif) LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") ); } -/** - * @ingroup netif - * Find a network interface by searching for its name - * - * @param name the name of the netif (like netif->name) plus concatenated number - * in ascii representation (e.g. 'en0') - */ -struct netif * -netif_find(const char *name) -{ - struct netif *netif; - u8_t num; - - if (name == NULL) { - return NULL; - } - - num = (u8_t)(name[2] - '0'); - - for (netif = netif_list; netif != NULL; netif = netif->next) { - if (num == netif->num && - name[0] == netif->name[0] && - name[1] == netif->name[1]) { - LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); - return netif; - } - } - LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); - return NULL; -} - -#if LWIP_IPV4 -/** - * @ingroup netif_ip4 - * Change the IP address of a network interface - * - * @param netif the network interface to change - * @param ipaddr the new IP address - * - * @note call netif_set_addr() if you also want to change netmask and - * default gateway - */ -void -netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr) -{ - ip_addr_t new_addr; - *ip_2_ip4(&new_addr) = (ipaddr ? *ipaddr : *IP4_ADDR_ANY4); - IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4); - - /* address is actually being changed? */ - if (ip4_addr_cmp(ip_2_ip4(&new_addr), netif_ip4_addr(netif)) == 0) { - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); -#if LWIP_TCP - tcp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr); -#endif /* LWIP_TCP */ -#if LWIP_UDP - udp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr); -#endif /* LWIP_UDP */ -#if LWIP_RAW - raw_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr); -#endif /* LWIP_RAW */ - - mib2_remove_ip4(netif); - mib2_remove_route_ip4(0, netif); - /* set new IP address to netif */ - ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr); - IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4); - mib2_add_ip4(netif); - mib2_add_route_ip4(0, netif); - - netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4); - - NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV4); - } - - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(netif_ip4_addr(netif)), - ip4_addr2_16(netif_ip4_addr(netif)), - ip4_addr3_16(netif_ip4_addr(netif)), - ip4_addr4_16(netif_ip4_addr(netif)))); -} - -/** - * @ingroup netif_ip4 - * Change the default gateway for a network interface - * - * @param netif the network interface to change - * @param gw the new default gateway - * - * @note call netif_set_addr() if you also want to change ip address and netmask - */ -void -netif_set_gw(struct netif *netif, const ip4_addr_t *gw) -{ - ip4_addr_set(ip_2_ip4(&netif->gw), gw); - IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4); - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(netif_ip4_gw(netif)), - ip4_addr2_16(netif_ip4_gw(netif)), - ip4_addr3_16(netif_ip4_gw(netif)), - ip4_addr4_16(netif_ip4_gw(netif)))); -} - -/** - * @ingroup netif_ip4 - * Change the netmask of a network interface - * - * @param netif the network interface to change - * @param netmask the new netmask - * - * @note call netif_set_addr() if you also want to change ip address and - * default gateway - */ -void -netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask) -{ - mib2_remove_route_ip4(0, netif); - /* set new netmask to netif */ - ip4_addr_set(ip_2_ip4(&netif->netmask), netmask); - IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4); - mib2_add_route_ip4(0, netif); - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(netif_ip4_netmask(netif)), - ip4_addr2_16(netif_ip4_netmask(netif)), - ip4_addr3_16(netif_ip4_netmask(netif)), - ip4_addr4_16(netif_ip4_netmask(netif)))); -} -#endif /* LWIP_IPV4 */ - /** * @ingroup netif * Set a network interface as the default network interface @@ -598,6 +825,8 @@ netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask) void netif_set_default(struct netif *netif) { + LWIP_ASSERT_CORE_LOCKED(); + if (netif == NULL) { /* remove default route */ mib2_remove_route_ip4(1, netif); @@ -607,7 +836,7 @@ netif_set_default(struct netif *netif) } netif_default = netif; LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n", - netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); + netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); } /** @@ -618,30 +847,45 @@ netif_set_default(struct netif *netif) void netif_set_up(struct netif *netif) { -//printf("netif_set_up netif %x, netif->flags %x\n", netif, netif->flags); + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("netif_set_up: invalid netif", netif != NULL, return); + if (!(netif->flags & NETIF_FLAG_UP)) { - netif->flags |= NETIF_FLAG_UP; + netif_set_flags(netif, NETIF_FLAG_UP); MIB2_COPY_SYSUPTIME_TO(&netif->ts); -#if 0 + NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV4|NETIF_STATE_IPV6); -#else -#if LWIP_IPV6 - netif_create_ip6_linklocal_address(netif, 1); -#endif + +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.status_changed.state = 1; + netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args); + } #endif - if (netif->flags & NETIF_FLAG_LINK_UP) { - netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6); - } + netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6); +#if LWIP_IPV6 + nd6_restart_netif(netif); +#endif /* LWIP_IPV6 */ } } /** Send ARP/IGMP/MLD/RS events, e.g. on link-up/netif-up or addr-change */ static void -netif_issue_reports(struct netif* netif, u8_t report_type) +netif_issue_reports(struct netif *netif, u8_t report_type) { + LWIP_ASSERT("netif_issue_reports: invalid netif", netif != NULL); + + /* Only send reports when both link and admin states are up */ + if (!(netif->flags & NETIF_FLAG_LINK_UP) || + !(netif->flags & NETIF_FLAG_UP)) { + return; + } + #if LWIP_IPV4 if ((report_type & NETIF_REPORT_TYPE_IPV4) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) { @@ -667,10 +911,6 @@ netif_issue_reports(struct netif* netif, u8_t report_type) /* send mld memberships */ mld6_report_groups(netif); #endif /* LWIP_IPV6_MLD */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - /* Send Router Solicitation messages. */ - netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ } #endif /* LWIP_IPV6 */ } @@ -682,13 +922,21 @@ netif_issue_reports(struct netif* netif, u8_t report_type) void netif_set_down(struct netif *netif) { - if (netif->flags & NETIF_FLAG_UP) { - netif->flags &= ~NETIF_FLAG_UP; - MIB2_COPY_SYSUPTIME_TO(&netif->ts); + LWIP_ASSERT_CORE_LOCKED(); - ip_addr_set_zero_ip4(&netif->ip_addr); - ip_addr_set_zero_ip4(&netif->netmask); - ip_addr_set_zero_ip4(&netif->gw); + LWIP_ERROR("netif_set_down: invalid netif", netif != NULL, return); + + if (netif->flags & NETIF_FLAG_UP) { +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.status_changed.state = 0; + netif_invoke_ext_callback(netif, LWIP_NSC_STATUS_CHANGED, &args); + } +#endif + + netif_clear_flags(netif, NETIF_FLAG_UP); + MIB2_COPY_SYSUPTIME_TO(&netif->ts); #if LWIP_IPV4 && LWIP_ARP if (netif->flags & NETIF_FLAG_ETHARP) { @@ -698,7 +946,6 @@ netif_set_down(struct netif *netif) #if LWIP_IPV6 nd6_cleanup_netif(netif); - netif_ip6_addr_set_state(netif, 0, IP6_ADDR_INVALID); #endif /* LWIP_IPV6 */ NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV4|NETIF_STATE_IPV6); @@ -713,6 +960,8 @@ netif_set_down(struct netif *netif) void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback) { + LWIP_ASSERT_CORE_LOCKED(); + if (netif) { netif->status_callback = status_callback; } @@ -727,6 +976,8 @@ netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_c void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback) { + LWIP_ASSERT_CORE_LOCKED(); + if (netif) { netif->remove_callback = remove_callback; } @@ -740,8 +991,12 @@ netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_c void netif_set_link_up(struct netif *netif) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return); + if (!(netif->flags & NETIF_FLAG_LINK_UP)) { - netif->flags |= NETIF_FLAG_LINK_UP; + netif_set_flags(netif, NETIF_FLAG_LINK_UP); #if LWIP_DHCP dhcp_network_changed(netif); @@ -751,10 +1006,19 @@ netif_set_link_up(struct netif *netif) autoip_network_changed(netif); #endif /* LWIP_AUTOIP */ - if (netif->flags & NETIF_FLAG_UP) { - netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6); - } + netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6); +#if LWIP_IPV6 + nd6_restart_netif(netif); +#endif /* LWIP_IPV6 */ + NETIF_LINK_CALLBACK(netif); +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.link_changed.state = 1; + netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args); + } +#endif } } @@ -763,11 +1027,26 @@ netif_set_link_up(struct netif *netif) * Called by a driver when its link goes down */ void -netif_set_link_down(struct netif *netif ) +netif_set_link_down(struct netif *netif) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("netif_set_link_down: invalid netif", netif != NULL, return); + if (netif->flags & NETIF_FLAG_LINK_UP) { - netif->flags &= ~NETIF_FLAG_LINK_UP; + netif_clear_flags(netif, NETIF_FLAG_LINK_UP); +#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES + netif->mtu6 = netif->mtu; +#endif + NETIF_LINK_CALLBACK(netif); +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.link_changed.state = 0; + netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args); + } +#endif } } @@ -779,6 +1058,8 @@ netif_set_link_down(struct netif *netif ) void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback) { + LWIP_ASSERT_CORE_LOCKED(); + if (netif) { netif->link_callback = link_callback; } @@ -789,11 +1070,12 @@ netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callb /** * @ingroup netif * Send an IP packet to be received on the same netif (loopif-like). - * The pbuf is simply copied and handed back to netif->input. - * In multithreaded mode, this is done directly since netif->input must put - * the packet on a queue. - * In callback mode, the packet is put on an internal queue and is fed to + * The pbuf is copied and added to an internal queue which is fed to * netif->input by netif_poll(). + * In multithreaded mode, the call to netif_poll() is queued to be done on the + * TCP/IP thread. + * In callback mode, the user has the responsibility to call netif_poll() in + * the main loop of their application. * * @param netif the lwip network interface structure * @param p the (IP) packet to 'send' @@ -818,8 +1100,14 @@ netif_loop_output(struct netif *netif, struct pbuf *p) struct netif *stats_if = netif; #endif /* LWIP_HAVE_LOOPIF */ #endif /* MIB2_STATS */ +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + u8_t schedule_poll = 0; +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ SYS_ARCH_DECL_PROTECT(lev); + LWIP_ASSERT("netif_loop_output: invalid netif", netif != NULL); + LWIP_ASSERT("netif_loop_output: invalid pbuf", p != NULL); + /* Allocate a new pbuf */ r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); if (r == NULL) { @@ -832,14 +1120,14 @@ netif_loop_output(struct netif *netif, struct pbuf *p) clen = pbuf_clen(r); /* check for overflow or too many pbuf on queue */ if (((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || - ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { + ((netif->loop_cnt_current + clen) > LWIP_MIN(LWIP_LOOPBACK_MAX_PBUFS, 0xFFFF))) { pbuf_free(r); LINK_STATS_INC(link.memerr); LINK_STATS_INC(link.drop); MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards); return ERR_MEM; } - netif->loop_cnt_current += clen; + netif->loop_cnt_current = (u16_t)(netif->loop_cnt_current + clen); #endif /* LWIP_LOOPBACK_MAX_PBUFS */ /* Copy the whole pbuf queue p into the single pbuf r */ @@ -864,9 +1152,19 @@ netif_loop_output(struct netif *netif, struct pbuf *p) LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); netif->loop_last->next = r; netif->loop_last = last; +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + if (netif->reschedule_poll) { + schedule_poll = 1; + netif->reschedule_poll = 0; + } +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ } else { netif->loop_first = r; netif->loop_last = last; +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + /* No existing packets queued, schedule poll */ + schedule_poll = 1; +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ } SYS_ARCH_UNPROTECT(lev); @@ -876,7 +1174,13 @@ netif_loop_output(struct netif *netif, struct pbuf *p) #if LWIP_NETIF_LOOPBACK_MULTITHREADING /* For multithreading environment, schedule a call to netif_poll */ - tcpip_callback_with_block((tcpip_callback_fn)netif_poll, netif, 0); + if (schedule_poll) { + if (tcpip_try_callback((tcpip_callback_fn)netif_poll, netif) != ERR_OK) { + SYS_ARCH_PROTECT(lev); + netif->reschedule_poll = 1; + SYS_ARCH_UNPROTECT(lev); + } + } #endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ return ERR_OK; @@ -885,7 +1189,7 @@ netif_loop_output(struct netif *netif, struct pbuf *p) #if LWIP_HAVE_LOOPIF #if LWIP_IPV4 static err_t -netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr) +netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t *addr) { LWIP_UNUSED_ARG(addr); return netif_loop_output(netif, p); @@ -894,7 +1198,7 @@ netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* ad #if LWIP_IPV6 static err_t -netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr) +netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr) { LWIP_UNUSED_ARG(addr); return netif_loop_output(netif, p); @@ -923,6 +1227,8 @@ netif_poll(struct netif *netif) #endif /* MIB2_STATS */ SYS_ARCH_DECL_PROTECT(lev); + LWIP_ASSERT("netif_poll: invalid netif", netif != NULL); + /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ SYS_ARCH_PROTECT(lev); while (netif->loop_first != NULL) { @@ -942,8 +1248,8 @@ netif_poll(struct netif *netif) #if LWIP_LOOPBACK_MAX_PBUFS /* adjust the number of pbufs on queue */ LWIP_ASSERT("netif->loop_cnt_current underflow", - ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); - netif->loop_cnt_current -= clen; + ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); + netif->loop_cnt_current = (u16_t)(netif->loop_cnt_current - clen); #endif /* LWIP_LOOPBACK_MAX_PBUFS */ /* 'in_end' now points to the last pbuf from 'in' */ @@ -959,6 +1265,8 @@ netif_poll(struct netif *netif) in_end->next = NULL; SYS_ARCH_UNPROTECT(lev); + in->if_idx = netif_get_index(netif); + LINK_STATS_INC(link.recv); MIB2_STATS_NETIF_ADD(stats_if, ifinoctets, in->tot_len); MIB2_STATS_NETIF_INC(stats_if, ifinucastpkts); @@ -978,12 +1286,10 @@ netif_poll(struct netif *netif) void netif_poll_all(void) { - struct netif *netif = netif_list; + struct netif *netif; /* loop through netifs */ - while (netif != NULL) { + NETIF_FOREACH(netif) { netif_poll(netif); - /* proceed to next network interface */ - netif = netif->next; } } #endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ @@ -1002,8 +1308,13 @@ netif_alloc_client_data_id(void) u8_t result = netif_client_id; netif_client_id++; + LWIP_ASSERT_CORE_LOCKED(); + +#if LWIP_NUM_NETIF_CLIENT_DATA > 256 +#error LWIP_NUM_NETIF_CLIENT_DATA must be <= 256 +#endif LWIP_ASSERT("Increase LWIP_NUM_NETIF_CLIENT_DATA in lwipopts.h", result < LWIP_NUM_NETIF_CLIENT_DATA); - return result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX; + return (u8_t)(result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX); } #endif @@ -1021,9 +1332,13 @@ netif_alloc_client_data_id(void) void netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6) { - LWIP_ASSERT("addr6 != NULL", addr6 != NULL); + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("netif_ip6_addr_set: invalid netif", netif != NULL); + LWIP_ASSERT("netif_ip6_addr_set: invalid addr6", addr6 != NULL); + netif_ip6_addr_set_parts(netif, addr_idx, addr6->addr[0], addr6->addr[1], - addr6->addr[2], addr6->addr[3]); + addr6->addr[2], addr6->addr[3]); } /* @@ -1039,45 +1354,48 @@ netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6) void netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3) { - const ip6_addr_t *old_addr; + ip_addr_t old_addr; + ip_addr_t new_ipaddr; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("invalid index", addr_idx < LWIP_IPV6_NUM_ADDRESSES); - old_addr = netif_ip6_addr(netif, addr_idx); + ip6_addr_copy(*ip_2_ip6(&old_addr), *netif_ip6_addr(netif, addr_idx)); + IP_SET_TYPE_VAL(old_addr, IPADDR_TYPE_V6); + /* address is actually being changed? */ - if ((old_addr->addr[0] != i0) || (old_addr->addr[1] != i1) || - (old_addr->addr[2] != i2) || (old_addr->addr[3] != i3)) { + if ((ip_2_ip6(&old_addr)->addr[0] != i0) || (ip_2_ip6(&old_addr)->addr[1] != i1) || + (ip_2_ip6(&old_addr)->addr[2] != i2) || (ip_2_ip6(&old_addr)->addr[3] != i3)) { LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_ip6_addr_set: netif address being changed\n")); - if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) { -#if LWIP_TCP || LWIP_UDP - ip_addr_t new_ipaddr; - IP_ADDR6(&new_ipaddr, i0, i1, i2, i3); -#endif /* LWIP_TCP || LWIP_UDP */ -#if LWIP_TCP - tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr); -#endif /* LWIP_TCP */ -#if LWIP_UDP - udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr); -#endif /* LWIP_UDP */ -#if LWIP_RAW - raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr); -#endif /* LWIP_RAW */ + IP_ADDR6(&new_ipaddr, i0, i1, i2, i3); + ip6_addr_assign_zone(ip_2_ip6(&new_ipaddr), IP6_UNICAST, netif); + + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addr_idx))) { + netif_do_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr); } /* @todo: remove/readd mib2 ip6 entries? */ - IP6_ADDR(ip_2_ip6(&(netif->ip6_addr[addr_idx])), i0, i1, i2, i3); - IP_SET_TYPE_VAL(netif->ip6_addr[addr_idx], IPADDR_TYPE_V6); + ip_addr_copy(netif->ip6_addr[addr_idx], new_ipaddr); - if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, addr_idx))) { netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6); NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV6); } + +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.ipv6_set.addr_index = addr_idx; + args.ipv6_set.old_address = &old_addr; + netif_invoke_ext_callback(netif, LWIP_NSC_IPV6_SET, &args); + } +#endif } LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IPv6 address %d of interface %c%c set to %s/0x%"X8_F"\n", - addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)), - netif_ip6_addr_state(netif, addr_idx))); + addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)), + netif_ip6_addr_state(netif, addr_idx))); } /** @@ -1091,14 +1409,14 @@ netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, * @param state the new IPv6 address state */ void -netif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state) +netif_ip6_addr_set_state(struct netif *netif, s8_t addr_idx, u8_t state) { u8_t old_state; + LWIP_ASSERT_CORE_LOCKED(); LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("invalid index", addr_idx < LWIP_IPV6_NUM_ADDRESSES); old_state = netif_ip6_addr_state(netif, addr_idx); - //printf("old_state %d, state %d\n", old_state, state); /* state is actually being changed? */ if (old_state != state) { u8_t old_valid = old_state & IP6_ADDR_VALID; @@ -1114,39 +1432,47 @@ netif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state) if (old_valid && !new_valid) { /* address about to be removed by setting invalid */ -#if LWIP_TCP - tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL); -#endif /* LWIP_TCP */ -#if LWIP_UDP - udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL); -#endif /* LWIP_UDP */ -#if LWIP_RAW - raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL); -#endif /* LWIP_RAW */ + netif_do_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL); /* @todo: remove mib2 ip6 entries? */ } netif->ip6_addr_state[addr_idx] = state; if (!old_valid && new_valid) { /* address added by setting valid */ + /* This is a good moment to check that the address is properly zoned. */ + IP6_ADDR_ZONECHECK_NETIF(netif_ip6_addr(netif, addr_idx), netif); /* @todo: add mib2 ip6 entries? */ netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6); } - if ((old_state & IP6_ADDR_PREFERRED) != (state & IP6_ADDR_PREFERRED)) { - /* address state has changed (valid flag changed or switched between - preferred and deprecated) -> call the callback function */ + if ((old_state & ~IP6_ADDR_TENTATIVE_COUNT_MASK) != + (state & ~IP6_ADDR_TENTATIVE_COUNT_MASK)) { + /* address state has changed -> call the callback function */ NETIF_STATUS_CALLBACK(netif, NETIF_STATE_IPV6); } - } +#if LWIP_NETIF_EXT_STATUS_CALLBACK + { + netif_ext_callback_args_t args; + args.ipv6_addr_state_changed.addr_index = addr_idx; + args.ipv6_addr_state_changed.old_state = old_state; + args.ipv6_addr_state_changed.address = netif_ip_addr6(netif, addr_idx); + netif_invoke_ext_callback(netif, LWIP_NSC_IPV6_ADDR_STATE_CHANGED, &args); + } +#endif + } LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IPv6 address %d of interface %c%c set to %s/0x%"X8_F"\n", - addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)), - netif_ip6_addr_state(netif, addr_idx))); + addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)), + netif_ip6_addr_state(netif, addr_idx))); } /** - * Checks if a specific address is assigned to the netif and returns its - * index. + * Checks if a specific local address is present on the netif and returns its + * index. Depending on its state, it may or may not be assigned to the + * interface (as per RFC terminology). + * + * The given address may or may not be zoned (i.e., have a zone index other + * than IP6_NO_ZONE). If the address is zoned, it must have the correct zone + * for the given netif, or no match will be found. * * @param netif the netif to check * @param ip6addr the IPv6 address to find @@ -1157,9 +1483,21 @@ s8_t netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr) { s8_t i; + + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("netif_get_ip6_addr_match: invalid netif", netif != NULL); + LWIP_ASSERT("netif_get_ip6_addr_match: invalid ip6addr", ip6addr != NULL); + +#if LWIP_IPV6_SCOPES + if (ip6_addr_has_zone(ip6addr) && !ip6_addr_test_zone(ip6addr, netif)) { + return -1; /* wrong zone, no match */ + } +#endif /* LWIP_IPV6_SCOPES */ + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(netif_ip6_addr(netif, i), ip6addr)) { + ip6_addr_cmp_zoneless(netif_ip6_addr(netif, i), ip6addr)) { return i; } } @@ -1179,6 +1517,10 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) { u8_t i, addr_index; + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("netif_create_ip6_linklocal_address: invalid netif", netif != NULL); + /* Link-local prefix. */ ip_2_ip6(&netif->ip6_addr[0])->addr[0] = PP_HTONL(0xfe800000ul); ip_2_ip6(&netif->ip6_addr[0])->addr[1] = 0; @@ -1190,7 +1532,7 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) ((u32_t)(netif->hwaddr[1]) << 16) | ((u32_t)(netif->hwaddr[2]) << 8) | (0xff)); - ip_2_ip6(&netif->ip6_addr[0])->addr[3] = lwip_htonl((0xfeul << 24) | + ip_2_ip6(&netif->ip6_addr[0])->addr[3] = lwip_htonl((u32_t)(0xfeul << 24) | ((u32_t)(netif->hwaddr[3]) << 16) | ((u32_t)(netif->hwaddr[4]) << 8) | (netif->hwaddr[5])); @@ -1204,10 +1546,20 @@ netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit) if (i == 4) { addr_index--; } - ip_2_ip6(&netif->ip6_addr[0])->addr[addr_index] |= ((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03)); + ip_2_ip6(&netif->ip6_addr[0])->addr[addr_index] |= lwip_htonl(((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03))); } } + /* Set a link-local zone. Even though the zone is implied by the owning + * netif, setting the zone anyway has two important conceptual advantages: + * 1) it avoids the need for a ton of exceptions in internal code, allowing + * e.g. ip6_addr_cmp() to be used on local addresses; + * 2) the properly zoned address is visible externally, e.g. when any outside + * code enumerates available addresses or uses one to bind a socket. + * Any external code unaware of address scoping is likely to just ignore the + * zone field, so this should not create any compatibility problems. */ + ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[0]), IP6_UNICAST, netif); + /* Set address state. */ #if LWIP_IPV6_DUP_DETECT_ATTEMPTS /* Will perform duplicate address detection (DAD). */ @@ -1233,6 +1585,11 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos { s8_t i; + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("netif_add_ip6_address: invalid netif", netif != NULL); + LWIP_ASSERT("netif_add_ip6_address: invalid ip6addr", ip6addr != NULL); + i = netif_get_ip6_addr_match(netif, ip6addr); if (i >= 0) { /* Address already added */ @@ -1242,10 +1599,11 @@ netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chos return ERR_OK; } - /* Find a free slot -- musn't be the first one (reserved for link local) */ - for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + /* Find a free slot. The first one is reserved for link-local addresses. */ + for (i = ip6_addr_islinklocal(ip6addr) ? 0 : 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) { ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr); + ip6_addr_assign_zone(ip_2_ip6(&netif->ip6_addr[i]), IP6_UNICAST, netif); netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE); if (chosen_idx != NULL) { *chosen_idx = i; @@ -1272,3 +1630,189 @@ netif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipa return ERR_IF; } #endif /* LWIP_IPV6 */ + +#if LWIP_IPV4 +/** Dummy IPv4 output function for netifs not supporting IPv4 + */ +static err_t +netif_null_output_ip4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr) +{ + LWIP_UNUSED_ARG(netif); + LWIP_UNUSED_ARG(p); + LWIP_UNUSED_ARG(ipaddr); + + return ERR_IF; +} +#endif /* LWIP_IPV4 */ + +/** +* @ingroup netif +* Return the interface index for the netif with name +* or NETIF_NO_INDEX if not found/on error +* +* @param name the name of the netif +*/ +u8_t +netif_name_to_index(const char *name) +{ + struct netif *netif = netif_find(name); + if (netif != NULL) { + return netif_get_index(netif); + } + /* No name found, return invalid index */ + return NETIF_NO_INDEX; +} + +/** +* @ingroup netif +* Return the interface name for the netif matching index +* or NULL if not found/on error +* +* @param idx the interface index of the netif +* @param name char buffer of at least NETIF_NAMESIZE bytes +*/ +char * +netif_index_to_name(u8_t idx, char *name) +{ + struct netif *netif = netif_get_by_index(idx); + + if (netif != NULL) { + name[0] = netif->name[0]; + name[1] = netif->name[1]; + lwip_itoa(&name[2], NETIF_NAMESIZE - 2, netif_index_to_num(idx)); + return name; + } + return NULL; +} + +/** +* @ingroup netif +* Return the interface for the netif index +* +* @param idx index of netif to find +*/ +struct netif * +netif_get_by_index(u8_t idx) +{ + struct netif *netif; + + LWIP_ASSERT_CORE_LOCKED(); + + if (idx != NETIF_NO_INDEX) { + NETIF_FOREACH(netif) { + if (idx == netif_get_index(netif)) { + return netif; /* found! */ + } + } + } + + return NULL; +} + +/** + * @ingroup netif + * Find a network interface by searching for its name + * + * @param name the name of the netif (like netif->name) plus concatenated number + * in ascii representation (e.g. 'en0') + */ +struct netif * +netif_find(const char *name) +{ + struct netif *netif; + u8_t num; + + LWIP_ASSERT_CORE_LOCKED(); + + if (name == NULL) { + return NULL; + } + + num = (u8_t)atoi(&name[2]); + if (!num && (name[2] != '0')) { + /* this means atoi has failed */ + return NULL; + } + + NETIF_FOREACH(netif) { + if (num == netif->num && + name[0] == netif->name[0] && + name[1] == netif->name[1]) { + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); + return netif; + } + } + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); + return NULL; +} + +#if LWIP_NETIF_EXT_STATUS_CALLBACK +/** + * @ingroup netif + * Add extended netif events listener + * @param callback pointer to listener structure + * @param fn callback function + */ +void +netif_add_ext_callback(netif_ext_callback_t *callback, netif_ext_callback_fn fn) +{ + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ASSERT("callback must be != NULL", callback != NULL); + LWIP_ASSERT("fn must be != NULL", fn != NULL); + + callback->callback_fn = fn; + callback->next = ext_callback; + ext_callback = callback; +} + +/** + * @ingroup netif + * Remove extended netif events listener + * @param callback pointer to listener structure + */ +void +netif_remove_ext_callback(netif_ext_callback_t* callback) +{ + netif_ext_callback_t *last, *iter; + + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ASSERT("callback must be != NULL", callback != NULL); + + if (ext_callback == NULL) { + return; + } + + if (callback == ext_callback) { + ext_callback = ext_callback->next; + } else { + last = ext_callback; + for (iter = ext_callback->next; iter != NULL; last = iter, iter = iter->next) { + if (iter == callback) { + LWIP_ASSERT("last != NULL", last != NULL); + last->next = callback->next; + callback->next = NULL; + return; + } + } + } +} + +/** + * Invoke extended netif status event + * @param netif netif that is affected by change + * @param reason change reason + * @param args depends on reason, see reason description + */ +void +netif_invoke_ext_callback(struct netif *netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t *args) +{ + netif_ext_callback_t *callback = ext_callback; + + LWIP_ASSERT("netif must be != NULL", netif != NULL); + + while (callback != NULL) { + callback->callback_fn(netif, reason, args); + callback = callback->next; + } +} +#endif /* LWIP_NETIF_EXT_STATUS_CALLBACK */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/pbuf.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/pbuf.c similarity index 64% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/pbuf.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/pbuf.c index 059f83a..7638dfd 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/pbuf.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/pbuf.c @@ -33,48 +33,7 @@ * Therefore, looping through a pbuf of a single packet, has an * loop end condition (tot_len == p->len), NOT (next == NULL). * - * Example of custom pbuf usage for zero-copy RX: - @code{.c} -typedef struct my_custom_pbuf -{ - struct pbuf_custom p; - void* dma_descriptor; -} my_custom_pbuf_t; - -LWIP_MEMPOOL_DECLARE(RX_POOL, 10, sizeof(my_custom_pbuf_t), "Zero-copy RX PBUF pool"); - -void my_pbuf_free_custom(void* p) -{ - my_custom_pbuf_t* my_puf = (my_custom_pbuf_t*)p; - - LOCK_INTERRUPTS(); - free_rx_dma_descriptor(my_pbuf->dma_descriptor); - LWIP_MEMPOOL_FREE(RX_POOL, my_pbuf); - UNLOCK_INTERRUPTS(); -} - -void eth_rx_irq() -{ - dma_descriptor* dma_desc = get_RX_DMA_descriptor_from_ethernet(); - my_custom_pbuf_t* my_pbuf = (my_custom_pbuf_t*)LWIP_MEMPOOL_ALLOC(RX_POOL); - - my_pbuf->p.custom_free_function = my_pbuf_free_custom; - my_pbuf->dma_descriptor = dma_desc; - - invalidate_cpu_cache(dma_desc->rx_data, dma_desc->rx_length); - - struct pbuf* p = pbuf_alloced_custom(PBUF_RAW, - dma_desc->rx_length, - PBUF_REF, - &my_pbuf->p, - dma_desc->rx_data, - dma_desc->max_buffer_size); - - if(netif->input(p, netif) != ERR_OK) { - pbuf_free(p); - } -} - @endcode + * Example of custom pbuf usage: @ref zerocopyrx */ /* @@ -111,12 +70,13 @@ void eth_rx_irq() #include "lwip/opt.h" +#include "lwip/pbuf.h" #include "lwip/stats.h" #include "lwip/def.h" #include "lwip/mem.h" #include "lwip/memp.h" -#include "lwip/pbuf.h" #include "lwip/sys.h" +#include "lwip/netif.h" #if LWIP_TCP && TCP_QUEUE_OOSEQ #include "lwip/priv/tcp_priv.h" #endif @@ -131,6 +91,9 @@ void eth_rx_irq() aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */ #define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) +static const struct pbuf * +pbuf_skip_const(const struct pbuf *in, u16_t in_offset, u16_t *out_offset); + #if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ #define PBUF_POOL_IS_EMPTY() #else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ @@ -139,7 +102,7 @@ void eth_rx_irq() #ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL #include "lwip/tcpip.h" #define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL() do { \ - if (tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \ + if (tcpip_try_callback(pbuf_free_ooseq_callback, NULL) != ERR_OK) { \ SYS_ARCH_PROTECT(old_level); \ pbuf_free_ooseq_pending = 0; \ SYS_ARCH_UNPROTECT(old_level); \ @@ -164,15 +127,14 @@ static void pbuf_free_ooseq(void) { - struct tcp_pcb* pcb; + struct tcp_pcb *pcb; SYS_ARCH_SET(pbuf_free_ooseq_pending, 0); for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) { - if (NULL != pcb->ooseq) { + if (pcb->ooseq != NULL) { /** Free the ooseq pbufs of one PCB only */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n")); - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; + tcp_free_ooseq(pcb); return; } } @@ -212,6 +174,20 @@ pbuf_pool_is_empty(void) } #endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ +/* Initialize members of struct pbuf after allocation */ +static void +pbuf_init_alloced_pbuf(struct pbuf *p, void *payload, u16_t tot_len, u16_t len, pbuf_type type, u8_t flags) +{ + p->next = NULL; + p->payload = payload; + p->tot_len = tot_len; + p->len = len; + p->type_internal = (u8_t)type; + p->flags = flags; + p->ref = 1; + p->if_idx = NETIF_NO_INDEX; +} + /** * @ingroup pbuf * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). @@ -220,7 +196,7 @@ pbuf_pool_is_empty(void) * layer at which the pbuf is allocated and the requested size * (from the size parameter). * - * @param layer flag to define header size + * @param layer header size * @param length size of the pbuf's payload * @param type this parameter decides how and where the pbuf * should be allocated as follows: @@ -247,169 +223,131 @@ pbuf_pool_is_empty(void) struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) { - struct pbuf *p, *q, *r; - u16_t offset; - s32_t rem_len; /* remaining length */ + struct pbuf *p; + u16_t offset = (u16_t)layer; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); - /* determine header offset */ - switch (layer) { - case PBUF_TRANSPORT: - /* add room for transport (often TCP) layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; - break; - case PBUF_IP: - /* add room for IP layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN; - break; - case PBUF_LINK: - /* add room for link layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN; - break; - case PBUF_RAW_TX: - /* add room for encapsulating link layer headers (e.g. 802.11) */ - offset = PBUF_LINK_ENCAPSULATION_HLEN; - break; - case PBUF_RAW: - /* no offset (e.g. RX buffers or chain successors) */ - offset = 0; - break; - default: - LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0); - return NULL; - } - switch (type) { - case PBUF_POOL: - /* allocate head of pbuf chain into p */ - p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p)); - if (p == NULL) { - PBUF_POOL_IS_EMPTY(); - return NULL; + case PBUF_REF: /* fall through */ + case PBUF_ROM: + p = pbuf_alloc_reference(NULL, length, type); + break; + case PBUF_POOL: { + struct pbuf *q, *last; + u16_t rem_len; /* remaining length */ + p = NULL; + last = NULL; + rem_len = length; + do { + u16_t qlen; + q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); + if (q == NULL) { + PBUF_POOL_IS_EMPTY(); + /* free chain so far allocated */ + if (p) { + pbuf_free(p); + } + /* bail out unsuccessfully */ + return NULL; + } + qlen = LWIP_MIN(rem_len, (u16_t)(PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset))); + pbuf_init_alloced_pbuf(q, LWIP_MEM_ALIGN((void *)((u8_t *)q + SIZEOF_STRUCT_PBUF + offset)), + rem_len, qlen, type, 0); + LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", + ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); + LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", + (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); + if (p == NULL) { + /* allocated head of pbuf chain (into p) */ + p = q; + } else { + /* make previous pbuf point to this pbuf */ + last->next = q; + } + last = q; + rem_len = (u16_t)(rem_len - qlen); + offset = 0; + } while (rem_len > 0); + break; } - p->type = type; - p->next = NULL; + case PBUF_RAM: { + mem_size_t payload_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(offset) + LWIP_MEM_ALIGN_SIZE(length)); + mem_size_t alloc_len = (mem_size_t)(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF) + payload_len); - /* make the payload pointer point 'offset' bytes into pbuf data memory */ - p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset))); - LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned", - ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); - /* the total length of the pbuf chain is the requested size */ - p->tot_len = length; - /* set the length of the first pbuf in the chain */ - p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)); - LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", - ((u8_t*)p->payload + p->len <= - (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); - LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", - (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); - /* set reference count (needed here in case we fail) */ - p->ref = 1; - - /* now allocate the tail of the pbuf chain */ - - /* remember first pbuf for linkage in next iteration */ - r = p; - /* remaining length to be allocated */ - rem_len = length - p->len; - /* any remaining pbufs to be allocated? */ - while (rem_len > 0) { - q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); - if (q == NULL) { - PBUF_POOL_IS_EMPTY(); - /* free chain so far allocated */ - pbuf_free(p); - /* bail out unsuccessfully */ - return NULL; - } - q->type = type; - q->flags = 0; - q->next = NULL; - /* make previous pbuf point to this pbuf */ - r->next = q; - /* set total length of this pbuf and next in chain */ - LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff); - q->tot_len = (u16_t)rem_len; - /* this pbuf length is pool size, unless smaller sized tail */ - q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED); - q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF); - LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", - ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); - LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", - ((u8_t*)p->payload + p->len <= - (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); - q->ref = 1; - /* calculate remaining length to be allocated */ - rem_len -= q->len; - /* remember this pbuf for linkage in next iteration */ - r = q; - } - /* end of chain */ - /*r->next = NULL;*/ - - break; - case PBUF_RAM: - { - mem_size_t alloc_len = LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length); - /* bug #50040: Check for integer overflow when calculating alloc_len */ - if (alloc_len < LWIP_MEM_ALIGN_SIZE(length)) { + if ((payload_len < LWIP_MEM_ALIGN_SIZE(length)) || + (alloc_len < LWIP_MEM_ALIGN_SIZE(length))) { return NULL; } - + /* If pbuf is to be allocated in RAM, allocate memory for it. */ - p = (struct pbuf*)mem_malloc(alloc_len); + p = (struct pbuf *)mem_malloc(alloc_len); + if (p == NULL) { + return NULL; + } + pbuf_init_alloced_pbuf(p, LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)), + length, length, type, 0); + LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", + ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); + break; } - - if (p == NULL) { + default: + LWIP_ASSERT("pbuf_alloc: erroneous type", 0); return NULL; - } - /* Set up internal structure of the pbuf. */ - p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)); - p->len = p->tot_len = length; - p->next = NULL; - p->type = type; - - LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", - ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); - break; - /* pbuf references existing (non-volatile static constant) ROM payload? */ - case PBUF_ROM: - /* pbuf references existing (externally allocated) RAM payload? */ - case PBUF_REF: - /* only allocate memory for the pbuf structure */ - p = (struct pbuf *)memp_malloc(MEMP_PBUF); - if (p == NULL) { - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", - (type == PBUF_ROM) ? "ROM" : "REF")); - return NULL; - } - /* caller must set this field properly, afterwards */ - p->payload = NULL; - p->len = p->tot_len = length; - p->next = NULL; - p->type = type; - break; - default: - LWIP_ASSERT("pbuf_alloc: erroneous type", 0); - return NULL; } - /* set reference count */ - p->ref = 1; - /* set flags */ - p->flags = 0; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p)); return p; } +/** + * @ingroup pbuf + * Allocates a pbuf for referenced data. + * Referenced data can be volatile (PBUF_REF) or long-lived (PBUF_ROM). + * + * The actual memory allocated for the pbuf is determined by the + * layer at which the pbuf is allocated and the requested size + * (from the size parameter). + * + * @param payload referenced payload + * @param length size of the pbuf's payload + * @param type this parameter decides how and where the pbuf + * should be allocated as follows: + * + * - PBUF_ROM: It is assumed that the memory used is really + * similar to ROM in that it is immutable and will not be + * changed. Memory which is dynamic should generally not + * be attached to PBUF_ROM pbufs. Use PBUF_REF instead. + * - PBUF_REF: It is assumed that the pbuf is only + * being used in a single thread. If the pbuf gets queued, + * then pbuf_take should be called to copy the buffer. + * + * @return the allocated pbuf. + */ +struct pbuf * +pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type) +{ + struct pbuf *p; + LWIP_ASSERT("invalid pbuf_type", (type == PBUF_REF) || (type == PBUF_ROM)); + /* only allocate memory for the pbuf structure */ + p = (struct pbuf *)memp_malloc(MEMP_PBUF); + if (p == NULL) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_alloc_reference: Could not allocate MEMP_PBUF for PBUF_%s.\n", + (type == PBUF_ROM) ? "ROM" : "REF")); + return NULL; + } + pbuf_init_alloced_pbuf(p, payload, length, length, type, 0); + return p; +} + + #if LWIP_SUPPORT_CUSTOM_PBUF /** * @ingroup pbuf * Initialize a custom pbuf (already allocated). + * Example of custom pbuf usage: @ref zerocopyrx * - * @param l flag to define header size + * @param l header size * @param length size of the pbuf's payload * @param type type of the pbuf (only used to treat the pbuf accordingly, as * this function allocates no memory) @@ -421,54 +359,25 @@ pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) * @param payload_mem_len the size of the 'payload_mem' buffer, must be at least * big enough to hold 'length' plus the header size */ -struct pbuf* +struct pbuf * pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len) { - u16_t offset; + u16_t offset = (u16_t)l; + void *payload; LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length)); - /* determine header offset */ - switch (l) { - case PBUF_TRANSPORT: - /* add room for transport (often TCP) layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; - break; - case PBUF_IP: - /* add room for IP layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN; - break; - case PBUF_LINK: - /* add room for link layer header */ - offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN; - break; - case PBUF_RAW_TX: - /* add room for encapsulating link layer headers (e.g. 802.11) */ - offset = PBUF_LINK_ENCAPSULATION_HLEN; - break; - case PBUF_RAW: - offset = 0; - break; - default: - LWIP_ASSERT("pbuf_alloced_custom: bad pbuf layer", 0); - return NULL; - } - if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) { LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length)); return NULL; } - p->pbuf.next = NULL; if (payload_mem != NULL) { - p->pbuf.payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset); + payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset); } else { - p->pbuf.payload = NULL; + payload = NULL; } - p->pbuf.flags = PBUF_FLAG_IS_CUSTOM; - p->pbuf.len = p->pbuf.tot_len = length; - p->pbuf.type = type; - p->pbuf.ref = 1; + pbuf_init_alloced_pbuf(&p->pbuf, payload, length, length, type, PBUF_FLAG_IS_CUSTOM); return &p->pbuf; } #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ @@ -494,13 +403,9 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) { struct pbuf *q; u16_t rem_len; /* remaining length */ - s32_t grow; + u16_t shrink; LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); - LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL || - p->type == PBUF_ROM || - p->type == PBUF_RAM || - p->type == PBUF_REF); /* desired length larger than current length? */ if (new_len >= p->tot_len) { @@ -510,7 +415,7 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) /* the pbuf chain grows by (new_len - p->tot_len) bytes * (which may be negative in case of shrinking) */ - grow = new_len - p->tot_len; + shrink = (u16_t)(p->tot_len - new_len); /* first, step over any pbufs that should remain in the chain */ rem_len = new_len; @@ -518,10 +423,9 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) /* should this pbuf be kept? */ while (rem_len > q->len) { /* decrease remaining length by pbuf length */ - rem_len -= q->len; + rem_len = (u16_t)(rem_len - q->len); /* decrease total length indicator */ - LWIP_ASSERT("grow < max_u16_t", grow < 0xffff); - q->tot_len += (u16_t)grow; + q->tot_len = (u16_t)(q->tot_len - shrink); /* proceed to next pbuf in chain */ q = q->next; LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); @@ -531,13 +435,13 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) /* shrink allocated memory for PBUF_RAM */ /* (other types merely adjust their length fields */ - if ((q->type == PBUF_RAM) && (rem_len != q->len) + if (pbuf_match_allocsrc(q, PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) && (rem_len != q->len) #if LWIP_SUPPORT_CUSTOM_PBUF && ((q->flags & PBUF_FLAG_IS_CUSTOM) == 0) #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ ) { /* reallocate and adjust the length of the pbuf that will be split */ - q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len); + q = (struct pbuf *)mem_trim(q, (mem_size_t)(((u8_t *)q->payload - (u8_t *)q) + rem_len)); LWIP_ASSERT("mem_trim returned q == NULL", q != NULL); } /* adjust length fields for new last pbuf */ @@ -555,8 +459,8 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) } /** - * Adjusts the payload pointer to hide or reveal headers in the payload. - * @see pbuf_header. + * Adjusts the payload pointer to reveal headers in the payload. + * @see pbuf_add_header. * * @param p pbuf to change the header size. * @param header_size_increment Number of bytes to increment header size. @@ -566,81 +470,158 @@ pbuf_realloc(struct pbuf *p, u16_t new_len) * */ static u8_t -pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force) +pbuf_add_header_impl(struct pbuf *p, size_t header_size_increment, u8_t force) { - u16_t type; + u16_t type_internal; void *payload; u16_t increment_magnitude; LWIP_ASSERT("p != NULL", p != NULL); - if ((header_size_increment == 0) || (p == NULL)) { + if ((p == NULL) || (header_size_increment > 0xFFFF)) { + return 1; + } + if (header_size_increment == 0) { return 0; } - if (header_size_increment < 0) { - increment_magnitude = (u16_t)-header_size_increment; - /* Check that we aren't going to move off the end of the pbuf */ - LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); - } else { - increment_magnitude = (u16_t)header_size_increment; -#if 0 - /* Can't assert these as some callers speculatively call - pbuf_header() to see if it's OK. Will return 1 below instead. */ - /* Check that we've got the correct type of pbuf to work with */ - LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL", - p->type == PBUF_RAM || p->type == PBUF_POOL); - /* Check that we aren't going to move off the beginning of the pbuf */ - LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF", - (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF); -#endif + increment_magnitude = (u16_t)header_size_increment; + /* Do not allow tot_len to wrap as a result. */ + if ((u16_t)(increment_magnitude + p->tot_len) < increment_magnitude) { + return 1; } - type = p->type; - /* remember current payload pointer */ - payload = p->payload; + type_internal = p->type_internal; /* pbuf types containing payloads? */ - if (type == PBUF_RAM || type == PBUF_POOL) { + if (type_internal & PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS) { /* set new payload pointer */ - p->payload = (u8_t *)p->payload - header_size_increment; + payload = (u8_t *)p->payload - header_size_increment; /* boundary check fails? */ - if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { + if ((u8_t *)payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, - ("pbuf_header: failed as %p < %p (not enough space for new header size)\n", - (void *)p->payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF))); - /* restore old payload pointer */ - p->payload = payload; + ("pbuf_add_header: failed as %p < %p (not enough space for new header size)\n", + (void *)payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF))); /* bail out unsuccessfully */ return 1; } - /* pbuf types referring to external payloads? */ - } else if (type == PBUF_REF || type == PBUF_ROM) { + /* pbuf types referring to external payloads? */ + } else { /* hide a header in the payload? */ - if ((header_size_increment < 0) && (increment_magnitude <= p->len)) { - /* increase payload pointer */ - p->payload = (u8_t *)p->payload - header_size_increment; - } else if ((header_size_increment > 0) && force) { - p->payload = (u8_t *)p->payload - header_size_increment; + if (force) { + payload = (u8_t *)p->payload - header_size_increment; } else { /* cannot expand payload to front (yet!) * bail out unsuccessfully */ return 1; } - } else { - /* Unknown type */ - LWIP_ASSERT("bad pbuf type", 0); - return 1; } - /* modify pbuf length fields */ - p->len += header_size_increment; - p->tot_len += header_size_increment; + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_add_header: old %p new %p (%"U16_F")\n", + (void *)p->payload, (void *)payload, increment_magnitude)); + + /* modify pbuf fields */ + p->payload = payload; + p->len = (u16_t)(p->len + increment_magnitude); + p->tot_len = (u16_t)(p->tot_len + increment_magnitude); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n", - (void *)payload, (void *)p->payload, header_size_increment)); return 0; } +/** + * Adjusts the payload pointer to reveal headers in the payload. + * + * Adjusts the ->payload pointer so that space for a header + * appears in the pbuf payload. + * + * The ->payload, ->tot_len and ->len fields are adjusted. + * + * @param p pbuf to change the header size. + * @param header_size_increment Number of bytes to increment header size which + * increases the size of the pbuf. New space is on the front. + * If header_size_increment is 0, this function does nothing and returns successful. + * + * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so + * the call will fail. A check is made that the increase in header size does + * not move the payload pointer in front of the start of the buffer. + * + * @return non-zero on failure, zero on success. + * + */ +u8_t +pbuf_add_header(struct pbuf *p, size_t header_size_increment) +{ + return pbuf_add_header_impl(p, header_size_increment, 0); +} + +/** + * Same as @ref pbuf_add_header but does not check if 'header_size > 0' is allowed. + * This is used internally only, to allow PBUF_REF for RX. + */ +u8_t +pbuf_add_header_force(struct pbuf *p, size_t header_size_increment) +{ + return pbuf_add_header_impl(p, header_size_increment, 1); +} + +/** + * Adjusts the payload pointer to hide headers in the payload. + * + * Adjusts the ->payload pointer so that space for a header + * disappears in the pbuf payload. + * + * The ->payload, ->tot_len and ->len fields are adjusted. + * + * @param p pbuf to change the header size. + * @param header_size_decrement Number of bytes to decrement header size which + * decreases the size of the pbuf. + * If header_size_decrement is 0, this function does nothing and returns successful. + * @return non-zero on failure, zero on success. + * + */ +u8_t +pbuf_remove_header(struct pbuf *p, size_t header_size_decrement) +{ + void *payload; + u16_t increment_magnitude; + + LWIP_ASSERT("p != NULL", p != NULL); + if ((p == NULL) || (header_size_decrement > 0xFFFF)) { + return 1; + } + if (header_size_decrement == 0) { + return 0; + } + + increment_magnitude = (u16_t)header_size_decrement; + /* Check that we aren't going to move off the end of the pbuf */ + LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); + + /* remember current payload pointer */ + payload = p->payload; + LWIP_UNUSED_ARG(payload); /* only used in LWIP_DEBUGF below */ + + /* increase payload pointer (guarded by length check above) */ + p->payload = (u8_t *)p->payload + header_size_decrement; + /* modify pbuf length fields */ + p->len = (u16_t)(p->len - increment_magnitude); + p->tot_len = (u16_t)(p->tot_len - increment_magnitude); + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_remove_header: old %p new %p (%"U16_F")\n", + (void *)payload, (void *)p->payload, increment_magnitude)); + + return 0; +} + +static u8_t +pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force) +{ + if (header_size_increment < 0) { + return pbuf_remove_header(p, (size_t) - header_size_increment); + } else { + return pbuf_add_header_impl(p, (size_t)header_size_increment, force); + } +} + /** * Adjusts the payload pointer to hide or reveal headers in the payload. * @@ -653,7 +634,7 @@ pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force) * @param header_size_increment Number of bytes to increment header size which * increases the size of the pbuf. New space is on the front. * (Using a negative value decreases the header size.) - * If hdr_size_inc is 0, this function does nothing and returns successful. + * If header_size_increment is 0, this function does nothing and returns successful. * * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so * the call will fail. A check is made that the increase in header size does @@ -664,7 +645,7 @@ pbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force) u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment) { - return pbuf_header_impl(p, header_size_increment, 0); + return pbuf_header_impl(p, header_size_increment, 0); } /** @@ -674,7 +655,36 @@ pbuf_header(struct pbuf *p, s16_t header_size_increment) u8_t pbuf_header_force(struct pbuf *p, s16_t header_size_increment) { - return pbuf_header_impl(p, header_size_increment, 1); + return pbuf_header_impl(p, header_size_increment, 1); +} + +/** Similar to pbuf_header(-size) but de-refs header pbufs for (size >= p->len) + * + * @param q pbufs to operate on + * @param size The number of bytes to remove from the beginning of the pbuf list. + * While size >= p->len, pbufs are freed. + * ATTENTION: this is the opposite direction as @ref pbuf_header, but + * takes an u16_t not s16_t! + * @return the new head pbuf + */ +struct pbuf * +pbuf_free_header(struct pbuf *q, u16_t size) +{ + struct pbuf *p = q; + u16_t free_left = size; + while (free_left && p) { + if (free_left >= p->len) { + struct pbuf *f = p; + free_left = (u16_t)(free_left - p->len); + p = p->next; + f->next = 0; + pbuf_free(f); + } else { + pbuf_remove_header(p, free_left); + free_left = 0; + } + } + return p; } /** @@ -714,7 +724,7 @@ pbuf_header_force(struct pbuf *p, s16_t header_size_increment) u8_t pbuf_free(struct pbuf *p) { - u16_t type; + u8_t alloc_src; struct pbuf *q; u8_t count; @@ -722,22 +732,18 @@ pbuf_free(struct pbuf *p) LWIP_ASSERT("p != NULL", p != NULL); /* if assertions are disabled, proceed with debug output */ LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("pbuf_free(p == NULL) was called.\n")); + ("pbuf_free(p == NULL) was called.\n")); return 0; } LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p)); PERF_START; - LWIP_ASSERT("pbuf_free: sane type", - p->type == PBUF_RAM || p->type == PBUF_ROM || - p->type == PBUF_REF || p->type == PBUF_POOL); - count = 0; /* de-allocate all consecutive pbufs from the head of the chain that * obtain a zero reference count after decrementing*/ while (p != NULL) { - u16_t ref; + LWIP_PBUF_REF_T ref; SYS_ARCH_DECL_PROTECT(old_level); /* Since decrementing ref cannot be guaranteed to be a single machine operation * we must protect it. We put the new ref into a local variable to prevent @@ -753,34 +759,37 @@ pbuf_free(struct pbuf *p) /* remember next pbuf in chain for next iteration */ q = p->next; LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p)); - type = p->type; + alloc_src = pbuf_get_allocsrc(p); #if LWIP_SUPPORT_CUSTOM_PBUF /* is this a custom pbuf? */ if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) { - struct pbuf_custom *pc = (struct pbuf_custom*)p; + struct pbuf_custom *pc = (struct pbuf_custom *)p; LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL); pc->custom_free_function(p); } else #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ { /* is this a pbuf from the pool? */ - if (type == PBUF_POOL) { + if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) { memp_free(MEMP_PBUF_POOL, p); - /* is this a ROM or RAM referencing pbuf? */ - } else if (type == PBUF_ROM || type == PBUF_REF) { + /* is this a ROM or RAM referencing pbuf? */ + } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF) { memp_free(MEMP_PBUF, p); - /* type == PBUF_RAM */ - } else { + /* type == PBUF_RAM */ + } else if (alloc_src == PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP) { mem_free(p); + } else { + /* @todo: support freeing other types */ + LWIP_ASSERT("invalid pbuf type", 0); } } count++; /* proceed to next pbuf */ p = q; - /* p->ref > 0, this pbuf is still referenced to */ - /* (and so the remaining pbufs in chain as well) */ + /* p->ref > 0, this pbuf is still referenced to */ + /* (and so the remaining pbufs in chain as well) */ } else { - LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref)); + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, (u16_t)ref)); /* stop walking through the chain */ p = NULL; } @@ -821,7 +830,7 @@ pbuf_ref(struct pbuf *p) { /* pbuf given? */ if (p != NULL) { - SYS_ARCH_INC(p->ref, 1); + SYS_ARCH_SET(p->ref, (LWIP_PBUF_REF_T)(p->ref + 1)); LWIP_ASSERT("pbuf ref overflow", p->ref > 0); } } @@ -834,6 +843,10 @@ pbuf_ref(struct pbuf *p) * @note The caller MAY NOT reference the tail pbuf afterwards. * Use pbuf_chain() for that purpose. * + * This function explicitly does not check for tot_len overflow to prevent + * failing to queue too long pbufs. This can produce invalid pbufs, so + * handle with care! + * * @see pbuf_chain() */ void @@ -847,13 +860,13 @@ pbuf_cat(struct pbuf *h, struct pbuf *t) /* proceed to last pbuf of chain */ for (p = h; p->next != NULL; p = p->next) { /* add total length of second chain to all totals of first chain */ - p->tot_len += t->tot_len; + p->tot_len = (u16_t)(p->tot_len + t->tot_len); } /* { p is last pbuf of first h chain, p->next == NULL } */ LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); LWIP_ASSERT("p->next == NULL", p->next == NULL); /* add total length of second chain to last pbuf total of first chain */ - p->tot_len += t->tot_len; + p->tot_len = (u16_t)(p->tot_len + t->tot_len); /* chain last pbuf of head (p) with first of tail (t) */ p->next = t; /* p->next now references t, but the caller will drop its reference to t, @@ -907,7 +920,7 @@ pbuf_dechain(struct pbuf *p) /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len); /* enforce invariant if assertion is disabled */ - q->tot_len = p->tot_len - p->len; + q->tot_len = (u16_t)(p->tot_len - p->len); /* decouple pbuf from remainder */ p->next = NULL; /* total length of pbuf p is its own length only */ @@ -947,55 +960,88 @@ pbuf_dechain(struct pbuf *p) err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from) { - u16_t offset_to=0, offset_from=0, len; - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n", - (const void*)p_to, (const void*)p_from)); + (const void *)p_to, (const void *)p_from)); + LWIP_ERROR("pbuf_copy: invalid source", p_from != NULL, return ERR_ARG;); + return pbuf_copy_partial_pbuf(p_to, p_from, p_from->tot_len, 0); +} + +/** + * @ingroup pbuf + * Copy part or all of one packet buffer into another, to a specified offset. + * + * @note Only data in one packet is copied, no packet queue! + * @note Argument order is shared with pbuf_copy, but different than pbuf_copy_partial. + * + * @param p_to pbuf destination of the copy + * @param p_from pbuf source of the copy + * @param copy_len number of bytes to copy + * @param offset offset in destination pbuf where to copy to + * + * @return ERR_OK if copy_len bytes were copied + * ERR_ARG if one of the pbufs is NULL or p_from is shorter than copy_len + * or p_to is not big enough to hold copy_len at offset + * ERR_VAL if any of the pbufs are part of a queue + */ +err_t +pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset) +{ + size_t offset_to = offset, offset_from = 0, len_calc; + u16_t len; + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy_partial_pbuf(%p, %p, %"U16_F", %"U16_F")\n", + (const void *)p_to, (const void *)p_from, copy_len, offset)); + + /* is the copy_len in range? */ + LWIP_ERROR("pbuf_copy_partial_pbuf: copy_len bigger than source", ((p_from != NULL) && + (p_from->tot_len >= copy_len)), return ERR_ARG;); /* is the target big enough to hold the source? */ - LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) && - (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;); + LWIP_ERROR("pbuf_copy_partial_pbuf: target not big enough", ((p_to != NULL) && + (p_to->tot_len >= (offset + copy_len))), return ERR_ARG;); /* iterate through pbuf chain */ - do - { + do { /* copy one part of the original chain */ if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { /* complete current p_from fits into current p_to */ - len = p_from->len - offset_from; + len_calc = p_from->len - offset_from; } else { /* current p_from does not fit into current p_to */ - len = p_to->len - offset_to; + len_calc = p_to->len - offset_to; } - MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len); + len = (u16_t)LWIP_MIN(copy_len, len_calc); + MEMCPY((u8_t *)p_to->payload + offset_to, (u8_t *)p_from->payload + offset_from, len); offset_to += len; offset_from += len; + copy_len -= len; LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); if (offset_from >= p_from->len) { /* on to next p_from (if any) */ offset_from = 0; p_from = p_from->next; + LWIP_ERROR("p_from != NULL", (p_from != NULL) || (copy_len == 0), return ERR_ARG;); } if (offset_to == p_to->len) { /* on to next p_to (if any) */ offset_to = 0; p_to = p_to->next; - LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;); + LWIP_ERROR("p_to != NULL", (p_to != NULL) || (copy_len == 0), return ERR_ARG;); } if ((p_from != NULL) && (p_from->len == p_from->tot_len)) { /* don't copy more than one packet! */ - LWIP_ERROR("pbuf_copy() does not allow packet queues!", + LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", (p_from->next == NULL), return ERR_VAL;); } if ((p_to != NULL) && (p_to->len == p_to->tot_len)) { /* don't copy more than one packet! */ - LWIP_ERROR("pbuf_copy() does not allow packet queues!", - (p_to->next == NULL), return ERR_VAL;); + LWIP_ERROR("pbuf_copy_partial_pbuf() does not allow packet queues!", + (p_to->next == NULL), return ERR_VAL;); } - } while (p_from); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n")); + } while (copy_len); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy_partial_pbuf: copy complete.\n")); return ERR_OK; } @@ -1015,41 +1061,76 @@ u16_t pbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) { const struct pbuf *p; - u16_t left; + u16_t left = 0; u16_t buf_copy_len; u16_t copied_total = 0; LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); - left = 0; - - if ((buf == NULL) || (dataptr == NULL)) { - return 0; - } - /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ for (p = buf; len != 0 && p != NULL; p = p->next) { if ((offset != 0) && (offset >= p->len)) { /* don't copy from this buffer -> on to the next */ - offset -= p->len; + offset = (u16_t)(offset - p->len); } else { /* copy from this buffer. maybe only partially. */ - buf_copy_len = p->len - offset; + buf_copy_len = (u16_t)(p->len - offset); if (buf_copy_len > len) { buf_copy_len = len; } /* copy the necessary parts of the buffer */ - MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len); - copied_total += buf_copy_len; - left += buf_copy_len; - len -= buf_copy_len; + MEMCPY(&((char *)dataptr)[left], &((char *)p->payload)[offset], buf_copy_len); + copied_total = (u16_t)(copied_total + buf_copy_len); + left = (u16_t)(left + buf_copy_len); + len = (u16_t)(len - buf_copy_len); offset = 0; } } return copied_total; } +/** + * @ingroup pbuf + * Get part of a pbuf's payload as contiguous memory. The returned memory is + * either a pointer into the pbuf's payload or, if split over multiple pbufs, + * a copy into the user-supplied buffer. + * + * @param p the pbuf from which to copy data + * @param buffer the application supplied buffer + * @param bufsize size of the application supplied buffer + * @param len length of data to copy (dataptr must be big enough). No more + * than buf->tot_len will be copied, irrespective of len + * @param offset offset into the packet buffer from where to begin copying len bytes + * @return the number of bytes copied, or 0 on failure + */ +void * +pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset) +{ + const struct pbuf *q; + u16_t out_offset; + + LWIP_ERROR("pbuf_get_contiguous: invalid buf", (p != NULL), return NULL;); + LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (buffer != NULL), return NULL;); + LWIP_ERROR("pbuf_get_contiguous: invalid dataptr", (bufsize >= len), return NULL;); + + q = pbuf_skip_const(p, offset, &out_offset); + if (q != NULL) { + if (q->len >= (out_offset + len)) { + /* all data in this pbuf, return zero-copy */ + return (u8_t *)q->payload + out_offset; + } + /* need to copy */ + if (pbuf_copy_partial(q, buffer, len, out_offset) != len) { + /* copying failed: pbuf is too short */ + return NULL; + } + return buffer; + } + /* pbuf is too short (offset does not fit in) */ + return NULL; +} + #if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE /** * This method modifies a 'pbuf chain', so that its total length is @@ -1072,8 +1153,8 @@ void pbuf_split_64k(struct pbuf *p, struct pbuf **rest) struct pbuf *r = p->next; /* continue until the total length (summed up as u16_t) overflows */ - while ((r != NULL) && ((u16_t)(tot_len_front + r->len) > tot_len_front)) { - tot_len_front += r->len; + while ((r != NULL) && ((u16_t)(tot_len_front + r->len) >= tot_len_front)) { + tot_len_front = (u16_t)(tot_len_front + r->len); i = r; r = r->next; } @@ -1084,7 +1165,7 @@ void pbuf_split_64k(struct pbuf *p, struct pbuf **rest) if (r != NULL) { /* Update the tot_len field in the first part */ for (i = p; i != NULL; i = i->next) { - i->tot_len -= r->tot_len; + i->tot_len = (u16_t)(i->tot_len - r->tot_len); LWIP_ASSERT("tot_len/len mismatch in last pbuf", (i->next != NULL) || (i->tot_len == i->len)); } @@ -1101,15 +1182,15 @@ void pbuf_split_64k(struct pbuf *p, struct pbuf **rest) #endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ /* Actual implementation of pbuf_skip() but returning const pointer... */ -static const struct pbuf* -pbuf_skip_const(const struct pbuf* in, u16_t in_offset, u16_t* out_offset) +static const struct pbuf * +pbuf_skip_const(const struct pbuf *in, u16_t in_offset, u16_t *out_offset) { u16_t offset_left = in_offset; - const struct pbuf* q = in; + const struct pbuf *q = in; /* get the correct pbuf */ while ((q != NULL) && (q->len <= offset_left)) { - offset_left -= q->len; + offset_left = (u16_t)(offset_left - q->len); q = q->next; } if (out_offset != NULL) { @@ -1127,11 +1208,11 @@ pbuf_skip_const(const struct pbuf* in, u16_t in_offset, u16_t* out_offset) * @param out_offset resulting offset in the returned pbuf * @return the pbuf in the queue where the offset is */ -struct pbuf* -pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset) +struct pbuf * +pbuf_skip(struct pbuf *in, u16_t in_offset, u16_t *out_offset) { - const struct pbuf* out = pbuf_skip_const(in, in_offset, out_offset); - return LWIP_CONST_CAST(struct pbuf*, out); + const struct pbuf *out = pbuf_skip_const(in, in_offset, out_offset); + return LWIP_CONST_CAST(struct pbuf *, out); } /** @@ -1149,9 +1230,9 @@ err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) { struct pbuf *p; - u16_t buf_copy_len; - u16_t total_copy_len = len; - u16_t copied_total = 0; + size_t buf_copy_len; + size_t total_copy_len = len; + size_t copied_total = 0; LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return ERR_ARG;); LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return ERR_ARG;); @@ -1170,7 +1251,7 @@ pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) buf_copy_len = p->len; } /* copy the necessary parts of the buffer */ - MEMCPY(p->payload, &((const char*)dataptr)[copied_total], buf_copy_len); + MEMCPY(p->payload, &((const char *)dataptr)[copied_total], buf_copy_len); total_copy_len -= buf_copy_len; copied_total += buf_copy_len; } @@ -1193,16 +1274,18 @@ err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset) { u16_t target_offset; - struct pbuf* q = pbuf_skip(buf, offset, &target_offset); + struct pbuf *q = pbuf_skip(buf, offset, &target_offset); /* return requested data if pbuf is OK */ if ((q != NULL) && (q->tot_len >= target_offset + len)) { u16_t remaining_len = len; - const u8_t* src_ptr = (const u8_t*)dataptr; + const u8_t *src_ptr = (const u8_t *)dataptr; /* copy the part that goes into the first pbuf */ - u16_t first_copy_len = LWIP_MIN(q->len - target_offset, len); - MEMCPY(((u8_t*)q->payload) + target_offset, dataptr, first_copy_len); - remaining_len -= first_copy_len; + u16_t first_copy_len; + LWIP_ASSERT("check pbuf_skip result", target_offset < q->len); + first_copy_len = (u16_t)LWIP_MIN(q->len - target_offset, len); + MEMCPY(((u8_t *)q->payload) + target_offset, dataptr, first_copy_len); + remaining_len = (u16_t)(remaining_len - first_copy_len); src_ptr += first_copy_len; if (remaining_len > 0) { return pbuf_take(q->next, src_ptr, remaining_len); @@ -1225,23 +1308,46 @@ pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset) * @return a new, single pbuf (p->next is NULL) * or the old pbuf if allocation fails */ -struct pbuf* +struct pbuf * pbuf_coalesce(struct pbuf *p, pbuf_layer layer) { struct pbuf *q; - err_t err; if (p->next == NULL) { return p; } - q = pbuf_alloc(layer, p->tot_len, PBUF_RAM); + q = pbuf_clone(layer, PBUF_RAM, p); if (q == NULL) { /* @todo: what do we do now? */ return p; } + pbuf_free(p); + return q; +} + +/** + * @ingroup pbuf + * Allocates a new pbuf of same length (via pbuf_alloc()) and copies the source + * pbuf into this new pbuf (using pbuf_copy()). + * + * @param layer pbuf_layer of the new pbuf + * @param type this parameter decides how and where the pbuf should be allocated + * (@see pbuf_alloc()) + * @param p the source pbuf + * + * @return a new pbuf or NULL if allocation fails + */ +struct pbuf * +pbuf_clone(pbuf_layer layer, pbuf_type type, struct pbuf *p) +{ + struct pbuf *q; + err_t err; + q = pbuf_alloc(layer, p->tot_len, type); + if (q == NULL) { + return NULL; + } err = pbuf_copy(q, p); LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */ LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); - pbuf_free(p); return q; } @@ -1274,7 +1380,7 @@ pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, return ERR_ARG; } - dst_ptr = ((char*)p->payload) + start_offset; + dst_ptr = ((char *)p->payload) + start_offset; copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr, len); if ((start_offset & 1) != 0) { copy_chksum = SWAP_BYTES_IN_WORD(copy_chksum); @@ -1296,7 +1402,7 @@ pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len */ u8_t -pbuf_get_at(const struct pbuf* p, u16_t offset) +pbuf_get_at(const struct pbuf *p, u16_t offset) { int ret = pbuf_try_get_at(p, offset); if (ret >= 0) { @@ -1314,14 +1420,14 @@ pbuf_get_at(const struct pbuf* p, u16_t offset) * @return byte at an offset into p [0..0xFF] OR negative if 'offset' >= p->tot_len */ int -pbuf_try_get_at(const struct pbuf* p, u16_t offset) +pbuf_try_get_at(const struct pbuf *p, u16_t offset) { u16_t q_idx; - const struct pbuf* q = pbuf_skip_const(p, offset, &q_idx); + const struct pbuf *q = pbuf_skip_const(p, offset, &q_idx); /* return requested data if pbuf is OK */ if ((q != NULL) && (q->len > q_idx)) { - return ((u8_t*)q->payload)[q_idx]; + return ((u8_t *)q->payload)[q_idx]; } return -1; } @@ -1336,14 +1442,14 @@ pbuf_try_get_at(const struct pbuf* p, u16_t offset) * @param data byte to write at an offset into p */ void -pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data) +pbuf_put_at(struct pbuf *p, u16_t offset, u8_t data) { u16_t q_idx; - struct pbuf* q = pbuf_skip(p, offset, &q_idx); + struct pbuf *q = pbuf_skip(p, offset, &q_idx); /* write requested data if pbuf is OK */ if ((q != NULL) && (q->len > q_idx)) { - ((u8_t*)q->payload)[q_idx] = data; + ((u8_t *)q->payload)[q_idx] = data; } } @@ -1359,30 +1465,30 @@ pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data) * (0xffff if p is too short, diffoffset+1 otherwise) */ u16_t -pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n) +pbuf_memcmp(const struct pbuf *p, u16_t offset, const void *s2, u16_t n) { u16_t start = offset; - const struct pbuf* q = p; + const struct pbuf *q = p; u16_t i; - + /* pbuf long enough to perform check? */ - if(p->tot_len < (offset + n)) { + if (p->tot_len < (offset + n)) { return 0xffff; } - + /* get the correct pbuf from chain. We know it succeeds because of p->tot_len check above. */ while ((q != NULL) && (q->len <= start)) { - start -= q->len; + start = (u16_t)(start - q->len); q = q->next; } - + /* return requested data if pbuf is OK */ for (i = 0; i < n; i++) { /* We know pbuf_get_at() succeeds because of p->tot_len check above. */ - u8_t a = pbuf_get_at(q, start + i); - u8_t b = ((const u8_t*)s2)[i]; + u8_t a = pbuf_get_at(q, (u16_t)(start + i)); + u8_t b = ((const u8_t *)s2)[i]; if (a != b) { - return i+1; + return (u16_t)LWIP_MIN(i + 1, 0xFFFF); } } return 0; @@ -1401,12 +1507,12 @@ pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n) * @return 0xFFFF if substr was not found in p or the index where it was found */ u16_t -pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset) +pbuf_memfind(const struct pbuf *p, const void *mem, u16_t mem_len, u16_t start_offset) { u16_t i; - u16_t max = p->tot_len - mem_len; + u16_t max_cmp_start = (u16_t)(p->tot_len - mem_len); if (p->tot_len >= mem_len + start_offset) { - for (i = start_offset; i <= max; i++) { + for (i = start_offset; i <= max_cmp_start; i++) { u16_t plus = pbuf_memcmp(p, i, mem, mem_len); if (plus == 0) { return i; @@ -1428,7 +1534,7 @@ pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_o * @return 0xFFFF if substr was not found in p or the index where it was found */ u16_t -pbuf_strstr(const struct pbuf* p, const char* substr) +pbuf_strstr(const struct pbuf *p, const char *substr) { size_t substr_len; if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/raw.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/raw.c similarity index 65% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/raw.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/raw.c index 80cf9ec..3b34544 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/raw.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/raw.c @@ -4,13 +4,13 @@ * different types of protocols besides (or overriding) those * already available in lwIP.\n * See also @ref raw_raw - * + * * @defgroup raw_raw RAW * @ingroup callbackstyle_api * Implementation of raw protocol PCBs for low-level handling of * different types of protocols besides (or overriding) those * already available in lwIP.\n - * @see @ref raw_api + * @see @ref api */ /* @@ -54,6 +54,7 @@ #include "lwip/ip_addr.h" #include "lwip/netif.h" #include "lwip/raw.h" +#include "lwip/priv/raw_priv.h" #include "lwip/stats.h" #include "lwip/ip6.h" #include "lwip/ip6_addr.h" @@ -65,10 +66,16 @@ static struct raw_pcb *raw_pcbs; static u8_t -raw_input_match(struct raw_pcb *pcb, u8_t broadcast) +raw_input_local_match(struct raw_pcb *pcb, u8_t broadcast) { LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */ + /* check if PCB is bound to specific netif */ + if ((pcb->netif_idx != NETIF_NO_INDEX) && + (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { + return 0; + } + #if LWIP_IPV4 && LWIP_IPV6 /* Dual-stack: PCBs listening to any IP type also listen to any IP address */ if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { @@ -97,11 +104,11 @@ raw_input_match(struct raw_pcb *pcb, u8_t broadcast) } } else #endif /* LWIP_IPV4 */ - /* Handle IPv4 and IPv6: catch all or exact match */ - if (ip_addr_isany(&pcb->local_ip) || - ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) { - return 1; - } + /* Handle IPv4 and IPv6: catch all or exact match */ + if (ip_addr_isany(&pcb->local_ip) || + ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) { + return 1; + } } return 0; @@ -124,12 +131,12 @@ raw_input_match(struct raw_pcb *pcb, u8_t broadcast) * caller). * */ -u8_t +raw_input_state_t raw_input(struct pbuf *p, struct netif *inp) { struct raw_pcb *pcb, *prev; s16_t proto; - u8_t eaten = 0; + raw_input_state_t ret = RAW_INPUT_NONE; u8_t broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()); LWIP_UNUSED_ARG(inp); @@ -156,30 +163,34 @@ raw_input(struct pbuf *p, struct netif *inp) pcb = raw_pcbs; /* loop through all raw pcbs until the packet is eaten by one */ /* this allows multiple pcbs to match against the packet by design */ - while ((eaten == 0) && (pcb != NULL)) { - if ((pcb->protocol == proto) && raw_input_match(pcb, broadcast)) { + while (pcb != NULL) { + if ((pcb->protocol == proto) && raw_input_local_match(pcb, broadcast) && + (((pcb->flags & RAW_FLAGS_CONNECTED) == 0) || + ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) { /* receive callback function available? */ if (pcb->recv != NULL) { + u8_t eaten; #ifndef LWIP_NOASSERT - void* old_payload = p->payload; + void *old_payload = p->payload; #endif + ret = RAW_INPUT_DELIVERED; /* the receive callback function did not eat the packet? */ eaten = pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()); if (eaten != 0) { /* receive function ate the packet */ p = NULL; - eaten = 1; if (prev != NULL) { - /* move the pcb to the front of raw_pcbs so that is - found faster next time */ + /* move the pcb to the front of raw_pcbs so that is + found faster next time */ prev->next = pcb->next; pcb->next = raw_pcbs; raw_pcbs = pcb; } + return RAW_INPUT_EATEN; } else { /* sanity-check that the receive callback did not alter the pbuf */ LWIP_ASSERT("raw pcb recv callback altered pbuf payload pointer without eating packet", - p->payload == old_payload); + p->payload == old_payload); } } /* no receive callback function was set for this raw PCB */ @@ -188,7 +199,7 @@ raw_input(struct pbuf *p, struct netif *inp) prev = pcb; pcb = pcb->next; } - return eaten; + return ret; } /** @@ -209,13 +220,46 @@ raw_input(struct pbuf *p, struct netif *inp) err_t raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr) { + LWIP_ASSERT_CORE_LOCKED(); if ((pcb == NULL) || (ipaddr == NULL)) { return ERR_VAL; } ip_addr_set_ipaddr(&pcb->local_ip, ipaddr); +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now. + * This is legacy support: scope-aware callers should always provide properly + * zoned source addresses. */ + if (IP_IS_V6(&pcb->local_ip) && + ip6_addr_lacks_zone(ip_2_ip6(&pcb->local_ip), IP6_UNKNOWN)) { + ip6_addr_select_zone(ip_2_ip6(&pcb->local_ip), ip_2_ip6(&pcb->local_ip)); + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ return ERR_OK; } +/** + * @ingroup raw_raw + * Bind an RAW PCB to a specific netif. + * After calling this function, all packets received via this PCB + * are guaranteed to have come in via the specified netif, and all + * outgoing packets will go out via the specified netif. + * + * @param pcb RAW PCB to be bound with netif. + * @param netif netif to bind to. Can be NULL. + * + * @see raw_disconnect() + */ +void +raw_bind_netif(struct raw_pcb *pcb, const struct netif *netif) +{ + LWIP_ASSERT_CORE_LOCKED(); + if (netif != NULL) { + pcb->netif_idx = netif_get_index(netif); + } else { + pcb->netif_idx = NETIF_NO_INDEX; + } +} + /** * @ingroup raw_raw * Connect an RAW PCB. This function is required by upper layers @@ -233,13 +277,48 @@ raw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr) err_t raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr) { + LWIP_ASSERT_CORE_LOCKED(); if ((pcb == NULL) || (ipaddr == NULL)) { return ERR_VAL; } ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr); +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now, + * using the bound address to make a more informed decision when possible. */ + if (IP_IS_V6(&pcb->remote_ip) && + ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNKNOWN)) { + ip6_addr_select_zone(ip_2_ip6(&pcb->remote_ip), ip_2_ip6(&pcb->local_ip)); + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + raw_set_flags(pcb, RAW_FLAGS_CONNECTED); return ERR_OK; } +/** + * @ingroup raw_raw + * Disconnect a RAW PCB. + * + * @param pcb the raw pcb to disconnect. + */ +void +raw_disconnect(struct raw_pcb *pcb) +{ + LWIP_ASSERT_CORE_LOCKED(); + /* reset remote address association */ +#if LWIP_IPV4 && LWIP_IPV6 + if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { + ip_addr_copy(pcb->remote_ip, *IP_ANY_TYPE); + } else { +#endif + ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip); +#if LWIP_IPV4 && LWIP_IPV6 + } +#endif + pcb->netif_idx = NETIF_NO_INDEX; + /* mark PCB as unconnected */ + raw_clear_flags(pcb, RAW_FLAGS_CONNECTED); +} + /** * @ingroup raw_raw * Set the callback function for received packets that match the @@ -254,6 +333,7 @@ raw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr) void raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg) { + LWIP_ASSERT_CORE_LOCKED(); /* remember recv() callback and user data */ pcb->recv = recv; pcb->recv_arg = recv_arg; @@ -261,11 +341,9 @@ raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg) /** * @ingroup raw_raw - * Send the raw IP packet to the given address. Note that actually you cannot - * modify the IP headers (this is inconsistent with the receive callback where - * you actually get the IP headers), you can only specify the IP payload here. - * It requires some more changes in lwIP. (there will be a raw_send() function - * then.) + * Send the raw IP packet to the given address. An IP header will be prepended + * to the packet, unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that + * case, the packet must include an IP header, which will then be sent as is. * * @param pcb the raw pcb which to send * @param p the IP payload to send @@ -275,11 +353,8 @@ raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg) err_t raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr) { - err_t err; struct netif *netif; const ip_addr_t *src_ip; - struct pbuf *q; /* q will be sent down the stack */ - s16_t header_size; if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) { return ERR_VAL; @@ -287,17 +362,106 @@ raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr) LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n")); + if (pcb->netif_idx != NETIF_NO_INDEX) { + netif = netif_get_by_index(pcb->netif_idx); + } else { +#if LWIP_MULTICAST_TX_OPTIONS + netif = NULL; + if (ip_addr_ismulticast(ipaddr)) { + /* For multicast-destined packets, use the user-provided interface index to + * determine the outgoing interface, if an interface index is set and a + * matching netif can be found. Otherwise, fall back to regular routing. */ + netif = netif_get_by_index(pcb->mcast_ifindex); + } + + if (netif == NULL) +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + { + netif = ip_route(&pcb->local_ip, ipaddr); + } + } + + if (netif == NULL) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to ")); + ip_addr_debug_print(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ipaddr); + return ERR_RTE; + } + + if (ip_addr_isany(&pcb->local_ip) || ip_addr_ismulticast(&pcb->local_ip)) { + /* use outgoing network interface IP address as source address */ + src_ip = ip_netif_get_local_ip(netif, ipaddr); +#if LWIP_IPV6 + if (src_ip == NULL) { + return ERR_RTE; + } +#endif /* LWIP_IPV6 */ + } else { + /* use RAW PCB local IP address as source address */ + src_ip = &pcb->local_ip; + } + + return raw_sendto_if_src(pcb, p, ipaddr, netif, src_ip); +} + +/** + * @ingroup raw_raw + * Send the raw IP packet to the given address, using a particular outgoing + * netif and source IP address. An IP header will be prepended to the packet, + * unless the RAW_FLAGS_HDRINCL flag is set on the PCB. In that case, the + * packet must include an IP header, which will then be sent as is. + * + * @param pcb RAW PCB used to send the data + * @param p chain of pbufs to be sent + * @param dst_ip destination IP address + * @param netif the netif used for sending + * @param src_ip source IP address + */ +err_t +raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, + struct netif *netif, const ip_addr_t *src_ip) +{ + err_t err; + struct pbuf *q; /* q will be sent down the stack */ + u16_t header_size; + u8_t ttl; + + LWIP_ASSERT_CORE_LOCKED(); + + if ((pcb == NULL) || (dst_ip == NULL) || (netif == NULL) || (src_ip == NULL) || + !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { + return ERR_VAL; + } + header_size = ( #if LWIP_IPV4 && LWIP_IPV6 - IP_IS_V6(ipaddr) ? IP6_HLEN : IP_HLEN); + IP_IS_V6(dst_ip) ? IP6_HLEN : IP_HLEN); #elif LWIP_IPV4 - IP_HLEN); + IP_HLEN); #else - IP6_HLEN); + IP6_HLEN); #endif + /* Handle the HDRINCL option as an exception: none of the code below applies + * to this case, and sending the packet needs to be done differently too. */ + if (pcb->flags & RAW_FLAGS_HDRINCL) { + /* A full header *must* be present in the first pbuf of the chain, as the + * output routines may access its fields directly. */ + if (p->len < header_size) { + return ERR_VAL; + } + /* @todo multicast loop support, if at all desired for this scenario.. */ + NETIF_SET_HINTS(netif, &pcb->netif_hints); + err = ip_output_if_hdrincl(p, src_ip, dst_ip, netif); + NETIF_RESET_HINTS(netif); + return err; + } + + /* packet too large to add an IP header without causing an overflow? */ + if ((u16_t)(p->tot_len + header_size) < p->tot_len) { + return ERR_MEM; + } /* not enough space to add an IP header to first pbuf in given p chain? */ - if (pbuf_header(p, header_size)) { + if (pbuf_add_header(p, header_size)) { /* allocate header in new pbuf */ q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM); /* new header pbuf could not be allocated? */ @@ -314,34 +478,16 @@ raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr) } else { /* first pbuf q equals given pbuf */ q = p; - if (pbuf_header(q, -header_size)) { + if (pbuf_remove_header(q, header_size)) { LWIP_ASSERT("Can't restore header we just removed!", 0); return ERR_MEM; } } - if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { - /* Don't call ip_route() with IP_ANY_TYPE */ - netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(ipaddr)), ipaddr); - } else { - netif = ip_route(&pcb->local_ip, ipaddr); - } - - if (netif == NULL) { - LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to ")); - ip_addr_debug_print(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ipaddr); - /* free any temporary header pbuf allocated by pbuf_header() */ - if (q != p) { - pbuf_free(q); - } - return ERR_RTE; - } - #if IP_SOF_BROADCAST - if (IP_IS_V4(ipaddr)) - { + if (IP_IS_V4(dst_ip)) { /* broadcast filter? */ - if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) { + if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(dst_ip, netif)) { LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); /* free any temporary header pbuf allocated by pbuf_header() */ if (q != p) { @@ -352,35 +498,33 @@ raw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr) } #endif /* IP_SOF_BROADCAST */ - if (ip_addr_isany(&pcb->local_ip)) { - /* use outgoing network interface IP address as source address */ - src_ip = ip_netif_get_local_ip(netif, ipaddr); -#if LWIP_IPV6 - if (src_ip == NULL) { - if (q != p) { - pbuf_free(q); - } - return ERR_RTE; - } -#endif /* LWIP_IPV6 */ - } else { - /* use RAW PCB local IP address as source address */ - src_ip = &pcb->local_ip; + /* Multicast Loop? */ +#if LWIP_MULTICAST_TX_OPTIONS + if (((pcb->flags & RAW_FLAGS_MULTICAST_LOOP) != 0) && ip_addr_ismulticast(dst_ip)) { + q->flags |= PBUF_FLAG_MCASTLOOP; } +#endif /* LWIP_MULTICAST_TX_OPTIONS */ #if LWIP_IPV6 /* If requested, based on the IPV6_CHECKSUM socket option per RFC3542, compute the checksum and update the checksum in the payload. */ - if (IP_IS_V6(ipaddr) && pcb->chksum_reqd) { - u16_t chksum = ip6_chksum_pseudo(p, pcb->protocol, p->tot_len, ip_2_ip6(src_ip), ip_2_ip6(ipaddr)); + if (IP_IS_V6(dst_ip) && pcb->chksum_reqd) { + u16_t chksum = ip6_chksum_pseudo(p, pcb->protocol, p->tot_len, ip_2_ip6(src_ip), ip_2_ip6(dst_ip)); LWIP_ASSERT("Checksum must fit into first pbuf", p->len >= (pcb->chksum_offset + 2)); SMEMCPY(((u8_t *)p->payload) + pcb->chksum_offset, &chksum, sizeof(u16_t)); } #endif - NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint); - err = ip_output_if(q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif); - NETIF_SET_HWADDRHINT(netif, NULL); + /* Determine TTL to use */ +#if LWIP_MULTICAST_TX_OPTIONS + ttl = (ip_addr_ismulticast(dst_ip) ? raw_get_multicast_ttl(pcb) : pcb->ttl); +#else /* LWIP_MULTICAST_TX_OPTIONS */ + ttl = pcb->ttl; +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + + NETIF_SET_HINTS(netif, &pcb->netif_hints); + err = ip_output_if(q, src_ip, dst_ip, ttl, pcb->tos, pcb->protocol, netif); + NETIF_RESET_HINTS(netif); /* did we chain a header earlier? */ if (q != p) { @@ -417,6 +561,7 @@ void raw_remove(struct raw_pcb *pcb) { struct raw_pcb *pcb2; + LWIP_ASSERT_CORE_LOCKED(); /* pcb to be removed is first in list? */ if (raw_pcbs == pcb) { /* make list start at 2nd pcb */ @@ -452,6 +597,7 @@ raw_new(u8_t proto) struct raw_pcb *pcb; LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n")); + LWIP_ASSERT_CORE_LOCKED(); pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB); /* could allocate RAW PCB? */ @@ -460,6 +606,9 @@ raw_new(u8_t proto) memset(pcb, 0, sizeof(struct raw_pcb)); pcb->protocol = proto; pcb->ttl = RAW_TTL; +#if LWIP_MULTICAST_TX_OPTIONS + raw_set_multicast_ttl(pcb, RAW_TTL); +#endif /* LWIP_MULTICAST_TX_OPTIONS */ pcb->next = raw_pcbs; raw_pcbs = pcb; } @@ -485,6 +634,7 @@ struct raw_pcb * raw_new_ip_type(u8_t type, u8_t proto) { struct raw_pcb *pcb; + LWIP_ASSERT_CORE_LOCKED(); pcb = raw_new(proto); #if LWIP_IPV4 && LWIP_IPV6 if (pcb != NULL) { @@ -502,9 +652,9 @@ raw_new_ip_type(u8_t type, u8_t proto) * @param old_addr IP address of the netif before change * @param new_addr IP address of the netif after change */ -void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr) +void raw_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr) { - struct raw_pcb* rpcb; + struct raw_pcb *rpcb; if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) { for (rpcb = raw_pcbs; rpcb != NULL; rpcb = rpcb->next) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/stats.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/stats.c similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/stats.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/stats.c index 893d199..34e9b27 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/stats.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/stats.c @@ -105,17 +105,17 @@ void stats_display_mem(struct stats_mem *mem, const char *name) { LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name)); - LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail)); - LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used)); - LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max)); - LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); + LWIP_PLATFORM_DIAG(("avail: %"MEM_SIZE_F"\n\t", mem->avail)); + LWIP_PLATFORM_DIAG(("used: %"MEM_SIZE_F"\n\t", mem->used)); + LWIP_PLATFORM_DIAG(("max: %"MEM_SIZE_F"\n\t", mem->max)); + LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n", mem->err)); } #if MEMP_STATS void -stats_display_memp(struct stats_mem *mem, int index) +stats_display_memp(struct stats_mem *mem, int idx) { - if (index < MEMP_MAX) { + if (idx < MEMP_MAX) { stats_display_mem(mem, mem->name); } } @@ -127,15 +127,15 @@ void stats_display_sys(struct stats_sys *sys) { LWIP_PLATFORM_DIAG(("\nSYS\n\t")); - LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); - LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); - LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); - LWIP_PLATFORM_DIAG(("mutex.used: %"U32_F"\n\t", (u32_t)sys->mutex.used)); - LWIP_PLATFORM_DIAG(("mutex.max: %"U32_F"\n\t", (u32_t)sys->mutex.max)); - LWIP_PLATFORM_DIAG(("mutex.err: %"U32_F"\n\t", (u32_t)sys->mutex.err)); - LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); - LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); - LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n", (u32_t)sys->mbox.err)); + LWIP_PLATFORM_DIAG(("sem.used: %"STAT_COUNTER_F"\n\t", sys->sem.used)); + LWIP_PLATFORM_DIAG(("sem.max: %"STAT_COUNTER_F"\n\t", sys->sem.max)); + LWIP_PLATFORM_DIAG(("sem.err: %"STAT_COUNTER_F"\n\t", sys->sem.err)); + LWIP_PLATFORM_DIAG(("mutex.used: %"STAT_COUNTER_F"\n\t", sys->mutex.used)); + LWIP_PLATFORM_DIAG(("mutex.max: %"STAT_COUNTER_F"\n\t", sys->mutex.max)); + LWIP_PLATFORM_DIAG(("mutex.err: %"STAT_COUNTER_F"\n\t", sys->mutex.err)); + LWIP_PLATFORM_DIAG(("mbox.used: %"STAT_COUNTER_F"\n\t", sys->mbox.used)); + LWIP_PLATFORM_DIAG(("mbox.max: %"STAT_COUNTER_F"\n\t", sys->mbox.max)); + LWIP_PLATFORM_DIAG(("mbox.err: %"STAT_COUNTER_F"\n", sys->mbox.err)); } #endif /* SYS_STATS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/sys.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/sys.c similarity index 57% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/sys.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/sys.c index 6e640c0..5f08352 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/sys.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/sys.c @@ -39,14 +39,52 @@ /** * @defgroup sys_layer Porting (system abstraction layer) * @ingroup lwip - * @verbinclude "sys_arch.txt" * * @defgroup sys_os OS abstraction layer * @ingroup sys_layer * No need to implement functions in this section in NO_SYS mode. + * The OS-specific code should be implemented in arch/sys_arch.h + * and sys_arch.c of your port. + * + * The operating system emulation layer provides a common interface + * between the lwIP code and the underlying operating system kernel. The + * general idea is that porting lwIP to new architectures requires only + * small changes to a few header files and a new sys_arch + * implementation. It is also possible to do a sys_arch implementation + * that does not rely on any underlying operating system. + * + * The sys_arch provides semaphores, mailboxes and mutexes to lwIP. For the full + * lwIP functionality, multiple threads support can be implemented in the + * sys_arch, but this is not required for the basic lwIP + * functionality. Timer scheduling is implemented in lwIP, but can be implemented + * by the sys_arch port (LWIP_TIMERS_CUSTOM==1). + * + * In addition to the source file providing the functionality of sys_arch, + * the OS emulation layer must provide several header files defining + * macros used throughout lwip. The files required and the macros they + * must define are listed below the sys_arch description. + * + * Since lwIP 1.4.0, semaphore, mutexes and mailbox functions are prototyped in a way that + * allows both using pointers or actual OS structures to be used. This way, memory + * required for such types can be either allocated in place (globally or on the + * stack) or on the heap (allocated internally in the "*_new()" functions). + * + * Note: + * ----- + * Be careful with using mem_malloc() in sys_arch. When malloc() refers to + * mem_malloc() you can run into a circular function call problem. In mem.c + * mem_init() tries to allocate a semaphore using mem_malloc, which of course + * can't be performed when sys_arch uses mem_malloc. * * @defgroup sys_sem Semaphores * @ingroup sys_os + * Semaphores can be either counting or binary - lwIP works with both + * kinds. + * Semaphores are represented by the type "sys_sem_t" which is typedef'd + * in the sys_arch.h file. Mailboxes are equivalently represented by the + * type "sys_mbox_t". Mutexes are represented by the type "sys_mutex_t". + * lwIP does not place any restrictions on how these types are represented + * internally. * * @defgroup sys_mutex Mutexes * @ingroup sys_os @@ -55,6 +93,10 @@ * * @defgroup sys_mbox Mailboxes * @ingroup sys_os + * Mailboxes should be implemented as a queue which allows multiple messages + * to be posted (implementing as a rendez-vous point where only one message can be + * posted at a time can have a highly negative impact on performance). A message + * in a mailbox is just a pointer, nothing more. * * @defgroup sys_time Time * @ingroup sys_layer @@ -77,7 +119,6 @@ #include "lwip/opt.h" #include "lwip/sys.h" -#include "wm_socket.h" /* Most of the functions defined in sys.h must be implemented in the * architecture-dependent file sys_arch.c */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp.c similarity index 65% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp.c index 4a15dff..a9ec3de 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp.c @@ -1,16 +1,68 @@ /** - * @file + * @file * Transmission Control Protocol for IP * See also @ref tcp_raw * * @defgroup tcp_raw TCP * @ingroup callbackstyle_api * Transmission Control Protocol for IP\n - * @see @ref raw_api and @ref netconn + * @see @ref api * - * Common functions for the TCP implementation, such as functinos + * Common functions for the TCP implementation, such as functions * for manipulating the data structures and the TCP timer functions. TCP functions * related to input and output is found in tcp_in.c and tcp_out.c respectively.\n + * + * TCP connection setup + * -------------------- + * The functions used for setting up connections is similar to that of + * the sequential API and of the BSD socket API. A new TCP connection + * identifier (i.e., a protocol control block - PCB) is created with the + * tcp_new() function. This PCB can then be either set to listen for new + * incoming connections or be explicitly connected to another host. + * - tcp_new() + * - tcp_bind() + * - tcp_listen() and tcp_listen_with_backlog() + * - tcp_accept() + * - tcp_connect() + * + * Sending TCP data + * ---------------- + * TCP data is sent by enqueueing the data with a call to tcp_write() and + * triggering to send by calling tcp_output(). When the data is successfully + * transmitted to the remote host, the application will be notified with a + * call to a specified callback function. + * - tcp_write() + * - tcp_output() + * - tcp_sent() + * + * Receiving TCP data + * ------------------ + * TCP data reception is callback based - an application specified + * callback function is called when new data arrives. When the + * application has taken the data, it has to call the tcp_recved() + * function to indicate that TCP can advertise increase the receive + * window. + * - tcp_recv() + * - tcp_recved() + * + * Application polling + * ------------------- + * When a connection is idle (i.e., no data is either transmitted or + * received), lwIP will repeatedly poll the application by calling a + * specified callback function. This can be used either as a watchdog + * timer for killing connections that have stayed idle for too long, or + * as a method of waiting for memory to become available. For instance, + * if a call to tcp_write() has failed because memory wasn't available, + * the application may use the polling functionality to call tcp_write() + * again when the connection has been idle for a while. + * - tcp_poll() + * + * Closing and aborting connections + * -------------------------------- + * - tcp_close() + * - tcp_abort() + * - tcp_err() + * */ /* @@ -60,7 +112,6 @@ #include "lwip/ip6_addr.h" #include "lwip/nd6.h" #include "lwip/alg.h" - #include #ifdef LWIP_HOOK_FILENAME @@ -72,7 +123,7 @@ "The Dynamic and/or Private Ports are those from 49152 through 65535" */ #define TCP_LOCAL_PORT_RANGE_START 0xc000 #define TCP_LOCAL_PORT_RANGE_END 0xffff -#define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START)) +#define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & (u16_t)~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START)) #endif #if LWIP_TCP_KEEPALIVE @@ -90,7 +141,7 @@ #define INITIAL_MSS TCP_MSS #endif -static const char * const tcp_state_str[] = { +static const char *const tcp_state_str[] = { "CLOSED", "LISTEN", "SYN_SENT", @@ -110,8 +161,8 @@ static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START; /* Incremented every coarse grained timer shot (typically every 500 ms). */ u32_t tcp_ticks; static const u8_t tcp_backoff[13] = - { 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3}; - /* Times per slowtmr hits */ +{ 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3}; +/* Times per slowtmr hits */ static const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 }; /* The TCP PCB lists. */ @@ -127,21 +178,21 @@ struct tcp_pcb *tcp_active_pcbs; struct tcp_pcb *tcp_tw_pcbs; /** An array with all (non-temporary) PCB lists, mainly used for smaller code size */ -struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs, - &tcp_active_pcbs, &tcp_tw_pcbs}; +struct tcp_pcb **const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs, + &tcp_active_pcbs, &tcp_tw_pcbs +}; u8_t tcp_active_pcbs_changed; -#if SNDBUF_SHARE -s32 sndbuf_len = TCP_SND_BUF; -#endif - /** Timer counter to handle calling slow-timer from tcp_tmr() */ static u8_t tcp_timer; static u8_t tcp_timer_ctr; static u16_t tcp_new_port(void); static err_t tcp_close_shutdown_fin(struct tcp_pcb *pcb); +#if LWIP_TCP_PCB_NUM_EXT_ARGS +static void tcp_ext_arg_invoke_callbacks_destroyed(struct tcp_pcb_ext_args *ext_args); +#endif /** * Initialize this module. @@ -149,9 +200,31 @@ static err_t tcp_close_shutdown_fin(struct tcp_pcb *pcb); void tcp_init(void) { -#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) +#ifdef LWIP_RAND tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); -#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ +#endif /* LWIP_RAND */ +} + +/** Free a tcp pcb */ +void +tcp_free(struct tcp_pcb *pcb) +{ + LWIP_ASSERT("tcp_free: LISTEN", pcb->state != LISTEN); +#if LWIP_TCP_PCB_NUM_EXT_ARGS + tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args); +#endif + memp_free(MEMP_TCP_PCB, pcb); +} + +/** Free a tcp listen pcb */ +static void +tcp_free_listen(struct tcp_pcb *pcb) +{ + LWIP_ASSERT("tcp_free_listen: !LISTEN", pcb->state != LISTEN); +#if LWIP_TCP_PCB_NUM_EXT_ARGS + tcp_ext_arg_invoke_callbacks_destroyed(pcb->ext_args); +#endif + memp_free(MEMP_TCP_PCB_LISTEN, pcb); } /** @@ -177,12 +250,15 @@ tcp_tmr(void) static void tcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb) { - struct tcp_pcb *pcb; - for (pcb = list; pcb != NULL; pcb = pcb->next) { - if (pcb->listener == lpcb) { - pcb->listener = NULL; - } - } + struct tcp_pcb *pcb; + + LWIP_ASSERT("tcp_remove_listener: invalid listener", lpcb != NULL); + + for (pcb = list; pcb != NULL; pcb = pcb->next) { + if (pcb->listener == lpcb) { + pcb->listener = NULL; + } + } } #endif @@ -197,7 +273,7 @@ tcp_listen_closed(struct tcp_pcb *pcb) LWIP_ASSERT("pcb != NULL", pcb != NULL); LWIP_ASSERT("pcb->state == LISTEN", pcb->state == LISTEN); for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) { - tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen*)pcb); + tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen *)pcb); } #endif LWIP_UNUSED_ARG(pcb); @@ -215,14 +291,15 @@ tcp_listen_closed(struct tcp_pcb *pcb) * @param pcb the connection pcb which is not fully accepted yet */ void -tcp_backlog_delayed(struct tcp_pcb* pcb) +tcp_backlog_delayed(struct tcp_pcb *pcb) { LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_ASSERT_CORE_LOCKED(); if ((pcb->flags & TF_BACKLOGPEND) == 0) { if (pcb->listener != NULL) { pcb->listener->accepts_pending++; LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0); - pcb->flags |= TF_BACKLOGPEND; + tcp_set_flags(pcb, TF_BACKLOGPEND); } } } @@ -237,15 +314,15 @@ tcp_backlog_delayed(struct tcp_pcb* pcb) * @param pcb the connection pcb which is now fully accepted (or closed/aborted) */ void -tcp_backlog_accepted(struct tcp_pcb* pcb) +tcp_backlog_accepted(struct tcp_pcb *pcb) { LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_ASSERT_CORE_LOCKED(); if ((pcb->flags & TF_BACKLOGPEND) != 0) { if (pcb->listener != NULL) { LWIP_ASSERT("accepts_pending != 0", pcb->listener->accepts_pending != 0); - if(pcb->listener->accepts_pending>0) - pcb->listener->accepts_pending--; - pcb->flags &= ~TF_BACKLOGPEND; + pcb->listener->accepts_pending--; + tcp_clear_flags(pcb, TF_BACKLOGPEND); } } } @@ -270,6 +347,8 @@ tcp_backlog_accepted(struct tcp_pcb* pcb) static err_t tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data) { + LWIP_ASSERT("tcp_close_shutdown: invalid pcb", pcb != NULL); + if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) { /* Not all data received by application, send RST to tell the remote @@ -278,23 +357,17 @@ tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data) /* don't call tcp_abort here: we must not deallocate the pcb since that might not be expected when calling tcp_close */ - tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, - pcb->local_port, pcb->remote_port); + tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, + pcb->local_port, pcb->remote_port); tcp_pcb_purge(pcb); TCP_RMV_ACTIVE(pcb); - if (pcb->state == ESTABLISHED) { - /* move to TIME_WAIT since we close actively */ - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); + /* Deallocate the pcb since we already sent a RST for it */ + if (tcp_input_pcb == pcb) { + /* prevent using a deallocated pcb: free it from tcp_input later */ + tcp_trigger_input_pcb_close(); } else { - /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */ - if (tcp_input_pcb == pcb) { - /* prevent using a deallocated pcb: free it from tcp_input later */ - tcp_trigger_input_pcb_close(); - } else { - memp_free(MEMP_TCP_PCB, pcb); - } + tcp_free(pcb); } return ERR_OK; } @@ -303,31 +376,31 @@ tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data) /* - states which free the pcb are handled here, - states which send FIN and change state are handled in tcp_close_shutdown_fin() */ switch (pcb->state) { - case CLOSED: - /* Closing a pcb in the CLOSED state might seem erroneous, - * however, it is in this state once allocated and as yet unused - * and the user needs some way to free it should the need arise. - * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) - * or for a pcb that has been used and then entered the CLOSED state - * is erroneous, but this should never happen as the pcb has in those cases - * been freed, and so any remaining handles are bogus. */ - if (pcb->local_port != 0) { - TCP_RMV(&tcp_bound_pcbs, pcb); - } - memp_free(MEMP_TCP_PCB, pcb); - break; - case LISTEN: - tcp_listen_closed(pcb); - tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb); - memp_free(MEMP_TCP_PCB_LISTEN, pcb); - break; - case SYN_SENT: - TCP_PCB_REMOVE_ACTIVE(pcb); - memp_free(MEMP_TCP_PCB, pcb); - MIB2_STATS_INC(mib2.tcpattemptfails); - break; - default: - return tcp_close_shutdown_fin(pcb); + case CLOSED: + /* Closing a pcb in the CLOSED state might seem erroneous, + * however, it is in this state once allocated and as yet unused + * and the user needs some way to free it should the need arise. + * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) + * or for a pcb that has been used and then entered the CLOSED state + * is erroneous, but this should never happen as the pcb has in those cases + * been freed, and so any remaining handles are bogus. */ + if (pcb->local_port != 0) { + TCP_RMV(&tcp_bound_pcbs, pcb); + } + tcp_free(pcb); + break; + case LISTEN: + tcp_listen_closed(pcb); + tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb); + tcp_free_listen(pcb); + break; + case SYN_SENT: + TCP_PCB_REMOVE_ACTIVE(pcb); + tcp_free(pcb); + MIB2_STATS_INC(mib2.tcpattemptfails); + break; + default: + return tcp_close_shutdown_fin(pcb); } return ERR_OK; } @@ -339,31 +412,31 @@ tcp_close_shutdown_fin(struct tcp_pcb *pcb) LWIP_ASSERT("pcb != NULL", pcb != NULL); switch (pcb->state) { - case SYN_RCVD: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - tcp_backlog_accepted(pcb); - MIB2_STATS_INC(mib2.tcpattemptfails); - pcb->state = FIN_WAIT_1; - } - break; - case ESTABLISHED: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - MIB2_STATS_INC(mib2.tcpestabresets); - pcb->state = FIN_WAIT_1; - } - break; - case CLOSE_WAIT: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - MIB2_STATS_INC(mib2.tcpestabresets); - pcb->state = LAST_ACK; - } - break; - default: - /* Has already been closed, do nothing. */ - return ERR_OK; + case SYN_RCVD: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + tcp_backlog_accepted(pcb); + MIB2_STATS_INC(mib2.tcpattemptfails); + pcb->state = FIN_WAIT_1; + } + break; + case ESTABLISHED: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + MIB2_STATS_INC(mib2.tcpestabresets); + pcb->state = FIN_WAIT_1; + } + break; + case CLOSE_WAIT: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + MIB2_STATS_INC(mib2.tcpestabresets); + pcb->state = LAST_ACK; + } + break; + default: + /* Has already been closed, do nothing. */ + return ERR_OK; } if (err == ERR_OK) { @@ -375,7 +448,7 @@ tcp_close_shutdown_fin(struct tcp_pcb *pcb) tcp_output(pcb); } else if (err == ERR_MEM) { /* Mark this pcb for closing. Closing is retried from tcp_tmr. */ - pcb->flags |= TF_CLOSEPEND; + tcp_set_flags(pcb, TF_CLOSEPEND); /* We have to return ERR_OK from here to indicate to the callers that this pcb should not be used any more as it will be freed soon via tcp_tmr. This is OK here since sending FIN does not guarantee a time frime for @@ -396,6 +469,12 @@ tcp_close_shutdown_fin(struct tcp_pcb *pcb) * a closing state), the connection is closed, and put in a closing state. * The pcb is then automatically freed in tcp_slowtmr(). It is therefore * unsafe to reference it (unless an error is returned). + * + * The function may return ERR_MEM if no memory + * was available for closing the connection. If so, the application + * should wait and try again either by using the acknowledgment + * callback or the polling functionality. If the close succeeds, the + * function returns ERR_OK. * * @param pcb the tcp_pcb to close * @return ERR_OK if connection has been closed @@ -404,12 +483,16 @@ tcp_close_shutdown_fin(struct tcp_pcb *pcb) err_t tcp_close(struct tcp_pcb *pcb) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_close: invalid pcb", pcb != NULL, return ERR_ARG); LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in ")); + tcp_debug_print_state(pcb->state); if (pcb->state != LISTEN) { /* Set a flag not to receive any more data... */ - pcb->flags |= TF_RXCLOSED; + tcp_set_flags(pcb, TF_RXCLOSED); } /* ... and close */ return tcp_close_shutdown(pcb, 1); @@ -431,12 +514,16 @@ tcp_close(struct tcp_pcb *pcb) err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_shutdown: invalid pcb", pcb != NULL, return ERR_ARG); + if (pcb->state == LISTEN) { return ERR_CONN; } if (shut_rx) { /* shut down the receive side: set a flag not to receive any more data... */ - pcb->flags |= TF_RXCLOSED; + tcp_set_flags(pcb, TF_RXCLOSED); if (shut_tx) { /* shutting down the tx AND rx side is the same as closing for the raw API */ return tcp_close_shutdown(pcb, 1); @@ -451,14 +538,14 @@ tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx) /* This can't happen twice since if it succeeds, the pcb's state is changed. Only close in these states as the others directly deallocate the PCB */ switch (pcb->state) { - case SYN_RCVD: - case ESTABLISHED: - case CLOSE_WAIT: - return tcp_close_shutdown(pcb, (u8_t)shut_rx); - default: - /* Not (yet?) connected, cannot shutdown the TX side as that would bring us - into CLOSED state, where the PCB is deallocated. */ - return ERR_CONN; + case SYN_RCVD: + case ESTABLISHED: + case CLOSE_WAIT: + return tcp_close_shutdown(pcb, (u8_t)shut_rx); + default: + /* Not (yet?) connected, cannot shutdown the TX side as that would bring us + into CLOSED state, where the PCB is deallocated. */ + return ERR_CONN; } } return ERR_OK; @@ -481,15 +568,19 @@ tcp_abandon(struct tcp_pcb *pcb, int reset) #endif /* LWIP_CALLBACK_API */ void *errf_arg; + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_abandon: invalid pcb", pcb != NULL, return); + /* pcb->state LISTEN not allowed here */ LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs", - pcb->state != LISTEN); + pcb->state != LISTEN); /* Figure out on which TCP PCB list we are, and remove us. If we are in an active state, call the receive function associated with the PCB with a NULL argument, and send an RST to the remote end. */ if (pcb->state == TIME_WAIT) { tcp_pcb_remove(&tcp_tw_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); + tcp_free(pcb); } else { int send_rst = 0; u16_t local_port = 0; @@ -524,17 +615,10 @@ tcp_abandon(struct tcp_pcb *pcb, int reset) tcp_backlog_accepted(pcb); if (send_rst) { LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n")); - tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port); + tcp_rst(pcb, seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port); } - #if SNDBUF_SHARE - if(pcb->snd_buf < TCP_SND_BUF) - { - sndbuf_len += (TCP_SND_BUF - pcb->snd_buf); - pcb->snd_buf = TCP_SND_BUF; - } -#endif last_state = pcb->state; - memp_free(MEMP_TCP_PCB, pcb); + tcp_free(pcb); TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT); } } @@ -559,12 +643,15 @@ tcp_abort(struct tcp_pcb *pcb) /** * @ingroup tcp_raw * Binds the connection to a local port number and IP address. If the - * IP address is not given (i.e., ipaddr == NULL), the IP address of - * the outgoing network interface is used instead. + * IP address is not given (i.e., ipaddr == IP_ANY_TYPE), the connection is + * bound to all local IP addresses. + * If another connection is bound to the same port, the function will + * return ERR_USE, otherwise ERR_OK is returned. + * @see MEMP_NUM_TCP_PCB_LISTEN and MEMP_NUM_TCP_PCB * * @param pcb the tcp_pcb to bind (no check is done whether this pcb is * already bound!) - * @param ipaddr the local ip address to bind to (use IP4_ADDR_ANY to bind + * @param ipaddr the local ip address to bind to (use IPx_ADDR_ANY to bind * to any local address * @param port the local port to bind to * @return ERR_USE if the port is already in use @@ -577,28 +664,31 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) int i; int max_pcb_list = NUM_TCP_PCB_LISTS; struct tcp_pcb *cpcb; +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + ip_addr_t zoned_ipaddr; +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + + LWIP_ASSERT_CORE_LOCKED(); #if LWIP_IPV4 /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ if (ipaddr == NULL) { ipaddr = IP4_ADDR_ANY; } +#else /* LWIP_IPV4 */ + LWIP_ERROR("tcp_bind: invalid ipaddr", ipaddr != NULL, return ERR_ARG); #endif /* LWIP_IPV4 */ + LWIP_ERROR("tcp_bind: invalid pcb", pcb != NULL, return ERR_ARG); + + LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL); + #if TLS_CONFIG_AP_OPT_FWD if (alg_napt_port_is_used(port)) { return ERR_USE; } #endif - - /* still need to check for ipaddr == NULL in IPv6 only case */ - if ((pcb == NULL) || (ipaddr == NULL)) { - return ERR_VAL; - } - - LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL); - #if SO_REUSE /* Unless the REUSEADDR flag is set, we have to check the pcbs in TIME-WAIT state, also. @@ -610,6 +700,18 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) } #endif /* SO_REUSE */ +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now. + * This is legacy support: scope-aware callers should always provide properly + * zoned source addresses. Do the zone selection before the address-in-use + * check below; as such we have to make a temporary copy of the address. */ + if (IP_IS_V6(ipaddr) && ip6_addr_lacks_zone(ip_2_ip6(ipaddr), IP6_UNICAST)) { + ip_addr_copy(zoned_ipaddr, *ipaddr); + ip6_addr_select_zone(ip_2_ip6(&zoned_ipaddr), ip_2_ip6(&zoned_ipaddr)); + ipaddr = &zoned_ipaddr; + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + if (port == 0) { port = tcp_new_port(); if (port == 0) { @@ -629,20 +731,11 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) #endif /* SO_REUSE */ { /* @todo: check accept_any_ip_version */ - if (i == (NUM_TCP_PCB_LISTS - 1) ){ - if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) && - ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { - return ERR_USE; - } - } - else - { - if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) && - (ip_addr_isany(&cpcb->local_ip) || - ip_addr_isany(ipaddr) || - ip_addr_cmp(&cpcb->local_ip, ipaddr))) { - return ERR_USE; - } + if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) && + (ip_addr_isany(&cpcb->local_ip) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&cpcb->local_ip, ipaddr))) { + return ERR_USE; } } } @@ -650,7 +743,11 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) } } - if (!ip_addr_isany(ipaddr)) { + if (!ip_addr_isany(ipaddr) +#if LWIP_IPV4 && LWIP_IPV6 + || (IP_GET_TYPE(ipaddr) != IP_GET_TYPE(&pcb->local_ip)) +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + ) { ip_addr_set(&pcb->local_ip, ipaddr); } pcb->local_port = port; @@ -658,6 +755,28 @@ tcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port)); return ERR_OK; } + +/** + * @ingroup tcp_raw + * Binds the connection to a netif and IP address. + * After calling this function, all packets received via this PCB + * are guaranteed to have come in via the specified netif, and all + * outgoing packets will go out via the specified netif. + * + * @param pcb the tcp_pcb to bind. + * @param netif the netif to bind to. Can be NULL. + */ +void +tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif) +{ + LWIP_ASSERT_CORE_LOCKED(); + if (netif != NULL) { + pcb->netif_idx = netif_get_index(netif); + } else { + pcb->netif_idx = NETIF_NO_INDEX; + } +} + #if LWIP_CALLBACK_API /** * Default accept callback if no accept callback is specified by the user. @@ -668,6 +787,8 @@ tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) LWIP_UNUSED_ARG(arg); LWIP_UNUSED_ARG(err); + LWIP_ASSERT("tcp_accept_null: invalid pcb", pcb != NULL); + tcp_abort(pcb); return ERR_ABRT; @@ -680,7 +801,25 @@ tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) * is able to accept incoming connections. The protocol control block * is reallocated in order to consume less memory. Setting the * connection to LISTEN is an irreversible process. + * When an incoming connection is accepted, the function specified with + * the tcp_accept() function will be called. The pcb has to be bound + * to a local port with the tcp_bind() function. + * + * The tcp_listen() function returns a new connection identifier, and + * the one passed as an argument to the function will be + * deallocated. The reason for this behavior is that less memory is + * needed for a connection that is listening, so tcp_listen() will + * reclaim the memory needed for the original connection and allocate a + * new smaller memory block for the listening connection. * + * tcp_listen() may return NULL if no memory was available for the + * listening connection. If so, the memory associated with the pcb + * passed as an argument to tcp_listen() will not be deallocated. + * + * The backlog limits the number of outstanding connections + * in the listen queue to the value specified by the backlog argument. + * To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h. + * * @param pcb the original tcp_pcb * @param backlog the incoming connections queue limit * @return tcp_pcb used for listening, consumes less memory. @@ -692,6 +831,7 @@ tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) { + LWIP_ASSERT_CORE_LOCKED(); return tcp_listen_with_backlog_and_err(pcb, backlog, NULL); } @@ -718,11 +858,15 @@ tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err) err_t res; LWIP_UNUSED_ARG(backlog); - LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done); + + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_listen_with_backlog_and_err: invalid pcb", pcb != NULL, res = ERR_ARG; goto done); + LWIP_ERROR("tcp_listen_with_backlog_and_err: pcb already connected", pcb->state == CLOSED, res = ERR_CLSD; goto done); /* already listening? */ if (pcb->state == LISTEN) { - lpcb = (struct tcp_pcb_listen*)pcb; + lpcb = (struct tcp_pcb_listen *)pcb; res = ERR_ALREADY; goto done; } @@ -752,6 +896,7 @@ tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err) lpcb->state = LISTEN; lpcb->prio = pcb->prio; lpcb->so_options = pcb->so_options; + lpcb->netif_idx = pcb->netif_idx; lpcb->ttl = pcb->ttl; lpcb->tos = pcb->tos; #if LWIP_IPV4 && LWIP_IPV6 @@ -761,7 +906,11 @@ tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err) if (pcb->local_port != 0) { TCP_RMV(&tcp_bound_pcbs, pcb); } - memp_free(MEMP_TCP_PCB, pcb); +#if LWIP_TCP_PCB_NUM_EXT_ARGS + /* copy over ext_args to listening pcb */ + memcpy(&lpcb->ext_args, &pcb->ext_args, sizeof(pcb->ext_args)); +#endif + tcp_free(pcb); #if LWIP_CALLBACK_API lpcb->accept = tcp_accept_null; #endif /* LWIP_CALLBACK_API */ @@ -787,7 +936,10 @@ done: u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) { - u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; + u32_t new_right_edge; + + LWIP_ASSERT("tcp_update_rcv_ann_wnd: invalid pcb", pcb != NULL); + new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { /* we can advertise more window */ @@ -822,25 +974,24 @@ tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) void tcp_recved(struct tcp_pcb *pcb, u16_t len) { - int wnd_inflation; + u32_t wnd_inflation; + tcpwnd_size_t rcv_wnd; + + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_recved: invalid pcb", pcb != NULL, return); /* pcb->state LISTEN not allowed here */ LWIP_ASSERT("don't call tcp_recved for listen-pcbs", - pcb->state != LISTEN); + pcb->state != LISTEN); - pcb->rcv_wnd += len; - if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) { + rcv_wnd = (tcpwnd_size_t)(pcb->rcv_wnd + len); + if ((rcv_wnd > TCP_WND_MAX(pcb)) || (rcv_wnd < pcb->rcv_wnd)) { + /* window got too big or tcpwnd_size_t overflow */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: window got too big or tcpwnd_size_t overflow\n")); pcb->rcv_wnd = TCP_WND_MAX(pcb); - } else if (pcb->rcv_wnd == 0) { - /* rcv_wnd overflowed */ - if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) { - /* In passive close, we allow this, since the FIN bit is added to rcv_wnd - by the stack itself, since it is not mandatory for an application - to call tcp_recved() for the FIN bit, but e.g. the netconn API does so. */ - pcb->rcv_wnd = TCP_WND_MAX(pcb); - } else { - LWIP_ASSERT("tcp_recved: len wrapped rcv_wnd\n", 0); - } + } else { + pcb->rcv_wnd = rcv_wnd; } wnd_inflation = tcp_update_rcv_ann_wnd(pcb); @@ -855,7 +1006,7 @@ tcp_recved(struct tcp_pcb *pcb, u16_t len) } LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: received %"U16_F" bytes, wnd %"TCPWNDSIZE_F" (%"TCPWNDSIZE_F").\n", - len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd))); + len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd))); } /** @@ -869,26 +1020,18 @@ tcp_new_port(void) u8_t i; u16_t n = 0; struct tcp_pcb *pcb; -// u32_t value = 0; - - if (tcp_port == TCP_LOCAL_PORT_RANGE_START) - { - extern unsigned int tls_random_seed_generation(void ); - tcp_port = (u16_t)tls_random_seed_generation(); - srand(tcp_port); - tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); - } - again: - if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) { + tcp_port++; + if (tcp_port == TCP_LOCAL_PORT_RANGE_END) { tcp_port = TCP_LOCAL_PORT_RANGE_START; } /* Check all PCB lists. */ for (i = 0; i < NUM_TCP_PCB_LISTS; i++) { for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) { if (pcb->local_port == tcp_port) { - if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) { + n++; + if (n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) { return 0; } goto again; @@ -902,6 +1045,21 @@ again: * @ingroup tcp_raw * Connects to another host. The function given as the "connected" * argument will be called when the connection has been established. + * Sets up the pcb to connect to the remote host and sends the + * initial SYN segment which opens the connection. + * + * The tcp_connect() function returns immediately; it does not wait for + * the connection to be properly setup. Instead, it will call the + * function specified as the fourth argument (the "connected" argument) + * when the connection is established. If the connection could not be + * properly established, either because the other host refused the + * connection or because the other host didn't answer, the "err" + * callback function of this pcb (registered with tcp_err, see below) + * will be called. + * + * The tcp_connect() function can return ERR_MEM if no memory is + * available for enqueueing the SYN segment. If the SYN indeed was + * enqueued successfully, the tcp_connect() function returns ERR_OK. * * @param pcb the tcp_pcb used to establish the connection * @param ipaddr the remote ip address to connect to @@ -914,15 +1072,17 @@ again: */ err_t tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, - tcp_connected_fn connected) + tcp_connected_fn connected) { + struct netif *netif = NULL; err_t ret; u32_t iss; u16_t old_local_port; - if ((pcb == NULL) || (ipaddr == NULL)) { - return ERR_VAL; - } + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_connect: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("tcp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG); LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); @@ -930,21 +1090,35 @@ tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, ip_addr_set(&pcb->remote_ip, ipaddr); pcb->remote_port = port; - /* check if we have a route to the remote host */ + if (pcb->netif_idx != NETIF_NO_INDEX) { + netif = netif_get_by_index(pcb->netif_idx); + } else { + /* check if we have a route to the remote host */ + netif = ip_route(&pcb->local_ip, &pcb->remote_ip); + } + if (netif == NULL) { + /* Don't even try to send a SYN packet if we have no route since that will fail. */ + return ERR_RTE; + } + + /* check if local IP has been assigned to pcb, if not, get one */ if (ip_addr_isany(&pcb->local_ip)) { - /* no local IP address set, yet. */ - struct netif *netif; - const ip_addr_t *local_ip; - ip_route_get_local_ip(&pcb->local_ip, &pcb->remote_ip, netif, local_ip); - if ((netif == NULL) || (local_ip == NULL)) { - /* Don't even try to send a SYN packet if we have no route - since that will fail. */ + const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, ipaddr); + if (local_ip == NULL) { return ERR_RTE; } - /* Use the address as local address of the pcb. */ ip_addr_copy(pcb->local_ip, *local_ip); } +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now. + * Given that we already have the target netif, this is easy and cheap. */ + if (IP_IS_V6(&pcb->remote_ip) && + ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST)) { + ip6_addr_assign_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNICAST, netif); + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + old_local_port = pcb->local_port; if (pcb->local_port == 0) { pcb->local_port = tcp_new_port(); @@ -989,7 +1163,7 @@ tcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, The send MSS is updated when an MSS option is received. */ pcb->mss = INITIAL_MSS; #if TCP_CALCULATE_EFF_SEND_MSS - pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip); + pcb->mss = tcp_eff_send_mss_netif(pcb->mss, netif, &pcb->remote_ip); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ pcb->cwnd = 1; #if LWIP_CALLBACK_API @@ -1049,6 +1223,7 @@ tcp_slowtmr_start: LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT); if (pcb->last_timer == tcp_timer_ctr) { /* skip this pcb, we have already processed it */ + prev = pcb; pcb = pcb->next; continue; } @@ -1060,62 +1235,86 @@ tcp_slowtmr_start: if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n")); - } - else if (pcb->nrtx >= TCP_MAXRTX) { + } else if (pcb->nrtx >= TCP_MAXRTX) { ++pcb_remove; LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n")); } else { if (pcb->persist_backoff > 0) { - /* If snd_wnd is zero, use persist timer to send 1 byte probes - * instead of using the standard retransmission mechanism. */ - u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1]; - if (pcb->persist_cnt < backoff_cnt) { - pcb->persist_cnt++; - } - if (pcb->persist_cnt >= backoff_cnt) { - if (tcp_zero_window_probe(pcb) == ERR_OK) { - pcb->persist_cnt = 0; - if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { - pcb->persist_backoff++; + LWIP_ASSERT("tcp_slowtimr: persist ticking with in-flight data", pcb->unacked == NULL); + LWIP_ASSERT("tcp_slowtimr: persist ticking with empty send buffer", pcb->unsent != NULL); + if (pcb->persist_probe >= TCP_MAXRTX) { + ++pcb_remove; /* max probes reached */ + } else { + u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff - 1]; + if (pcb->persist_cnt < backoff_cnt) { + pcb->persist_cnt++; + } + if (pcb->persist_cnt >= backoff_cnt) { + int next_slot = 1; /* increment timer to next slot */ + /* If snd_wnd is zero, send 1 byte probes */ + if (pcb->snd_wnd == 0) { + if (tcp_zero_window_probe(pcb) != ERR_OK) { + next_slot = 0; /* try probe again with current slot */ + } + /* snd_wnd not fully closed, split unsent head and fill window */ + } else { + if (tcp_split_unsent_seg(pcb, (u16_t)pcb->snd_wnd) == ERR_OK) { + if (tcp_output(pcb) == ERR_OK) { + /* sending will cancel persist timer, else retry with current slot */ + next_slot = 0; + } + } + } + if (next_slot) { + pcb->persist_cnt = 0; + if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { + pcb->persist_backoff++; + } } } } } else { /* Increase the retransmission timer if it is running */ - if (pcb->rtime >= 0) { + if ((pcb->rtime >= 0) && (pcb->rtime < 0x7FFF)) { ++pcb->rtime; } - if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) { + if (pcb->rtime >= pcb->rto) { /* Time for a retransmission. */ LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F " pcb->rto %"S16_F"\n", pcb->rtime, pcb->rto)); + /* If prepare phase fails but we have unsent data but no unacked data, + still execute the backoff calculations below, as this means we somehow + failed to send segment. */ + if ((tcp_rexmit_rto_prepare(pcb) == ERR_OK) || ((pcb->unacked == NULL) && (pcb->unsent != NULL))) { + /* Double retransmission time-out unless we are trying to + * connect to somebody (i.e., we are in SYN_SENT). */ + if (pcb->state != SYN_SENT) { + u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff) - 1); + int calc_rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx]; + pcb->rto = (s16_t)LWIP_MIN(calc_rto, 0x7FFF); + } - /* Double retransmission time-out unless we are trying to - * connect to somebody (i.e., we are in SYN_SENT). */ - if (pcb->state != SYN_SENT) { - u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff)-1); - pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx]; + /* Reset the retransmission timer. */ + pcb->rtime = 0; + + /* Reduce congestion window and ssthresh. */ + eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); + pcb->ssthresh = eff_wnd >> 1; + if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { + pcb->ssthresh = (tcpwnd_size_t)(pcb->mss << 1); + } + pcb->cwnd = pcb->mss; + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F + " ssthresh %"TCPWNDSIZE_F"\n", + pcb->cwnd, pcb->ssthresh)); + pcb->bytes_acked = 0; + + /* The following needs to be called AFTER cwnd is set to one + mss - STJ */ + tcp_rexmit_rto_commit(pcb); } - - /* Reset the retransmission timer. */ - pcb->rtime = 0; - - /* Reduce congestion window and ssthresh. */ - eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); - pcb->ssthresh = eff_wnd >> 1; - if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) { - pcb->ssthresh = (pcb->mss << 1); - } - pcb->cwnd = pcb->mss; - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"TCPWNDSIZE_F - " ssthresh %"TCPWNDSIZE_F"\n", - pcb->cwnd, pcb->ssthresh)); - - /* The following needs to be called AFTER cwnd is set to one - mss - STJ */ - tcp_rexmit_rto(pcb); } } } @@ -1135,21 +1334,19 @@ tcp_slowtmr_start: /* Check if KEEPALIVE should be sent */ if (ip_get_option(pcb, SOF_KEEPALIVE) && - ((pcb->state == ESTABLISHED) || - (pcb->state == CLOSE_WAIT))) { + ((pcb->state == ESTABLISHED) || + (pcb->state == CLOSE_WAIT))) { if ((u32_t)(tcp_ticks - pcb->tmr) > - (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) - { + (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to ")); - ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip); + ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip); LWIP_DEBUGF(TCP_DEBUG, ("\n")); ++pcb_remove; ++pcb_reset; } else if ((u32_t)(tcp_ticks - pcb->tmr) > - (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb)) - / TCP_SLOW_INTERVAL) - { + (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb)) + / TCP_SLOW_INTERVAL) { err = tcp_keepalive(pcb); if (err == ERR_OK) { pcb->keep_cnt_sent++; @@ -1162,10 +1359,9 @@ tcp_slowtmr_start: be retransmitted). */ #if TCP_QUEUE_OOSEQ if (pcb->ooseq != NULL && - (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) { - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; + (tcp_ticks - pcb->tmr >= (u32_t)pcb->rto * TCP_OOSEQ_TIMEOUT)) { LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); + tcp_free_ooseq(pcb); } #endif /* TCP_QUEUE_OOSEQ */ @@ -1206,15 +1402,15 @@ tcp_slowtmr_start: } if (pcb_reset) { - tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, - pcb->local_port, pcb->remote_port); + tcp_rst(pcb, pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, + pcb->local_port, pcb->remote_port); } err_arg = pcb->callback_arg; last_state = pcb->state; pcb2 = pcb; pcb = pcb->next; - memp_free(MEMP_TCP_PCB, pcb2); + tcp_free(pcb2); tcp_active_pcbs_changed = 0; TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT); @@ -1272,7 +1468,7 @@ tcp_slowtmr_start: } pcb2 = pcb; pcb = pcb->next; - memp_free(MEMP_TCP_PCB, pcb2); + tcp_free(pcb2); } else { prev = pcb; pcb = pcb->next; @@ -1282,7 +1478,7 @@ tcp_slowtmr_start: /** * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously - * "refused" by upper layer (application) and sends delayed ACKs. + * "refused" by upper layer (application) and sends delayed ACKs or pending FINs. * * Automatically called from tcp_tmr(). */ @@ -1305,12 +1501,12 @@ tcp_fasttmr_start: LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n")); tcp_ack_now(pcb); tcp_output(pcb); - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); } /* send pending FIN */ if (pcb->flags & TF_CLOSEPEND) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: pending FIN\n")); - pcb->flags &= ~(TF_CLOSEPEND); + tcp_clear_flags(pcb, TF_CLOSEPEND); tcp_close_shutdown_fin(pcb); } @@ -1351,6 +1547,11 @@ tcp_process_refused_data(struct tcp_pcb *pcb) { #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE struct pbuf *rest; +#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ + + LWIP_ERROR("tcp_process_refused_data: invalid pcb", pcb != NULL, return ERR_ARG); + +#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE while (pcb->refused_data != NULL) #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ { @@ -1370,7 +1571,7 @@ tcp_process_refused_data(struct tcp_pcb *pcb) TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); if (err == ERR_OK) { /* did refused_data include a FIN? */ - if (refused_flags & PBUF_FLAG_TCP_FIN + if ((refused_flags & PBUF_FLAG_TCP_FIN) #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE && (rest == NULL) #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ @@ -1440,6 +1641,7 @@ tcp_seg_free(struct tcp_seg *seg) } /** + * @ingroup tcp * Sets the priority of a connection. * * @param pcb the tcp_pcb to manipulate @@ -1448,6 +1650,10 @@ tcp_seg_free(struct tcp_seg *seg) void tcp_setprio(struct tcp_pcb *pcb, u8_t prio) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_setprio: invalid pcb", pcb != NULL, return); + pcb->prio = prio; } @@ -1464,6 +1670,8 @@ tcp_seg_copy(struct tcp_seg *seg) { struct tcp_seg *cseg; + LWIP_ASSERT("tcp_seg_copy: invalid seg", seg != NULL); + cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG); if (cseg == NULL) { return NULL; @@ -1483,6 +1691,9 @@ err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { LWIP_UNUSED_ARG(arg); + + LWIP_ERROR("tcp_recv_null: invalid pcb", pcb != NULL, return ERR_ARG); + if (p != NULL) { tcp_recved(pcb, p->tot_len); pbuf_free(p); @@ -1494,8 +1705,7 @@ tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) #endif /* LWIP_CALLBACK_API */ /** - * Kills the oldest active connection that has the same or lower priority than - * 'prio'. + * Kills the oldest active connection that has a lower priority than 'prio'. * * @param prio minimum priority */ @@ -1508,20 +1718,35 @@ tcp_kill_prio(u8_t prio) mprio = LWIP_MIN(TCP_PRIO_MAX, prio); - /* We kill the oldest active connection that has lower priority than prio. */ + /* We want to kill connections with a lower prio, so bail out if + * supplied prio is 0 - there can never be a lower prio + */ + if (mprio == 0) { + return; + } + + /* We only want kill connections with a lower prio, so decrement prio by one + * and start searching for oldest connection with same or lower priority than mprio. + * We want to find the connections with the lowest possible prio, and among + * these the one with the longest inactivity time. + */ + mprio--; + inactivity = 0; inactive = NULL; for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - if (pcb->prio <= mprio && - (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { + /* lower prio is always a kill candidate */ + if ((pcb->prio < mprio) || + /* longer inactivity is also a kill candidate */ + ((pcb->prio == mprio) && ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity))) { inactivity = tcp_ticks - pcb->tmr; - inactive = pcb; - mprio = pcb->prio; + inactive = pcb; + mprio = pcb->prio; } } if (inactive != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n", - (void *)inactive, inactivity)); + (void *)inactive, inactivity)); tcp_abort(inactive); } } @@ -1552,7 +1777,7 @@ tcp_kill_state(enum tcp_state state) } if (inactive != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_closing: killing oldest %s PCB %p (%"S32_F")\n", - tcp_state_str[state], (void *)inactive, inactivity)); + tcp_state_str[state], (void *)inactive, inactivity)); /* Don't send a RST, since no data is lost. */ tcp_abandon(inactive, 0); } @@ -1579,58 +1804,33 @@ tcp_kill_timewait(void) } if (inactive != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n", - (void *)inactive, inactivity)); + (void *)inactive, inactivity)); tcp_abort(inactive); } } +/* Called when allocating a pcb fails. + * In this case, we want to handle all pcbs that want to close first: if we can + * now send the FIN (which failed before), the pcb might be in a state that is + * OK for us to now free it. + */ static void -tcp_kill_finwait2(void) +tcp_handle_closepend(void) { - struct tcp_pcb *pcb, *inactive; - u32_t inactivity; + struct tcp_pcb *pcb = tcp_active_pcbs; - inactivity = 0; - inactive = NULL; - /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ - for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - if (pcb->state == FIN_WAIT_1 || pcb->state == FIN_WAIT_2) { - if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { - inactivity = tcp_ticks - pcb->tmr; - inactive = pcb; - } - } - } - if (inactive != NULL) { - tcp_pcb_remove(&tcp_active_pcbs, inactive); - memp_free(MEMP_TCP_PCB, inactive); + while (pcb != NULL) { + struct tcp_pcb *next = pcb->next; + /* send pending FIN */ + if (pcb->flags & TF_CLOSEPEND) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_handle_closepend: pending FIN\n")); + tcp_clear_flags(pcb, TF_CLOSEPEND); + tcp_close_shutdown_fin(pcb); + } + pcb = next; } } -static void -tcp_kill_lastack(void) -{ - struct tcp_pcb *pcb, *inactive; - u32_t inactivity; - - inactivity = 0; - inactive = NULL; - /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ - for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - if (pcb->state == LAST_ACK ) { - if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { - inactivity = tcp_ticks - pcb->tmr; - inactive = pcb; - } - } - } - if (inactive != NULL) { - tcp_pcb_remove(&tcp_active_pcbs, inactive); - memp_free(MEMP_TCP_PCB, inactive); - } -} - - /** * Allocate a new tcp_pcb structure. * @@ -1641,43 +1841,14 @@ struct tcp_pcb * tcp_alloc(u8_t prio) { struct tcp_pcb *pcb; - struct tcp_pcb *pcb_tw; - u32_t n = 0; - - pcb_tw = tcp_tw_pcbs; - while (pcb_tw != NULL) { - n++; - pcb_tw = pcb_tw->next; - } - if (n > TCP_DEFAULT_LISTEN_BACKLOG) - tcp_kill_timewait(); - pcb_tw = tcp_active_pcbs; - while (pcb_tw != NULL) { - if (pcb_tw->state == FIN_WAIT_2 || pcb_tw->state == FIN_WAIT_1) - { - n++; - } - pcb_tw = pcb_tw->next; - } + LWIP_ASSERT_CORE_LOCKED(); - if (n > MEMP_NUM_TCP_PCB) - tcp_kill_finwait2(); - - pcb_tw = tcp_active_pcbs; - while (pcb_tw != NULL) { - if (pcb_tw->state == LAST_ACK) - { - n++; - } - pcb_tw = pcb_tw->next; - } - if (n > MEMP_NUM_TCP_PCB) - tcp_kill_lastack(); - - pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); if (pcb == NULL) { + /* Try to send FIN for all pcbs stuck in TF_CLOSEPEND first */ + tcp_handle_closepend(); + /* Try killing oldest connection in TIME-WAIT. */ LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); tcp_kill_timewait(); @@ -1696,8 +1867,8 @@ tcp_alloc(u8_t prio) /* Try to allocate a tcp_pcb again. */ pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); if (pcb == NULL) { - /* Try killing active connections with lower priority than the new one. */ - LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio)); + /* Try killing oldest active connection with lower priority than the new one. */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing oldest connection with prio lower than %d\n", prio)); tcp_kill_prio(prio); /* Try to allocate a tcp_pcb again. */ pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); @@ -1768,6 +1939,8 @@ tcp_alloc(u8_t prio) * Creates a new TCP protocol control block but doesn't place it on * any of the TCP PCB lists. * The pcb is not put on any list until binding using tcp_bind(). + * If memory is not available for creating the new pcb, NULL is returned. + * @see MEMP_NUM_TCP_PCB_LISTEN and MEMP_NUM_TCP_PCB * * @internal: Maybe there should be a idle TCP PCB list where these * PCBs are put on. Port reservation using tcp_bind() is implemented but @@ -1787,6 +1960,7 @@ tcp_new(void) * Creates a new TCP protocol control block but doesn't * place it on any of the TCP PCB lists. * The pcb is not put on any list until binding using tcp_bind(). + * @see MEMP_NUM_TCP_PCB_LISTEN and MEMP_NUM_TCP_PCB * * @param type IP address type, see @ref lwip_ip_addr_type definitions. * If you want to listen to IPv4 and IPv6 (dual-stack) connections, @@ -1796,7 +1970,7 @@ tcp_new(void) struct tcp_pcb * tcp_new_ip_type(u8_t type) { - struct tcp_pcb * pcb; + struct tcp_pcb *pcb; pcb = tcp_alloc(TCP_PRIO_NORMAL); #if LWIP_IPV4 && LWIP_IPV6 if (pcb != NULL) { @@ -1811,8 +1985,10 @@ tcp_new_ip_type(u8_t type) /** * @ingroup tcp_raw - * Used to specify the argument that should be passed callback - * functions. + * Specifies the program specific state that should be passed to all + * other callback functions. The "pcb" argument is the current TCP + * connection control block, and the "arg" argument is the argument + * that will be passed to the callbacks. * * @param pcb tcp_pcb to set the callback argument * @param arg void pointer argument to pass to callback functions @@ -1820,6 +1996,7 @@ tcp_new_ip_type(u8_t type) void tcp_arg(struct tcp_pcb *pcb, void *arg) { + LWIP_ASSERT_CORE_LOCKED(); /* This function is allowed to be called for both listen pcbs and connection pcbs. */ if (pcb != NULL) { @@ -1830,8 +2007,11 @@ tcp_arg(struct tcp_pcb *pcb, void *arg) /** * @ingroup tcp_raw - * Used to specify the function that should be called when a TCP - * connection receives data. + * Sets the callback function that will be called when new data + * arrives. The callback function will be passed a NULL pbuf to + * indicate that the remote host has closed the connection. If the + * callback function returns ERR_OK or ERR_ABRT it must have + * freed the pbuf, otherwise it must not have freed it. * * @param pcb tcp_pcb to set the recv callback * @param recv callback function to call for this pcb when data is received @@ -1839,6 +2019,7 @@ tcp_arg(struct tcp_pcb *pcb, void *arg) void tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb != NULL) { LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN); pcb->recv = recv; @@ -1847,8 +2028,10 @@ tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv) /** * @ingroup tcp_raw - * Used to specify the function that should be called when TCP data - * has been successfully delivered to the remote host. + * Specifies the callback function that should be called when data has + * successfully been received (i.e., acknowledged) by the remote + * host. The len argument passed to the callback function gives the + * amount bytes that was acknowledged by the last acknowledgment. * * @param pcb tcp_pcb to set the sent callback * @param sent callback function to call for this pcb when data is successfully sent @@ -1856,6 +2039,7 @@ tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv) void tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb != NULL) { LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN); pcb->sent = sent; @@ -1866,9 +2050,14 @@ tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent) * @ingroup tcp_raw * Used to specify the function that should be called when a fatal error * has occurred on the connection. + * + * If a connection is aborted because of an error, the application is + * alerted of this event by the err callback. Errors that might abort a + * connection are when there is a shortage of memory. The callback + * function to be called is set using the tcp_err() function. * * @note The corresponding pcb is already freed when this callback is called! - * + * * @param pcb tcp_pcb to set the err callback * @param err callback function to call for this pcb when a fatal error * has occurred on the connection @@ -1876,6 +2065,7 @@ tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent) void tcp_err(struct tcp_pcb *pcb, tcp_err_fn err) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb != NULL) { LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN); pcb->errf = err; @@ -1886,6 +2076,7 @@ tcp_err(struct tcp_pcb *pcb, tcp_err_fn err) * @ingroup tcp_raw * Used for specifying the function that should be called when a * LISTENing connection has been connected to another host. + * @see MEMP_NUM_TCP_PCB_LISTEN and MEMP_NUM_TCP_PCB * * @param pcb tcp_pcb to set the accept callback * @param accept callback function to call for this pcb when LISTENing @@ -1894,8 +2085,9 @@ tcp_err(struct tcp_pcb *pcb, tcp_err_fn err) void tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept) { + LWIP_ASSERT_CORE_LOCKED(); if ((pcb != NULL) && (pcb->state == LISTEN)) { - struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)pcb; + struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen *)pcb; lpcb->accept = accept; } } @@ -1904,15 +2096,29 @@ tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept) /** * @ingroup tcp_raw - * Used to specify the function that should be called periodically - * from TCP. The interval is specified in terms of the TCP coarse - * timer interval, which is called twice a second. - * + * Specifies the polling interval and the callback function that should + * be called to poll the application. The interval is specified in + * number of TCP coarse grained timer shots, which typically occurs + * twice a second. An interval of 10 means that the application would + * be polled every 5 seconds. + * + * When a connection is idle (i.e., no data is either transmitted or + * received), lwIP will repeatedly poll the application by calling a + * specified callback function. This can be used either as a watchdog + * timer for killing connections that have stayed idle for too long, or + * as a method of waiting for memory to become available. For instance, + * if a call to tcp_write() has failed because memory wasn't available, + * the application may use the polling functionality to call tcp_write() + * again when the connection has been idle for a while. */ void tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("tcp_poll: invalid pcb", pcb != NULL, return); LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN); + #if LWIP_CALLBACK_API pcb->poll = poll; #else /* LWIP_CALLBACK_API */ @@ -1930,9 +2136,11 @@ tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval) void tcp_pcb_purge(struct tcp_pcb *pcb) { + LWIP_ERROR("tcp_pcb_purge: invalid pcb", pcb != NULL, return); + if (pcb->state != CLOSED && - pcb->state != TIME_WAIT && - pcb->state != LISTEN) { + pcb->state != TIME_WAIT && + pcb->state != LISTEN) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n")); @@ -1952,9 +2160,8 @@ tcp_pcb_purge(struct tcp_pcb *pcb) #if TCP_QUEUE_OOSEQ if (pcb->ooseq != NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n")); + tcp_free_ooseq(pcb); } - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; #endif /* TCP_QUEUE_OOSEQ */ /* Stop the retransmission timer as it will expect data on unacked @@ -1967,13 +2174,6 @@ tcp_pcb_purge(struct tcp_pcb *pcb) #if TCP_OVERSIZE pcb->unsent_oversize = 0; #endif /* TCP_OVERSIZE */ -#if SNDBUF_SHARE - if(pcb->snd_buf < TCP_SND_BUF) - { - sndbuf_len += (TCP_SND_BUF - pcb->snd_buf); - pcb->snd_buf = TCP_SND_BUF; - } -#endif } } @@ -1986,15 +2186,18 @@ tcp_pcb_purge(struct tcp_pcb *pcb) void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) { + LWIP_ASSERT("tcp_pcb_remove: invalid pcb", pcb != NULL); + LWIP_ASSERT("tcp_pcb_remove: invalid pcblist", pcblist != NULL); + TCP_RMV(pcblist, pcb); tcp_pcb_purge(pcb); /* if there is an outstanding delayed ACKs, send it */ - if (pcb->state != TIME_WAIT && - pcb->state != LISTEN && - pcb->flags & TF_ACK_DELAY) { - pcb->flags |= TF_ACK_NOW; + if ((pcb->state != TIME_WAIT) && + (pcb->state != LISTEN) && + (pcb->flags & TF_ACK_DELAY)) { + tcp_ack_now(pcb); tcp_output(pcb); } @@ -2022,10 +2225,12 @@ u32_t tcp_next_iss(struct tcp_pcb *pcb) { #ifdef LWIP_HOOK_TCP_ISN + LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL); return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port); #else /* LWIP_HOOK_TCP_ISN */ static u32_t iss = 6510; + LWIP_ASSERT("tcp_next_iss: invalid pcb", pcb != NULL); LWIP_UNUSED_ARG(pcb); iss += tcp_ticks; /* XXX */ @@ -2036,21 +2241,19 @@ tcp_next_iss(struct tcp_pcb *pcb) #if TCP_CALCULATE_EFF_SEND_MSS /** * Calculates the effective send mss that can be used for a specific IP address - * by using ip_route to determine the netif used to send to the address and - * calculating the minimum of TCP_MSS and that netif's mtu (if set). + * by calculating the minimum of TCP_MSS and the mtu (if set) of the target + * netif (if not NULL). */ u16_t -tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest -#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING - , const ip_addr_t *src -#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ - ) +tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, const ip_addr_t *dest) { u16_t mss_s; - struct netif *outif; - s16_t mtu; + u16_t mtu; + + LWIP_UNUSED_ARG(dest); /* in case IPv6 is disabled */ + + LWIP_ASSERT("tcp_eff_send_mss_netif: invalid dst_ip", dest != NULL); - outif = ip_route(src, dest); #if LWIP_IPV6 #if LWIP_IPV4 if (IP_IS_V6(dest)) @@ -2073,12 +2276,13 @@ tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest #endif /* LWIP_IPV4 */ if (mtu != 0) { + u16_t offset; #if LWIP_IPV6 #if LWIP_IPV4 if (IP_IS_V6(dest)) #endif /* LWIP_IPV4 */ { - mss_s = mtu - IP6_HLEN - TCP_HLEN; + offset = IP6_HLEN + TCP_HLEN; } #if LWIP_IPV4 else @@ -2086,9 +2290,10 @@ tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest #endif /* LWIP_IPV6 */ #if LWIP_IPV4 { - mss_s = mtu - IP_HLEN - TCP_HLEN; + offset = IP_HLEN + TCP_HLEN; } #endif /* LWIP_IPV4 */ + mss_s = (mtu > offset) ? (u16_t)(mtu - offset) : 0; /* RFC 1122, chap 4.2.2.6: * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize * We correct for TCP options in tcp_write(), and don't support IP options. @@ -2101,18 +2306,21 @@ tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest /** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */ static void -tcp_netif_ip_addr_changed_pcblist(const ip_addr_t* old_addr, struct tcp_pcb* pcb_list) +tcp_netif_ip_addr_changed_pcblist(const ip_addr_t *old_addr, struct tcp_pcb *pcb_list) { struct tcp_pcb *pcb; pcb = pcb_list; + + LWIP_ASSERT("tcp_netif_ip_addr_changed_pcblist: invalid old_addr", old_addr != NULL); + while (pcb != NULL) { /* PCB bound to current local interface address? */ if (ip_addr_cmp(&pcb->local_ip, old_addr) #if LWIP_AUTOIP - /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */ - && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip))) + /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */ + && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip))) #endif /* LWIP_AUTOIP */ - ) { + ) { /* this connection must be aborted */ struct tcp_pcb *next = pcb->next; LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb)); @@ -2130,9 +2338,9 @@ tcp_netif_ip_addr_changed_pcblist(const ip_addr_t* old_addr, struct tcp_pcb* pcb * @param new_addr IP address of the netif after change or NULL if netif has been removed */ void -tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr) +tcp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr) { - struct tcp_pcb_listen *lpcb, *next; + struct tcp_pcb_listen *lpcb; if (!ip_addr_isany(old_addr)) { tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs); @@ -2140,8 +2348,7 @@ tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr) if (!ip_addr_isany(new_addr)) { /* PCB bound to current local interface address? */ - for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = next) { - next = lpcb->next; + for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { /* PCB bound to current local interface address? */ if (ip_addr_cmp(&lpcb->local_ip, old_addr)) { /* The PCB is listening to the old ipaddr and @@ -2153,12 +2360,51 @@ tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr) } } -const char* +const char * tcp_debug_state_str(enum tcp_state s) { return tcp_state_str[s]; } +err_t +tcp_tcp_get_tcp_addrinfo(struct tcp_pcb *pcb, int local, ip_addr_t *addr, u16_t *port) +{ + if (pcb) { + if (local) { + if (addr) { + *addr = pcb->local_ip; + } + if (port) { + *port = pcb->local_port; + } + } else { + if (addr) { + *addr = pcb->remote_ip; + } + if (port) { + *port = pcb->remote_port; + } + } + return ERR_OK; + } + return ERR_VAL; +} + +#if TCP_QUEUE_OOSEQ +/* Free all ooseq pbufs (and possibly reset SACK state) */ +void +tcp_free_ooseq(struct tcp_pcb *pcb) +{ + if (pcb->ooseq) { + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; +#if LWIP_TCP_SACK_OUT + memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks)); +#endif /* LWIP_TCP_SACK_OUT */ + } +} +#endif /* TCP_QUEUE_OOSEQ */ + #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG /** * Print a tcp header for debugging purposes. @@ -2171,28 +2417,28 @@ tcp_debug_print(struct tcp_hdr *tcphdr) LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n")); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", - lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest))); + lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n", - lwip_ntohl(tcphdr->seqno))); + lwip_ntohl(tcphdr->seqno))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n", - lwip_ntohl(tcphdr->ackno))); + lwip_ntohl(tcphdr->ackno))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (", - TCPH_HDRLEN(tcphdr), - (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1), - (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1), - (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1), - (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1), - (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1), - (u16_t)(TCPH_FLAGS(tcphdr) & 1), - lwip_ntohs(tcphdr->wnd))); + TCPH_HDRLEN(tcphdr), + (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1), + (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1), + (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1), + (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1), + (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1), + (u16_t)(TCPH_FLAGS(tcphdr) & 1), + lwip_ntohs(tcphdr->wnd))); tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); LWIP_DEBUGF(TCP_DEBUG, ("), win)\n")); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n", - lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp))); + lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp))); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); } @@ -2254,8 +2500,8 @@ tcp_debug_print_pcbs(void) LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", - pcb->local_port, pcb->remote_port, - pcb->snd_nxt, pcb->rcv_nxt)); + pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); tcp_debug_print_state(pcb->state); } @@ -2268,8 +2514,8 @@ tcp_debug_print_pcbs(void) LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", - pcb->local_port, pcb->remote_port, - pcb->snd_nxt, pcb->rcv_nxt)); + pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); tcp_debug_print_state(pcb->state); } } @@ -2293,4 +2539,158 @@ tcp_pcbs_sane(void) } #endif /* TCP_DEBUG */ +#if LWIP_TCP_PCB_NUM_EXT_ARGS +/** + * @defgroup tcp_raw_extargs ext arguments + * @ingroup tcp_raw + * Additional data storage per tcp pcb\n + * @see @ref tcp_raw + * + * When LWIP_TCP_PCB_NUM_EXT_ARGS is > 0, every tcp pcb (including listen pcb) + * includes a number of additional argument entries in an array. + * + * To support memory management, in addition to a 'void *', callbacks can be + * provided to manage transition from listening pcbs to connections and to + * deallocate memory when a pcb is deallocated (see struct @ref tcp_ext_arg_callbacks). + * + * After allocating this index, use @ref tcp_ext_arg_set and @ref tcp_ext_arg_get + * to store and load arguments from this index for a given pcb. + */ + +static u8_t tcp_ext_arg_id; + +/** + * @ingroup tcp_raw_extargs + * Allocate an index to store data in ext_args member of struct tcp_pcb. + * Returned value is an index in mentioned array. + * The index is *global* over all pcbs! + * + * When @ref LWIP_TCP_PCB_NUM_EXT_ARGS is > 0, every tcp pcb (including listen pcb) + * includes a number of additional argument entries in an array. + * + * To support memory management, in addition to a 'void *', callbacks can be + * provided to manage transition from listening pcbs to connections and to + * deallocate memory when a pcb is deallocated (see struct @ref tcp_ext_arg_callbacks). + * + * After allocating this index, use @ref tcp_ext_arg_set and @ref tcp_ext_arg_get + * to store and load arguments from this index for a given pcb. + * + * @return a unique index into struct tcp_pcb.ext_args + */ +u8_t +tcp_ext_arg_alloc_id(void) +{ + u8_t result = tcp_ext_arg_id; + tcp_ext_arg_id++; + + LWIP_ASSERT_CORE_LOCKED(); + +#if LWIP_TCP_PCB_NUM_EXT_ARGS >= 255 +#error LWIP_TCP_PCB_NUM_EXT_ARGS +#endif + LWIP_ASSERT("Increase LWIP_TCP_PCB_NUM_EXT_ARGS in lwipopts.h", result < LWIP_TCP_PCB_NUM_EXT_ARGS); + return result; +} + +/** + * @ingroup tcp_raw_extargs + * Set callbacks for a given index of ext_args on the specified pcb. + * + * @param pcb tcp_pcb for which to set the callback + * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id) + * @param callbacks callback table (const since it is referenced, not copied!) + */ +void +tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks * const callbacks) +{ + LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS); + LWIP_ASSERT("callbacks != NULL", callbacks != NULL); + + LWIP_ASSERT_CORE_LOCKED(); + + pcb->ext_args[id].callbacks = callbacks; +} + +/** + * @ingroup tcp_raw_extargs + * Set data for a given index of ext_args on the specified pcb. + * + * @param pcb tcp_pcb for which to set the data + * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id) + * @param arg data pointer to set + */ +void tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg) +{ + LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS); + + LWIP_ASSERT_CORE_LOCKED(); + + pcb->ext_args[id].data = arg; +} + +/** + * @ingroup tcp_raw_extargs + * Set data for a given index of ext_args on the specified pcb. + * + * @param pcb tcp_pcb for which to set the data + * @param id ext_args index to set (allocated via @ref tcp_ext_arg_alloc_id) + * @return data pointer at the given index + */ +void *tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id) +{ + LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_ASSERT("id < LWIP_TCP_PCB_NUM_EXT_ARGS", id < LWIP_TCP_PCB_NUM_EXT_ARGS); + + LWIP_ASSERT_CORE_LOCKED(); + + return pcb->ext_args[id].data; +} + +/** This function calls the "destroy" callback for all ext_args once a pcb is + * freed. + */ +static void +tcp_ext_arg_invoke_callbacks_destroyed(struct tcp_pcb_ext_args *ext_args) +{ + int i; + LWIP_ASSERT("ext_args != NULL", ext_args != NULL); + + for (i = 0; i < LWIP_TCP_PCB_NUM_EXT_ARGS; i++) { + if (ext_args[i].callbacks != NULL) { + if (ext_args[i].callbacks->destroy != NULL) { + ext_args[i].callbacks->destroy((u8_t)i, ext_args[i].data); + } + } + } +} + +/** This function calls the "passive_open" callback for all ext_args if a connection + * is in the process of being accepted. This is called just after the SYN is + * received and before a SYN/ACK is sent, to allow to modify the very first + * segment sent even on passive open. Naturally, the "accepted" callback of the + * pcb has not been called yet! + */ +err_t +tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb) +{ + int i; + LWIP_ASSERT("lpcb != NULL", lpcb != NULL); + LWIP_ASSERT("cpcb != NULL", cpcb != NULL); + + for (i = 0; i < LWIP_TCP_PCB_NUM_EXT_ARGS; i++) { + if (lpcb->ext_args[i].callbacks != NULL) { + if (lpcb->ext_args[i].callbacks->passive_open != NULL) { + err_t err = lpcb->ext_args[i].callbacks->passive_open((u8_t)i, lpcb, cpcb); + if (err != ERR_OK) { + return err; + } + } + } + } + return ERR_OK; +} +#endif /* LWIP_TCP_PCB_NUM_EXT_ARGS */ + #endif /* LWIP_TCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_in.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_in.c similarity index 60% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_in.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_in.c index 57373aa..4bd5207 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_in.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_in.c @@ -59,8 +59,14 @@ #include "lwip/nd6.h" #endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ +#include + +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif + /** Initial CWND calculation as defined RFC 2581 */ -#define LWIP_TCP_CALC_INITIAL_CWND(mss) LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U)); +#define LWIP_TCP_CALC_INITIAL_CWND(mss) ((tcpwnd_size_t)LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U))) /* These variables are global to all functions involved in the input processing of TCP segments. They are set by the tcp_input() @@ -69,7 +75,7 @@ static struct tcp_seg inseg; static struct tcp_hdr *tcphdr; static u16_t tcphdr_optlen; static u16_t tcphdr_opt1len; -static u8_t* tcphdr_opt2; +static u8_t *tcphdr_opt2; static u16_t tcp_optidx; static u32_t seqno, ackno; static tcpwnd_size_t recv_acked; @@ -91,6 +97,14 @@ static void tcp_timewait_input(struct tcp_pcb *pcb); static int tcp_input_delayed_close(struct tcp_pcb *pcb); +#if LWIP_TCP_SACK_OUT +static void tcp_add_sack(struct tcp_pcb *pcb, u32_t left, u32_t right); +static void tcp_remove_sacks_lt(struct tcp_pcb *pcb, u32_t seq); +#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT) +static void tcp_remove_sacks_gt(struct tcp_pcb *pcb, u32_t seq); +#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */ +#endif /* LWIP_TCP_SACK_OUT */ + /** * The initial input processing of TCP. It verifies the TCP header, demultiplexes * the segment between the PCBs and passes it on to tcp_process(), which implements @@ -113,6 +127,8 @@ tcp_input(struct pbuf *p, struct netif *inp) err_t err; LWIP_UNUSED_ARG(inp); + LWIP_ASSERT_CORE_LOCKED(); + LWIP_ASSERT("tcp_input: invalid pbuf", p != NULL); PERF_START; @@ -144,10 +160,10 @@ tcp_input(struct pbuf *p, struct netif *inp) IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_TCP) { /* Verify TCP checksum. */ u16_t chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, - ip_current_src_addr(), ip_current_dest_addr()); + ip_current_src_addr(), ip_current_dest_addr()); if (chksum != 0) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", - chksum)); + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", + chksum)); tcp_debug_print(tcphdr); TCP_STATS_INC(tcp.chkerr); goto dropped; @@ -156,7 +172,7 @@ tcp_input(struct pbuf *p, struct netif *inp) #endif /* CHECKSUM_CHECK_TCP */ /* sanity-check header length */ - hdrlen_bytes = TCPH_HDRLEN(tcphdr) * 4; + hdrlen_bytes = TCPH_HDRLEN_BYTES(tcphdr); if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: invalid header length (%"U16_F")\n", (u16_t)hdrlen_bytes)); TCP_STATS_INC(tcp.lenerr); @@ -165,12 +181,12 @@ tcp_input(struct pbuf *p, struct netif *inp) /* Move the payload pointer in the pbuf so that it points to the TCP data instead of the TCP header. */ - tcphdr_optlen = hdrlen_bytes - TCP_HLEN; + tcphdr_optlen = (u16_t)(hdrlen_bytes - TCP_HLEN); tcphdr_opt2 = NULL; if (p->len >= hdrlen_bytes) { /* all options are in the first pbuf */ tcphdr_opt1len = tcphdr_optlen; - pbuf_header(p, -(s16_t)hdrlen_bytes); /* cannot fail */ + pbuf_remove_header(p, hdrlen_bytes); /* cannot fail */ } else { u16_t opt2len; /* TCP header fits into first pbuf, options don't - data is in the next pbuf */ @@ -178,15 +194,15 @@ tcp_input(struct pbuf *p, struct netif *inp) LWIP_ASSERT("p->next != NULL", p->next != NULL); /* advance over the TCP header (cannot fail) */ - pbuf_header(p, -TCP_HLEN); + pbuf_remove_header(p, TCP_HLEN); /* determine how long the first and second parts of the options are */ tcphdr_opt1len = p->len; - opt2len = tcphdr_optlen - tcphdr_opt1len; + opt2len = (u16_t)(tcphdr_optlen - tcphdr_opt1len); /* options continue in the next pbuf: set p to zero length and hide the options in the next pbuf (adjusting p->tot_len) */ - pbuf_header(p, -(s16_t)tcphdr_opt1len); + pbuf_remove_header(p, tcphdr_opt1len); /* check that the options fit in the second pbuf */ if (opt2len > p->next->len) { @@ -197,12 +213,12 @@ tcp_input(struct pbuf *p, struct netif *inp) } /* remember the pointer to the second part of the options */ - tcphdr_opt2 = (u8_t*)p->next->payload; + tcphdr_opt2 = (u8_t *)p->next->payload; /* advance p->next to point after the options, and manually adjust p->tot_len to keep it consistent with the changed p->next */ - pbuf_header(p->next, -(s16_t)opt2len); - p->tot_len -= opt2len; + pbuf_remove_header(p->next, opt2len); + p->tot_len = (u16_t)(p->tot_len - opt2len); LWIP_ASSERT("p->len == 0", p->len == 0); LWIP_ASSERT("p->tot_len == p->next->tot_len", p->tot_len == p->next->tot_len); @@ -216,7 +232,16 @@ tcp_input(struct pbuf *p, struct netif *inp) tcphdr->wnd = lwip_ntohs(tcphdr->wnd); flags = TCPH_FLAGS(tcphdr); - tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0); + tcplen = p->tot_len; + if (flags & (TCP_FIN | TCP_SYN)) { + tcplen++; + if (tcplen < p->tot_len) { + /* u16_t overflow, cannot handle this */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: length u16_t overflow, cannot handle this\n")); + TCP_STATS_INC(tcp.lenerr); + goto dropped; + } + } /* Demultiplex an incoming segment. First, we check if it is destined for an active connection. */ @@ -226,6 +251,14 @@ tcp_input(struct pbuf *p, struct netif *inp) LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); + + /* check if PCB is bound to specific netif */ + if ((pcb->netif_idx != NETIF_NO_INDEX) && + (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { + prev = pcb; + continue; + } + if (pcb->remote_port == tcphdr->src && pcb->local_port == tcphdr->dest && ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) && @@ -252,6 +285,13 @@ tcp_input(struct pbuf *p, struct netif *inp) in the TIME-WAIT state. */ for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + + /* check if PCB is bound to specific netif */ + if ((pcb->netif_idx != NETIF_NO_INDEX) && + (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { + continue; + } + if (pcb->remote_port == tcphdr->src && pcb->local_port == tcphdr->dest && ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) && @@ -260,7 +300,13 @@ tcp_input(struct pbuf *p, struct netif *inp) of the list since we are not very likely to receive that many segments for connections in TIME-WAIT. */ LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n")); - tcp_timewait_input(pcb); +#ifdef LWIP_HOOK_TCP_INPACKET_PCB + if (LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen, tcphdr_opt1len, + tcphdr_opt2, p) == ERR_OK) +#endif + { + tcp_timewait_input(pcb); + } pbuf_free(p); return; } @@ -270,6 +316,13 @@ tcp_input(struct pbuf *p, struct netif *inp) are LISTENing for incoming connections. */ prev = NULL; for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + /* check if PCB is bound to specific netif */ + if ((lpcb->netif_idx != NETIF_NO_INDEX) && + (lpcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { + prev = (struct tcp_pcb *)lpcb; + continue; + } + if (lpcb->local_port == tcphdr->dest) { if (IP_IS_ANY_TYPE_VAL(lpcb->local_ip)) { /* found an ANY TYPE (IPv4/IPv6) match */ @@ -290,7 +343,7 @@ tcp_input(struct pbuf *p, struct netif *inp) lpcb_prev = prev; #else /* SO_REUSE */ break; - #endif /* SO_REUSE */ +#endif /* SO_REUSE */ } } } @@ -310,16 +363,22 @@ tcp_input(struct pbuf *p, struct netif *inp) arrivals). */ if (prev != NULL) { ((struct tcp_pcb_listen *)prev)->next = lpcb->next; - /* our successor is the remainder of the listening list */ + /* our successor is the remainder of the listening list */ lpcb->next = tcp_listen_pcbs.listen_pcbs; - /* put this listening pcb at the head of the listening list */ + /* put this listening pcb at the head of the listening list */ tcp_listen_pcbs.listen_pcbs = lpcb; } else { TCP_STATS_INC(tcp.cachehit); } LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); - tcp_listen_input(lpcb); +#ifdef LWIP_HOOK_TCP_INPACKET_PCB + if (LWIP_HOOK_TCP_INPACKET_PCB((struct tcp_pcb *)lpcb, tcphdr, tcphdr_optlen, + tcphdr_opt1len, tcphdr_opt2, p) == ERR_OK) +#endif + { + tcp_listen_input(lpcb); + } pbuf_free(p); return; } @@ -332,6 +391,13 @@ tcp_input(struct pbuf *p, struct netif *inp) #endif /* TCP_INPUT_DEBUG */ +#ifdef LWIP_HOOK_TCP_INPACKET_PCB + if ((pcb != NULL) && LWIP_HOOK_TCP_INPACKET_PCB(pcb, tcphdr, tcphdr_optlen, + tcphdr_opt1len, tcphdr_opt2, p) != ERR_OK) { + pbuf_free(p); + return; + } +#endif if (pcb != NULL) { /* The incoming segment belongs to a connection. */ #if TCP_INPUT_DEBUG @@ -355,7 +421,7 @@ tcp_input(struct pbuf *p, struct netif *inp) /* If there is data which was previously "refused" by upper layer */ if (pcb->refused_data != NULL) { if ((tcp_process_refused_data(pcb) == ERR_ABRT) || - ((pcb->refused_data != NULL) && (tcplen > 0))) { + ((pcb->refused_data != NULL) && (tcplen > 0))) { /* pcb has been aborted or refused data is still refused and the new segment contains data */ if (pcb->rcv_ann_wnd == 0) { @@ -380,7 +446,7 @@ tcp_input(struct pbuf *p, struct netif *inp) deallocate the PCB. */ TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST); tcp_pcb_remove(&tcp_active_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); + tcp_free(pcb); } else { err = ERR_OK; /* If the application has registered a "sent" function to be @@ -421,7 +487,6 @@ tcp_input(struct pbuf *p, struct netif *inp) if (pcb->flags & TF_RXCLOSED) { /* received data although already closed -> abort (send RST) to notify the remote host that not all data has been processed */ - pbuf_free(recv_data); #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE if (rest != NULL) { pbuf_free(rest); @@ -434,6 +499,8 @@ tcp_input(struct pbuf *p, struct netif *inp) /* Notify application that data has been received. */ TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); if (err == ERR_ABRT) { + /* pbuf has been freed by the application */ + recv_data = NULL; #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE if (rest != NULL) { pbuf_free(rest); @@ -450,12 +517,19 @@ tcp_input(struct pbuf *p, struct netif *inp) } #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ pcb->refused_data = recv_data; + /* We keep incoming packet, so pbuf must not be freed */ + recv_data = NULL; LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n")); #if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE break; +#endif } else { +#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE /* Upper layer received the data, go on with the rest if > 64K */ recv_data = rest; +#else + /* Upper layer received the data, pbuf has already been freed */ + recv_data = NULL; #endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ } } @@ -496,24 +570,28 @@ tcp_input(struct pbuf *p, struct netif *inp) Below this line, 'pcb' may not be dereferenced! */ aborted: tcp_input_pcb = NULL; - recv_data = NULL; + /* Release the received data, if not already done */ + if (recv_data != NULL) + { + pbuf_free(recv_data); + recv_data = NULL; + } + /* give up our reference to inseg.p */ - if (inseg.p != NULL) - { + if (inseg.p != NULL) { pbuf_free(inseg.p); inseg.p = NULL; } } else { - /* If no matching PCB was found, send a TCP RST (reset) to the sender. */ LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n")); if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { TCP_STATS_INC(tcp.proterr); TCP_STATS_INC(tcp.drop); - tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), - ip_current_src_addr(), tcphdr->dest, tcphdr->src); + tcp_rst(NULL, ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); } pbuf_free(p); } @@ -535,6 +613,8 @@ dropped: static int tcp_input_delayed_close(struct tcp_pcb *pcb) { + LWIP_ASSERT("tcp_input_delayed_close: invalid pcb", pcb != NULL); + if (recv_flags & TF_CLOSED) { /* The connection has been closed and we will deallocate the PCB. */ @@ -545,7 +625,7 @@ tcp_input_delayed_close(struct tcp_pcb *pcb) TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD); } tcp_pcb_remove(&tcp_active_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); + tcp_free(pcb); return 1; } return 0; @@ -572,14 +652,16 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) return; } + LWIP_ASSERT("tcp_listen_input: invalid pcb", pcb != NULL); + /* In the LISTEN state, we check for incoming SYN segments, creates a new PCB, and responds with a SYN|ACK. */ if (flags & TCP_ACK) { /* For incoming segments with the ACK flag set, respond with a RST. */ LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); - tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), - ip_current_src_addr(), tcphdr->dest, tcphdr->src); + tcp_rst((const struct tcp_pcb *)pcb, ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); } else if (flags & TCP_SYN) { LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest)); #if TCP_LISTEN_BACKLOG @@ -602,7 +684,7 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) } #if TCP_LISTEN_BACKLOG pcb->accepts_pending++; - npcb->flags |= TF_BACKLOGPEND; + tcp_set_flags(npcb, TF_BACKLOGPEND); #endif /* TCP_LISTEN_BACKLOG */ /* Set up the new PCB. */ ip_addr_copy(npcb->local_ip, *ip_current_dest_addr()); @@ -624,6 +706,7 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) #endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */ /* inherit socket options */ npcb->so_options = pcb->so_options & SOF_INHERITED; + npcb->netif_idx = pcb->netif_idx; /* Register the new PCB so that we can begin receiving segments for it. */ TCP_REG_ACTIVE(npcb); @@ -639,6 +722,13 @@ tcp_listen_input(struct tcp_pcb_listen *pcb) MIB2_STATS_INC(mib2.tcppassiveopens); +#if LWIP_TCP_PCB_NUM_EXT_ARGS + if (tcp_ext_arg_invoke_callbacks_passive_open(pcb, npcb) != ERR_OK) { + tcp_abandon(npcb, 0); + return; + } +#endif + /* Send a SYN|ACK together with the MSS option. */ rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK); if (rc != ERR_OK) { @@ -670,14 +760,17 @@ tcp_timewait_input(struct tcp_pcb *pcb) if (flags & TCP_RST) { return; } + + LWIP_ASSERT("tcp_timewait_input: invalid pcb", pcb != NULL); + /* - fourth, check the SYN bit, */ if (flags & TCP_SYN) { /* If an incoming segment is not acceptable, an acknowledgment should be sent in reply */ if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) { /* If the SYN is in the window it is an error, send a reset */ - tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), - ip_current_src_addr(), tcphdr->dest, tcphdr->src); + tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); return; } } else if (flags & TCP_FIN) { @@ -688,7 +781,7 @@ tcp_timewait_input(struct tcp_pcb *pcb) if ((tcplen > 0)) { /* Acknowledge data, FIN or out-of-window SYN */ - pcb->flags |= TF_ACK_NOW; + tcp_ack_now(pcb); tcp_output(pcb); } return; @@ -714,6 +807,8 @@ tcp_process(struct tcp_pcb *pcb) err = ERR_OK; + LWIP_ASSERT("tcp_process: invalid pcb", pcb != NULL); + /* Process incoming RST segments. */ if (flags & TCP_RST) { /* First, determine if the reset is acceptable. */ @@ -730,10 +825,10 @@ tcp_process(struct tcp_pcb *pcb) acceptable = 1; } else if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) { - /* If the sequence number is inside the window, we only send an ACK + /* If the sequence number is inside the window, we send a challenge ACK and wait for a re-send with matching sequence number. - This violates RFC 793, but is required to protection against - CVE-2004-0230 (RST spoofing attack). */ + This follows RFC 5961 section 3.2 and addresses CVE-2004-0230 + (RST spoofing attack), which is present in RFC 793 RST handling. */ tcp_ack_now(pcb); } } @@ -742,13 +837,13 @@ tcp_process(struct tcp_pcb *pcb) LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); recv_flags |= TF_RESET; - pcb->flags &= ~TF_ACK_DELAY; + tcp_clear_flags(pcb, TF_ACK_DELAY); return ERR_RST; } else { LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", - seqno, pcb->rcv_nxt)); + seqno, pcb->rcv_nxt)); LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", - seqno, pcb->rcv_nxt)); + seqno, pcb->rcv_nxt)); return ERR_OK; } } @@ -764,198 +859,199 @@ tcp_process(struct tcp_pcb *pcb) pcb->tmr = tcp_ticks; } pcb->keep_cnt_sent = 0; + pcb->persist_probe = 0; tcp_parseopt(pcb); /* Do different things depending on the TCP state. */ switch (pcb->state) { - case SYN_SENT: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno, - pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno))); - /* received SYN ACK with expected sequence number? */ - if ((flags & TCP_ACK) && (flags & TCP_SYN) - && (ackno == pcb->lastack + 1)) { - pcb->rcv_nxt = seqno + 1; - pcb->rcv_ann_right_edge = pcb->rcv_nxt; - pcb->lastack = ackno; - pcb->snd_wnd = tcphdr->wnd; - pcb->snd_wnd_max = pcb->snd_wnd; - pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ - pcb->state = ESTABLISHED; + case SYN_SENT: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %s %"U32_F"\n", + ackno, pcb->snd_nxt, pcb->unacked ? "" : " empty:", + pcb->unacked ? lwip_ntohl(pcb->unacked->tcphdr->seqno) : 0)); + /* received SYN ACK with expected sequence number? */ + if ((flags & TCP_ACK) && (flags & TCP_SYN) + && (ackno == pcb->lastack + 1)) { + pcb->rcv_nxt = seqno + 1; + pcb->rcv_ann_right_edge = pcb->rcv_nxt; + pcb->lastack = ackno; + pcb->snd_wnd = tcphdr->wnd; + pcb->snd_wnd_max = pcb->snd_wnd; + pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ + pcb->state = ESTABLISHED; #if TCP_CALCULATE_EFF_SEND_MSS - pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip); + pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip); #endif /* TCP_CALCULATE_EFF_SEND_MSS */ - pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F - " ssthresh %"TCPWNDSIZE_F"\n", - pcb->cwnd, pcb->ssthresh)); - LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); - --pcb->snd_queuelen; - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen)); - rseg = pcb->unacked; - if (rseg == NULL) { - /* might happen if tcp_output fails in tcp_rexmit_rto() - in which case the segment is on the unsent list */ - rseg = pcb->unsent; - LWIP_ASSERT("no segment to free", rseg != NULL); - pcb->unsent = rseg->next; - } else { - pcb->unacked = rseg->next; - } - tcp_seg_free(rseg); - - /* If there's nothing left to acknowledge, stop the retransmit - timer, otherwise reset it to start again */ - if (pcb->unacked == NULL) { - pcb->rtime = -1; - } else { - pcb->rtime = 0; - pcb->nrtx = 0; - } - - /* Call the user specified function to call when successfully - * connected. */ - TCP_EVENT_CONNECTED(pcb, ERR_OK, err); - if (err == ERR_ABRT) { - return ERR_ABRT; - } - tcp_ack_now(pcb); - } - /* received ACK? possibly a half-open connection */ - else if (flags & TCP_ACK) { - /* send a RST to bring the other side in a non-synchronized state. */ - tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), - ip_current_src_addr(), tcphdr->dest, tcphdr->src); - /* Resend SYN immediately (don't wait for rto timeout) to establish - connection faster, but do not send more SYNs than we otherwise would - have, or we might get caught in a loop on loopback interfaces. */ - if (pcb->nrtx < TCP_SYNMAXRTX) { - pcb->rtime = 0; - tcp_rexmit_rto(pcb); - } - } - break; - case SYN_RCVD: - if (flags & TCP_ACK) { - /* expected ACK number? */ - if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { - pcb->state = ESTABLISHED; - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); -#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG -#if LWIP_CALLBACK_API - LWIP_ASSERT("pcb->listener->accept != NULL", - (pcb->listener == NULL) || (pcb->listener->accept != NULL)); -#endif - if (pcb->listener == NULL) { - /* listen pcb might be closed by now */ - err = ERR_VAL; - } else -#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */ - { - tcp_backlog_accepted(pcb); - /* Call the accept function. */ - TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err); - } - if (err != ERR_OK) { - /* If the accept function returns with an error, we abort - * the connection. */ - /* Already aborted? */ - if (err != ERR_ABRT) { - tcp_abort(pcb); - } - return ERR_ABRT; - } - /* If there was any data contained within this ACK, - * we'd better pass it on to the application as well. */ - tcp_receive(pcb); - - /* Prevent ACK for SYN to generate a sent event */ - if (recv_acked != 0) { - recv_acked--; - } - pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SENT): cwnd %"TCPWNDSIZE_F " ssthresh %"TCPWNDSIZE_F"\n", pcb->cwnd, pcb->ssthresh)); - - if (recv_flags & TF_GOT_FIN) { - tcp_ack_now(pcb); - pcb->state = CLOSE_WAIT; + LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); + --pcb->snd_queuelen; + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"TCPWNDSIZE_F"\n", (tcpwnd_size_t)pcb->snd_queuelen)); + rseg = pcb->unacked; + if (rseg == NULL) { + /* might happen if tcp_output fails in tcp_rexmit_rto() + in which case the segment is on the unsent list */ + rseg = pcb->unsent; + LWIP_ASSERT("no segment to free", rseg != NULL); + pcb->unsent = rseg->next; + } else { + pcb->unacked = rseg->next; } - } else { - /* incorrect ACK number, send RST */ - tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), - ip_current_src_addr(), tcphdr->dest, tcphdr->src); + tcp_seg_free(rseg); + + /* If there's nothing left to acknowledge, stop the retransmit + timer, otherwise reset it to start again */ + if (pcb->unacked == NULL) { + pcb->rtime = -1; + } else { + pcb->rtime = 0; + pcb->nrtx = 0; + } + + /* Call the user specified function to call when successfully + * connected. */ + TCP_EVENT_CONNECTED(pcb, ERR_OK, err); + if (err == ERR_ABRT) { + return ERR_ABRT; + } + tcp_ack_now(pcb); } - } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { - /* Looks like another copy of the SYN - retransmit our SYN-ACK */ - tcp_rexmit(pcb); - } - break; - case CLOSE_WAIT: + /* received ACK? possibly a half-open connection */ + else if (flags & TCP_ACK) { + /* send a RST to bring the other side in a non-synchronized state. */ + tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); + /* Resend SYN immediately (don't wait for rto timeout) to establish + connection faster, but do not send more SYNs than we otherwise would + have, or we might get caught in a loop on loopback interfaces. */ + if (pcb->nrtx < TCP_SYNMAXRTX) { + pcb->rtime = 0; + tcp_rexmit_rto(pcb); + } + } + break; + case SYN_RCVD: + if (flags & TCP_ACK) { + /* expected ACK number? */ + if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) { + pcb->state = ESTABLISHED; + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); +#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG + if (pcb->listener == NULL) { + /* listen pcb might be closed by now */ + err = ERR_VAL; + } else +#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */ + { +#if LWIP_CALLBACK_API + LWIP_ASSERT("pcb->listener->accept != NULL", pcb->listener->accept != NULL); +#endif + tcp_backlog_accepted(pcb); + /* Call the accept function. */ + TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err); + } + if (err != ERR_OK) { + /* If the accept function returns with an error, we abort + * the connection. */ + /* Already aborted? */ + if (err != ERR_ABRT) { + tcp_abort(pcb); + } + return ERR_ABRT; + } + /* If there was any data contained within this ACK, + * we'd better pass it on to the application as well. */ + tcp_receive(pcb); + + /* Prevent ACK for SYN to generate a sent event */ + if (recv_acked != 0) { + recv_acked--; + } + + pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss); + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_process (SYN_RCVD): cwnd %"TCPWNDSIZE_F + " ssthresh %"TCPWNDSIZE_F"\n", + pcb->cwnd, pcb->ssthresh)); + + if (recv_flags & TF_GOT_FIN) { + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + } else { + /* incorrect ACK number, send RST */ + tcp_rst(pcb, ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); + } + } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { + /* Looks like another copy of the SYN - retransmit our SYN-ACK */ + tcp_rexmit(pcb); + } + break; + case CLOSE_WAIT: /* FALLTHROUGH */ - case ESTABLISHED: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { /* passive close */ - tcp_ack_now(pcb); - pcb->state = CLOSE_WAIT; - } - break; - case FIN_WAIT_1: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { - if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && - pcb->unsent == NULL) { - LWIP_DEBUGF(TCP_DEBUG, - ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + case ESTABLISHED: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { /* passive close */ + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + break; + case FIN_WAIT_1: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && + pcb->unsent == NULL) { + LWIP_DEBUGF(TCP_DEBUG, + ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_ack_now(pcb); + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } else { + tcp_ack_now(pcb); + pcb->state = CLOSING; + } + } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && + pcb->unsent == NULL) { + pcb->state = FIN_WAIT_2; + } + break; + case FIN_WAIT_2: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); tcp_ack_now(pcb); tcp_pcb_purge(pcb); TCP_RMV_ACTIVE(pcb); pcb->state = TIME_WAIT; TCP_REG(&tcp_tw_pcbs, pcb); - } else { - tcp_ack_now(pcb); - pcb->state = CLOSING; } - } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) && - pcb->unsent == NULL) { - pcb->state = FIN_WAIT_2; - } - break; - case FIN_WAIT_2: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - tcp_ack_now(pcb); - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } - break; - case CLOSING: - tcp_receive(pcb); - if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } - break; - case LAST_ACK: - tcp_receive(pcb); - if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ - recv_flags |= TF_CLOSED; - } - break; - default: - break; + break; + case CLOSING: + tcp_receive(pcb); + if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } + break; + case LAST_ACK: + tcp_receive(pcb); + if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ + recv_flags |= TF_CLOSED; + } + break; + default: + break; } return ERR_OK; } @@ -971,6 +1067,8 @@ tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) { struct tcp_seg *old_seg; + LWIP_ASSERT("tcp_oos_insert_segment: invalid cseg", cseg != NULL); + if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { /* received segment overlaps all following segments */ tcp_segs_free(next); @@ -980,7 +1078,7 @@ tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) oos queue may have segments with FIN flag */ while (next && TCP_SEQ_GEQ((seqno + cseg->len), - (next->tcphdr->seqno + next->len))) { + (next->tcphdr->seqno + next->len))) { /* cseg with FIN already processed */ if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN); @@ -1000,6 +1098,48 @@ tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) } #endif /* TCP_QUEUE_OOSEQ */ +/** Remove segments from a list if the incoming ACK acknowledges them */ +static struct tcp_seg * +tcp_free_acked_segments(struct tcp_pcb *pcb, struct tcp_seg *seg_list, const char *dbg_list_name, + struct tcp_seg *dbg_other_seg_list) +{ + struct tcp_seg *next; + u16_t clen; + + LWIP_UNUSED_ARG(dbg_list_name); + LWIP_UNUSED_ARG(dbg_other_seg_list); + + while (seg_list != NULL && + TCP_SEQ_LEQ(lwip_ntohl(seg_list->tcphdr->seqno) + + TCP_TCPLEN(seg_list), ackno)) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->%s\n", + lwip_ntohl(seg_list->tcphdr->seqno), + lwip_ntohl(seg_list->tcphdr->seqno) + TCP_TCPLEN(seg_list), + dbg_list_name)); + + next = seg_list; + seg_list = seg_list->next; + + clen = pbuf_clen(next->p); + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ", + (tcpwnd_size_t)pcb->snd_queuelen)); + LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= clen)); + + pcb->snd_queuelen = (u16_t)(pcb->snd_queuelen - clen); + recv_acked = (tcpwnd_size_t)(recv_acked + next->len); + tcp_seg_free(next); + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing %s)\n", + (tcpwnd_size_t)pcb->snd_queuelen, + dbg_list_name)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_receive: valid queue length", + seg_list != NULL || dbg_other_seg_list != NULL); + } + } + return seg_list; +} + /** * Called by tcp_process. Checks if the given segment is an ACK for outstanding * data, and if so frees the memory of the buffered data. Next, it places the @@ -1015,20 +1155,11 @@ tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) static void tcp_receive(struct tcp_pcb *pcb) { - struct tcp_seg *next; -#if TCP_QUEUE_OOSEQ - struct tcp_seg *prev, *cseg; -#endif /* TCP_QUEUE_OOSEQ */ - s32_t off; s16_t m; u32_t right_wnd_edge; - u16_t new_tot_len; int found_dupack = 0; -#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS - u32_t ooseq_blen; - u16_t ooseq_qlen; -#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ + LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL); LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); if (flags & TCP_ACK) { @@ -1036,8 +1167,8 @@ tcp_receive(struct tcp_pcb *pcb) /* Update window. */ if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || - (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || - (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) { + (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || + (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) { pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd); /* keep track of the biggest window announced by the remote host to calculate the maximum segment size */ @@ -1046,16 +1177,6 @@ tcp_receive(struct tcp_pcb *pcb) } pcb->snd_wl1 = seqno; pcb->snd_wl2 = ackno; - if (pcb->snd_wnd == 0) { - if (pcb->persist_backoff == 0) { - /* start persist timer */ - pcb->persist_cnt = 0; - pcb->persist_backoff = 1; - } - } else if (pcb->persist_backoff > 0) { - /* stop persist timer */ - pcb->persist_backoff = 0; - } LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"TCPWNDSIZE_F"\n", pcb->snd_wnd)); #if TCP_WND_DEBUG } else { @@ -1103,13 +1224,11 @@ tcp_receive(struct tcp_pcb *pcb) ++pcb->dupacks; } if (pcb->dupacks > 3) { - /* Inflate the congestion window, but not if it means that - the value overflows. */ - if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { - pcb->cwnd += pcb->mss; - } - } else if (pcb->dupacks == 3) { - /* Do fast retransmit */ + /* Inflate the congestion window */ + TCP_WND_INC(pcb->cwnd, pcb->mss); + } + if (pcb->dupacks >= 3) { + /* Do fast retransmit (checked via TF_INFR, not via dupacks count) */ tcp_rexmit_fast(pcb); } } @@ -1121,22 +1240,27 @@ tcp_receive(struct tcp_pcb *pcb) if (!found_dupack) { pcb->dupacks = 0; } - } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { + } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) { /* We come here when the ACK acknowledges new data. */ + tcpwnd_size_t acked; /* Reset the "IN Fast Retransmit" flag, since we are no longer in fast retransmit. Also reset the congestion window to the slow start threshold. */ if (pcb->flags & TF_INFR) { - pcb->flags &= ~TF_INFR; + tcp_clear_flags(pcb, TF_INFR); pcb->cwnd = pcb->ssthresh; + pcb->bytes_acked = 0; } /* Reset the number of retransmissions. */ pcb->nrtx = 0; /* Reset the retransmission time-out. */ - pcb->rto = (pcb->sa >> 3) + pcb->sv; + pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv); + + /* Record how much data this ACK acks */ + acked = (tcpwnd_size_t)(ackno - pcb->lastack); /* Reset the fast retransmit variables. */ pcb->dupacks = 0; @@ -1146,51 +1270,40 @@ tcp_receive(struct tcp_pcb *pcb) ssthresh). */ if (pcb->state >= ESTABLISHED) { if (pcb->cwnd < pcb->ssthresh) { - if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { - pcb->cwnd += pcb->mss; - } + tcpwnd_size_t increase; + /* limit to 1 SMSS segment during period following RTO */ + u8_t num_seg = (pcb->flags & TF_RTO) ? 1 : 2; + /* RFC 3465, section 2.2 Slow Start */ + increase = LWIP_MIN(acked, (tcpwnd_size_t)(num_seg * pcb->mss)); + TCP_WND_INC(pcb->cwnd, increase); LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd)); } else { - tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd); - if (new_cwnd > pcb->cwnd) { - pcb->cwnd = new_cwnd; + /* RFC 3465, section 2.1 Congestion Avoidance */ + TCP_WND_INC(pcb->bytes_acked, acked); + if (pcb->bytes_acked >= pcb->cwnd) { + pcb->bytes_acked = (tcpwnd_size_t)(pcb->bytes_acked - pcb->cwnd); + TCP_WND_INC(pcb->cwnd, pcb->mss); } LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"TCPWNDSIZE_F"\n", pcb->cwnd)); } } LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n", ackno, - pcb->unacked != NULL? - lwip_ntohl(pcb->unacked->tcphdr->seqno): 0, - pcb->unacked != NULL? - lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0)); + pcb->unacked != NULL ? + lwip_ntohl(pcb->unacked->tcphdr->seqno) : 0, + pcb->unacked != NULL ? + lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked) : 0)); /* Remove segment from the unacknowledged list if the incoming ACK acknowledges them. */ - while (pcb->unacked != NULL && - TCP_SEQ_LEQ(lwip_ntohl(pcb->unacked->tcphdr->seqno) + - TCP_TCPLEN(pcb->unacked), ackno)) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n", - lwip_ntohl(pcb->unacked->tcphdr->seqno), - lwip_ntohl(pcb->unacked->tcphdr->seqno) + - TCP_TCPLEN(pcb->unacked))); - - next = pcb->unacked; - pcb->unacked = pcb->unacked->next; - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ", (tcpwnd_size_t)pcb->snd_queuelen)); - LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); - - pcb->snd_queuelen -= pbuf_clen(next->p); - recv_acked += next->len; - tcp_seg_free(next); - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing unacked)\n", (tcpwnd_size_t)pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); - } - } + pcb->unacked = tcp_free_acked_segments(pcb, pcb->unacked, "unacked", pcb->unsent); + /* We go through the ->unsent list to see if any of the segments + on the list are acknowledged by the ACK. This may seem + strange since an "unsent" segment shouldn't be acked. The + rationale is that lwIP puts all outstanding segments on the + ->unsent list after a retransmission, so these segments may + in fact have been sent once. */ + pcb->unsent = tcp_free_acked_segments(pcb, pcb->unsent, "unsent", pcb->unacked); /* If there's nothing left to acknowledge, stop the retransmit timer, otherwise reset it to start again */ @@ -1202,55 +1315,41 @@ tcp_receive(struct tcp_pcb *pcb) pcb->polltmr = 0; +#if TCP_OVERSIZE + if (pcb->unsent == NULL) { + pcb->unsent_oversize = 0; + } +#endif /* TCP_OVERSIZE */ + #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS if (ip_current_is_v6()) { /* Inform neighbor reachability of forward progress. */ nd6_reachability_hint(ip6_current_src_addr()); } #endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/ + + pcb->snd_buf = (tcpwnd_size_t)(pcb->snd_buf + recv_acked); + /* check if this ACK ends our retransmission of in-flight data */ + if (pcb->flags & TF_RTO) { + /* RTO is done if + 1) both queues are empty or + 2) unacked is empty and unsent head contains data not part of RTO or + 3) unacked head contains data not part of RTO */ + if (pcb->unacked == NULL) { + if ((pcb->unsent == NULL) || + (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unsent->tcphdr->seqno)))) { + tcp_clear_flags(pcb, TF_RTO); + } + } else if (TCP_SEQ_LEQ(pcb->rto_end, lwip_ntohl(pcb->unacked->tcphdr->seqno))) { + tcp_clear_flags(pcb, TF_RTO); + } + } + /* End of ACK for new data processing. */ } else { /* Out of sequence ACK, didn't really ack anything */ tcp_send_empty_ack(pcb); } - /* We go through the ->unsent list to see if any of the segments - on the list are acknowledged by the ACK. This may seem - strange since an "unsent" segment shouldn't be acked. The - rationale is that lwIP puts all outstanding segments on the - ->unsent list after a retransmission, so these segments may - in fact have been sent once. */ - while (pcb->unsent != NULL && - TCP_SEQ_BETWEEN(ackno, lwip_ntohl(pcb->unsent->tcphdr->seqno) + - TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n", - lwip_ntohl(pcb->unsent->tcphdr->seqno), lwip_ntohl(pcb->unsent->tcphdr->seqno) + - TCP_TCPLEN(pcb->unsent))); - - next = pcb->unsent; - pcb->unsent = pcb->unsent->next; -#if TCP_OVERSIZE - if (pcb->unsent == NULL) { - pcb->unsent_oversize = 0; - } -#endif /* TCP_OVERSIZE */ - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"TCPWNDSIZE_F" ... ", (tcpwnd_size_t)pcb->snd_queuelen)); - LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); - /* Prevent ACK for FIN to generate a sent event */ - pcb->snd_queuelen -= pbuf_clen(next->p); - recv_acked += next->len; - tcp_seg_free(next); - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"TCPWNDSIZE_F" (after freeing unsent)\n", (tcpwnd_size_t)pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_receive: valid queue length", - pcb->unacked != NULL || pcb->unsent != NULL); - } - } - pcb->snd_buf += recv_acked; -#if SNDBUF_SHARE - sndbuf_len += recv_acked; -#endif - /* End of ACK for new data processing. */ - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n", pcb->rttest, pcb->rtseq, ackno)); @@ -1266,14 +1365,14 @@ tcp_receive(struct tcp_pcb *pcb) m, (u16_t)(m * TCP_SLOW_INTERVAL))); /* This is taken directly from VJs original code in his paper */ - m = m - (pcb->sa >> 3); - pcb->sa += m; + m = (s16_t)(m - (pcb->sa >> 3)); + pcb->sa = (s16_t)(pcb->sa + m); if (m < 0) { - m = -m; + m = (s16_t) - m; } - m = m - (pcb->sv >> 2); - pcb->sv += m; - pcb->rto = (pcb->sa >> 3) + pcb->sv; + m = (s16_t)(m - (pcb->sv >> 2)); + pcb->sv = (s16_t)(pcb->sv + m); + pcb->rto = (s16_t)((pcb->sa >> 3) + pcb->sv); LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n", pcb->rto, (u16_t)(pcb->rto * TCP_SLOW_INTERVAL))); @@ -1339,35 +1438,25 @@ tcp_receive(struct tcp_pcb *pcb) length.*/ struct pbuf *p = inseg.p; - off = pcb->rcv_nxt - seqno; + u32_t off32 = pcb->rcv_nxt - seqno; + u16_t new_tot_len, off; LWIP_ASSERT("inseg.p != NULL", inseg.p); - LWIP_ASSERT("insane offset!", (off < 0x7fff)); - if (inseg.p->len < off) { - LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); - new_tot_len = (u16_t)(inseg.p->tot_len - off); - while (p->len < off) { - off -= p->len; - /* KJM following line changed (with addition of new_tot_len var) - to fix bug #9076 - inseg.p->tot_len -= p->len; */ - p->tot_len = new_tot_len; - p->len = 0; - p = p->next; - } - if (pbuf_header(p, (s16_t)-off)) { - /* Do we need to cope with this failing? Assert for now */ - LWIP_ASSERT("pbuf_header failed", 0); - } - } else { - if (pbuf_header(inseg.p, (s16_t)-off)) { - /* Do we need to cope with this failing? Assert for now */ - LWIP_ASSERT("pbuf_header failed", 0); - } + LWIP_ASSERT("insane offset!", (off32 < 0xffff)); + off = (u16_t)off32; + LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); + inseg.len -= off; + new_tot_len = (u16_t)(inseg.p->tot_len - off); + while (p->len < off) { + off -= p->len; + /* all pbufs up to and including this one have len==0, so tot_len is equal */ + p->tot_len = new_tot_len; + p->len = 0; + p = p->next; } - inseg.len -= (u16_t)(pcb->rcv_nxt - seqno); + /* cannot fail... */ + pbuf_remove_header(p, off); inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; - } - else { + } else { if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) { /* the whole segment is < rcv_nxt */ /* must be a duplicate of a packet that has already been correctly handled */ @@ -1426,21 +1515,22 @@ tcp_receive(struct tcp_pcb *pcb) tcp_seg_free(old_ooseq); } } else { - next = pcb->ooseq; + struct tcp_seg *next = pcb->ooseq; /* Remove all segments on ooseq that are covered by inseg already. * FIN is copied from ooseq to inseg if present. */ while (next && TCP_SEQ_GEQ(seqno + tcplen, next->tcphdr->seqno + next->len)) { + struct tcp_seg *tmp; /* inseg cannot have FIN here (already processed above) */ if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 && (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN); tcplen = TCP_TCPLEN(&inseg); } - prev = next; + tmp = next; next = next->next; - tcp_seg_free(prev); + tcp_seg_free(tmp); } /* Now trim right side of inseg if it overlaps with the first * segment on ooseq */ @@ -1497,7 +1587,7 @@ tcp_receive(struct tcp_pcb *pcb) while (pcb->ooseq != NULL && pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { - cseg = pcb->ooseq; + struct tcp_seg *cseg = pcb->ooseq; seqno = pcb->ooseq->tcphdr->seqno; pcb->rcv_nxt += TCP_TCPLEN(cseg); @@ -1531,12 +1621,34 @@ tcp_receive(struct tcp_pcb *pcb) pcb->ooseq = cseg->next; tcp_seg_free(cseg); } +#if LWIP_TCP_SACK_OUT + if (pcb->flags & TF_SACK) { + if (pcb->ooseq != NULL) { + /* Some segments may have been removed from ooseq, let's remove all SACKs that + describe anything before the new beginning of that list. */ + tcp_remove_sacks_lt(pcb, pcb->ooseq->tcphdr->seqno); + } else if (LWIP_TCP_SACK_VALID(pcb, 0)) { + /* ooseq has been cleared. Nothing to SACK */ + memset(pcb->rcv_sacks, 0, sizeof(pcb->rcv_sacks)); + } + } +#endif /* LWIP_TCP_SACK_OUT */ #endif /* TCP_QUEUE_OOSEQ */ /* Acknowledge the segment(s). */ tcp_ack(pcb); +#if LWIP_TCP_SACK_OUT + if (LWIP_TCP_SACK_VALID(pcb, 0)) { + /* Normally the ACK for the data received could be piggy-backed on a data packet, + but lwIP currently does not support including SACKs in data packets. So we force + it to respond with an empty ACK packet (only if there is at least one SACK to be sent). + NOTE: tcp_send_empty_ack() on success clears the ACK flags (set by tcp_ack()) */ + tcp_send_empty_ack(pcb); + } +#endif /* LWIP_TCP_SACK_OUT */ + #if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS if (ip_current_is_v6()) { /* Inform neighbor reachability of forward progress. */ @@ -1546,11 +1658,18 @@ tcp_receive(struct tcp_pcb *pcb) } else { /* We get here if the incoming segment is out-of-sequence. */ - tcp_send_empty_ack(pcb); + #if TCP_QUEUE_OOSEQ /* We queue the segment on the ->ooseq queue. */ if (pcb->ooseq == NULL) { pcb->ooseq = tcp_seg_copy(&inseg); +#if LWIP_TCP_SACK_OUT + if (pcb->flags & TF_SACK) { + /* All the SACKs should be invalid, so we can simply store the most recent one: */ + pcb->rcv_sacks[0].left = seqno; + pcb->rcv_sacks[0].right = seqno + inseg.len; + } +#endif /* LWIP_TCP_SACK_OUT */ } else { /* If the queue is not empty, we walk through the queue and try to find a place where the sequence number of the @@ -1564,7 +1683,12 @@ tcp_receive(struct tcp_pcb *pcb) segment on the ->ooseq queue, we discard the segment that contains less data. */ - prev = NULL; +#if LWIP_TCP_SACK_OUT + /* This is the left edge of the lowest possible SACK range. + It may start before the newly received segment (possibly adjusted below). */ + u32_t sackbeg = TCP_SEQ_LT(seqno, pcb->ooseq->tcphdr->seqno) ? seqno : pcb->ooseq->tcphdr->seqno; +#endif /* LWIP_TCP_SACK_OUT */ + struct tcp_seg *next, *prev = NULL; for (next = pcb->ooseq; next != NULL; next = next->next) { if (seqno == next->tcphdr->seqno) { /* The sequence number of the incoming segment is the @@ -1575,7 +1699,7 @@ tcp_receive(struct tcp_pcb *pcb) /* The incoming segment is larger than the old segment. We replace some segments with the new one. */ - cseg = tcp_seg_copy(&inseg); + struct tcp_seg *cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { if (prev != NULL) { prev->next = cseg; @@ -1598,7 +1722,7 @@ tcp_receive(struct tcp_pcb *pcb) than the sequence number of the first segment on the queue. We put the incoming segment first on the queue. */ - cseg = tcp_seg_copy(&inseg); + struct tcp_seg *cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { pcb->ooseq = cseg; tcp_oos_insert_segment(cseg, next); @@ -1608,13 +1732,13 @@ tcp_receive(struct tcp_pcb *pcb) } else { /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) && TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/ - if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) { + if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno + 1, next->tcphdr->seqno - 1)) { /* The sequence number of the incoming segment is in between the sequence numbers of the previous and the next segment on ->ooseq. We trim trim the previous segment, delete next segments that included in received segment and trim received, if needed. */ - cseg = tcp_seg_copy(&inseg); + struct tcp_seg *cseg = tcp_seg_copy(&inseg); if (cseg != NULL) { if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { /* We need to trim the prev segment. */ @@ -1627,6 +1751,20 @@ tcp_receive(struct tcp_pcb *pcb) break; } } + +#if LWIP_TCP_SACK_OUT + /* The new segment goes after the 'next' one. If there is a "hole" in sequence numbers + between 'prev' and the beginning of 'next', we want to move sackbeg. */ + if (prev != NULL && prev->tcphdr->seqno + prev->len != next->tcphdr->seqno) { + sackbeg = next->tcphdr->seqno; + } +#endif /* LWIP_TCP_SACK_OUT */ + + /* We don't use 'prev' below, so let's set it to current 'next'. + This way even if we break the loop below, 'prev' will be pointing + at the segment right in front of the newly added one. */ + prev = next; + /* If the "next" segment is the last segment on the ooseq queue, we add the incoming segment to the end of the list. */ @@ -1665,35 +1803,88 @@ tcp_receive(struct tcp_pcb *pcb) break; } } - prev = next; + } + +#if LWIP_TCP_SACK_OUT + if (pcb->flags & TF_SACK) { + if (prev == NULL) { + /* The new segment is at the beginning. sackbeg should already be set properly. + We need to find the right edge. */ + next = pcb->ooseq; + } else if (prev->next != NULL) { + /* The new segment was added after 'prev'. If there is a "hole" between 'prev' and 'prev->next', + we need to move sackbeg. After that we should find the right edge. */ + next = prev->next; + if (prev->tcphdr->seqno + prev->len != next->tcphdr->seqno) { + sackbeg = next->tcphdr->seqno; + } + } else { + next = NULL; + } + if (next != NULL) { + u32_t sackend = next->tcphdr->seqno; + for ( ; (next != NULL) && (sackend == next->tcphdr->seqno); next = next->next) { + sackend += next->len; + } + tcp_add_sack(pcb, sackbeg, sackend); + } + } +#endif /* LWIP_TCP_SACK_OUT */ + } +#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT) + { + /* Check that the data on ooseq doesn't exceed one of the limits + and throw away everything above that limit. */ +#ifdef TCP_OOSEQ_BYTES_LIMIT + const u32_t ooseq_max_blen = TCP_OOSEQ_BYTES_LIMIT(pcb); + u32_t ooseq_blen = 0; +#endif +#ifdef TCP_OOSEQ_PBUFS_LIMIT + const u16_t ooseq_max_qlen = TCP_OOSEQ_PBUFS_LIMIT(pcb); + u16_t ooseq_qlen = 0; +#endif + struct tcp_seg *next, *prev = NULL; + for (next = pcb->ooseq; next != NULL; prev = next, next = next->next) { + struct pbuf *p = next->p; + int stop_here = 0; +#ifdef TCP_OOSEQ_BYTES_LIMIT + ooseq_blen += p->tot_len; + if (ooseq_blen > ooseq_max_blen) { + stop_here = 1; + } +#endif +#ifdef TCP_OOSEQ_PBUFS_LIMIT + ooseq_qlen += pbuf_clen(p); + if (ooseq_qlen > ooseq_max_qlen) { + stop_here = 1; + } +#endif + if (stop_here) { +#if LWIP_TCP_SACK_OUT + if (pcb->flags & TF_SACK) { + /* Let's remove all SACKs from next's seqno up. */ + tcp_remove_sacks_gt(pcb, next->tcphdr->seqno); + } +#endif /* LWIP_TCP_SACK_OUT */ + /* too much ooseq data, dump this and everything after it */ + tcp_segs_free(next); + if (prev == NULL) { + /* first ooseq segment is too much, dump the whole queue */ + pcb->ooseq = NULL; + } else { + /* just dump 'next' and everything after it */ + prev->next = NULL; + } + break; + } } } -#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS - /* Check that the data on ooseq doesn't exceed one of the limits - and throw away everything above that limit. */ - ooseq_blen = 0; - ooseq_qlen = 0; - prev = NULL; - for (next = pcb->ooseq; next != NULL; prev = next, next = next->next) { - struct pbuf *p = next->p; - ooseq_blen += p->tot_len; - ooseq_qlen += pbuf_clen(p); - if ((ooseq_blen > TCP_OOSEQ_MAX_BYTES) || - (ooseq_qlen > TCP_OOSEQ_MAX_PBUFS)) { - /* too much ooseq data, dump this and everything after it */ - tcp_segs_free(next); - if (prev == NULL) { - /* first ooseq segment is too much, dump the whole queue */ - pcb->ooseq = NULL; - } else { - /* just dump 'next' and everything after it */ - prev->next = NULL; - } - break; - } - } -#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ +#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */ #endif /* TCP_QUEUE_OOSEQ */ + + /* We send the ACK packet after we've (potentially) dealt with SACKs, + so they can be included in the acknowledgment. */ + tcp_send_empty_ack(pcb); } } else { /* The incoming segment is not within the window. */ @@ -1709,13 +1900,14 @@ tcp_receive(struct tcp_pcb *pcb) } static u8_t -tcp_getoptbyte(void) +tcp_get_next_optbyte(void) { - if ((tcphdr_opt2 == NULL) || (tcp_optidx < tcphdr_opt1len)) { - u8_t* opts = (u8_t *)tcphdr + TCP_HLEN; - return opts[tcp_optidx++]; + u16_t optidx = tcp_optidx++; + if ((tcphdr_opt2 == NULL) || (optidx < tcphdr_opt1len)) { + u8_t *opts = (u8_t *)tcphdr + TCP_HLEN; + return opts[optidx]; } else { - u8_t idx = (u8_t)(tcp_optidx++ - tcphdr_opt1len); + u8_t idx = (u8_t)(optidx - tcphdr_opt1len); return tcphdr_opt2[idx]; } } @@ -1737,95 +1929,112 @@ tcp_parseopt(struct tcp_pcb *pcb) u32_t tsval; #endif + LWIP_ASSERT("tcp_parseopt: invalid pcb", pcb != NULL); + /* Parse the TCP MSS option, if present. */ if (tcphdr_optlen != 0) { for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) { - u8_t opt = tcp_getoptbyte(); + u8_t opt = tcp_get_next_optbyte(); switch (opt) { - case LWIP_TCP_OPT_EOL: - /* End of options. */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); - return; - case LWIP_TCP_OPT_NOP: - /* NOP option. */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); - break; - case LWIP_TCP_OPT_MSS: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); - if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) { - /* Bad length */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + case LWIP_TCP_OPT_EOL: + /* End of options. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); return; - } - /* An MSS option with the right option length. */ - mss = (tcp_getoptbyte() << 8); - mss |= tcp_getoptbyte(); - /* Limit the mss to the configured TCP_MSS and prevent division by zero */ - pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; - break; -#if LWIP_WND_SCALE - case LWIP_TCP_OPT_WS: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: WND_SCALE\n")); - if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > tcphdr_optlen) { - /* Bad length */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - return; - } - /* An WND_SCALE option with the right option length. */ - data = tcp_getoptbyte(); - /* If syn was received with wnd scale option, - activate wnd scale opt, but only if this is not a retransmission */ - if ((flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) { - pcb->snd_scale = data; - if (pcb->snd_scale > 14U) { - pcb->snd_scale = 14U; + case LWIP_TCP_OPT_NOP: + /* NOP option. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); + break; + case LWIP_TCP_OPT_MSS: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); + if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; } - pcb->rcv_scale = TCP_RCV_SCALE; - pcb->flags |= TF_WND_SCALE; - /* window scaling is enabled, we can use the full receive window */ - LWIP_ASSERT("window not at default value", pcb->rcv_wnd == TCPWND_MIN16(TCP_WND)); - LWIP_ASSERT("window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND)); - pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND; - } - break; -#endif + /* An MSS option with the right option length. */ + mss = (u16_t)(tcp_get_next_optbyte() << 8); + mss |= tcp_get_next_optbyte(); + /* Limit the mss to the configured TCP_MSS and prevent division by zero */ + pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; + break; +#if LWIP_WND_SCALE + case LWIP_TCP_OPT_WS: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: WND_SCALE\n")); + if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > tcphdr_optlen) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* An WND_SCALE option with the right option length. */ + data = tcp_get_next_optbyte(); + /* If syn was received with wnd scale option, + activate wnd scale opt, but only if this is not a retransmission */ + if ((flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) { + pcb->snd_scale = data; + if (pcb->snd_scale > 14U) { + pcb->snd_scale = 14U; + } + pcb->rcv_scale = TCP_RCV_SCALE; + tcp_set_flags(pcb, TF_WND_SCALE); + /* window scaling is enabled, we can use the full receive window */ + LWIP_ASSERT("window not at default value", pcb->rcv_wnd == TCPWND_MIN16(TCP_WND)); + LWIP_ASSERT("window not at default value", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND)); + pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND; + } + break; +#endif /* LWIP_WND_SCALE */ #if LWIP_TCP_TIMESTAMPS - case LWIP_TCP_OPT_TS: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); - if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > tcphdr_optlen) { - /* Bad length */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - return; - } - /* TCP timestamp option with valid length */ - tsval = tcp_getoptbyte(); - tsval |= (tcp_getoptbyte() << 8); - tsval |= (tcp_getoptbyte() << 16); - tsval |= (tcp_getoptbyte() << 24); - if (flags & TCP_SYN) { - pcb->ts_recent = lwip_ntohl(tsval); - /* Enable sending timestamps in every segment now that we know - the remote host supports it. */ - pcb->flags |= TF_TIMESTAMP; - } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) { - pcb->ts_recent = lwip_ntohl(tsval); - } - /* Advance to next option (6 bytes already read) */ - tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6; - break; -#endif - default: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); - data = tcp_getoptbyte(); - if (data < 2) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - /* If the length field is zero, the options are malformed - and we don't process them further. */ - return; - } - /* All other options have a length field, so that we easily - can skip past them. */ - tcp_optidx += data - 2; + case LWIP_TCP_OPT_TS: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); + if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > tcphdr_optlen) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* TCP timestamp option with valid length */ + tsval = tcp_get_next_optbyte(); + tsval |= (tcp_get_next_optbyte() << 8); + tsval |= (tcp_get_next_optbyte() << 16); + tsval |= (tcp_get_next_optbyte() << 24); + if (flags & TCP_SYN) { + pcb->ts_recent = lwip_ntohl(tsval); + /* Enable sending timestamps in every segment now that we know + the remote host supports it. */ + tcp_set_flags(pcb, TF_TIMESTAMP); + } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno + tcplen)) { + pcb->ts_recent = lwip_ntohl(tsval); + } + /* Advance to next option (6 bytes already read) */ + tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6; + break; +#endif /* LWIP_TCP_TIMESTAMPS */ +#if LWIP_TCP_SACK_OUT + case LWIP_TCP_OPT_SACK_PERM: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: SACK_PERM\n")); + if (tcp_get_next_optbyte() != LWIP_TCP_OPT_LEN_SACK_PERM || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_SACK_PERM) > tcphdr_optlen) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* TCP SACK_PERM option with valid length */ + if (flags & TCP_SYN) { + /* We only set it if we receive it in a SYN (or SYN+ACK) packet */ + tcp_set_flags(pcb, TF_SACK); + } + break; +#endif /* LWIP_TCP_SACK_OUT */ + default: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); + data = tcp_get_next_optbyte(); + if (data < 2) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + /* If the length field is zero, the options are malformed + and we don't process them further. */ + return; + } + /* All other options have a length field, so that we easily + can skip past them. */ + tcp_optidx += data - 2; } } } @@ -1837,4 +2046,148 @@ tcp_trigger_input_pcb_close(void) recv_flags |= TF_CLOSED; } +#if LWIP_TCP_SACK_OUT +/** + * Called by tcp_receive() to add new SACK entry. + * + * The new SACK entry will be placed at the beginning of rcv_sacks[], as the newest one. + * Existing SACK entries will be "pushed back", to preserve their order. + * This is the behavior described in RFC 2018, section 4. + * + * @param pcb the tcp_pcb for which a segment arrived + * @param left the left side of the SACK (the first sequence number) + * @param right the right side of the SACK (the first sequence number past this SACK) + */ +static void +tcp_add_sack(struct tcp_pcb *pcb, u32_t left, u32_t right) +{ + u8_t i; + u8_t unused_idx; + + if ((pcb->flags & TF_SACK) == 0 || !TCP_SEQ_LT(left, right)) { + return; + } + + /* First, let's remove all SACKs that are no longer needed (because they overlap with the newest one), + while moving all other SACKs forward. + We run this loop for all entries, until we find the first invalid one. + There is no point checking after that. */ + for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) { + /* We only want to use SACK at [i] if it doesn't overlap with left:right range. + It does not overlap if its right side is before the newly added SACK, + or if its left side is after the newly added SACK. + NOTE: The equality should not really happen, but it doesn't hurt. */ + if (TCP_SEQ_LEQ(pcb->rcv_sacks[i].right, left) || TCP_SEQ_LEQ(right, pcb->rcv_sacks[i].left)) { + if (unused_idx != i) { + /* We don't need to copy if it's already in the right spot */ + pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i]; + } + ++unused_idx; + } + } + + /* Now 'unused_idx' is the index of the first invalid SACK entry, + anywhere between 0 (no valid entries) and LWIP_TCP_MAX_SACK_NUM (all entries are valid). + We want to clear this and all following SACKs. + However, we will be adding another one in the front (and shifting everything else back). + So let's just iterate from the back, and set each entry to the one to the left if it's valid, + or to 0 if it is not. */ + for (i = LWIP_TCP_MAX_SACK_NUM - 1; i > 0; --i) { + /* [i] is the index we are setting, and the value should be at index [i-1], + or 0 if that index is unused (>= unused_idx). */ + if (i - 1 >= unused_idx) { + /* [i-1] is unused. Let's clear [i]. */ + pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0; + } else { + pcb->rcv_sacks[i] = pcb->rcv_sacks[i - 1]; + } + } + + /* And now we can store the newest SACK */ + pcb->rcv_sacks[0].left = left; + pcb->rcv_sacks[0].right = right; +} + +/** + * Called to remove a range of SACKs. + * + * SACK entries will be removed or adjusted to not acknowledge any sequence + * numbers that are less than 'seq' passed. It not only invalidates entries, + * but also moves all entries that are still valid to the beginning. + * + * @param pcb the tcp_pcb to modify + * @param seq the lowest sequence number to keep in SACK entries + */ +static void +tcp_remove_sacks_lt(struct tcp_pcb *pcb, u32_t seq) +{ + u8_t i; + u8_t unused_idx; + + /* We run this loop for all entries, until we find the first invalid one. + There is no point checking after that. */ + for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) { + /* We only want to use SACK at index [i] if its right side is > 'seq'. */ + if (TCP_SEQ_GT(pcb->rcv_sacks[i].right, seq)) { + if (unused_idx != i) { + /* We only copy it if it's not in the right spot already. */ + pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i]; + } + /* NOTE: It is possible that its left side is < 'seq', in which case we should adjust it. */ + if (TCP_SEQ_LT(pcb->rcv_sacks[unused_idx].left, seq)) { + pcb->rcv_sacks[unused_idx].left = seq; + } + ++unused_idx; + } + } + + /* We also need to invalidate everything from 'unused_idx' till the end */ + for (i = unused_idx; i < LWIP_TCP_MAX_SACK_NUM; ++i) { + pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0; + } +} + +#if defined(TCP_OOSEQ_BYTES_LIMIT) || defined(TCP_OOSEQ_PBUFS_LIMIT) +/** + * Called to remove a range of SACKs. + * + * SACK entries will be removed or adjusted to not acknowledge any sequence + * numbers that are greater than (or equal to) 'seq' passed. It not only invalidates entries, + * but also moves all entries that are still valid to the beginning. + * + * @param pcb the tcp_pcb to modify + * @param seq the highest sequence number to keep in SACK entries + */ +static void +tcp_remove_sacks_gt(struct tcp_pcb *pcb, u32_t seq) +{ + u8_t i; + u8_t unused_idx; + + /* We run this loop for all entries, until we find the first invalid one. + There is no point checking after that. */ + for (i = unused_idx = 0; (i < LWIP_TCP_MAX_SACK_NUM) && LWIP_TCP_SACK_VALID(pcb, i); ++i) { + /* We only want to use SACK at index [i] if its left side is < 'seq'. */ + if (TCP_SEQ_LT(pcb->rcv_sacks[i].left, seq)) { + if (unused_idx != i) { + /* We only copy it if it's not in the right spot already. */ + pcb->rcv_sacks[unused_idx] = pcb->rcv_sacks[i]; + } + /* NOTE: It is possible that its right side is > 'seq', in which case we should adjust it. */ + if (TCP_SEQ_GT(pcb->rcv_sacks[unused_idx].right, seq)) { + pcb->rcv_sacks[unused_idx].right = seq; + } + ++unused_idx; + } + } + + /* We also need to invalidate everything from 'unused_idx' till the end */ + for (i = unused_idx; i < LWIP_TCP_MAX_SACK_NUM; ++i) { + pcb->rcv_sacks[i].left = pcb->rcv_sacks[i].right = 0; + } +} +#endif /* TCP_OOSEQ_BYTES_LIMIT || TCP_OOSEQ_PBUFS_LIMIT */ + +#endif /* LWIP_TCP_SACK_OUT */ + #endif /* LWIP_TCP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_out.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_out.c similarity index 60% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_out.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_out.c index 5aef6b1..8149d39 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/tcp_out.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/tcp_out.c @@ -4,6 +4,28 @@ * * The output functions of TCP. * + * There are two distinct ways for TCP segments to get sent: + * - queued data: these are segments transferring data or segments containing + * SYN or FIN (which both count as one sequence number). They are created as + * struct @ref pbuf together with a struct tcp_seg and enqueue to the + * unsent list of the pcb. They are sent by tcp_output: + * - @ref tcp_write : creates data segments + * - @ref tcp_split_unsent_seg : splits a data segment + * - @ref tcp_enqueue_flags : creates SYN-only or FIN-only segments + * - @ref tcp_output / tcp_output_segment : finalize the tcp header + * (e.g. sequence numbers, options, checksum) and output to IP + * - the various tcp_rexmit functions shuffle around segments between the + * unsent an unacked lists to retransmit them + * - tcp_create_segment and tcp_pbuf_prealloc allocate pbuf and + * segment for these functions + * - direct send: these segments don't contain data but control the connection + * behaviour. They are created as pbuf only and sent directly without + * enqueueing them: + * - @ref tcp_send_empty_ack sends an ACK-only segment + * - @ref tcp_rst sends a RST segment + * - @ref tcp_keepalive sends a keepalive segment + * - @ref tcp_zero_window_probe sends a window probe segment + * - tcp_output_alloc_header allocates a header-only pbuf for these functions */ /* @@ -58,6 +80,17 @@ #include +#ifdef LWIP_HOOK_FILENAME +#include LWIP_HOOK_FILENAME +#endif + +/* Allow to add custom TCP header options by defining this hook */ +#ifdef LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH +#define LWIP_TCP_OPT_LENGTH_SEGMENT(flags, pcb) LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, LWIP_TCP_OPT_LENGTH(flags)) +#else +#define LWIP_TCP_OPT_LENGTH_SEGMENT(flags, pcb) LWIP_TCP_OPT_LENGTH(flags) +#endif + /* Define some copy-macros for checksum-on-copy so that the code looks nicer by preventing too many ifdef's. */ #if TCP_CHECKSUM_ON_COPY @@ -94,75 +127,27 @@ /* Forward declarations.*/ static err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif); -/** Allocate a pbuf and create a tcphdr at p->payload, used for output - * functions other than the default tcp_output -> tcp_output_segment - * (e.g. tcp_send_empty_ack, etc.) - * - * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr) - * @param optlen length of header-options - * @param datalen length of tcp data to reserve in pbuf - * @param seqno_be seqno in network byte order (big-endian) - * @return pbuf with p->payload being the tcp_hdr - */ -static struct pbuf * -tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen, - u32_t seqno_be /* already in network byte order */) +/* tcp_route: common code that returns a fixed bound netif or calls ip_route */ +static struct netif * +tcp_route(const struct tcp_pcb *pcb, const ip_addr_t *src, const ip_addr_t *dst) { - struct tcp_hdr *tcphdr; - struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); - if (p != NULL) { - LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", - (p->len >= TCP_HLEN + optlen)); - tcphdr = (struct tcp_hdr *)p->payload; - tcphdr->src = lwip_htons(pcb->local_port); - tcphdr->dest = lwip_htons(pcb->remote_port); - tcphdr->seqno = seqno_be; - tcphdr->ackno = lwip_htonl(pcb->rcv_nxt); - TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK); - tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd))); - tcphdr->chksum = 0; - tcphdr->urgp = 0; + LWIP_UNUSED_ARG(src); /* in case IPv4-only and source-based routing is disabled */ - /* If we're sending a packet, update the announced right window edge */ - pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + if ((pcb != NULL) && (pcb->netif_idx != NETIF_NO_INDEX)) { + return netif_get_by_index(pcb->netif_idx); + } else { + return ip_route(src, dst); } - return p; -} - -/** - * Called by tcp_close() to send a segment including FIN flag but not data. - * - * @param pcb the tcp_pcb over which to send a segment - * @return ERR_OK if sent, another err_t otherwise - */ -err_t -tcp_send_fin(struct tcp_pcb *pcb) -{ - /* first, try to add the fin to the last unsent segment */ - if (pcb->unsent != NULL) { - struct tcp_seg *last_unsent; - for (last_unsent = pcb->unsent; last_unsent->next != NULL; - last_unsent = last_unsent->next); - - if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) { - /* no SYN/FIN/RST flag in the header, we can add the FIN flag */ - TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN); - pcb->flags |= TF_FIN; - return ERR_OK; - } - } - /* no data, no length, flags, copy=1, no optdata */ - return tcp_enqueue_flags(pcb, TCP_FIN); } /** * Create a TCP segment with prefilled header. * - * Called by tcp_write and tcp_enqueue_flags. + * Called by @ref tcp_write, @ref tcp_enqueue_flags and @ref tcp_split_unsent_seg * * @param pcb Protocol control block for the TCP connection. * @param p pbuf that is used to hold the TCP header. - * @param flags TCP flags for header. + * @param hdrflags TCP flags for header. * @param seqno TCP sequence number of this packet * @param optflags options to include in TCP header * @return a new tcp_seg pointing to p, or NULL. @@ -170,10 +155,15 @@ tcp_send_fin(struct tcp_pcb *pcb) * p is freed on failure. */ static struct tcp_seg * -tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags) +tcp_create_segment(const struct tcp_pcb *pcb, struct pbuf *p, u8_t hdrflags, u32_t seqno, u8_t optflags) { struct tcp_seg *seg; - u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags); + u8_t optlen; + + LWIP_ASSERT("tcp_create_segment: invalid pcb", pcb != NULL); + LWIP_ASSERT("tcp_create_segment: invalid pbuf", p != NULL); + + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb); if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no memory.\n")); @@ -197,7 +187,7 @@ tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, #endif /* TCP_CHECKSUM_ON_COPY */ /* build TCP header */ - if (pbuf_header(p, TCP_HLEN)) { + if (pbuf_add_header(p, TCP_HLEN)) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_create_segment: no room for TCP header in pbuf.\n")); TCP_STATS_INC(tcp.err); tcp_seg_free(seg); @@ -208,7 +198,7 @@ tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, seg->tcphdr->dest = lwip_htons(pcb->remote_port); seg->tcphdr->seqno = lwip_htonl(seqno); /* ackno is set in tcp_output */ - TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags); + TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), hdrflags); /* wnd and chksum are set in tcp_output */ seg->tcphdr->urgp = 0; return seg; @@ -220,6 +210,8 @@ tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, * This function is like pbuf_alloc(layer, length, PBUF_RAM) except * there may be extra bytes available at the end. * + * Called by @ref tcp_write + * * @param layer flag to define header size. * @param length size of the pbuf's payload. * @param max_length maximum usable size of payload+oversize. @@ -231,12 +223,15 @@ tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, #if TCP_OVERSIZE static struct pbuf * tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length, - u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags, + u16_t *oversize, const struct tcp_pcb *pcb, u8_t apiflags, u8_t first_seg) { struct pbuf *p; u16_t alloc = length; + LWIP_ASSERT("tcp_pbuf_prealloc: invalid oversize", oversize != NULL); + LWIP_ASSERT("tcp_pbuf_prealloc: invalid pcb", pcb != NULL); + #if LWIP_NETIF_TX_SINGLE_PBUF LWIP_UNUSED_ARG(max_length); LWIP_UNUSED_ARG(pcb); @@ -280,7 +275,10 @@ tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length, #endif /* TCP_OVERSIZE */ #if TCP_CHECKSUM_ON_COPY -/** Add a checksum of newly added data to the segment */ +/** Add a checksum of newly added data to the segment. + * + * Called by tcp_write and tcp_split_unsent_seg. + */ static void tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum, u8_t *seg_chksum_swapped) @@ -306,6 +304,8 @@ tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum, static err_t tcp_write_checks(struct tcp_pcb *pcb, u16_t len) { + LWIP_ASSERT("tcp_write_checks: invalid pcb", pcb != NULL); + /* connection is in invalid state for data transmission? */ if ((pcb->state != ESTABLISHED) && (pcb->state != CLOSE_WAIT) && @@ -318,16 +318,10 @@ tcp_write_checks(struct tcp_pcb *pcb, u16_t len) } /* fail on too much data */ -#if SNDBUF_SHARE - if(len > sndbuf_len){ - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n", - len, sndbuf_len)); -#else - if (len > pcb->snd_buf) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n", - len, pcb->snd_buf)); -#endif - pcb->flags |= TF_NAGLEMEMERR; + if (len > pcb->snd_buf) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"TCPWNDSIZE_F")\n", + len, pcb->snd_buf)); + tcp_set_flags(pcb, TF_NAGLEMEMERR); return ERR_MEM; } @@ -336,19 +330,19 @@ tcp_write_checks(struct tcp_pcb *pcb, u16_t len) /* If total number of pbufs on the unsent/unacked queues exceeds the * configured maximum, return an error */ /* check for configured max queuelen and possible overflow */ - if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + if (pcb->snd_queuelen >= LWIP_MIN(TCP_SND_QUEUELEN, (TCP_SNDQUEUELEN_OVERFLOW + 1))) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n", - pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN)); + pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN)); TCP_STATS_INC(tcp.memerr); - pcb->flags |= TF_NAGLEMEMERR; + tcp_set_flags(pcb, TF_NAGLEMEMERR); return ERR_MEM; } if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty", - pcb->unacked != NULL || pcb->unsent != NULL); + pcb->unacked != NULL || pcb->unsent != NULL); } else { LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty", - pcb->unacked == NULL && pcb->unsent == NULL); + pcb->unacked == NULL && pcb->unsent == NULL); } return ERR_OK; } @@ -361,6 +355,28 @@ tcp_write_checks(struct tcp_pcb *pcb, u16_t len) * it can send them more efficiently by combining them together). * To prompt the system to send data now, call tcp_output() after * calling tcp_write(). + * + * This function enqueues the data pointed to by the argument dataptr. The length of + * the data is passed as the len parameter. The apiflags can be one or more of: + * - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated + * for the data to be copied into. If this flag is not given, no new memory + * should be allocated and the data should only be referenced by pointer. This + * also means that the memory behind dataptr must not change until the data is + * ACKed by the remote host + * - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is omitted, + * the PSH flag is set in the last segment created by this call to tcp_write. + * If this flag is given, the PSH flag is not set. + * + * The tcp_write() function will fail and return ERR_MEM if the length + * of the data exceeds the current send buffer size or if the length of + * the queue of outgoing segment is larger than the upper limit defined + * in lwipopts.h. The number of bytes available in the output queue can + * be retrieved with the tcp_sndbuf() function. + * + * The proper way to use this function is to call the function with at + * most tcp_sndbuf() bytes of data. If the function returns ERR_MEM, + * the application should wait until some of the currently enqueued + * data has been successfully received by the other host and try again. * * @param pcb Protocol control block for the TCP connection to enqueue data for. * @param arg Pointer to the data to be enqueued for sending. @@ -377,7 +393,7 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL; u16_t pos = 0; /* position in 'arg' data */ u16_t queuelen; - u8_t optlen = 0; + u8_t optlen; u8_t optflags = 0; #if TCP_OVERSIZE u16_t oversize = 0; @@ -393,17 +409,23 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) u16_t concat_chksummed = 0; #endif /* TCP_CHECKSUM_ON_COPY */ err_t err; + u16_t mss_local; + + LWIP_ERROR("tcp_write: invalid pcb", pcb != NULL, return ERR_ARG); + /* don't allocate segments bigger than half the maximum window we ever received */ - u16_t mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max/2)); + mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max / 2)); mss_local = mss_local ? mss_local : pcb->mss; + LWIP_ASSERT_CORE_LOCKED(); + #if LWIP_NETIF_TX_SINGLE_PBUF /* Always copy to try to create single pbufs for TX */ apiflags |= TCP_WRITE_FLAG_COPY; #endif /* LWIP_NETIF_TX_SINGLE_PBUF */ LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n", - (void *)pcb, arg, len, (u16_t)apiflags)); + (void *)pcb, arg, len, (u16_t)apiflags)); LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)", arg != NULL, return ERR_ARG;); @@ -418,11 +440,14 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) /* Make sure the timestamp option is only included in data segments if we agreed about it with the remote host. */ optflags = TF_SEG_OPTS_TS; - optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(TF_SEG_OPTS_TS, pcb); /* ensure that segments can hold at least one data byte... */ mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1); - } + } else #endif /* LWIP_TCP_TIMESTAMPS */ + { + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb); + } /* @@ -457,7 +482,7 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) last_unsent = last_unsent->next); /* Usable space at the end of the last unsent segment */ - unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags); + unsent_optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(last_unsent->flags, pcb); LWIP_ASSERT("mss_local is too small", mss_local >= last_unsent->len + unsent_optlen); space = mss_local - (last_unsent->len + unsent_optlen); @@ -487,6 +512,7 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) LWIP_ASSERT("inconsistent oversize vs. len", (oversize == 0) || (pos == len)); #endif /* TCP_OVERSIZE */ +#if !LWIP_NETIF_TX_SINGLE_PBUF /* * Phase 2: Chain a new pbuf to the end of pcb->unsent. * @@ -497,6 +523,10 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) * We don't extend segments containing SYN/FIN flags or options * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at * the end. + * + * This phase is skipped for LWIP_NETIF_TX_SINGLE_PBUF as we could only execute + * it after rexmit puts a segment from unacked to unsent and at this point, + * oversize info is lost. */ if ((pos < len) && (space > 0) && (last_unsent->len > 0)) { u16_t seglen = LWIP_MIN(space, len - pos); @@ -516,7 +546,7 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) #if TCP_OVERSIZE_DBGCHECK oversize_add = oversize; #endif /* TCP_OVERSIZE_DBGCHECK */ - TCP_DATA_COPY2(concat_p->payload, (const u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped); + TCP_DATA_COPY2(concat_p->payload, (const u8_t *)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped); #if TCP_CHECKSUM_ON_COPY concat_chksummed += seglen; #endif /* TCP_CHECKSUM_ON_COPY */ @@ -526,7 +556,8 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) /* If the last unsent pbuf is of type PBUF_ROM, try to extend it. */ struct pbuf *p; for (p = last_unsent->p; p->next != NULL; p = p->next); - if (p->type == PBUF_ROM && (const u8_t *)p->payload + p->len == (const u8_t *)arg) { + if (((p->type_internal & (PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_DATA_VOLATILE)) == 0) && + (const u8_t *)p->payload + p->len == (const u8_t *)arg) { LWIP_ASSERT("tcp_write: ROM pbufs cannot be oversized", pos == 0); extendlen = seglen; } else { @@ -536,19 +567,20 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) goto memerr; } /* reference the non-volatile payload data */ - ((struct pbuf_rom*)concat_p)->payload = (const u8_t*)arg + pos; + ((struct pbuf_rom *)concat_p)->payload = (const u8_t *)arg + pos; queuelen += pbuf_clen(concat_p); } #if TCP_CHECKSUM_ON_COPY /* calculate the checksum of nocopy-data */ - tcp_seg_add_chksum(~inet_chksum((const u8_t*)arg + pos, seglen), seglen, - &concat_chksum, &concat_chksum_swapped); + tcp_seg_add_chksum(~inet_chksum((const u8_t *)arg + pos, seglen), seglen, + &concat_chksum, &concat_chksum_swapped); concat_chksummed += seglen; #endif /* TCP_CHECKSUM_ON_COPY */ } pos += seglen; } +#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */ } else { #if TCP_OVERSIZE LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)", @@ -581,7 +613,7 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) } LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen", (p->len >= seglen)); - TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t*)arg + pos, seglen, &chksum, &chksum_swapped); + TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t *)arg + pos, seglen, &chksum, &chksum_swapped); } else { /* Copy is not set: First allocate a pbuf for holding the data. * Since the referenced data is available at least until it is @@ -598,14 +630,14 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) } #if TCP_CHECKSUM_ON_COPY /* calculate the checksum of nocopy-data */ - chksum = ~inet_chksum((const u8_t*)arg + pos, seglen); + chksum = ~inet_chksum((const u8_t *)arg + pos, seglen); if (seglen & 1) { chksum_swapped = 1; chksum = SWAP_BYTES_IN_WORD(chksum); } #endif /* TCP_CHECKSUM_ON_COPY */ /* reference the non-volatile payload data */ - ((struct pbuf_rom*)p2)->payload = (const u8_t*)arg + pos; + ((struct pbuf_rom *)p2)->payload = (const u8_t *)arg + pos; /* Second, allocate a pbuf for the headers. */ if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { @@ -624,9 +656,9 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) /* Now that there are more segments queued, we check again if the * length of the queue exceeds the configured maximum or * overflows. */ - if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + if (queuelen > LWIP_MIN(TCP_SND_QUEUELEN, TCP_SNDQUEUELEN_OVERFLOW)) { LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_write: queue too long %"U16_F" (%d)\n", - queuelen, (int)TCP_SND_QUEUELEN)); + queuelen, (int)TCP_SND_QUEUELEN)); pbuf_free(p); goto memerr; } @@ -655,8 +687,8 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) prev_seg = seg; LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n", - lwip_ntohl(seg->tcphdr->seqno), - lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg))); + lwip_ntohl(seg->tcphdr->seqno), + lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg))); pos += seglen; } @@ -702,13 +734,13 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) */ if (concat_p != NULL) { LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty", - (last_unsent != NULL)); + (last_unsent != NULL)); pbuf_cat(last_unsent->p, concat_p); last_unsent->len += concat_p->tot_len; } else if (extendlen > 0) { struct pbuf *p; LWIP_ASSERT("tcp_write: extension of reference requires reference", - last_unsent != NULL && last_unsent->p != NULL); + last_unsent != NULL && last_unsent->p != NULL); for (p = last_unsent->p; p->next != NULL; p = p->next) { p->tot_len += extendlen; } @@ -720,13 +752,13 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) #if TCP_CHECKSUM_ON_COPY if (concat_chksummed) { LWIP_ASSERT("tcp_write: concat checksum needs concatenated data", - concat_p != NULL || extendlen > 0); + concat_p != NULL || extendlen > 0); /*if concat checksumm swapped - swap it back */ if (concat_chksum_swapped) { concat_chksum = SWAP_BYTES_IN_WORD(concat_chksum); } tcp_seg_add_chksum(concat_chksum, concat_chksummed, &last_unsent->chksum, - &last_unsent->chksum_swapped); + &last_unsent->chksum_swapped); last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED; } #endif /* TCP_CHECKSUM_ON_COPY */ @@ -746,26 +778,23 @@ tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) */ pcb->snd_lbb += len; pcb->snd_buf -= len; -#if SNDBUF_SHARE - sndbuf_len -= len; -#endif pcb->snd_queuelen = queuelen; LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n", - pcb->snd_queuelen)); + pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL || pcb->unsent != NULL); } /* Set the PSH flag in the last segment that we enqueued. */ - if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) { + if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE) == 0)) { TCPH_SET_FLAG(seg->tcphdr, TCP_PSH); } return ERR_OK; memerr: - pcb->flags |= TF_NAGLEMEMERR; + tcp_set_flags(pcb, TF_NAGLEMEMERR); TCP_STATS_INC(tcp.memerr); if (concat_p != NULL) { @@ -776,16 +805,226 @@ memerr: } if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); + pcb->unsent != NULL); } LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen)); return ERR_MEM; } /** - * Enqueue TCP options for transmission. + * Split segment on the head of the unsent queue. If return is not + * ERR_OK, existing head remains intact * - * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl(). + * The split is accomplished by creating a new TCP segment and pbuf + * which holds the remainder payload after the split. The original + * pbuf is trimmed to new length. This allows splitting of read-only + * pbufs + * + * @param pcb the tcp_pcb for which to split the unsent head + * @param split the amount of payload to remain in the head + */ +err_t +tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split) +{ + struct tcp_seg *seg = NULL, *useg = NULL; + struct pbuf *p = NULL; + u8_t optlen; + u8_t optflags; + u8_t split_flags; + u8_t remainder_flags; + u16_t remainder; + u16_t offset; +#if TCP_CHECKSUM_ON_COPY + u16_t chksum = 0; + u8_t chksum_swapped = 0; + struct pbuf *q; +#endif /* TCP_CHECKSUM_ON_COPY */ + + LWIP_ASSERT("tcp_split_unsent_seg: invalid pcb", pcb != NULL); + + useg = pcb->unsent; + if (useg == NULL) { + return ERR_MEM; + } + + if (split == 0) { + LWIP_ASSERT("Can't split segment into length 0", 0); + return ERR_VAL; + } + + if (useg->len <= split) { + return ERR_OK; + } + + LWIP_ASSERT("split <= mss", split <= pcb->mss); + LWIP_ASSERT("useg->len > 0", useg->len > 0); + + /* We should check that we don't exceed TCP_SND_QUEUELEN but we need + * to split this packet so we may actually exceed the max value by + * one! + */ + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: split_unsent_seg: %u\n", (unsigned int)pcb->snd_queuelen)); + + optflags = useg->flags; +#if TCP_CHECKSUM_ON_COPY + /* Remove since checksum is not stored until after tcp_create_segment() */ + optflags &= ~TF_SEG_DATA_CHECKSUMMED; +#endif /* TCP_CHECKSUM_ON_COPY */ + optlen = LWIP_TCP_OPT_LENGTH(optflags); + remainder = useg->len - split; + + /* Create new pbuf for the remainder of the split */ + p = pbuf_alloc(PBUF_TRANSPORT, remainder + optlen, PBUF_RAM); + if (p == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_split_unsent_seg: could not allocate memory for pbuf remainder %u\n", remainder)); + goto memerr; + } + + /* Offset into the original pbuf is past TCP/IP headers, options, and split amount */ + offset = useg->p->tot_len - useg->len + split; + /* Copy remainder into new pbuf, headers and options will not be filled out */ + if (pbuf_copy_partial(useg->p, (u8_t *)p->payload + optlen, remainder, offset ) != remainder) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_split_unsent_seg: could not copy pbuf remainder %u\n", remainder)); + goto memerr; + } +#if TCP_CHECKSUM_ON_COPY + /* calculate the checksum on remainder data */ + tcp_seg_add_chksum(~inet_chksum((const u8_t *)p->payload + optlen, remainder), remainder, + &chksum, &chksum_swapped); +#endif /* TCP_CHECKSUM_ON_COPY */ + + /* Options are created when calling tcp_output() */ + + /* Migrate flags from original segment */ + split_flags = TCPH_FLAGS(useg->tcphdr); + remainder_flags = 0; /* ACK added in tcp_output() */ + + if (split_flags & TCP_PSH) { + split_flags &= ~TCP_PSH; + remainder_flags |= TCP_PSH; + } + if (split_flags & TCP_FIN) { + split_flags &= ~TCP_FIN; + remainder_flags |= TCP_FIN; + } + /* SYN should be left on split, RST should not be present with data */ + + seg = tcp_create_segment(pcb, p, remainder_flags, lwip_ntohl(useg->tcphdr->seqno) + split, optflags); + if (seg == NULL) { + p = NULL; /* Freed by tcp_create_segment */ + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_split_unsent_seg: could not create new TCP segment\n")); + goto memerr; + } + +#if TCP_CHECKSUM_ON_COPY + seg->chksum = chksum; + seg->chksum_swapped = chksum_swapped; + seg->flags |= TF_SEG_DATA_CHECKSUMMED; +#endif /* TCP_CHECKSUM_ON_COPY */ + + /* Remove this segment from the queue since trimming it may free pbufs */ + pcb->snd_queuelen -= pbuf_clen(useg->p); + + /* Trim the original pbuf into our split size. At this point our remainder segment must be setup + successfully because we are modifying the original segment */ + pbuf_realloc(useg->p, useg->p->tot_len - remainder); + useg->len -= remainder; + TCPH_SET_FLAG(useg->tcphdr, split_flags); +#if TCP_OVERSIZE_DBGCHECK + /* By trimming, realloc may have actually shrunk the pbuf, so clear oversize_left */ + useg->oversize_left = 0; +#endif /* TCP_OVERSIZE_DBGCHECK */ + + /* Add back to the queue with new trimmed pbuf */ + pcb->snd_queuelen += pbuf_clen(useg->p); + +#if TCP_CHECKSUM_ON_COPY + /* The checksum on the split segment is now incorrect. We need to re-run it over the split */ + useg->chksum = 0; + useg->chksum_swapped = 0; + q = useg->p; + offset = q->tot_len - useg->len; /* Offset due to exposed headers */ + + /* Advance to the pbuf where the offset ends */ + while (q != NULL && offset > q->len) { + offset -= q->len; + q = q->next; + } + LWIP_ASSERT("Found start of payload pbuf", q != NULL); + /* Checksum the first payload pbuf accounting for offset, then other pbufs are all payload */ + for (; q != NULL; offset = 0, q = q->next) { + tcp_seg_add_chksum(~inet_chksum((const u8_t *)q->payload + offset, q->len - offset), q->len - offset, + &useg->chksum, &useg->chksum_swapped); + } +#endif /* TCP_CHECKSUM_ON_COPY */ + + /* Update number of segments on the queues. Note that length now may + * exceed TCP_SND_QUEUELEN! We don't have to touch pcb->snd_buf + * because the total amount of data is constant when packet is split */ + pcb->snd_queuelen += pbuf_clen(seg->p); + + /* Finally insert remainder into queue after split (which stays head) */ + seg->next = useg->next; + useg->next = seg; + +#if TCP_OVERSIZE + /* If remainder is last segment on the unsent, ensure we clear the oversize amount + * because the remainder is always sized to the exact remaining amount */ + if (seg->next == NULL) { + pcb->unsent_oversize = 0; + } +#endif /* TCP_OVERSIZE */ + + return ERR_OK; +memerr: + TCP_STATS_INC(tcp.memerr); + + LWIP_ASSERT("seg == NULL", seg == NULL); + if (p != NULL) { + pbuf_free(p); + } + + return ERR_MEM; +} + +/** + * Called by tcp_close() to send a segment including FIN flag but not data. + * This FIN may be added to an existing segment or a new, otherwise empty + * segment is enqueued. + * + * @param pcb the tcp_pcb over which to send a segment + * @return ERR_OK if sent, another err_t otherwise + */ +err_t +tcp_send_fin(struct tcp_pcb *pcb) +{ + LWIP_ASSERT("tcp_send_fin: invalid pcb", pcb != NULL); + + /* first, try to add the fin to the last unsent segment */ + if (pcb->unsent != NULL) { + struct tcp_seg *last_unsent; + for (last_unsent = pcb->unsent; last_unsent->next != NULL; + last_unsent = last_unsent->next); + + if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) { + /* no SYN/FIN/RST flag in the header, we can add the FIN flag */ + TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN); + tcp_set_flags(pcb, TF_FIN); + return ERR_OK; + } + } + /* no data, no length, flags, copy=1, no optdata */ + return tcp_enqueue_flags(pcb, TCP_FIN); +} + +/** + * Enqueue SYN or FIN for transmission. + * + * Called by @ref tcp_connect, tcp_listen_input, and @ref tcp_close + * (via @ref tcp_send_fin) * * @param pcb Protocol control block for the TCP connection. * @param flags TCP header flags to set in the outgoing segment. @@ -802,17 +1041,12 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)", (flags & (TCP_SYN | TCP_FIN)) != 0); + LWIP_ASSERT("tcp_enqueue_flags: invalid pcb", pcb != NULL); - /* check for configured max queuelen and possible overflow (FIN flag should always come through!) */ - if (((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) && - ((flags & TCP_FIN) == 0)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n", - pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN)); - TCP_STATS_INC(tcp.memerr); - pcb->flags |= TF_NAGLEMEMERR; - return ERR_MEM; - } + /* No need to check pcb->snd_queuelen if only SYN or FIN are allowed! */ + /* Get options for this segment. This is a special case since this is the + only place where a SYN can be sent. */ if (flags & TCP_SYN) { optflags = TF_SEG_OPTS_MSS; #if LWIP_WND_SCALE @@ -822,19 +1056,26 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) optflags |= TF_SEG_OPTS_WND_SCALE; } #endif /* LWIP_WND_SCALE */ +#if LWIP_TCP_SACK_OUT + if ((pcb->state != SYN_RCVD) || (pcb->flags & TF_SACK)) { + /* In a (sent in state SYN_RCVD), the SACK_PERM option may only + be sent if we received a SACK_PERM option from the remote host. */ + optflags |= TF_SEG_OPTS_SACK_PERM; + } +#endif /* LWIP_TCP_SACK_OUT */ } #if LWIP_TCP_TIMESTAMPS - if ((pcb->flags & TF_TIMESTAMP)) { + if ((pcb->flags & TF_TIMESTAMP) || ((flags & TCP_SYN) && (pcb->state != SYN_RCVD))) { /* Make sure the timestamp option is only included in data segments if we - agreed about it with the remote host. */ + agreed about it with the remote host (and in active open SYN segments). */ optflags |= TF_SEG_OPTS_TS; } #endif /* LWIP_TCP_TIMESTAMPS */ - optlen = LWIP_TCP_OPT_LENGTH(optflags); + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb); /* Allocate pbuf with room for TCP header + options */ if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { - pcb->flags |= TF_NAGLEMEMERR; + tcp_set_flags(pcb, TF_NAGLEMEMERR); TCP_STATS_INC(tcp.memerr); return ERR_MEM; } @@ -843,7 +1084,7 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) /* Allocate memory for tcp_seg, and fill in fields. */ if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) { - pcb->flags |= TF_NAGLEMEMERR; + tcp_set_flags(pcb, TF_NAGLEMEMERR); TCP_STATS_INC(tcp.memerr); return ERR_MEM; } @@ -875,7 +1116,7 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) /* optlen does not influence snd_buf */ } if (flags & TCP_FIN) { - pcb->flags |= TF_FIN; + tcp_set_flags(pcb, TF_FIN); } /* update number of segments on the queues */ @@ -883,7 +1124,7 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen)); if (pcb->snd_queuelen != 0) { LWIP_ASSERT("tcp_enqueue_flags: invalid queue length", - pcb->unacked != NULL || pcb->unsent != NULL); + pcb->unacked != NULL || pcb->unsent != NULL); } return ERR_OK; @@ -896,8 +1137,10 @@ tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) * @param opts option pointer where to store the timestamp option */ static void -tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) +tcp_build_timestamp_option(const struct tcp_pcb *pcb, u32_t *opts) { + LWIP_ASSERT("tcp_build_timestamp_option: invalid pcb", pcb != NULL); + /* Pad with two NOP options to make everything nicely aligned */ opts[0] = PP_HTONL(0x0101080A); opts[1] = lwip_htonl(sys_now()); @@ -905,6 +1148,69 @@ tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) } #endif +#if LWIP_TCP_SACK_OUT +/** + * Calculates the number of SACK entries that should be generated. + * It takes into account whether TF_SACK flag is set, + * the number of SACK entries in tcp_pcb that are valid, + * as well as the available options size. + * + * @param pcb tcp_pcb + * @param optlen the length of other TCP options (in bytes) + * @return the number of SACK ranges that can be used + */ +static u8_t +tcp_get_num_sacks(const struct tcp_pcb *pcb, u8_t optlen) +{ + u8_t num_sacks = 0; + + LWIP_ASSERT("tcp_get_num_sacks: invalid pcb", pcb != NULL); + + if (pcb->flags & TF_SACK) { + u8_t i; + + /* The first SACK takes up 12 bytes (it includes SACK header and two NOP options), + each additional one - 8 bytes. */ + optlen += 12; + + /* Max options size = 40, number of SACK array entries = LWIP_TCP_MAX_SACK_NUM */ + for (i = 0; (i < LWIP_TCP_MAX_SACK_NUM) && (optlen <= TCP_MAX_OPTION_BYTES) && + LWIP_TCP_SACK_VALID(pcb, i); ++i) { + ++num_sacks; + optlen += 8; + } + } + + return num_sacks; +} + +/** Build a SACK option (12 or more bytes long) at the specified options pointer) + * + * @param pcb tcp_pcb + * @param opts option pointer where to store the SACK option + * @param num_sacks the number of SACKs to store + */ +static void +tcp_build_sack_option(const struct tcp_pcb *pcb, u32_t *opts, u8_t num_sacks) +{ + u8_t i; + + LWIP_ASSERT("tcp_build_sack_option: invalid pcb", pcb != NULL); + LWIP_ASSERT("tcp_build_sack_option: invalid opts", opts != NULL); + + /* Pad with two NOP options to make everything nicely aligned. + We add the length (of just the SACK option, not the NOPs in front of it), + which is 2B of header, plus 8B for each SACK. */ + *(opts++) = PP_HTONL(0x01010500 + 2 + num_sacks * 8); + + for (i = 0; i < num_sacks; ++i) { + *(opts++) = lwip_htonl(pcb->rcv_sacks[i].left); + *(opts++) = lwip_htonl(pcb->rcv_sacks[i].right); + } +} + +#endif + #if LWIP_WND_SCALE /** Build a window scale option (3 bytes long) at the specified options pointer) * @@ -913,83 +1219,13 @@ tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) static void tcp_build_wnd_scale_option(u32_t *opts) { + LWIP_ASSERT("tcp_build_wnd_scale_option: invalid opts", opts != NULL); + /* Pad with one NOP option to make everything nicely aligned */ opts[0] = PP_HTONL(0x01030300 | TCP_RCV_SCALE); } #endif -/** - * Send an ACK without data. - * - * @param pcb Protocol control block for the TCP connection to send the ACK - */ -err_t -tcp_send_empty_ack(struct tcp_pcb *pcb) -{ - err_t err; - struct pbuf *p; - u8_t optlen = 0; - struct netif *netif; -#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP - struct tcp_hdr *tcphdr; -#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */ - -#if LWIP_TCP_TIMESTAMPS - if (pcb->flags & TF_TIMESTAMP) { - optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); - } -#endif - - p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt)); - if (p == NULL) { - /* let tcp_fasttmr retry sending this ACK */ - pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW); - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); - return ERR_BUF; - } -#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP - tcphdr = (struct tcp_hdr *)p->payload; -#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */ - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, - ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); - - /* NB. MSS and window scale options are only sent on SYNs, so ignore them here */ -#if LWIP_TCP_TIMESTAMPS - pcb->ts_lastacksent = pcb->rcv_nxt; - - if (pcb->flags & TF_TIMESTAMP) { - tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1)); - } -#endif - - netif = ip_route(&pcb->local_ip, &pcb->remote_ip); - if (netif == NULL) { - err = ERR_RTE; - } else { -#if CHECKSUM_GEN_TCP - IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { - tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); - } -#endif - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); - err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, - pcb->ttl, pcb->tos, IP_PROTO_TCP, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - } - pbuf_free(p); - - if (err != ERR_OK) { - /* let tcp_fasttmr retry sending this ACK */ - pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW); - } else { - /* remove ACK flags from the PCB, as we sent an empty ACK now */ - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); - } - - return err; -} - /** * @ingroup tcp_raw * Find out what we can send and send it @@ -1009,9 +1245,12 @@ tcp_output(struct tcp_pcb *pcb) s16_t i = 0; #endif /* TCP_CWND_DEBUG */ + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("tcp_output: invalid pcb", pcb != NULL); /* pcb->state LISTEN not allowed here */ LWIP_ASSERT("don't call tcp_output for listen-pcbs", - pcb->state != LISTEN); + pcb->state != LISTEN); /* First, check if we are invoked by the TCP input processing code. If so, we do not output anything. Instead, we rely on the @@ -1025,25 +1264,31 @@ tcp_output(struct tcp_pcb *pcb) seg = pcb->unsent; - /* If the TF_ACK_NOW flag is set and no data will be sent (either - * because the ->unsent queue is empty or because the window does - * not allow it), construct an empty ACK segment and send it. - * - * If data is to be sent, we will just piggyback the ACK (see below). - */ - if (pcb->flags & TF_ACK_NOW && - (seg == NULL || - lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) { - return tcp_send_empty_ack(pcb); + if (seg == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", + (void *)pcb->unsent)); + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F + ", cwnd %"TCPWNDSIZE_F", wnd %"U32_F + ", seg == NULL, ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); + + /* If the TF_ACK_NOW flag is set and the ->unsent queue is empty, construct + * an empty ACK segment and send it. */ + if (pcb->flags & TF_ACK_NOW) { + return tcp_send_empty_ack(pcb); + } + /* nothing to send: shortcut out of here */ + goto output_done; + } else { + LWIP_DEBUGF(TCP_CWND_DEBUG, + ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F + ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, + lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, + lwip_ntohl(seg->tcphdr->seqno), pcb->lastack)); } - /* useg should point to last segment on unacked queue */ - useg = pcb->unacked; - if (useg != NULL) { - for (; useg->next != NULL; useg = useg->next); - } - - netif = ip_route(&pcb->local_ip, &pcb->remote_ip); + netif = tcp_route(pcb, &pcb->local_ip, &pcb->remote_ip); if (netif == NULL) { return ERR_RTE; } @@ -1057,45 +1302,33 @@ tcp_output(struct tcp_pcb *pcb) ip_addr_copy(pcb->local_ip, *local_ip); } -#if TCP_OUTPUT_DEBUG - if (seg == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", - (void*)pcb->unsent)); - } -#endif /* TCP_OUTPUT_DEBUG */ -#if TCP_CWND_DEBUG - if (seg == NULL) { - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F - ", cwnd %"TCPWNDSIZE_F", wnd %"U32_F - ", seg == NULL, ack %"U32_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); - } else { - LWIP_DEBUGF(TCP_CWND_DEBUG, - ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F - ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, - lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, - lwip_ntohl(seg->tcphdr->seqno), pcb->lastack)); - } -#endif /* TCP_CWND_DEBUG */ - /* Check if we need to start the persistent timer when the next unsent segment - * does not fit within the remaining send window and RTO timer is not running (we - * have no in-flight data). A traditional approach would fill the remaining window - * with part of the unsent segment (which will engage zero-window probing upon - * reception of the zero window update from the receiver). This ensures the - * subsequent window update is reliably received. With the goal of being lightweight, - * we avoid splitting the unsent segment and treat the window as already zero. - */ - if (seg != NULL && - lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd && - wnd > 0 && wnd == pcb->snd_wnd && pcb->unacked == NULL) { - /* Start the persist timer */ - if (pcb->persist_backoff == 0) { + /* Handle the current segment not fitting within the window */ + if (lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd) { + /* We need to start the persistent timer when the next unsent segment does not fit + * within the remaining (could be 0) send window and RTO timer is not running (we + * have no in-flight data). If window is still too small after persist timer fires, + * then we split the segment. We don't consider the congestion window since a cwnd + * smaller than 1 SMSS implies in-flight data + */ + if (wnd == pcb->snd_wnd && pcb->unacked == NULL && pcb->persist_backoff == 0) { pcb->persist_cnt = 0; pcb->persist_backoff = 1; + pcb->persist_probe = 0; + } + /* We need an ACK, but can't send data now, so send an empty ACK */ + if (pcb->flags & TF_ACK_NOW) { + return tcp_send_empty_ack(pcb); } goto output_done; } + /* Stop persist timer, above conditions are not active */ + pcb->persist_backoff = 0; + + /* useg should point to last segment on unacked queue */ + useg = pcb->unacked; + if (useg != NULL) { + for (; useg->next != NULL; useg = useg->next); + } /* data available and window allows it to be sent? */ while (seg != NULL && lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { @@ -1109,15 +1342,15 @@ tcp_output(struct tcp_pcb *pcb) * RST is no sent using tcp_write/tcp_output. */ if ((tcp_do_output_nagle(pcb) == 0) && - ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) { + ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) { break; } #if TCP_CWND_DEBUG LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"TCPWNDSIZE_F", cwnd %"TCPWNDSIZE_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, - lwip_ntohl(seg->tcphdr->seqno) + seg->len - - pcb->lastack, - lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i)); + pcb->snd_wnd, pcb->cwnd, wnd, + lwip_ntohl(seg->tcphdr->seqno) + seg->len - + pcb->lastack, + lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i)); ++i; #endif /* TCP_CWND_DEBUG */ @@ -1125,18 +1358,18 @@ tcp_output(struct tcp_pcb *pcb) TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); } -#if TCP_OVERSIZE_DBGCHECK - seg->oversize_left = 0; -#endif /* TCP_OVERSIZE_DBGCHECK */ err = tcp_output_segment(seg, pcb, netif); if (err != ERR_OK) { /* segment could not be sent, for whatever reason */ - pcb->flags |= TF_NAGLEMEMERR; + tcp_set_flags(pcb, TF_NAGLEMEMERR); return err; } +#if TCP_OVERSIZE_DBGCHECK + seg->oversize_left = 0; +#endif /* TCP_OVERSIZE_DBGCHECK */ pcb->unsent = seg->next; if (pcb->state != SYN_SENT) { - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); } snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { @@ -1149,7 +1382,7 @@ tcp_output(struct tcp_pcb *pcb) if (pcb->unacked == NULL) { pcb->unacked = seg; useg = seg; - /* unacked list is not empty? */ + /* unacked list is not empty? */ } else { /* In the case of fast retransmit, the packet should not go to the tail * of the unacked queue, but rather somewhere before it. We need to check for @@ -1158,8 +1391,8 @@ tcp_output(struct tcp_pcb *pcb) /* add segment to before tail of unacked list, keeping the list sorted */ struct tcp_seg **cur_seg = &(pcb->unacked); while (*cur_seg && - TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { - cur_seg = &((*cur_seg)->next ); + TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); } seg->next = (*cur_seg); (*cur_seg) = seg; @@ -1169,13 +1402,12 @@ tcp_output(struct tcp_pcb *pcb) useg = useg->next; } } - /* do not queue empty segments on the unacked list */ + /* do not queue empty segments on the unacked list */ } else { tcp_seg_free(seg); } seg = pcb->unsent; } -output_done: #if TCP_OVERSIZE if (pcb->unsent == NULL) { /* last unsent has been removed, reset unsent_oversize */ @@ -1183,10 +1415,36 @@ output_done: } #endif /* TCP_OVERSIZE */ - pcb->flags &= ~TF_NAGLEMEMERR; +output_done: + tcp_clear_flags(pcb, TF_NAGLEMEMERR); return ERR_OK; } +/** Check if a segment's pbufs are used by someone else than TCP. + * This can happen on retransmission if the pbuf of this segment is still + * referenced by the netif driver due to deferred transmission. + * This is the case (only!) if someone down the TX call path called + * pbuf_ref() on one of the pbufs! + * + * @arg seg the tcp segment to check + * @return 1 if ref != 1, 0 if ref == 1 + */ +static int +tcp_output_segment_busy(const struct tcp_seg *seg) +{ + LWIP_ASSERT("tcp_output_segment_busy: invalid seg", seg != NULL); + + /* We only need to check the first pbuf here: + If a pbuf is queued for transmission, a driver calls pbuf_ref(), + which only changes the ref count of the first pbuf */ + if (seg->p->ref != 1) { + /* other reference found */ + return 1; + } + /* no other references found */ + return 0; +} + /** * Called by tcp_output() to actually send a TCP segment over IP. * @@ -1200,11 +1458,18 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif err_t err; u16_t len; u32_t *opts; +#if TCP_CHECKSUM_ON_COPY + int seg_chksum_was_swapped = 0; +#endif - if (seg->p->ref != 1) { - /* This can happen if the pbuf of this segment is still referenced by the - netif driver due to deferred transmission. Since this function modifies - p->len, we must not continue in this case. */ + LWIP_ASSERT("tcp_output_segment: invalid seg", seg != NULL); + LWIP_ASSERT("tcp_output_segment: invalid pcb", pcb != NULL); + LWIP_ASSERT("tcp_output_segment: invalid netif", netif != NULL); + + if (tcp_output_segment_busy(seg)) { + /* This should not happen: rexmit functions should have checked this. + However, since this function modifies p->len, we must not continue in this case. */ + LWIP_DEBUGF(TCP_RTO_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_output_segment: segment busy\n")); return ERR_OK; } @@ -1233,7 +1498,7 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif if (seg->flags & TF_SEG_OPTS_MSS) { u16_t mss; #if TCP_CALCULATE_EFF_SEND_MSS - mss = tcp_eff_send_mss(TCP_MSS, &pcb->local_ip, &pcb->remote_ip); + mss = tcp_eff_send_mss_netif(TCP_MSS, netif, &pcb->remote_ip); #else /* TCP_CALCULATE_EFF_SEND_MSS */ mss = TCP_MSS; #endif /* TCP_CALCULATE_EFF_SEND_MSS */ @@ -1254,6 +1519,16 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif opts += 1; } #endif +#if LWIP_TCP_SACK_OUT + if (seg->flags & TF_SEG_OPTS_SACK_PERM) { + /* Pad with two NOP options to make everything nicely aligned + * NOTE: When we send both timestamp and SACK_PERM options, + * we could use the first two NOPs before the timestamp to store SACK_PERM option, + * but that would complicate the code. + */ + *(opts++) = PP_HTONL(0x01010402); + } +#endif /* Set retransmission timer running if it is not currently enabled This must be set before checking the route. */ @@ -1268,8 +1543,8 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq)); } LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n", - lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) + - seg->len)); + lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) + + seg->len)); len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); if (len == 0) { @@ -1283,120 +1558,69 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif seg->p->payload = seg->tcphdr; seg->tcphdr->chksum = 0; + +#ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS + opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(seg->p, seg->tcphdr, pcb, opts); +#endif + LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(seg->tcphdr + 1)) + LWIP_TCP_OPT_LENGTH_SEGMENT(seg->flags, pcb)); + #if CHECKSUM_GEN_TCP IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { #if TCP_CHECKSUM_ON_COPY u32_t acc; #if TCP_CHECKSUM_ON_COPY_SANITY_CHECK u16_t chksum_slow = ip_chksum_pseudo(seg->p, IP_PROTO_TCP, - seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); + seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); #endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ if ((seg->flags & TF_SEG_DATA_CHECKSUMMED) == 0) { LWIP_ASSERT("data included but not checksummed", - seg->p->tot_len == (TCPH_HDRLEN(seg->tcphdr) * 4)); + seg->p->tot_len == TCPH_HDRLEN_BYTES(seg->tcphdr)); } /* rebuild TCP header checksum (TCP header changes for retransmissions!) */ acc = ip_chksum_pseudo_partial(seg->p, IP_PROTO_TCP, - seg->p->tot_len, TCPH_HDRLEN(seg->tcphdr) * 4, &pcb->local_ip, &pcb->remote_ip); + seg->p->tot_len, TCPH_HDRLEN_BYTES(seg->tcphdr), &pcb->local_ip, &pcb->remote_ip); /* add payload checksum */ if (seg->chksum_swapped) { + seg_chksum_was_swapped = 1; seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum); seg->chksum_swapped = 0; } - acc += (u16_t)~(seg->chksum); - seg->tcphdr->chksum = FOLD_U32T(acc); + acc = (u16_t)~acc + seg->chksum; + seg->tcphdr->chksum = (u16_t)~FOLD_U32T(acc); #if TCP_CHECKSUM_ON_COPY_SANITY_CHECK if (chksum_slow != seg->tcphdr->chksum) { TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL( - ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n", - seg->tcphdr->chksum, chksum_slow)); + ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n", + seg->tcphdr->chksum, chksum_slow)); seg->tcphdr->chksum = chksum_slow; } #endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ #else /* TCP_CHECKSUM_ON_COPY */ seg->tcphdr->chksum = ip_chksum_pseudo(seg->p, IP_PROTO_TCP, - seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); + seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); #endif /* TCP_CHECKSUM_ON_COPY */ } #endif /* CHECKSUM_GEN_TCP */ TCP_STATS_INC(tcp.xmit); - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); + NETIF_SET_HINTS(netif, &(pcb->netif_hints)); err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, - pcb->tos, IP_PROTO_TCP, netif); - NETIF_SET_HWADDRHINT(netif, NULL); + pcb->tos, IP_PROTO_TCP, netif); + NETIF_RESET_HINTS(netif); + +#if TCP_CHECKSUM_ON_COPY + if (seg_chksum_was_swapped) { + /* if data is added to this segment later, chksum needs to be swapped, + so restore this now */ + seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum); + seg->chksum_swapped = 1; + } +#endif + return err; } -/** - * Send a TCP RESET packet (empty segment with RST flag set) either to - * abort a connection or to show that there is no matching local connection - * for a received segment. - * - * Called by tcp_abort() (to abort a local connection), tcp_input() (if no - * matching local pcb was found), tcp_listen_input() (if incoming segment - * has ACK flag set) and tcp_process() (received segment in the wrong state) - * - * Since a RST segment is in most cases not sent for an active connection, - * tcp_rst() has a number of arguments that are taken from a tcp_pcb for - * most other segment output functions. - * - * @param seqno the sequence number to use for the outgoing segment - * @param ackno the acknowledge number to use for the outgoing segment - * @param local_ip the local IP address to send the segment from - * @param remote_ip the remote IP address to send the segment to - * @param local_port the local TCP port to send the segment from - * @param remote_port the remote TCP port to send the segment to - */ -void -tcp_rst(u32_t seqno, u32_t ackno, - const ip_addr_t *local_ip, const ip_addr_t *remote_ip, - u16_t local_port, u16_t remote_port) -{ - struct pbuf *p; - struct tcp_hdr *tcphdr; - struct netif *netif; - p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); - if (p == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); - return; - } - LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", - (p->len >= sizeof(struct tcp_hdr))); - - tcphdr = (struct tcp_hdr *)p->payload; - tcphdr->src = lwip_htons(local_port); - tcphdr->dest = lwip_htons(remote_port); - tcphdr->seqno = lwip_htonl(seqno); - tcphdr->ackno = lwip_htonl(ackno); - TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK); -#if LWIP_WND_SCALE - tcphdr->wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF)); -#else - tcphdr->wnd = PP_HTONS(TCP_WND); -#endif - tcphdr->chksum = 0; - tcphdr->urgp = 0; - - TCP_STATS_INC(tcp.xmit); - MIB2_STATS_INC(mib2.tcpoutrsts); - - netif = ip_route(local_ip, remote_ip); - if (netif != NULL) { -#if CHECKSUM_GEN_TCP - IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { - tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, - local_ip, remote_ip); - } -#endif - /* Send output with hardcoded TTL/HL since we have no access to the pcb */ - ip_output_if(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP, netif); - } - pbuf_free(p); - LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); -} - /** * Requeue all unacked segments for retransmission * @@ -1404,17 +1628,31 @@ tcp_rst(u32_t seqno, u32_t ackno, * * @param pcb the tcp_pcb for which to re-enqueue all unacked segments */ -void -tcp_rexmit_rto(struct tcp_pcb *pcb) +err_t +tcp_rexmit_rto_prepare(struct tcp_pcb *pcb) { struct tcp_seg *seg; + LWIP_ASSERT("tcp_rexmit_rto_prepare: invalid pcb", pcb != NULL); + if (pcb->unacked == NULL) { - return; + return ERR_VAL; } - /* Move all unacked segments to the head of the unsent queue */ - for (seg = pcb->unacked; seg->next != NULL; seg = seg->next); + /* Move all unacked segments to the head of the unsent queue. + However, give up if any of the unsent pbufs are still referenced by the + netif driver due to deferred transmission. No point loading the link further + if it is struggling to flush its buffered writes. */ + for (seg = pcb->unacked; seg->next != NULL; seg = seg->next) { + if (tcp_output_segment_busy(seg)) { + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n")); + return ERR_VAL; + } + } + if (tcp_output_segment_busy(seg)) { + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit_rto: segment busy\n")); + return ERR_VAL; + } /* concatenate unsent queue after unacked queue */ seg->next = pcb->unsent; #if TCP_OVERSIZE_DBGCHECK @@ -1428,18 +1666,54 @@ tcp_rexmit_rto(struct tcp_pcb *pcb) /* unacked queue is now empty */ pcb->unacked = NULL; + /* Mark RTO in-progress */ + tcp_set_flags(pcb, TF_RTO); + /* Record the next byte following retransmit */ + pcb->rto_end = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); + /* Don't take any RTT measurements after retransmitting. */ + pcb->rttest = 0; + + return ERR_OK; +} + +/** + * Requeue all unacked segments for retransmission + * + * Called by tcp_slowtmr() for slow retransmission. + * + * @param pcb the tcp_pcb for which to re-enqueue all unacked segments + */ +void +tcp_rexmit_rto_commit(struct tcp_pcb *pcb) +{ + LWIP_ASSERT("tcp_rexmit_rto_commit: invalid pcb", pcb != NULL); + /* increment number of retransmissions */ if (pcb->nrtx < 0xFF) { ++pcb->nrtx; } - - /* Don't take any RTT measurements after retransmitting. */ - pcb->rttest = 0; - /* Do the actual retransmission */ tcp_output(pcb); } +/** + * Requeue all unacked segments for retransmission + * + * Called by tcp_process() only, tcp_slowtmr() needs to do some things between + * "prepare" and "commit". + * + * @param pcb the tcp_pcb for which to re-enqueue all unacked segments + */ +void +tcp_rexmit_rto(struct tcp_pcb *pcb) +{ + LWIP_ASSERT("tcp_rexmit_rto: invalid pcb", pcb != NULL); + + if (tcp_rexmit_rto_prepare(pcb) == ERR_OK) { + tcp_rexmit_rto_commit(pcb); + } +} + /** * Requeue the first unacked segment for retransmission * @@ -1447,25 +1721,35 @@ tcp_rexmit_rto(struct tcp_pcb *pcb) * * @param pcb the tcp_pcb for which to retransmit the first unacked segment */ -void +err_t tcp_rexmit(struct tcp_pcb *pcb) { struct tcp_seg *seg; struct tcp_seg **cur_seg; + LWIP_ASSERT("tcp_rexmit: invalid pcb", pcb != NULL); + if (pcb->unacked == NULL) { - return; + return ERR_VAL; + } + + seg = pcb->unacked; + + /* Give up if the segment is still referenced by the netif driver + due to deferred transmission. */ + if (tcp_output_segment_busy(seg)) { + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_rexmit busy\n")); + return ERR_VAL; } /* Move the first unacked segment to the unsent queue */ /* Keep the unsent queue sorted. */ - seg = pcb->unacked; pcb->unacked = seg->next; cur_seg = &(pcb->unsent); while (*cur_seg && - TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { - cur_seg = &((*cur_seg)->next ); + TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); } seg->next = *cur_seg; *cur_seg = seg; @@ -1487,6 +1771,7 @@ tcp_rexmit(struct tcp_pcb *pcb) MIB2_STATS_INC(mib2.tcpretranssegs); /* No need to call tcp_output: we are always called from tcp_input() and thus tcp_output directly returns. */ + return ERR_OK; } @@ -1498,6 +1783,8 @@ tcp_rexmit(struct tcp_pcb *pcb) void tcp_rexmit_fast(struct tcp_pcb *pcb) { + LWIP_ASSERT("tcp_rexmit_fast: invalid pcb", pcb != NULL); + if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { /* This is fast retransmit. Retransmit the first unacked segment. */ LWIP_DEBUGF(TCP_FR_DEBUG, @@ -1505,29 +1792,280 @@ tcp_rexmit_fast(struct tcp_pcb *pcb) "), fast retransmit %"U32_F"\n", (u16_t)pcb->dupacks, pcb->lastack, lwip_ntohl(pcb->unacked->tcphdr->seqno))); - tcp_rexmit(pcb); + if (tcp_rexmit(pcb) == ERR_OK) { + /* Set ssthresh to half of the minimum of the current + * cwnd and the advertised window */ + pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2; - /* Set ssthresh to half of the minimum of the current - * cwnd and the advertised window */ - pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2; + /* The minimum value for ssthresh should be 2 MSS */ + if (pcb->ssthresh < (2U * pcb->mss)) { + LWIP_DEBUGF(TCP_FR_DEBUG, + ("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F + " should be min 2 mss %"U16_F"...\n", + pcb->ssthresh, (u16_t)(2 * pcb->mss))); + pcb->ssthresh = 2 * pcb->mss; + } - /* The minimum value for ssthresh should be 2 MSS */ - if (pcb->ssthresh < (2U * pcb->mss)) { - LWIP_DEBUGF(TCP_FR_DEBUG, - ("tcp_receive: The minimum value for ssthresh %"TCPWNDSIZE_F - " should be min 2 mss %"U16_F"...\n", - pcb->ssthresh, (u16_t)(2*pcb->mss))); - pcb->ssthresh = 2*pcb->mss; + pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; + tcp_set_flags(pcb, TF_INFR); + + /* Reset the retransmission timer to prevent immediate rto retransmissions */ + pcb->rtime = 0; } - - pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; - pcb->flags |= TF_INFR; - - /* Reset the retransmission timer to prevent immediate rto retransmissions */ - pcb->rtime = 0; } } +static struct pbuf * +tcp_output_alloc_header_common(u32_t ackno, u16_t optlen, u16_t datalen, + u32_t seqno_be /* already in network byte order */, + u16_t src_port, u16_t dst_port, u8_t flags, u16_t wnd) +{ + struct tcp_hdr *tcphdr; + struct pbuf *p; + + p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); + if (p != NULL) { + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= TCP_HLEN + optlen)); + tcphdr = (struct tcp_hdr *)p->payload; + tcphdr->src = lwip_htons(src_port); + tcphdr->dest = lwip_htons(dst_port); + tcphdr->seqno = seqno_be; + tcphdr->ackno = lwip_htonl(ackno); + TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), flags); + tcphdr->wnd = lwip_htons(wnd); + tcphdr->chksum = 0; + tcphdr->urgp = 0; + } + return p; +} + +/** Allocate a pbuf and create a tcphdr at p->payload, used for output + * functions other than the default tcp_output -> tcp_output_segment + * (e.g. tcp_send_empty_ack, etc.) + * + * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr) + * @param optlen length of header-options + * @param datalen length of tcp data to reserve in pbuf + * @param seqno_be seqno in network byte order (big-endian) + * @return pbuf with p->payload being the tcp_hdr + */ +static struct pbuf * +tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen, + u32_t seqno_be /* already in network byte order */) +{ + struct pbuf *p; + + LWIP_ASSERT("tcp_output_alloc_header: invalid pcb", pcb != NULL); + + p = tcp_output_alloc_header_common(pcb->rcv_nxt, optlen, datalen, + seqno_be, pcb->local_port, pcb->remote_port, TCP_ACK, + TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd))); + if (p != NULL) { + /* If we're sending a packet, update the announced right window edge */ + pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + } + return p; +} + +/* Fill in options for control segments */ +static void +tcp_output_fill_options(const struct tcp_pcb *pcb, struct pbuf *p, u8_t optflags, u8_t num_sacks) +{ + struct tcp_hdr *tcphdr; + u32_t *opts; + u16_t sacks_len = 0; + + LWIP_ASSERT("tcp_output_fill_options: invalid pbuf", p != NULL); + + tcphdr = (struct tcp_hdr *)p->payload; + opts = (u32_t *)(void *)(tcphdr + 1); + + /* NB. MSS and window scale options are only sent on SYNs, so ignore them here */ + +#if LWIP_TCP_TIMESTAMPS + if (optflags & TF_SEG_OPTS_TS) { + tcp_build_timestamp_option(pcb, opts); + opts += 3; + } +#endif + +#if LWIP_TCP_SACK_OUT + if (pcb && (num_sacks > 0)) { + tcp_build_sack_option(pcb, opts, num_sacks); + /* 1 word for SACKs header (including 2xNOP), and 2 words for each SACK */ + sacks_len = 1 + num_sacks * 2; + opts += sacks_len; + } +#else + LWIP_UNUSED_ARG(num_sacks); +#endif + +#ifdef LWIP_HOOK_TCP_OUT_ADD_TCPOPTS + opts = LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, tcphdr, pcb, opts); +#endif + + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(sacks_len); + LWIP_ASSERT("options not filled", (u8_t *)opts == ((u8_t *)(tcphdr + 1)) + sacks_len * 4 + LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb)); + LWIP_UNUSED_ARG(optflags); /* for LWIP_NOASSERT */ + LWIP_UNUSED_ARG(opts); /* for LWIP_NOASSERT */ +} + +/** Output a control segment pbuf to IP. + * + * Called from tcp_rst, tcp_send_empty_ack, tcp_keepalive and tcp_zero_window_probe, + * this function combines selecting a netif for transmission, generating the tcp + * header checksum and calling ip_output_if while handling netif hints and stats. + */ +static err_t +tcp_output_control_segment(const struct tcp_pcb *pcb, struct pbuf *p, + const ip_addr_t *src, const ip_addr_t *dst) +{ + err_t err; + struct netif *netif; + + LWIP_ASSERT("tcp_output_control_segment: invalid pbuf", p != NULL); + + netif = tcp_route(pcb, src, dst); + if (netif == NULL) { + err = ERR_RTE; + } else { + u8_t ttl, tos; +#if CHECKSUM_GEN_TCP + IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { + struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload; + tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, + src, dst); + } +#endif + if (pcb != NULL) { + NETIF_SET_HINTS(netif, LWIP_CONST_CAST(struct netif_hint*, &(pcb->netif_hints))); + ttl = pcb->ttl; + tos = pcb->tos; + } else { + /* Send output with hardcoded TTL/HL since we have no access to the pcb */ + ttl = TCP_TTL; + tos = 0; + } + TCP_STATS_INC(tcp.xmit); + err = ip_output_if(p, src, dst, ttl, tos, IP_PROTO_TCP, netif); + NETIF_RESET_HINTS(netif); + } + pbuf_free(p); + return err; +} + +/** + * Send a TCP RESET packet (empty segment with RST flag set) either to + * abort a connection or to show that there is no matching local connection + * for a received segment. + * + * Called by tcp_abort() (to abort a local connection), tcp_input() (if no + * matching local pcb was found), tcp_listen_input() (if incoming segment + * has ACK flag set) and tcp_process() (received segment in the wrong state) + * + * Since a RST segment is in most cases not sent for an active connection, + * tcp_rst() has a number of arguments that are taken from a tcp_pcb for + * most other segment output functions. + * + * @param pcb TCP pcb (may be NULL if no pcb is available) + * @param seqno the sequence number to use for the outgoing segment + * @param ackno the acknowledge number to use for the outgoing segment + * @param local_ip the local IP address to send the segment from + * @param remote_ip the remote IP address to send the segment to + * @param local_port the local TCP port to send the segment from + * @param remote_port the remote TCP port to send the segment to + */ +void +tcp_rst(const struct tcp_pcb *pcb, u32_t seqno, u32_t ackno, + const ip_addr_t *local_ip, const ip_addr_t *remote_ip, + u16_t local_port, u16_t remote_port) +{ + struct pbuf *p; + u16_t wnd; + u8_t optlen; + + LWIP_ASSERT("tcp_rst: invalid local_ip", local_ip != NULL); + LWIP_ASSERT("tcp_rst: invalid remote_ip", remote_ip != NULL); + + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb); + +#if LWIP_WND_SCALE + wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF)); +#else + wnd = PP_HTONS(TCP_WND); +#endif + + p = tcp_output_alloc_header_common(ackno, optlen, 0, lwip_htonl(seqno), local_port, + remote_port, TCP_RST | TCP_ACK, wnd); + if (p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); + return; + } + tcp_output_fill_options(pcb, p, 0, 0); + + MIB2_STATS_INC(mib2.tcpoutrsts); + + tcp_output_control_segment(pcb, p, local_ip, remote_ip); + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); +} + +/** + * Send an ACK without data. + * + * @param pcb Protocol control block for the TCP connection to send the ACK + */ +err_t +tcp_send_empty_ack(struct tcp_pcb *pcb) +{ + err_t err; + struct pbuf *p; + u8_t optlen, optflags = 0; + u8_t num_sacks = 0; + + LWIP_ASSERT("tcp_send_empty_ack: invalid pcb", pcb != NULL); + +#if LWIP_TCP_TIMESTAMPS + if (pcb->flags & TF_TIMESTAMP) { + optflags = TF_SEG_OPTS_TS; + } +#endif + optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(optflags, pcb); + +#if LWIP_TCP_SACK_OUT + /* For now, SACKs are only sent with empty ACKs */ + if ((num_sacks = tcp_get_num_sacks(pcb, optlen)) > 0) { + optlen += 4 + num_sacks * 8; /* 4 bytes for header (including 2*NOP), plus 8B for each SACK */ + } +#endif + + p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt)); + if (p == NULL) { + /* let tcp_fasttmr retry sending this ACK */ + tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); + return ERR_BUF; + } + tcp_output_fill_options(pcb, p, optflags, num_sacks); + +#if LWIP_TCP_TIMESTAMPS + pcb->ts_lastacksent = pcb->rcv_nxt; +#endif + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, + ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); + err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); + if (err != ERR_OK) { + /* let tcp_fasttmr retry sending this ACK */ + tcp_set_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); + } else { + /* remove ACK flags from the PCB, as we sent an empty ACK now */ + tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW); + } + + return err; +} /** * Send keepalive packets to keep a connection active although @@ -1542,47 +2080,31 @@ tcp_keepalive(struct tcp_pcb *pcb) { err_t err; struct pbuf *p; - struct netif *netif; + u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb); + + LWIP_ASSERT("tcp_keepalive: invalid pcb", pcb != NULL); LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to ")); - ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip); + ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip); LWIP_DEBUGF(TCP_DEBUG, ("\n")); LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent)); - p = tcp_output_alloc_header(pcb, 0, 0, lwip_htonl(pcb->snd_nxt - 1)); + p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt - 1)); if (p == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: could not allocate memory for pbuf\n")); return ERR_MEM; } - netif = ip_route(&pcb->local_ip, &pcb->remote_ip); - if (netif == NULL) { - err = ERR_RTE; - } else { -#if CHECKSUM_GEN_TCP - IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { - struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload; - tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); - } -#endif /* CHECKSUM_GEN_TCP */ - TCP_STATS_INC(tcp.xmit); - - /* Send output to IP */ - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); - err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - } - pbuf_free(p); + tcp_output_fill_options(pcb, p, 0, 0); + err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F" err %d.\n", pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err)); return err; } - /** * Send persist timer zero-window probes to keep a connection active * when a window update is lost. @@ -1601,10 +2123,12 @@ tcp_zero_window_probe(struct tcp_pcb *pcb) u16_t len; u8_t is_fin; u32_t snd_nxt; - struct netif *netif; + u8_t optlen = LWIP_TCP_OPT_LENGTH_SEGMENT(0, pcb); + + LWIP_ASSERT("tcp_zero_window_probe: invalid pcb", pcb != NULL); LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: sending ZERO WINDOW probe to ")); - ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip); + ip_addr_debug_print_val(TCP_DEBUG, pcb->remote_ip); LWIP_DEBUGF(TCP_DEBUG, ("\n")); LWIP_DEBUGF(TCP_DEBUG, @@ -1612,21 +2136,26 @@ tcp_zero_window_probe(struct tcp_pcb *pcb) " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent)); - seg = pcb->unacked; - + /* Only consider unsent, persist timer should be off when there is data in-flight */ + seg = pcb->unsent; if (seg == NULL) { - seg = pcb->unsent; - } - if (seg == NULL) { - /* nothing to send, zero window probe not needed */ + /* Not expected, persist timer should be off when the send buffer is empty */ return ERR_OK; } + /* increment probe count. NOTE: we record probe even if it fails + to actually transmit due to an error. This ensures memory exhaustion/ + routing problem doesn't leave a zero-window pcb as an indefinite zombie. + RTO mechanism has similar behavior, see pcb->nrtx */ + if (pcb->persist_probe < 0xFF) { + ++pcb->persist_probe; + } + is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); /* we want to send one seqno: either FIN or data (no options) */ len = is_fin ? 0 : 1; - p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno); + p = tcp_output_alloc_header(pcb, optlen, len, seg->tcphdr->seqno); if (p == NULL) { LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); return ERR_MEM; @@ -1650,27 +2179,9 @@ tcp_zero_window_probe(struct tcp_pcb *pcb) if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { pcb->snd_nxt = snd_nxt; } + tcp_output_fill_options(pcb, p, 0, 0); - netif = ip_route(&pcb->local_ip, &pcb->remote_ip); - if (netif == NULL) { - err = ERR_RTE; - } else { -#if CHECKSUM_GEN_TCP - IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) { - tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); - } -#endif - TCP_STATS_INC(tcp.xmit); - - /* Send output to IP */ - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); - err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, - 0, IP_PROTO_TCP, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - } - - pbuf_free(p); + err = tcp_output_control_segment(pcb, p, &pcb->local_ip, &pcb->remote_ip); LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F " ackno %"U32_F" err %d.\n", diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timeouts.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/timeouts.c similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timeouts.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/timeouts.c index bcaa80d..f37acfe 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/timeouts.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/timeouts.c @@ -57,9 +57,9 @@ #include "lwip/nd6.h" #include "lwip/ip6_frag.h" #include "lwip/mld6.h" +#include "lwip/dhcp6.h" #include "lwip/sys.h" #include "lwip/pbuf.h" -#include "lwip/alg.h" #if LWIP_DEBUG_TIMERNAMES #define HANDLER(x) x, #x @@ -67,6 +67,11 @@ #define HANDLER(x) x #endif /* LWIP_DEBUG_TIMERNAMES */ +#define LWIP_MAX_TIMEOUT 0x7fffffff + +/* Check if timer's expiry time is greater than time and care about u32_t wraparounds */ +#define TIME_LESS_THAN(t, compare_to) ( (((u32_t)((t)-(compare_to))) > LWIP_MAX_TIMEOUT) ? 1 : 0 ) + /** This array contains all stack-internal cyclic timers. To get the number of * timers, use LWIP_ARRAYSIZE() */ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { @@ -104,14 +109,27 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { #if LWIP_IPV6_MLD {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)}, #endif /* LWIP_IPV6_MLD */ +#if LWIP_IPV6_DHCP6 + {DHCP6_TIMER_MSECS, HANDLER(dhcp6_tmr)}, +#endif /* LWIP_IPV6_DHCP6 */ #endif /* LWIP_IPV6 */ }; +const int lwip_num_cyclic_timers = LWIP_ARRAYSIZE(lwip_cyclic_timers); #if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM -#define MAX_TIMEO_SIZE 5 + /** The one and only timeout list */ -static struct sys_timeo *next_timeout[MAX_TIMEO_SIZE]; -static u32_t timeouts_last_time; +static struct sys_timeo *next_timeout; + +static u32_t current_timeout_due_time; + +#if LWIP_TESTMODE +struct sys_timeo** +sys_timeouts_get_next_timeout(void) +{ + return &next_timeout; +} +#endif #if LWIP_TCP /** global variable that shows if the tcp timer is currently scheduled or not */ @@ -147,6 +165,8 @@ tcpip_tcp_timer(void *arg) void tcp_timer_needed(void) { + LWIP_ASSERT_CORE_LOCKED(); + /* timer is off but needed again? */ if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { /* enable and start timer */ @@ -156,20 +176,88 @@ tcp_timer_needed(void) } #endif /* LWIP_TCP */ +static void +#if LWIP_DEBUG_TIMERNAMES +sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg, const char *handler_name) +#else /* LWIP_DEBUG_TIMERNAMES */ +sys_timeout_abs(u32_t abs_time, sys_timeout_handler handler, void *arg) +#endif +{ + struct sys_timeo *timeout, *t; + + timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); + if (timeout == NULL) { + LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); + return; + } + + timeout->next = NULL; + timeout->h = handler; + timeout->arg = arg; + timeout->time = abs_time; + +#if LWIP_DEBUG_TIMERNAMES + timeout->handler_name = handler_name; + LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p abs_time=%"U32_F" handler=%s arg=%p\n", + (void *)timeout, abs_time, handler_name, (void *)arg)); +#endif /* LWIP_DEBUG_TIMERNAMES */ + + if (next_timeout == NULL) { + next_timeout = timeout; + return; + } + if (TIME_LESS_THAN(timeout->time, next_timeout->time)) { + timeout->next = next_timeout; + next_timeout = timeout; + } else { + for (t = next_timeout; t != NULL; t = t->next) { + if ((t->next == NULL) || TIME_LESS_THAN(timeout->time, t->next->time)) { + timeout->next = t->next; + t->next = timeout; + break; + } + } + } +} + /** - * Timer callback function that calls mld6_tmr() and reschedules itself. + * Timer callback function that calls cyclic->handler() and reschedules itself. * * @param arg unused argument */ -static void -cyclic_timer(void *arg) +#if !LWIP_TESTMODE +static +#endif +void +lwip_cyclic_timer(void *arg) { - const struct lwip_cyclic_timer* cyclic = (const struct lwip_cyclic_timer*)arg; + u32_t now; + u32_t next_timeout_time; + const struct lwip_cyclic_timer *cyclic = (const struct lwip_cyclic_timer *)arg; + #if LWIP_DEBUG_TIMERNAMES LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: %s()\n", cyclic->handler_name)); #endif cyclic->handler(); - sys_timeout(cyclic->interval_ms, cyclic_timer, arg); + + now = sys_now(); + next_timeout_time = (u32_t)(current_timeout_due_time + cyclic->interval_ms); /* overflow handled by TIME_LESS_THAN macro */ + if (TIME_LESS_THAN(next_timeout_time, now)) { + /* timer would immediately expire again -> "overload" -> restart without any correction */ +#if LWIP_DEBUG_TIMERNAMES + sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg, cyclic->handler_name); +#else + sys_timeout_abs((u32_t)(now + cyclic->interval_ms), lwip_cyclic_timer, arg); +#endif + + } else { + /* correct cyclic interval with handler execution delay and sys_check_timeouts jitter */ +#if LWIP_DEBUG_TIMERNAMES + sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg, cyclic->handler_name); +#else + sys_timeout_abs(next_timeout_time, lwip_cyclic_timer, arg); +#endif + } } /** Initialize this module */ @@ -180,10 +268,8 @@ void sys_timeouts_init(void) for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) { /* we have to cast via size_t to get rid of const warning (this is OK as cyclic_timer() casts back to const* */ - sys_timeout(lwip_cyclic_timers[i].interval_ms, cyclic_timer, LWIP_CONST_CAST(void*, &lwip_cyclic_timers[i])); + sys_timeout(lwip_cyclic_timers[i].interval_ms, lwip_cyclic_timer, LWIP_CONST_CAST(void *, &lwip_cyclic_timers[i])); } - /* Initialise timestamp for sys_check_timeouts */ - timeouts_last_time = sys_now(); } /** @@ -198,67 +284,25 @@ void sys_timeouts_init(void) */ #if LWIP_DEBUG_TIMERNAMES void -sys_timeout_debug_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name) +sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char *handler_name) #else /* LWIP_DEBUG_TIMERNAMES */ void -sys_timeout_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg) +sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg) #endif /* LWIP_DEBUG_TIMERNAMES */ { - struct sys_timeo *timeout, *t; - u32_t now, diff; - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); - if (timeout == NULL) { - LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); - return; - } + u32_t next_timeout_time; - now = sys_now(); - if (*timeo == NULL) { - diff = 0; - timeouts_last_time = now; - } else { - diff = now - timeouts_last_time; - } + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("Timeout time too long, max is LWIP_UINT32_MAX/4 msecs", msecs <= (LWIP_UINT32_MAX / 4)); + + next_timeout_time = (u32_t)(sys_now() + msecs); /* overflow handled by TIME_LESS_THAN macro */ - timeout->next = NULL; - timeout->h = handler; - timeout->arg = arg; - timeout->time = msecs + diff; #if LWIP_DEBUG_TIMERNAMES - timeout->handler_name = handler_name; - LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n", - (void *)timeout, msecs, handler_name, (void *)arg)); -#endif /* LWIP_DEBUG_TIMERNAMES */ - - if (*timeo == NULL) { - *timeo = timeout; - return; - } - - if ((*timeo)->time > msecs) { - (*timeo)->time -= msecs; - timeout->next = *timeo; - *timeo = timeout; - } else { - for(t = *timeo; t != NULL; t = t->next) { - timeout->time -= t->time; - if (t->next == NULL || t->next->time > timeout->time) { - if (t->next != NULL) { - t->next->time -= timeout->time; - } else if (timeout->time > msecs) { - /* If this is the case, 'timeouts_last_time' and 'now' differs too much. - This can be due to sys_check_timeouts() not being called at the right - times, but also when stopping in a breakpoint. Anyway, let's assume - this is not wanted, so add the first timer's time instead of 'diff' */ - timeout->time = msecs + (*timeo)->time; - } - timeout->next = t->next; - t->next = timeout; - break; - } - } - } + sys_timeout_abs(next_timeout_time, handler, arg, handler_name); +#else + sys_timeout_abs(next_timeout_time, handler, arg); +#endif } /** @@ -270,28 +314,25 @@ sys_timeout_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void * @param arg callback argument that would be passed to handler */ void -sys_untimeout_p(u8 timeo_assigned, sys_timeout_handler handler, void *arg) +sys_untimeout(sys_timeout_handler handler, void *arg) { struct sys_timeo *prev_t, *t; - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - if (*timeo == NULL) { + LWIP_ASSERT_CORE_LOCKED(); + + if (next_timeout == NULL) { return; } - for (t = *timeo, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { + for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { if ((t->h == handler) && (t->arg == arg)) { /* We have a match */ /* Unlink from previous in list */ if (prev_t == NULL) { - *timeo = t->next; + next_timeout = t->next; } else { prev_t->next = t->next; } - /* If not the last one, add time of this one back to next */ - if (t->next != NULL) { - t->next->time += t->time; - } memp_free(MEMP_SYS_TIMEOUT, t); return; } @@ -307,62 +348,54 @@ sys_untimeout_p(u8 timeo_assigned, sys_timeout_handler handler, void *arg) * * Must be called periodically from your main loop. */ -#if !NO_SYS && !defined __DOXYGEN__ -static -#endif /* !NO_SYS */ void sys_check_timeouts(void) { - struct sys_timeo **timeo = &next_timeout[0]; - if (*timeo) { + u32_t now; + + LWIP_ASSERT_CORE_LOCKED(); + + /* Process only timers expired at the start of the function. */ + now = sys_now(); + + do { struct sys_timeo *tmptimeout; - u32_t diff; sys_timeout_handler handler; void *arg; - u8_t had_one; - u32_t now; - now = sys_now(); - /* this cares for wraparounds */ - diff = now - timeouts_last_time; - do { - PBUF_CHECK_FREE_OOSEQ(); - had_one = 0; - tmptimeout = *timeo; - if (tmptimeout && (tmptimeout->time <= diff)) { - /* timeout has expired */ - had_one = 1; - timeouts_last_time += tmptimeout->time; - diff -= tmptimeout->time; - *timeo = tmptimeout->next; - handler = tmptimeout->h; - arg = tmptimeout->arg; + PBUF_CHECK_FREE_OOSEQ(); + + tmptimeout = next_timeout; + if (tmptimeout == NULL) { + return; + } + + if (TIME_LESS_THAN(now, tmptimeout->time)) { + return; + } + + /* Timeout has expired */ + next_timeout = tmptimeout->next; + handler = tmptimeout->h; + arg = tmptimeout->arg; + current_timeout_due_time = tmptimeout->time; #if LWIP_DEBUG_TIMERNAMES - if (handler != NULL) { - LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n", - tmptimeout->handler_name, arg)); - } + if (handler != NULL) { + LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s t=%"U32_F" arg=%p\n", + tmptimeout->handler_name, sys_now() - tmptimeout->time, arg)); + } #endif /* LWIP_DEBUG_TIMERNAMES */ - memp_free(MEMP_SYS_TIMEOUT, tmptimeout); - if (handler != NULL) { -#if !NO_SYS - /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the - timeout handler function. */ - LOCK_TCPIP_CORE(); -#endif /* !NO_SYS */ - handler(arg); -#if !NO_SYS - UNLOCK_TCPIP_CORE(); -#endif /* !NO_SYS */ - } - LWIP_TCPIP_THREAD_ALIVE(); - } - /* repeat until all expired timers have been called */ - } while (had_one); - } + memp_free(MEMP_SYS_TIMEOUT, tmptimeout); + if (handler != NULL) { + handler(arg); + } + LWIP_TCPIP_THREAD_ALIVE(); + + /* Repeat until all expired timers have been called */ + } while (1); } -/** Set back the timestamp of the last call to sys_check_timeouts() +/** Rebase the timeout times to the current time. * This is necessary if sys_check_timeouts() hasn't been called for a long * time (e.g. while saving energy) to prevent all timer functions of that * period being called. @@ -370,64 +403,45 @@ sys_check_timeouts(void) void sys_restart_timeouts(void) { - timeouts_last_time = sys_now(); + u32_t now; + u32_t base; + struct sys_timeo *t; + + if (next_timeout == NULL) { + return; + } + + now = sys_now(); + base = next_timeout->time; + + for (t = next_timeout; t != NULL; t = t->next) { + t->time = (t->time - base) + now; + } } /** Return the time left before the next timeout is due. If no timeouts are * enqueued, returns 0xffffffff */ -#if !NO_SYS -static -#endif /* !NO_SYS */ u32_t -sys_timeouts_sleeptime_p(u8 timeo_assigned) +sys_timeouts_sleeptime(void) { - u32_t diff; - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; - if (*timeo == NULL) { - return 0xffffffff; + u32_t now; + + LWIP_ASSERT_CORE_LOCKED(); + + if (next_timeout == NULL) { + return SYS_TIMEOUTS_SLEEPTIME_INFINITE; } - diff = sys_now() - timeouts_last_time; - if (diff > (*timeo)->time) { + now = sys_now(); + if (TIME_LESS_THAN(next_timeout->time, now)) { return 0; } else { - return (*timeo)->time - diff; + u32_t ret = (u32_t)(next_timeout->time - now); + LWIP_ASSERT("invalid sleeptime", ret <= LWIP_MAX_TIMEOUT); + return ret; } } -#if !NO_SYS - -/** - * Wait (forever) for a message to arrive in an mbox. - * While waiting, timeouts are processed. - * - * @param mbox the mbox to fetch the message from - * @param msg the place to store the message - */ -void -sys_timeouts_mbox_fetch_p(u8 timeo_assigned, sys_mbox_t *mbox, void **msg) -{ - u32_t sleeptime; - - struct sys_timeo **timeo = &next_timeout[timeo_assigned]; -again: - if (!(*timeo)) { - sys_arch_mbox_fetch(mbox, msg, 0); - return; - } - - sleeptime = sys_timeouts_sleeptime_p(timeo_assigned); - if (sleeptime == 0 || sys_arch_mbox_fetch(mbox, msg, sleeptime) == SYS_ARCH_TIMEOUT) { - /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred - before a message could be fetched. */ - sys_check_timeouts(); - /* We try again to fetch a message from the mbox. */ - goto again; - } -} - -#endif /* NO_SYS */ - #else /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */ /* Satisfy the TCP code which calls this function */ void diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/udp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/udp.c similarity index 73% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/udp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/udp.c index 47fb042..e4bd53d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/udp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/core/udp.c @@ -3,11 +3,11 @@ * User Datagram Protocol module\n * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).\n * See also @ref udp_raw - * + * * @defgroup udp_raw UDP * @ingroup callbackstyle_api * User Datagram Protocol module\n - * @see @ref raw_api and @ref netconn + * @see @ref api */ /* @@ -71,7 +71,7 @@ "The Dynamic and/or Private Ports are those from 49152 through 65535" */ #define UDP_LOCAL_PORT_RANGE_START 0xc000 #define UDP_LOCAL_PORT_RANGE_END 0xffff -#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START)) +#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & (u16_t)~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START)) #endif /* last local UDP port */ @@ -87,9 +87,9 @@ struct udp_pcb *udp_pcbs; void udp_init(void) { -#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) +#ifdef LWIP_RAND udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); -#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ +#endif /* LWIP_RAND */ } /** @@ -133,6 +133,15 @@ udp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast) LWIP_UNUSED_ARG(inp); /* in IPv6 only case */ LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */ + LWIP_ASSERT("udp_input_local_match: invalid pcb", pcb != NULL); + LWIP_ASSERT("udp_input_local_match: invalid netif", inp != NULL); + + /* check if PCB is bound to specific netif */ + if ((pcb->netif_idx != NETIF_NO_INDEX) && + (pcb->netif_idx != netif_get_index(ip_data.current_input_netif))) { + return 0; + } + /* Dual-stack: PCBs listening to any IP type also listen to any IP address */ if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { #if LWIP_IPV4 && IP_SOF_BROADCAST_RECV @@ -154,17 +163,17 @@ udp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast) #endif /* IP_SOF_BROADCAST_RECV */ { if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || - ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) || - ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) { + ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) || + ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) { return 1; } } } else #endif /* LWIP_IPV4 */ - /* Handle IPv4 and IPv6: all or exact match */ - if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) { - return 1; - } + /* Handle IPv4 and IPv6: all or exact match */ + if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) { + return 1; + } } return 0; @@ -194,6 +203,11 @@ udp_input(struct pbuf *p, struct netif *inp) LWIP_UNUSED_ARG(inp); + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ASSERT("udp_input: invalid pbuf", p != NULL); + LWIP_ASSERT("udp_input: invalid netif", inp != NULL); + PERF_START; UDP_STATS_INC(udp.recv); @@ -225,9 +239,9 @@ udp_input(struct pbuf *p, struct netif *inp) /* print the UDP source and destination */ LWIP_DEBUGF(UDP_DEBUG, ("udp (")); - ip_addr_debug_print(UDP_DEBUG, ip_current_dest_addr()); + ip_addr_debug_print_val(UDP_DEBUG, *ip_current_dest_addr()); LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", lwip_ntohs(udphdr->dest))); - ip_addr_debug_print(UDP_DEBUG, ip_current_src_addr()); + ip_addr_debug_print_val(UDP_DEBUG, *ip_current_src_addr()); LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", lwip_ntohs(udphdr->src))); pcb = NULL; @@ -240,29 +254,42 @@ udp_input(struct pbuf *p, struct netif *inp) for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { /* print the PCB local and remote address */ LWIP_DEBUGF(UDP_DEBUG, ("pcb (")); - ip_addr_debug_print(UDP_DEBUG, &pcb->local_ip); + ip_addr_debug_print_val(UDP_DEBUG, pcb->local_ip); LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port)); - ip_addr_debug_print(UDP_DEBUG, &pcb->remote_ip); + ip_addr_debug_print_val(UDP_DEBUG, pcb->remote_ip); LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", pcb->remote_port)); /* compare PCB local addr+port to UDP destination addr+port */ if ((pcb->local_port == dest) && (udp_input_local_match(pcb, inp, broadcast) != 0)) { - if (((pcb->flags & UDP_FLAGS_CONNECTED) == 0) && - ((uncon_pcb == NULL) + if ((pcb->flags & UDP_FLAGS_CONNECTED) == 0) { + if (uncon_pcb == NULL) { + /* the first unconnected matching PCB */ + uncon_pcb = pcb; +#if LWIP_IPV4 + } else if (broadcast && ip4_current_dest_addr()->addr == IPADDR_BROADCAST) { + /* global broadcast address (only valid for IPv4; match was checked before) */ + if (!IP_IS_V4_VAL(uncon_pcb->local_ip) || !ip4_addr_cmp(ip_2_ip4(&uncon_pcb->local_ip), netif_ip4_addr(inp))) { + /* uncon_pcb does not match the input netif, check this pcb */ + if (IP_IS_V4_VAL(pcb->local_ip) && ip4_addr_cmp(ip_2_ip4(&pcb->local_ip), netif_ip4_addr(inp))) { + /* better match */ + uncon_pcb = pcb; + } + } +#endif /* LWIP_IPV4 */ + } #if SO_REUSE - /* prefer specific IPs over cath-all */ - || !ip_addr_isany(&pcb->local_ip) + else if (!ip_addr_isany(&pcb->local_ip)) { + /* prefer specific IPs over catch-all */ + uncon_pcb = pcb; + } #endif /* SO_REUSE */ - )) { - /* the first unconnected matching PCB */ - uncon_pcb = pcb; } /* compare PCB remote addr+port to UDP source addr+port */ if ((pcb->remote_port == src) && (ip_addr_isany_val(pcb->remote_ip) || - ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) { + ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) { /* the first fully matching PCB */ if (prev != NULL) { /* move the pcb to the front of udp_pcbs so that is @@ -303,7 +330,7 @@ udp_input(struct pbuf *p, struct netif *inp) if (for_us) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n")); #if CHECKSUM_CHECK_UDP - IF__NETIF_CHECKSUM_ENABLED(inp, CHECKSUM_CHECK_UDP) { + IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_UDP) { #if LWIP_UDPLITE if (ip_current_header_proto() == IP_PROTO_UDPLITE) { /* Do the UDP Lite checksum */ @@ -320,8 +347,8 @@ udp_input(struct pbuf *p, struct netif *inp) } } if (ip_chksum_pseudo_partial(p, IP_PROTO_UDPLITE, - p->tot_len, chklen, - ip_current_src_addr(), ip_current_dest_addr()) != 0) { + p->tot_len, chklen, + ip_current_src_addr(), ip_current_dest_addr()) != 0) { goto chkerr; } } else @@ -337,9 +364,9 @@ udp_input(struct pbuf *p, struct netif *inp) } } #endif /* CHECKSUM_CHECK_UDP */ - if (pbuf_header(p, -UDP_HLEN)) { + if (pbuf_remove_header(p, UDP_HLEN)) { /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); + LWIP_ASSERT("pbuf_remove_header failed\n", 0); UDP_STATS_INC(udp.drop); MIB2_STATS_INC(mib2.udpinerrors); pbuf_free(p); @@ -354,8 +381,6 @@ udp_input(struct pbuf *p, struct netif *inp) /* pass broadcast- or multicast packets to all multicast pcbs if SOF_REUSEADDR is set on the first match */ struct udp_pcb *mpcb; - u8_t p_header_changed = 0; - s16_t hdrs_len = (s16_t)(ip_current_header_tot_len() + UDP_HLEN); for (mpcb = udp_pcbs; mpcb != NULL; mpcb = mpcb->next) { if (mpcb != pcb) { /* compare PCB local addr+port to UDP destination addr+port */ @@ -364,28 +389,14 @@ udp_input(struct pbuf *p, struct netif *inp) /* pass a copy of the packet to all local matches */ if (mpcb->recv != NULL) { struct pbuf *q; - /* for that, move payload to IP header again */ - if (p_header_changed == 0) { - pbuf_header_force(p, hdrs_len); - p_header_changed = 1; - } - q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + q = pbuf_clone(PBUF_RAW, PBUF_POOL, p); if (q != NULL) { - err_t err = pbuf_copy(q, p); - if (err == ERR_OK) { - /* move payload to UDP data */ - pbuf_header(q, -hdrs_len); - mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src); - } + mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src); } } } } } - if (p_header_changed) { - /* and move payload to UDP data again */ - pbuf_header(p, -hdrs_len); - } } #endif /* SO_REUSE && SO_REUSE_RXTOALL */ /* callback */ @@ -434,7 +445,8 @@ chkerr: /** * @ingroup udp_raw - * Send data using UDP. + * Sends the pbuf p using UDP. The pbuf is not deallocated. + * * * @param pcb UDP PCB used to send the data. * @param p chain of pbuf's to be sent. @@ -455,7 +467,10 @@ chkerr: err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) { - if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) { + LWIP_ERROR("udp_send: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_send: invalid pbuf", p != NULL, return ERR_ARG); + + if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) { return ERR_VAL; } @@ -471,13 +486,16 @@ err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, u8_t have_chksum, u16_t chksum) { - if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) { + LWIP_ERROR("udp_send_chksum: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_send_chksum: invalid pbuf", p != NULL, return ERR_ARG); + + if (IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) { return ERR_VAL; } /* send to the packet using remote ip and port stored in the pcb */ return udp_sendto_chksum(pcb, p, &pcb->remote_ip, pcb->remote_port, - have_chksum, chksum); + have_chksum, chksum); } #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ @@ -501,7 +519,7 @@ udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, */ err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p, - const ip_addr_t *dst_ip, u16_t dst_port) + const ip_addr_t *dst_ip, u16_t dst_port) { #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0); @@ -515,43 +533,57 @@ udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, { #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ struct netif *netif; - const ip_addr_t *dst_ip_route = dst_ip; - if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { + LWIP_ERROR("udp_sendto: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto: invalid pbuf", p != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto: invalid dst_ip", dst_ip != NULL, return ERR_ARG); + + if (!IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n")); -#if LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) - if (ip_addr_ismulticast(dst_ip_route)) { -#if LWIP_IPV6 - if (IP_IS_V6(dst_ip)) { - /* For multicast, find a netif based on source address. */ - dst_ip_route = &pcb->local_ip; - } else -#endif /* LWIP_IPV6 */ - { -#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS - /* IPv4 does not use source-based routing by default, so we use an - administratively selected interface for multicast by default. - However, this can be overridden by setting an interface address - in pcb->multicast_ip that is used for routing. */ - if (!ip_addr_isany_val(pcb->multicast_ip) && - !ip4_addr_cmp(ip_2_ip4(&pcb->multicast_ip), IP4_ADDR_BROADCAST)) { - dst_ip_route = &pcb->multicast_ip; - } -#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS */ - } - } -#endif /* LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) */ - - /* find the outgoing network interface for this packet */ - if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { - /* Don't call ip_route() with IP_ANY_TYPE */ - netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(dst_ip_route)), dst_ip_route); + if (pcb->netif_idx != NETIF_NO_INDEX) { + netif = netif_get_by_index(pcb->netif_idx); } else { - netif = ip_route(&pcb->local_ip, dst_ip_route); +#if LWIP_MULTICAST_TX_OPTIONS + netif = NULL; + if (ip_addr_ismulticast(dst_ip)) { + /* For IPv6, the interface to use for packets with a multicast destination + * is specified using an interface index. The same approach may be used for + * IPv4 as well, in which case it overrides the IPv4 multicast override + * address below. Here we have to look up the netif by going through the + * list, but by doing so we skip a route lookup. If the interface index has + * gone stale, we fall through and do the regular route lookup after all. */ + if (pcb->mcast_ifindex != NETIF_NO_INDEX) { + netif = netif_get_by_index(pcb->mcast_ifindex); + } +#if LWIP_IPV4 + else +#if LWIP_IPV6 + if (IP_IS_V4(dst_ip)) +#endif /* LWIP_IPV6 */ + { + /* IPv4 does not use source-based routing by default, so we use an + administratively selected interface for multicast by default. + However, this can be overridden by setting an interface address + in pcb->mcast_ip4 that is used for routing. If this routing lookup + fails, we try regular routing as though no override was set. */ + if (!ip4_addr_isany_val(pcb->mcast_ip4) && + !ip4_addr_cmp(&pcb->mcast_ip4, IP4_ADDR_BROADCAST)) { + netif = ip4_route_src(ip_2_ip4(&pcb->local_ip), &pcb->mcast_ip4); + } + } +#endif /* LWIP_IPV4 */ + } + + if (netif == NULL) +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + { + /* find the outgoing network interface for this packet */ + netif = ip_route(&pcb->local_ip, dst_ip); + } } /* no outgoing network interface could be found? */ @@ -591,7 +623,7 @@ udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, */ err_t udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, - const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif) + const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif) { #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0); @@ -606,14 +638,20 @@ udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_i #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ const ip_addr_t *src_ip; - if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { + LWIP_ERROR("udp_sendto_if: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if: invalid pbuf", p != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if: invalid dst_ip", dst_ip != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if: invalid netif", netif != NULL, return ERR_ARG); + + if (!IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } - /* PCB local address is IP_ANY_ADDR? */ + /* PCB local address is IP_ANY_ADDR or multicast? */ #if LWIP_IPV6 if (IP_IS_V6(dst_ip)) { - if (ip6_addr_isany(ip_2_ip6(&pcb->local_ip))) { + if (ip6_addr_isany(ip_2_ip6(&pcb->local_ip)) || + ip6_addr_ismulticast(ip_2_ip6(&pcb->local_ip))) { src_ip = ip6_select_source_address(netif, ip_2_ip6(dst_ip)); if (src_ip == NULL) { /* No suitable source address was found. */ @@ -633,21 +671,21 @@ udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_i else #endif /* LWIP_IPV4 && LWIP_IPV6 */ #if LWIP_IPV4 - if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || - ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) { - /* if the local_ip is any or multicast - * use the outgoing network interface IP address as source address */ - src_ip = netif_ip_addr4(netif); - } else { - /* check if UDP PCB local IP address is correct - * this could be an old address if netif->ip_addr has changed */ - if (!ip4_addr_cmp(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) { - /* local_ip doesn't match, drop the packet */ - return ERR_RTE; + if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) || + ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) { + /* if the local_ip is any or multicast + * use the outgoing network interface IP address as source address */ + src_ip = netif_ip_addr4(netif); + } else { + /* check if UDP PCB local IP address is correct + * this could be an old address if netif->ip_addr has changed */ + if (!ip4_addr_cmp(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) { + /* local_ip doesn't match, drop the packet */ + return ERR_RTE; + } + /* use UDP PCB local IP address as source address */ + src_ip = &pcb->local_ip; } - /* use UDP PCB local IP address as source address */ - src_ip = &pcb->local_ip; - } #endif /* LWIP_IPV4 */ #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum, src_ip); @@ -660,7 +698,7 @@ udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_i * Same as @ref udp_sendto_if, but with source address */ err_t udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, - const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip) + const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip) { #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0, src_ip); @@ -669,8 +707,8 @@ udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, /** Same as udp_sendto_if_src(), but with checksum */ err_t udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, - u16_t dst_port, struct netif *netif, u8_t have_chksum, - u16_t chksum, const ip_addr_t *src_ip) + u16_t dst_port, struct netif *netif, u8_t have_chksum, + u16_t chksum, const ip_addr_t *src_ip) { #endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ struct udp_hdr *udphdr; @@ -679,7 +717,15 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d u8_t ip_proto; u8_t ttl; - if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("udp_sendto_if_src: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if_src: invalid pbuf", p != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if_src: invalid dst_ip", dst_ip != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if_src: invalid src_ip", src_ip != NULL, return ERR_ARG); + LWIP_ERROR("udp_sendto_if_src: invalid netif", netif != NULL, return ERR_ARG); + + if (!IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) { return ERR_VAL; } @@ -692,7 +738,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d #endif /* LWIP_IPV6 */ ip_addr_isbroadcast(dst_ip, netif)) { LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); + ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); return ERR_VAL; } #endif /* LWIP_IPV4 && IP_SOF_BROADCAST */ @@ -707,8 +753,12 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d } } + /* packet too large to add a UDP header without causing an overflow? */ + if ((u16_t)(p->tot_len + UDP_HLEN) < p->tot_len) { + return ERR_MEM; + } /* not enough space to add an UDP header to first pbuf in given p chain? */ - if (pbuf_header(p, UDP_HLEN)) { + if (pbuf_add_header(p, UDP_HLEN)) { /* allocate header in a separate new pbuf */ q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); /* new header pbuf could not be allocated? */ @@ -739,11 +789,11 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d udphdr->chksum = 0x0000; /* Multicast Loop? */ -#if (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD) +#if LWIP_MULTICAST_TX_OPTIONS if (((pcb->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) && ip_addr_ismulticast(dst_ip)) { q->flags |= PBUF_FLAG_MCASTLOOP; } -#endif /* (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD) */ +#endif /* LWIP_MULTICAST_TX_OPTIONS */ LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len)); @@ -777,7 +827,7 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d } #endif /* LWIP_CHECKSUM_ON_COPY */ udphdr->chksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDPLITE, - q->tot_len, chklen, src_ip, dst_ip); + q->tot_len, chklen, src_ip, dst_ip); #if LWIP_CHECKSUM_ON_COPY if (have_chksum) { u32_t acc; @@ -809,14 +859,14 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d if (have_chksum) { u32_t acc; udpchksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDP, - q->tot_len, UDP_HLEN, src_ip, dst_ip); + q->tot_len, UDP_HLEN, src_ip, dst_ip); acc = udpchksum + (u16_t)~(chksum); udpchksum = FOLD_U32T(acc); } else #endif /* LWIP_CHECKSUM_ON_COPY */ { udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len, - src_ip, dst_ip); + src_ip, dst_ip); } /* chksum zero must become 0xffff, as zero means 'no checksum' */ @@ -840,9 +890,9 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum)); LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto)); /* output to IP */ - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); + NETIF_SET_HINTS(netif, &(pcb->netif_hints)); err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif); - NETIF_SET_HWADDRHINT(netif, NULL); + NETIF_RESET_HINTS(netif); /* @todo: must this be increased even if error occurred? */ MIB2_STATS_INC(mib2.udpoutdatagrams); @@ -862,9 +912,9 @@ udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *d /** * @ingroup udp_raw * Bind an UDP PCB. - * + * * @param pcb UDP PCB to be bound with a local address ipaddr and port. - * @param ipaddr local IP address to bind with. Use IP4_ADDR_ANY to + * @param ipaddr local IP address to bind with. Use IP_ANY_TYPE to * bind to all local interfaces. * @param port local UDP port to bind with. Use 0 to automatically bind * to a random port between UDP_LOCAL_PORT_RANGE_START and @@ -884,18 +934,22 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) { struct udp_pcb *ipcb; u8_t rebind; +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + ip_addr_t zoned_ipaddr; +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + + LWIP_ASSERT_CORE_LOCKED(); #if LWIP_IPV4 /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */ if (ipaddr == NULL) { ipaddr = IP4_ADDR_ANY; } +#else /* LWIP_IPV4 */ + LWIP_ERROR("udp_bind: invalid ipaddr", ipaddr != NULL, return ERR_ARG); #endif /* LWIP_IPV4 */ - /* still need to check for ipaddr == NULL in IPv6 only case */ - if ((pcb == NULL) || (ipaddr == NULL)) { - return ERR_VAL; - } + LWIP_ERROR("udp_bind: invalid pcb", pcb != NULL, return ERR_ARG); LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = ")); ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE, ipaddr); @@ -918,6 +972,18 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) } } +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now. + * This is legacy support: scope-aware callers should always provide properly + * zoned source addresses. Do the zone selection before the address-in-use + * check below; as such we have to make a temporary copy of the address. */ + if (IP_IS_V6(ipaddr) && ip6_addr_lacks_zone(ip_2_ip6(ipaddr), IP6_UNKNOWN)) { + ip_addr_copy(zoned_ipaddr, *ipaddr); + ip6_addr_select_zone(ip_2_ip6(&zoned_ipaddr), ip_2_ip6(&zoned_ipaddr)); + ipaddr = &zoned_ipaddr; + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + /* no port specified? */ if (port == 0) { port = udp_new_port(); @@ -929,9 +995,9 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) } else { for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { if (pcb != ipcb) { - /* By default, we don't allow to bind to a port that any other udp - PCB is already bound to, unless *all* PCBs with that port have tha - REUSEADDR flag set. */ + /* By default, we don't allow to bind to a port that any other udp + PCB is already bound to, unless *all* PCBs with that port have tha + REUSEADDR flag set. */ #if SO_REUSE if (!ip_get_option(pcb, SOF_REUSEADDR) || !ip_get_option(ipcb, SOF_REUSEADDR)) @@ -939,8 +1005,13 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) { /* port matches that of PCB in list and REUSEADDR not set -> reject */ if ((ipcb->local_port == port) && - /* IP address matches? */ - ip_addr_cmp(&ipcb->local_ip, ipaddr)) { + (((IP_GET_TYPE(&ipcb->local_ip) == IP_GET_TYPE(ipaddr)) && + /* IP address matches or any IP used? */ + (ip_addr_cmp(&ipcb->local_ip, ipaddr) || + ip_addr_isany(ipaddr) || + ip_addr_isany(&ipcb->local_ip))) || + (IP_GET_TYPE(&ipcb->local_ip) == IPADDR_TYPE_ANY) || + (IP_GET_TYPE(ipaddr) == IPADDR_TYPE_ANY))) { /* other PCB already binds to this local IP and port */ LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: local port %"U16_F" already bound by another pcb\n", port)); @@ -962,25 +1033,39 @@ udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) udp_pcbs = pcb; } LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_bind: bound to ")); - ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, &pcb->local_ip); + ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, pcb->local_ip); LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->local_port)); return ERR_OK; } -/* udp has broadcast frame and has two netif, use this interface to bind netif*/ -err_t -udp_bind_multicast_netif(struct udp_pcb *pcb, ip_addr_t *ipaddr) +/** + * @ingroup udp_raw + * Bind an UDP PCB to a specific netif. + * After calling this function, all packets received via this PCB + * are guaranteed to have come in via the specified netif, and all + * outgoing packets will go out via the specified netif. + * + * @param pcb UDP PCB to be bound. + * @param netif netif to bind udp pcb to. Can be NULL. + * + * @see udp_disconnect() + */ +void +udp_bind_netif(struct udp_pcb *pcb, const struct netif *netif) { - pcb->multicast_ip.addr = ipaddr->addr; - return ERR_OK; -} + LWIP_ASSERT_CORE_LOCKED(); + if (netif != NULL) { + pcb->netif_idx = netif_get_index(netif); + } else { + pcb->netif_idx = NETIF_NO_INDEX; + } +} /** * @ingroup udp_raw - * Connect an UDP PCB. - * - * This will associate the UDP PCB with the remote address. + * Sets the remote end of the pcb. This function does not generate any + * network traffic, but only sets the remote address of the pcb. * * @param pcb UDP PCB to be connected with remote address ipaddr and port. * @param ipaddr remote IP address to connect with. @@ -999,9 +1084,10 @@ udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) { struct udp_pcb *ipcb; - if ((pcb == NULL) || (ipaddr == NULL)) { - return ERR_VAL; - } + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("udp_connect: invalid pcb", pcb != NULL, return ERR_ARG); + LWIP_ERROR("udp_connect: invalid ipaddr", ipaddr != NULL, return ERR_ARG); if (pcb->local_port == 0) { err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); @@ -1011,12 +1097,21 @@ udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) } ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr); +#if LWIP_IPV6 && LWIP_IPV6_SCOPES + /* If the given IP address should have a zone but doesn't, assign one now, + * using the bound address to make a more informed decision when possible. */ + if (IP_IS_V6(&pcb->remote_ip) && + ip6_addr_lacks_zone(ip_2_ip6(&pcb->remote_ip), IP6_UNKNOWN)) { + ip6_addr_select_zone(ip_2_ip6(&pcb->remote_ip), ip_2_ip6(&pcb->local_ip)); + } +#endif /* LWIP_IPV6 && LWIP_IPV6_SCOPES */ + pcb->remote_port = port; pcb->flags |= UDP_FLAGS_CONNECTED; LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_connect: connected to ")); - ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - &pcb->remote_ip); + ip_addr_debug_print_val(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + pcb->remote_ip); LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->remote_port)); /* Insert UDP PCB into the list of active UDP PCBs. */ @@ -1034,13 +1129,18 @@ udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) /** * @ingroup udp_raw - * Disconnect a UDP PCB + * Remove the remote end of the pcb. This function does not generate + * any network traffic, but only removes the remote address of the pcb. * * @param pcb the udp pcb to disconnect. */ void udp_disconnect(struct udp_pcb *pcb) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("udp_disconnect: invalid pcb", pcb != NULL, return); + /* reset remote address association */ #if LWIP_IPV4 && LWIP_IPV6 if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) { @@ -1052,14 +1152,14 @@ udp_disconnect(struct udp_pcb *pcb) } #endif pcb->remote_port = 0; + pcb->netif_idx = NETIF_NO_INDEX; /* mark PCB as unconnected */ - pcb->flags &= ~UDP_FLAGS_CONNECTED; + udp_clear_flags(pcb, UDP_FLAGS_CONNECTED); } /** * @ingroup udp_raw - * Set a receive callback for a UDP PCB - * + * Set a receive callback for a UDP PCB. * This callback will be called when receiving a datagram for the pcb. * * @param pcb the pcb for which to set the recv callback @@ -1069,6 +1169,10 @@ udp_disconnect(struct udp_pcb *pcb) void udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) { + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("udp_recv: invalid pcb", pcb != NULL, return); + /* remember recv() callback and user data */ pcb->recv = recv; pcb->recv_arg = recv_arg; @@ -1076,8 +1180,8 @@ udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) /** * @ingroup udp_raw - * Remove an UDP PCB. - * + * Removes and deallocates the pcb. + * * @param pcb UDP PCB to be removed. The PCB is removed from the list of * UDP PCB's and the data structure is freed from memory. * @@ -1088,6 +1192,10 @@ udp_remove(struct udp_pcb *pcb) { struct udp_pcb *pcb2; + LWIP_ASSERT_CORE_LOCKED(); + + LWIP_ERROR("udp_remove: invalid pcb", pcb != NULL, return); + mib2_udp_unbind(pcb); /* pcb to be removed is first in list? */ if (udp_pcbs == pcb) { @@ -1109,7 +1217,10 @@ udp_remove(struct udp_pcb *pcb) /** * @ingroup udp_raw - * Create a UDP PCB. + * Creates a new UDP pcb which can be used for UDP communication. The + * pcb is not active until it has either been bound to a local address + * or connected to a remote address. + * @see MEMP_NUM_UDP_PCB * * @return The UDP PCB which was created. NULL if the PCB data structure * could not be allocated. @@ -1120,6 +1231,9 @@ struct udp_pcb * udp_new(void) { struct udp_pcb *pcb; + + LWIP_ASSERT_CORE_LOCKED(); + pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB); /* could allocate UDP PCB? */ if (pcb != NULL) { @@ -1139,6 +1253,9 @@ udp_new(void) /** * @ingroup udp_raw * Create a UDP PCB for specific IP type. + * The pcb is not active until it has either been bound to a local address + * or connected to a remote address. + * @see MEMP_NUM_UDP_PCB * * @param type IP address type, see @ref lwip_ip_addr_type definitions. * If you want to listen to IPv4 and IPv6 (dual-stack) packets, @@ -1152,6 +1269,9 @@ struct udp_pcb * udp_new_ip_type(u8_t type) { struct udp_pcb *pcb; + + LWIP_ASSERT_CORE_LOCKED(); + pcb = udp_new(); #if LWIP_IPV4 && LWIP_IPV6 if (pcb != NULL) { @@ -1169,9 +1289,9 @@ udp_new_ip_type(u8_t type) * @param old_addr IP address of the netif before change * @param new_addr IP address of the netif after change */ -void udp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr) +void udp_netif_ip_addr_changed(const ip_addr_t *old_addr, const ip_addr_t *new_addr) { - struct udp_pcb* upcb; + struct udp_pcb *upcb; if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) { for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/cc.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/cc.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/cc.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/cc.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/perf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/perf.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/perf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/perf.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/sys_arch.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/sys_arch.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/arch/sys_arch.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/arch/sys_arch.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/sys/socket.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/arpa/inet.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/sys/socket.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/arpa/inet.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/dhcp6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/net/if.h similarity index 69% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/dhcp6.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/net/if.h index f27a725..6b8e63a 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/core/ipv6/dhcp6.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/net/if.h @@ -1,14 +1,13 @@ /** * @file - * - * DHCPv6. + * This file is a posix wrapper for lwip/if_api.h. */ /* - * Copyright (c) 2010 Inico Technologies Ltd. + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. * All rights reserved. * - * Redistribution and use in source and binary forms, with or without modification, + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, @@ -17,34 +16,21 @@ * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * derived from this software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * This file is part of the lwIP TCP/IP stack. * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * */ -#include "lwip/opt.h" - -#if LWIP_IPV6 && LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/ip6_addr.h" -#include "lwip/def.h" - - -#endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */ +#include "lwip/if_api.h" diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/netdb.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/netdb.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/netdb.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/netdb.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/sys/socket.h similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/sys/socket.h index 51cf2d2..0ed9baf 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/CodeElement.cs +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/posix/sys/socket.h @@ -1,7 +1,9 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * All rights reserved. - * +/** + * @file + * This file is a posix wrapper for lwip/sockets.h. + */ + +/* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * @@ -26,16 +28,6 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Martin Hentschel - * */ -namespace CCodeGeneration -{ - public class CodeElement - { - public virtual void GenerateCode(int level, CGenerator generator) - { - } - } -} +#include "lwip/sockets.h" diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/errno.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/stdc/errno.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/errno.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/stdc/errno.h index 5917c75..98a9aec 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/posix/errno.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/compat/stdc/errno.h @@ -1,6 +1,6 @@ /** * @file - * This file is a posix wrapper for lwip/errno.h. + * This file is a posix/stdc wrapper for lwip/errno.h. */ /* diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/alg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/alg.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/alg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/alg.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp.h new file mode 100644 index 0000000..1b24544 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp.h @@ -0,0 +1,206 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * + * This file contains the generic API. + * For more details see @ref altcp_api. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_H +#define LWIP_HDR_ALTCP_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcpbase.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb; +struct altcp_functions; + +typedef err_t (*altcp_accept_fn)(void *arg, struct altcp_pcb *new_conn, err_t err); +typedef err_t (*altcp_connected_fn)(void *arg, struct altcp_pcb *conn, err_t err); +typedef err_t (*altcp_recv_fn)(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err); +typedef err_t (*altcp_sent_fn)(void *arg, struct altcp_pcb *conn, u16_t len); +typedef err_t (*altcp_poll_fn)(void *arg, struct altcp_pcb *conn); +typedef void (*altcp_err_fn)(void *arg, err_t err); + +typedef struct altcp_pcb* (*altcp_new_fn)(void *arg, u8_t ip_type); + +struct altcp_pcb { + const struct altcp_functions *fns; + struct altcp_pcb *inner_conn; + void *arg; + void *state; + /* application callbacks */ + altcp_accept_fn accept; + altcp_connected_fn connected; + altcp_recv_fn recv; + altcp_sent_fn sent; + altcp_poll_fn poll; + altcp_err_fn err; + u8_t pollinterval; +}; + +/** @ingroup altcp */ +typedef struct altcp_allocator_s { + /** Allocator function */ + altcp_new_fn alloc; + /** Argument to allocator function */ + void *arg; +} altcp_allocator_t; + +struct altcp_pcb *altcp_new(altcp_allocator_t *allocator); +struct altcp_pcb *altcp_new_ip6(altcp_allocator_t *allocator); +struct altcp_pcb *altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type); + +void altcp_arg(struct altcp_pcb *conn, void *arg); +void altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept); +void altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv); +void altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent); +void altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval); +void altcp_err(struct altcp_pcb *conn, altcp_err_fn err); + +void altcp_recved(struct altcp_pcb *conn, u16_t len); +err_t altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +err_t altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected); + +/* return conn for source code compatibility to tcp callback API only */ +struct altcp_pcb *altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err); +#define altcp_listen_with_backlog(conn, backlog) altcp_listen_with_backlog_and_err(conn, backlog, NULL) +/** @ingroup altcp */ +#define altcp_listen(conn) altcp_listen_with_backlog_and_err(conn, TCP_DEFAULT_LISTEN_BACKLOG, NULL) + +void altcp_abort(struct altcp_pcb *conn); +err_t altcp_close(struct altcp_pcb *conn); +err_t altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); + +err_t altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +err_t altcp_output(struct altcp_pcb *conn); + +u16_t altcp_mss(struct altcp_pcb *conn); +u16_t altcp_sndbuf(struct altcp_pcb *conn); +u16_t altcp_sndqueuelen(struct altcp_pcb *conn); +void altcp_nagle_disable(struct altcp_pcb *conn); +void altcp_nagle_enable(struct altcp_pcb *conn); +int altcp_nagle_disabled(struct altcp_pcb *conn); + +void altcp_setprio(struct altcp_pcb *conn, u8_t prio); + +err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local); +u16_t altcp_get_port(struct altcp_pcb *conn, int local); + +#if LWIP_TCP_KEEPALIVE +void altcp_keepalive_disable(struct altcp_pcb *conn); +void altcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif + +#ifdef LWIP_DEBUG +enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn); +#endif + +#ifdef __cplusplus +} +#endif + +#else /* LWIP_ALTCP */ + +/* ALTCP disabled, define everything to link against tcp callback API (e.g. to get a small non-ssl httpd) */ + +#include "lwip/tcp.h" + +#define altcp_accept_fn tcp_accept_fn +#define altcp_connected_fn tcp_connected_fn +#define altcp_recv_fn tcp_recv_fn +#define altcp_sent_fn tcp_sent_fn +#define altcp_poll_fn tcp_poll_fn +#define altcp_err_fn tcp_err_fn + +#define altcp_pcb tcp_pcb +#define altcp_tcp_new_ip_type tcp_new_ip_type +#define altcp_tcp_new tcp_new +#define altcp_tcp_new_ip6 tcp_new_ip6 + +#define altcp_new(allocator) tcp_new() +#define altcp_new_ip6(allocator) tcp_new_ip6() +#define altcp_new_ip_type(allocator, ip_type) tcp_new_ip_type(ip_type) + +#define altcp_arg tcp_arg +#define altcp_accept tcp_accept +#define altcp_recv tcp_recv +#define altcp_sent tcp_sent +#define altcp_poll tcp_poll +#define altcp_err tcp_err + +#define altcp_recved tcp_recved +#define altcp_bind tcp_bind +#define altcp_connect tcp_connect + +#define altcp_listen_with_backlog_and_err tcp_listen_with_backlog_and_err +#define altcp_listen_with_backlog tcp_listen_with_backlog +#define altcp_listen tcp_listen + +#define altcp_abort tcp_abort +#define altcp_close tcp_close +#define altcp_shutdown tcp_shutdown + +#define altcp_write tcp_write +#define altcp_output tcp_output + +#define altcp_mss tcp_mss +#define altcp_sndbuf tcp_sndbuf +#define altcp_sndqueuelen tcp_sndqueuelen +#define altcp_nagle_disable tcp_nagle_disable +#define altcp_nagle_enable tcp_nagle_enable +#define altcp_nagle_disabled tcp_nagle_disabled +#define altcp_setprio tcp_setprio + +#define altcp_get_tcp_addrinfo tcp_get_tcp_addrinfo +#define altcp_get_ip(pcb, local) ((local) ? (&(pcb)->local_ip) : (&(pcb)->remote_ip)) + +#ifdef LWIP_DEBUG +#define altcp_dbg_get_tcp_state tcp_dbg_get_tcp_state +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tcp.h new file mode 100644 index 0000000..dbde584 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tcp.h @@ -0,0 +1,72 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + * + * This file contains the base implementation calling into tcp. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TCP_H +#define LWIP_HDR_ALTCP_TCP_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb *altcp_tcp_new_ip_type(u8_t ip_type); + +#define altcp_tcp_new() altcp_tcp_new_ip_type(IPADDR_TYPE_V4) +#define altcp_tcp_new_ip6() altcp_tcp_new_ip_type(IPADDR_TYPE_V6) + +struct altcp_pcb *altcp_tcp_alloc(void *arg, u8_t ip_type); + +struct tcp_pcb; +struct altcp_pcb *altcp_tcp_wrap(struct tcp_pcb *tpcb); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_TCP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tls.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tls.h new file mode 100644 index 0000000..ff797f2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/altcp_tls.h @@ -0,0 +1,143 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * @defgroup altcp_tls TLS layer + * @ingroup altcp + * This file contains function prototypes for a TLS layer. + * A port to ARM mbedtls is provided in the apps/ tree + * (LWIP_ALTCP_TLS_MBEDTLS option). + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TLS_H +#define LWIP_HDR_ALTCP_TLS_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#if LWIP_ALTCP_TLS + +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @ingroup altcp_tls + * ALTCP_TLS configuration handle, content depends on port (e.g. mbedtls) + */ +struct altcp_tls_config; + +/** @ingroup altcp_tls + * Create an ALTCP_TLS server configuration handle prepared for multiple certificates + */ +struct altcp_tls_config *altcp_tls_create_config_server(uint8_t cert_count); + +/** @ingroup altcp_tls + * Add a certificate to an ALTCP_TLS server configuration handle + */ +err_t altcp_tls_config_server_add_privkey_cert(struct altcp_tls_config *config, + const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS server configuration handle with one certificate + * (short version of calling @ref altcp_tls_create_config_server and + * @ref altcp_tls_config_server_add_privkey_cert) + */ +struct altcp_tls_config *altcp_tls_create_config_server_privkey_cert(const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS client configuration handle + */ +struct altcp_tls_config *altcp_tls_create_config_client(const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS client configuration handle with two-way server/client authentication + */ +struct altcp_tls_config *altcp_tls_create_config_client_2wayauth(const u8_t *ca, size_t ca_len, const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Free an ALTCP_TLS configuration handle + */ +void altcp_tls_free_config(struct altcp_tls_config *conf); + +/** @ingroup altcp_tls + * Free an ALTCP_TLS global entropy instance. + * All ALTCP_TLS configuration are linked to one altcp_tls_entropy_rng structure + * that handle an unique system entropy & ctr_drbg instance. + * This function allow application to free this altcp_tls_entropy_rng structure + * when all configuration referencing it were destroyed. + * This function does nothing if some ALTCP_TLS configuration handle are still + * active. + */ +void altcp_tls_free_entropy(void); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS layer wrapping an existing pcb as inner connection (e.g. TLS over TCP) + */ +struct altcp_pcb *altcp_tls_wrap(struct altcp_tls_config *config, struct altcp_pcb *inner_pcb); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS pcb and its inner tcp pcb + */ +struct altcp_pcb *altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS layer pcb and its inner tcp pcb. + * Same as @ref altcp_tls_new but this allocator function fits to + * @ref altcp_allocator_t / @ref altcp_new.\n + 'arg' must contain a struct altcp_tls_config *. + */ +struct altcp_pcb *altcp_tls_alloc(void *arg, u8_t ip_type); + +/** @ingroup altcp_tls + * Return pointer to internal TLS context so application can tweak it. + * Real type depends on port (e.g. mbedtls) + */ +void *altcp_tls_context(struct altcp_pcb *conn); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP_TLS */ +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_ALTCP_TLS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/api.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/api.h similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/api.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/api.h index 516bd16..c2afaf2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/api.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/api.h @@ -58,17 +58,25 @@ extern "C" { */ /* Flags for netconn_write (u8_t) */ -#define NETCONN_NOFLAG 0x00 -#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ -#define NETCONN_COPY 0x01 -#define NETCONN_MORE 0x02 -#define NETCONN_DONTBLOCK 0x04 +#define NETCONN_NOFLAG 0x00 +#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ +#define NETCONN_COPY 0x01 +#define NETCONN_MORE 0x02 +#define NETCONN_DONTBLOCK 0x04 +#define NETCONN_NOAUTORCVD 0x08 /* prevent netconn_recv_data_tcp() from updating the tcp window - must be done manually via netconn_tcp_recvd() */ +#define NETCONN_NOFIN 0x10 /* upper layer already received data, leave FIN in queue until called again */ /* Flags for struct netconn.flags (u8_t) */ +/** This netconn had an error, don't block on recvmbox/acceptmbox any more */ +#define NETCONN_FLAG_MBOXCLOSED 0x01 /** Should this netconn avoid blocking? */ #define NETCONN_FLAG_NON_BLOCKING 0x02 /** Was the last connect action a non-blocking one? */ #define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04 +#if LWIP_NETCONN_FULLDUPLEX + /** The mbox of this netconn is being deallocated, don't use it anymore */ +#define NETCONN_FLAG_MBOXINVALID 0x08 +#endif /* LWIP_NETCONN_FULLDUPLEX */ /** If a nonblocking write has been rejected before, poll_tcp needs to check if the netconn is writable again */ #define NETCONN_FLAG_CHECK_WRITESPACE 0x10 @@ -78,7 +86,12 @@ extern "C" { dual-stack usage by default. */ #define NETCONN_FLAG_IPV6_V6ONLY 0x20 #endif /* LWIP_IPV6 */ - +#if LWIP_NETBUF_RECVINFO +/** Received packet info will be recorded for this netconn */ +#define NETCONN_FLAG_PKTINFO 0x40 +#endif /* LWIP_NETBUF_RECVINFO */ +/** A FIN has been received but not passed to the application yet */ +#define NETCONN_FIN_RX_PENDING 0x80 /* Helpers to process several netconn_types by the same code */ #define NETCONNTYPE_GROUP(t) ((t)&0xF0) @@ -214,8 +227,8 @@ struct netconn { struct udp_pcb *udp; struct raw_pcb *raw; } pcb; - /** the last error this netconn had */ - err_t last_err; + /** the last asynchronous unreported error this netconn had */ + err_t pending_err; #if !LWIP_NETCONN_SEM_PER_THREAD /** sem that is used to synchronously execute functions in the core context */ sys_sem_t op_completed; @@ -228,6 +241,11 @@ struct netconn { by the application thread */ sys_mbox_t acceptmbox; #endif /* LWIP_TCP */ +#if LWIP_NETCONN_FULLDUPLEX + /** number of threads waiting on an mbox. This is required to unblock + all threads when closing while threads are waiting. */ + int mbox_threads_waiting; +#endif /** only used for socket layer */ #if LWIP_SOCKET int socket; @@ -240,7 +258,7 @@ struct netconn { #if LWIP_SO_RCVTIMEO /** timeout in milliseconds to wait for new data to be received (or connections to arrive for listening netconns) */ - int recv_timeout; + u32_t recv_timeout; #endif /* LWIP_SO_RCVTIMEO */ #if LWIP_SO_RCVBUF /** maximum amount of bytes queued in recvmbox @@ -258,9 +276,6 @@ struct netconn { /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */ u8_t flags; #if LWIP_TCP - /** TCP: when data passed to netconn_write doesn't fit into the send buffer, - this temporarily stores how much is already sent. */ - size_t write_offset; /** TCP: when data passed to netconn_write doesn't fit into the send buffer, this temporarily stores the message. Also used during connect and close. */ @@ -270,21 +285,23 @@ struct netconn { netconn_callback callback; }; +/** This vector type is passed to @ref netconn_write_vectors_partly to send + * multiple buffers at once. + * ATTENTION: This type has to directly map struct iovec since one is casted + * into the other! + */ +struct netvector { + /** pointer to the application buffer that contains the data to send */ + const void *ptr; + /** size of the application data to send */ + size_t len; +}; + /** Register an Network connection event */ #define API_EVENT(c,e,l) if (c->callback) { \ (*c->callback)(c, e, l); \ } -/** Set conn->last_err to err but don't overwrite fatal errors */ -#define NETCONN_SET_SAFE_ERR(conn, err) do { if ((conn) != NULL) { \ - SYS_ARCH_DECL_PROTECT(netconn_set_safe_err_lev); \ - SYS_ARCH_PROTECT(netconn_set_safe_err_lev); \ - if (!ERR_IS_FATAL((conn)->last_err)) { \ - (conn)->last_err = err; \ - } \ - SYS_ARCH_UNPROTECT(netconn_set_safe_err_lev); \ -}} while(0); - /* Network connection functions: */ /** @ingroup netconn_common @@ -294,6 +311,7 @@ struct netconn { #define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) struct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback); +err_t netconn_prepare_delete(struct netconn *conn); err_t netconn_delete(struct netconn *conn); /** Get the type of a netconn (as enum netconn_type). */ #define netconn_type(conn) (conn->type) @@ -306,6 +324,7 @@ err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr, #define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) err_t netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port); +err_t netconn_bind_if(struct netconn *conn, u8_t if_idx); err_t netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port); err_t netconn_disconnect (struct netconn *conn); err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); @@ -313,12 +332,18 @@ err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); #define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) err_t netconn_accept(struct netconn *conn, struct netconn **new_conn); err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf); +err_t netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf); +err_t netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags); err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf); +err_t netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags); +err_t netconn_tcp_recvd(struct netconn *conn, size_t len); err_t netconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port); err_t netconn_send(struct netconn *conn, struct netbuf *buf); err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, u8_t apiflags, size_t *bytes_written); +err_t netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, + u8_t apiflags, size_t *bytes_written); /** @ingroup netconn_tcp */ #define netconn_write(conn, dataptr, size, apiflags) \ netconn_write_partly(conn, dataptr, size, apiflags, NULL) @@ -328,6 +353,8 @@ err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx); #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) err_t netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave); +err_t netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, + u8_t if_idx, enum netconn_igmp join_or_leave); #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ #if LWIP_DNS #if LWIP_IPV4 && LWIP_IPV6 @@ -339,14 +366,18 @@ err_t netconn_gethostbyname(const char *name, ip_addr_t *addr); #endif /* LWIP_IPV4 && LWIP_IPV6 */ #endif /* LWIP_DNS */ -#define netconn_err(conn) ((conn)->last_err) +err_t netconn_err(struct netconn *conn); #define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) +#define netconn_set_flags(conn, set_flags) do { (conn)->flags = (u8_t)((conn)->flags | (set_flags)); } while(0) +#define netconn_clear_flags(conn, clr_flags) do { (conn)->flags = (u8_t)((conn)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define netconn_is_flag_set(conn, flag) (((conn)->flags & (flag)) != 0) + /** Set the blocking status of netconn calls (@todo: write/send is missing) */ #define netconn_set_nonblocking(conn, val) do { if(val) { \ - (conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \ + netconn_set_flags(conn, NETCONN_FLAG_NON_BLOCKING); \ } else { \ - (conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0) + netconn_clear_flags(conn, NETCONN_FLAG_NON_BLOCKING); }} while(0) /** Get the blocking status of netconn calls (@todo: write/send is missing) */ #define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0) @@ -355,9 +386,9 @@ err_t netconn_gethostbyname(const char *name, ip_addr_t *addr); * TCP: Set the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) */ #define netconn_set_ipv6only(conn, val) do { if(val) { \ - (conn)->flags |= NETCONN_FLAG_IPV6_V6ONLY; \ + netconn_set_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); \ } else { \ - (conn)->flags &= ~ NETCONN_FLAG_IPV6_V6ONLY; }} while(0) + netconn_clear_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); }} while(0) /** @ingroup netconn_common * TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/FILES similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/FILES diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_proxyconnect.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_proxyconnect.h new file mode 100644 index 0000000..65d3127 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_proxyconnect.h @@ -0,0 +1,79 @@ +/** + * @file + * Application layered TCP connection API that executes a proxy-connect. + * + * This file provides a starting layer that executes a proxy-connect e.g. to + * set up TLS connections through a http proxy. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H +#define LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_proxyconnect_config { + ip_addr_t proxy_addr; + u16_t proxy_port; +}; + + +struct altcp_pcb *altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb); +struct altcp_pcb *altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type); + +struct altcp_pcb *altcp_proxyconnect_alloc(void *arg, u8_t ip_type); + +#if LWIP_ALTCP_TLS +struct altcp_proxyconnect_tls_config { + struct altcp_proxyconnect_config proxy; + struct altcp_tls_config *tls_config; +}; + +struct altcp_pcb *altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type); +#endif /* LWIP_ALTCP_TLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_tls_mbedtls_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_tls_mbedtls_opts.h new file mode 100644 index 0000000..71aa599 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/altcp_tls_mbedtls_opts.h @@ -0,0 +1,105 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * This file contains options for an mbedtls port of the TLS layer. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TLS_OPTS_H +#define LWIP_HDR_ALTCP_TLS_OPTS_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +/** LWIP_ALTCP_TLS_MBEDTLS==1: use mbedTLS for TLS support for altcp API + * mbedtls include directory must be reachable via include search path + */ +#ifndef LWIP_ALTCP_TLS_MBEDTLS +#define LWIP_ALTCP_TLS_MBEDTLS 0 +#endif + +/** Configure debug level of this file */ +#ifndef ALTCP_MBEDTLS_DEBUG +#define ALTCP_MBEDTLS_DEBUG LWIP_DBG_OFF +#endif + +/** Configure lwIP debug level of the mbedTLS library */ +#ifndef ALTCP_MBEDTLS_LIB_DEBUG +#define ALTCP_MBEDTLS_LIB_DEBUG LWIP_DBG_OFF +#endif + +/** Configure minimum internal debug level of the mbedTLS library */ +#ifndef ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN +#define ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN 0 +#endif + +/** Enable the basic session cache + * ATTENTION: Using a session cache can lower security by reusing keys! + */ +#ifndef ALTCP_MBEDTLS_USE_SESSION_CACHE +#define ALTCP_MBEDTLS_USE_SESSION_CACHE 0 +#endif + +/** Maximum cache size of the basic session cache */ +#ifndef ALTCP_MBEDTLS_SESSION_CACHE_SIZE +#define ALTCP_MBEDTLS_SESSION_CACHE_SIZE 30 +#endif + +/** Set a session timeout in seconds for the basic session cache */ +#ifndef ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS +#define ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS (60 * 60) +#endif + +/** Use session tickets to speed up connection setup (needs + * MBEDTLS_SSL_SESSION_TICKETS enabled in mbedTLS config). + * ATTENTION: Using session tickets can lower security by reusing keys! + */ +#ifndef ALTCP_MBEDTLS_USE_SESSION_TICKETS +#define ALTCP_MBEDTLS_USE_SESSION_TICKETS 0 +#endif + +/** Session ticket cipher */ +#ifndef ALTCP_MBEDTLS_SESSION_TICKET_CIPHER +#define ALTCP_MBEDTLS_SESSION_TICKET_CIPHER MBEDTLS_CIPHER_AES_256_GCM +#endif + +/** Maximum timeout for session tickets */ +#ifndef ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS +#define ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS (60 * 60 * 24) +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_TLS_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/fs.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/fs.h similarity index 81% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/fs.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/fs.h index bb176fa..67b9a60 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/fs.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/fs.h @@ -52,12 +52,23 @@ struct fsdata_chksum { #define FS_FILE_FLAGS_HEADER_INCLUDED 0x01 #define FS_FILE_FLAGS_HEADER_PERSISTENT 0x02 +#define FS_FILE_FLAGS_HEADER_HTTPVER_1_1 0x04 +#define FS_FILE_FLAGS_SSI 0x08 + +/** Define FS_FILE_EXTENSION_T_DEFINED if you have typedef'ed to your private + * pointer type (defaults to 'void' so the default usage is 'void*') + */ +#ifndef FS_FILE_EXTENSION_T_DEFINED +typedef void fs_file_extension; +#endif struct fs_file { const char *data; int len; int index; - void *pextension; + /* pextension is free for implementations to hold private (extensional) + arbitrary data, e.g. holding some file state or file system handle */ + fs_file_extension *pextension; #if HTTPD_PRECALCULATED_CHECKSUM const struct fsdata_chksum *chksum; u16_t chksum_count; @@ -96,6 +107,18 @@ void *fs_state_init(struct fs_file *file, const char *name); void fs_state_free(struct fs_file *file, void *state); #endif /* #if LWIP_HTTPD_FILE_STATE */ +struct fsdata_file { + const struct fsdata_file *next; + const unsigned char *name; + const unsigned char *data; + int len; + u8_t flags; +#if HTTPD_PRECALCULATED_CHECKSUM + u16_t chksum_count; + const struct fsdata_chksum *chksum; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ +}; + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/http_client.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/http_client.h new file mode 100644 index 0000000..8a06308 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/http_client.h @@ -0,0 +1,160 @@ +/** + * @file + * HTTP client + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_APPS_HTTP_CLIENT_H +#define LWIP_HDR_APPS_HTTP_CLIENT_H + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/altcp.h" +#include "lwip/prot/iana.h" +#include "lwip/pbuf.h" + +#if LWIP_TCP && LWIP_CALLBACK_API + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup httpc + * HTTPC_HAVE_FILE_IO: define this to 1 to have functions dowloading directly + * to disk via fopen/fwrite. + * These functions are example implementations of the interface only. + */ +#ifndef LWIP_HTTPC_HAVE_FILE_IO +#define LWIP_HTTPC_HAVE_FILE_IO 0 +#endif + +/** + * @ingroup httpc + * The default TCP port used for HTTP + */ +#define HTTP_DEFAULT_PORT LWIP_IANA_PORT_HTTP + +/** + * @ingroup httpc + * HTTP client result codes + */ +typedef enum ehttpc_result { + /** File successfully received */ + HTTPC_RESULT_OK = 0, + /** Unknown error */ + HTTPC_RESULT_ERR_UNKNOWN = 1, + /** Connection to server failed */ + HTTPC_RESULT_ERR_CONNECT = 2, + /** Failed to resolve server hostname */ + HTTPC_RESULT_ERR_HOSTNAME = 3, + /** Connection unexpectedly closed by remote server */ + HTTPC_RESULT_ERR_CLOSED = 4, + /** Connection timed out (server didn't respond in time) */ + HTTPC_RESULT_ERR_TIMEOUT = 5, + /** Server responded with an error code */ + HTTPC_RESULT_ERR_SVR_RESP = 6, + /** Local memory error */ + HTTPC_RESULT_ERR_MEM = 7, + /** Local abort */ + HTTPC_RESULT_LOCAL_ABORT = 8, + /** Content length mismatch */ + HTTPC_RESULT_ERR_CONTENT_LEN = 9 +} httpc_result_t; + +typedef struct _httpc_state httpc_state_t; + +/** + * @ingroup httpc + * Prototype of a http client callback function + * + * @param arg argument specified when initiating the request + * @param httpc_result result of the http transfer (see enum httpc_result_t) + * @param rx_content_len number of bytes received (without headers) + * @param srv_res this contains the http status code received (if any) + * @param err an error returned by internal lwip functions, can help to specify + * the source of the error but must not necessarily be != ERR_OK + */ +typedef void (*httpc_result_fn)(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, u32_t srv_res, err_t err); + +/** + * @ingroup httpc + * Prototype of http client callback: called when the headers are received + * + * @param connection http client connection + * @param arg argument specified when initiating the request + * @param hdr header pbuf(s) (may contain data also) + * @param hdr_len length of the heders in 'hdr' + * @param content_len content length as received in the headers (-1 if not received) + * @return if != ERR_OK is returned, the connection is aborted + */ +typedef err_t (*httpc_headers_done_fn)(httpc_state_t *connection, void *arg, struct pbuf *hdr, u16_t hdr_len, u32_t content_len); + +typedef struct _httpc_connection { + ip_addr_t proxy_addr; + u16_t proxy_port; + u8_t use_proxy; + /* @todo: add username:pass? */ + +#if LWIP_ALTCP + altcp_allocator_t *altcp_allocator; +#endif + + /* this callback is called when the transfer is finished (or aborted) */ + httpc_result_fn result_fn; + /* this callback is called after receiving the http headers + It can abort the connection by returning != ERR_OK */ + httpc_headers_done_fn headers_done_fn; +} httpc_connection_t; + +err_t httpc_get_file(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection); +err_t httpc_get_file_dns(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection); + +#if LWIP_HTTPC_HAVE_FILE_IO +err_t httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection); +err_t httpc_get_file_dns_to_disk(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection); +#endif /* LWIP_HTTPC_HAVE_FILE_IO */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP && LWIP_CALLBACK_API */ + +#endif /* LWIP_HDR_APPS_HTTP_CLIENT_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd.h similarity index 79% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd.h index 40f1811..e872429 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd.h @@ -51,13 +51,14 @@ extern "C" { #if LWIP_HTTPD_CGI -/* +/** + * @ingroup httpd * Function pointer for a CGI script handler. * * This function is called each time the HTTPD server is asked for a file * whose name was previously registered as a CGI function using a call to - * http_set_cgi_handler. The iIndex parameter provides the index of the - * CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters + * http_set_cgi_handlers. The iIndex parameter provides the index of the + * CGI within the cgis array passed to http_set_cgi_handlers. Parameters * pcParam and pcValue provide access to the parameters provided along with * the URI. iNumParams provides a count of the entries in the pcParam and * pcValue arrays. Each entry in the pcParam array contains the name of a @@ -71,8 +72,8 @@ extern "C" { * browser, for example "/thanks.htm" or "/response/error.ssi". * * The maximum number of parameters that will be passed to this function via - * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming - * HTTP request above this number will be discarded. + * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in + * the incoming HTTP request above this number will be discarded. * * Requests intended for use by this CGI mechanism must be sent using the GET * method (which encodes all parameters within the URI rather than in a block @@ -83,7 +84,8 @@ extern "C" { typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]); -/* +/** + * @ingroup httpd * Structure defining the base filename (URL) of a CGI and the associated * function which is to be called when that URL is requested. */ @@ -100,11 +102,17 @@ void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers); #if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI #if LWIP_HTTPD_CGI_SSI +/* we have to prototype this struct here to make it available for the handler */ +struct fs_file; + /** Define this generic CGI handler in your application. * It is called once for every URI with parameters. - * The parameters can be stored to + * The parameters can be stored to the object passed as connection_state, which + * is allocated to file->state via fs_state_init() from fs_open() or fs_open_custom(). + * Content creation via SSI or complete dynamic files can retrieve the CGI params from there. */ -extern void httpd_cgi_handler(const char* uri, int iNumParams, char **pcParam, char **pcValue +extern void httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumParams, + char **pcParam, char **pcValue #if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE , void *connection_state #endif /* LWIP_HTTPD_FILE_STATE */ @@ -115,34 +123,35 @@ extern void httpd_cgi_handler(const char* uri, int iNumParams, char **pcParam, c #if LWIP_HTTPD_SSI -/* +/** + * @ingroup httpd * Function pointer for the SSI tag handler callback. * * This function will be called each time the HTTPD server detects a tag of the - * form in a .shtml, .ssi or .shtm file where "name" appears as - * one of the tags supplied to http_set_ssi_handler in the ppcTags array. The + * form in files with extensions mentioned in the g_pcSSIExtensions + * array (currently .shtml, .shtm, .ssi, .xml, .json) where "name" appears as + * one of the tags supplied to http_set_ssi_handler in the tags array. The * returned insert string, which will be appended after the the string - * "" in file sent back to the client,should be written to pointer - * pcInsert. iInsertLen contains the size of the buffer pointed to by - * pcInsert. The iIndex parameter provides the zero-based index of the tag as - * found in the ppcTags array and identifies the tag that is to be processed. + * "" in file sent back to the client, should be written to pointer + * pcInsert. iInsertLen contains the size of the buffer pointed to by + * pcInsert. The iIndex parameter provides the zero-based index of the tag as + * found in the tags array and identifies the tag that is to be processed. * * The handler returns the number of characters written to pcInsert excluding - * any terminating NULL or a negative number to indicate a failure (tag not - * recognized, for example). + * any terminating NULL or HTTPD_SSI_TAG_UNKNOWN when tag is not recognized. * * Note that the behavior of this SSI mechanism is somewhat different from the * "normal" SSI processing as found in, for example, the Apache web server. In * this case, the inserted text is appended following the SSI tag rather than * replacing the tag entirely. This allows for an implementation that does not * require significant additional buffering of output data yet which will still - * offer usable SSI functionality. One downside to this approach is when + * offer usable SSI functionality. One downside to this approach is when * attempting to use SSI within JavaScript. The SSI tag is structured to * resemble an HTML comment but this syntax does not constitute a comment * within JavaScript and, hence, leaving the tag in place will result in - * problems in these cases. To work around this, any SSI tag which needs to - * output JavaScript code must do so in an encapsulated way, sending the whole - * HTML section as a single include. + * problems in these cases. In order to avoid these problems, define + * LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript + * style block comments in the form / * # name * / (without the spaces). */ typedef u16_t (*tSSIHandler)( #if LWIP_HTTPD_SSI_RAW @@ -177,7 +186,9 @@ void http_set_ssi_handler(tSSIHandler pfnSSIHandler, /* These functions must be implemented by the application */ -/** Called when a POST request has been received. The application can decide +/** + * @ingroup httpd + * Called when a POST request has been received. The application can decide * whether to accept it or not. * * @param connection Unique connection identifier, valid until httpd_post_end @@ -199,7 +210,9 @@ err_t httpd_post_begin(void *connection, const char *uri, const char *http_reque u16_t http_request_len, int content_len, char *response_uri, u16_t response_uri_len, u8_t *post_auto_wnd); -/** Called for each pbuf of data that has been received for a POST. +/** + * @ingroup httpd + * Called for each pbuf of data that has been received for a POST. * ATTENTION: The application is responsible for freeing the pbufs passed in! * * @param connection Unique connection identifier. @@ -209,7 +222,9 @@ err_t httpd_post_begin(void *connection, const char *uri, const char *http_reque */ err_t httpd_post_receive_data(void *connection, struct pbuf *p); -/** Called when all data is received or when the connection is closed. +/** + * @ingroup httpd + * Called when all data is received or when the connection is closed. * The application must return the filename/URI of a file to send in response * to this POST request. If the response_uri buffer is untouched, a 404 * response is returned. @@ -228,9 +243,13 @@ void httpd_post_data_recved(void *connection, u16_t recved_len); void httpd_init(void); +#if HTTPD_ENABLE_HTTPS +struct altcp_tls_config; +void httpd_inits(struct altcp_tls_config *conf); +#endif #ifdef __cplusplus } #endif -#endif /* LWIP_HTTPD_H */ +#endif /* LWIP_HDR_APPS_HTTPD_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd_opts.h similarity index 74% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd_opts.h index 340db15..8723961 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/httpd_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/httpd_opts.h @@ -42,6 +42,7 @@ #define LWIP_HDR_APPS_HTTPD_OPTS_H #include "lwip/opt.h" +#include "lwip/prot/iana.h" /** * @defgroup httpd_opts Options @@ -49,27 +50,77 @@ * @{ */ -/** Set this to 1 to support CGI (old style) */ +/** Set this to 1 to support CGI (old style). + * + * This old style CGI support works by registering an array of URLs and + * associated CGI handler functions (@ref http_set_cgi_handlers). + * This list is scanned just before fs_open is called from request handling. + * The handler can return a new URL that is used internally by the httpd to + * load the returned page (passed to fs_open). + * + * Use this CGI type e.g. to execute specific actions and return a page that + * does not depend on the CGI parameters. + */ #if !defined LWIP_HTTPD_CGI || defined __DOXYGEN__ #define LWIP_HTTPD_CGI 0 #endif -/** Set this to 1 to support CGI (new style) */ +/** Set this to 1 to support CGI (new style). + * + * This new style CGI support works by calling a global function + * (@ref tCGIHandler) for all URLs that are found. fs_open is called first + * and the URL can not be written by the CGI handler. Instead, this handler gets + * passed the http file state, an object where it can store information derived + * from the CGI URL or parameters. This file state is later passed to SSI, so + * the SSI code can return data depending on CGI input. + * + * Use this CGI handler if you want CGI information passed on to SSI. + */ #if !defined LWIP_HTTPD_CGI_SSI || defined __DOXYGEN__ #define LWIP_HTTPD_CGI_SSI 0 #endif -/** Set this to 1 to support SSI (Server-Side-Includes) */ +/** Set this to 1 to support SSI (Server-Side-Includes) + * + * In contrast to other http servers, this only calls a preregistered callback + * function (@see http_set_ssi_handler) for each tag (in the format of + * ) encountered in SSI-enabled pages. + * SSI-enabled pages must have one of the predefined SSI-enabled file extensions. + * All files with one of these extensions are parsed when sent. + * + * A downside of the current SSI implementation is that persistent connections + * don't work, as the file length is not known in advance (and httpd currently + * relies on the Content-Length header for persistent connections). + * + * To save memory, the maximum tag length is limited (@see LWIP_HTTPD_MAX_TAG_NAME_LEN). + * To save memory, the maximum insertion string length is limited (@see + * LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enought, @ref LWIP_HTTPD_SSI_MULTIPART + * can be used. + */ #if !defined LWIP_HTTPD_SSI || defined __DOXYGEN__ #define LWIP_HTTPD_SSI 0 #endif /** Set this to 1 to implement an SSI tag handler callback that gets a const char* - * to the tag (instead of an index into a pre-registered array of known tags) */ + * to the tag (instead of an index into a pre-registered array of known tags) + * If this is 0, the SSI handler callback function is only called pre-registered tags. + */ #if !defined LWIP_HTTPD_SSI_RAW || defined __DOXYGEN__ #define LWIP_HTTPD_SSI_RAW 0 #endif +/** Set this to 0 to prevent parsing the file extension at runtime to decide + * if a file should be scanned for SSI tags or not. + * Default is 1 (file extensions are checked using the g_pcSSIExtensions array) + * Set to 2 to override this runtime test function. + * + * This is enabled by default, but if you only use a newer version of makefsdata + * supporting the "-ssi" option, this info is already present in + */ +#if !defined LWIP_HTTPD_SSI_BY_FILE_EXTENSION || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI_BY_FILE_EXTENSION 1 +#endif + /** Set this to 1 to support HTTP POST */ #if !defined LWIP_HTTPD_SUPPORT_POST || defined __DOXYGEN__ #define LWIP_HTTPD_SUPPORT_POST 0 @@ -88,12 +139,16 @@ #define LWIP_HTTPD_SSI_MULTIPART 0 #endif -/* The maximum length of the string comprising the tag name */ +/* The maximum length of the string comprising the SSI tag name + * ATTENTION: tags longer than this are ignored, not truncated! + */ #if !defined LWIP_HTTPD_MAX_TAG_NAME_LEN || defined __DOXYGEN__ #define LWIP_HTTPD_MAX_TAG_NAME_LEN 8 #endif -/* The maximum length of string that can be returned to replace any given tag */ +/* The maximum length of string that can be returned to replace any given tag + * If this buffer is not long enough, use LWIP_HTTPD_SSI_MULTIPART. + */ #if !defined LWIP_HTTPD_MAX_TAG_INSERT_LEN || defined __DOXYGEN__ #define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192 #endif @@ -122,6 +177,9 @@ /** Set this to 1 to use a memp pool for allocating * struct http_state instead of the heap. + * If enabled, you'll need to define MEMP_NUM_PARALLEL_HTTPD_CONNS + * (and MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS for SSI) to set the size of + * the pool(s). */ #if !defined HTTPD_USE_MEM_POOL || defined __DOXYGEN__ #define HTTPD_USE_MEM_POOL 0 @@ -129,7 +187,17 @@ /** The server port for HTTPD to use */ #if !defined HTTPD_SERVER_PORT || defined __DOXYGEN__ -#define HTTPD_SERVER_PORT 80 +#define HTTPD_SERVER_PORT LWIP_IANA_PORT_HTTP +#endif + +/** The https server port for HTTPD to use */ +#if !defined HTTPD_SERVER_PORT_HTTPS || defined __DOXYGEN__ +#define HTTPD_SERVER_PORT_HTTPS LWIP_IANA_PORT_HTTPS +#endif + +/** Enable https support? */ +#if !defined HTTPD_ENABLE_HTTPS || defined __DOXYGEN__ +#define HTTPD_ENABLE_HTTPS 0 #endif /** Maximum retries before the connection is aborted/closed. @@ -261,10 +329,11 @@ #endif /* Define this to a function that returns the maximum amount of data to enqueue. - The function have this signature: u16_t fn(struct tcp_pcb* pcb); */ + The function have this signature: u16_t fn(struct altcp_pcb* pcb); + The best place to define this is the hooks file (@see LWIP_HOOK_FILENAME) */ #if !defined HTTPD_MAX_WRITE_LEN || defined __DOXYGEN__ #if HTTPD_LIMIT_SENDING_TO_2MSS -#define HTTPD_MAX_WRITE_LEN(pcb) (2 * tcp_mss(pcb)) +#define HTTPD_MAX_WRITE_LEN(pcb) ((u16_t)(2 * altcp_mss(pcb))) #endif #endif @@ -310,10 +379,14 @@ #define LWIP_HTTPD_FS_ASYNC_READ 0 #endif -/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the - * file system (to prevent changing the file included in CVS) */ -#if !defined HTTPD_USE_CUSTOM_FSDATA || defined __DOXYGEN__ -#define HTTPD_USE_CUSTOM_FSDATA 0 +/** Filename (including path) to use as FS data file */ +#if !defined HTTPD_FSDATA_FILE || defined __DOXYGEN__ +/* HTTPD_USE_CUSTOM_FSDATA: Compatibility with deprecated lwIP option */ +#if defined(HTTPD_USE_CUSTOM_FSDATA) && (HTTPD_USE_CUSTOM_FSDATA != 0) +#define HTTPD_FSDATA_FILE "fsdata_custom.c" +#else +#define HTTPD_FSDATA_FILE "fsdata.c" +#endif #endif /** diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/lwiperf.h similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/lwiperf.h index 7dbebb0..cc86e7f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/lwiperf.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/lwiperf.h @@ -63,6 +63,17 @@ enum lwiperf_report_type LWIPERF_TCP_ABORTED_REMOTE }; +/** Control */ +enum lwiperf_client_type +{ + /** Unidirectional tx only test */ + LWIPERF_CLIENT, + /** Do a bidirectional test simultaneously */ + LWIPERF_DUAL, + /** Do a bidirectional test individually */ + LWIPERF_TRADEOFF +}; + /** Prototype of a report function that is called when a session is finished. This report function can show the test results. @param report_type contains the test result */ @@ -70,10 +81,15 @@ typedef void (*lwiperf_report_fn)(void *arg, enum lwiperf_report_type report_typ const ip_addr_t* local_addr, u16_t local_port, const ip_addr_t* remote_addr, u16_t remote_port, u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec); - void* lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port, lwiperf_report_fn report_fn, void* report_arg); void* lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg); +void* lwiperf_start_tcp_client(const ip_addr_t* remote_addr, u16_t remote_port, + enum lwiperf_client_type type, + lwiperf_report_fn report_fn, void* report_arg); +void* lwiperf_start_tcp_client_default(const ip_addr_t* remote_addr, + lwiperf_report_fn report_fn, void* report_arg); + void lwiperf_abort(void* lwiperf_session); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns.h similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns.h index d036816..20d7ee2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns.h @@ -34,12 +34,17 @@ * Author: Erik Ekman * */ -#ifndef LWIP_HDR_MDNS_H -#define LWIP_HDR_MDNS_H + +#ifndef LWIP_HDR_APPS_MDNS_H +#define LWIP_HDR_APPS_MDNS_H #include "lwip/apps/mdns_opts.h" #include "lwip/netif.h" +#ifdef __cplusplus +extern "C" { +#endif + #if LWIP_MDNS_RESPONDER enum mdns_sd_proto { @@ -47,6 +52,9 @@ enum mdns_sd_proto { DNSSD_PROTO_TCP = 1 }; +#define MDNS_PROBING_CONFLICT 0 +#define MDNS_PROBING_SUCCESSFUL 1 + #define MDNS_LABEL_MAXLEN 63 struct mdns_host; @@ -55,15 +63,43 @@ struct mdns_service; /** Callback function to add text to a reply, called when generating the reply */ typedef void (*service_get_txt_fn_t)(struct mdns_service *service, void *txt_userdata); +/** Callback function to let application know the result of probing network for name + * uniqueness, called with result MDNS_PROBING_SUCCESSFUL if no other node claimed + * use for the name for the netif or a service and is safe to use, or MDNS_PROBING_CONFLICT + * if another node is already using it and mdns is disabled on this interface */ +typedef void (*mdns_name_result_cb_t)(struct netif* netif, u8_t result); + void mdns_resp_init(void); +void mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb); + err_t mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl); err_t mdns_resp_remove_netif(struct netif *netif); +err_t mdns_resp_rename_netif(struct netif *netif, const char *hostname); + +s8_t mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata); +err_t mdns_resp_del_service(struct netif *netif, s8_t slot); +err_t mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name); -err_t mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata); err_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len); -void mdns_resp_netif_settings_changed(struct netif *netif); + +void mdns_resp_restart(struct netif *netif); +void mdns_resp_announce(struct netif *netif); + +/** + * @ingroup mdns + * Announce IP settings have changed on netif. + * Call this in your callback registered by netif_set_status_callback(). + * No need to call this function when LWIP_NETIF_EXT_STATUS_CALLBACK==1, + * this handled automatically for you. + * @param netif The network interface where settings have changed. + */ +#define mdns_resp_netif_settings_changed(netif) mdns_resp_announce(netif) #endif /* LWIP_MDNS_RESPONDER */ -#endif /* LWIP_HDR_MDNS_H */ +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MDNS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_opts.h similarity index 89% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_opts.h index bf186bc..45f2c50 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_opts.h @@ -59,6 +59,13 @@ #define MDNS_MAX_SERVICES 1 #endif +/** MDNS_RESP_USENETIF_EXTCALLBACK==1: register an ext_callback on the netif + * to automatically restart probing/announcing on status or address change. + */ +#ifndef MDNS_RESP_USENETIF_EXTCALLBACK +#define MDNS_RESP_USENETIF_EXTCALLBACK LWIP_NETIF_EXT_STATUS_CALLBACK +#endif + /** * MDNS_DEBUG: Enable debugging for multicast DNS. */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_priv.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_priv.h index 8ee6db8..9635b5b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mdns_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mdns_priv.h @@ -40,6 +40,10 @@ #include "lwip/apps/mdns_opts.h" #include "lwip/pbuf.h" +#ifdef __cplusplus +extern "C" { +#endif + #if LWIP_MDNS_RESPONDER /* Domain struct and methods - visible for unit tests */ @@ -63,4 +67,8 @@ u16_t mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain #endif /* LWIP_MDNS_RESPONDER */ +#ifdef __cplusplus +} +#endif + #endif /* LWIP_HDR_MDNS_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt.h similarity index 77% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt.h index 34b230b..c2bb228 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt.h @@ -40,16 +40,24 @@ #include "lwip/apps/mqtt_opts.h" #include "lwip/err.h" #include "lwip/ip_addr.h" +#include "lwip/prot/iana.h" #ifdef __cplusplus extern "C" { #endif -typedef struct mqtt_client_t mqtt_client_t; +typedef struct mqtt_client_s mqtt_client_t; + +#if LWIP_ALTCP && LWIP_ALTCP_TLS +struct altcp_tls_config; +#endif /** @ingroup mqtt - * Default MQTT port */ -#define MQTT_PORT 1883 + * Default MQTT port (non-TLS) */ +#define MQTT_PORT LWIP_IANA_PORT_MQTT +/** @ingroup mqtt + * Default MQTT TLS port */ +#define MQTT_TLS_PORT LWIP_IANA_PORT_SECURE_MQTT /*---------------------------------------------------------------------------------------------- */ /* Connection with server */ @@ -60,17 +68,25 @@ typedef struct mqtt_client_t mqtt_client_t; struct mqtt_connect_client_info_t { /** Client identifier, must be set by caller */ const char *client_id; - /** User name and password, set to NULL if not used */ + /** User name, set to NULL if not used */ const char* client_user; + /** Password, set to NULL if not used */ const char* client_pass; /** keep alive time in seconds, 0 to disable keep alive functionality*/ u16_t keep_alive; /** will topic, set to NULL if will is not to be used, will_msg, will_qos and will retain are then ignored */ const char* will_topic; + /** will_msg, see will_topic */ const char* will_msg; + /** will_qos, see will_topic */ u8_t will_qos; + /** will_retain, see will_topic */ u8_t will_retain; +#if LWIP_ALTCP && LWIP_ALTCP_TLS + /** TLS configuration for secure connections */ + struct altcp_tls_config *tls_config; +#endif }; /** @@ -78,13 +94,21 @@ struct mqtt_connect_client_info_t { * Connection status codes */ typedef enum { + /** Accepted */ MQTT_CONNECT_ACCEPTED = 0, + /** Refused protocol version */ MQTT_CONNECT_REFUSED_PROTOCOL_VERSION = 1, + /** Refused identifier */ MQTT_CONNECT_REFUSED_IDENTIFIER = 2, + /** Refused server */ MQTT_CONNECT_REFUSED_SERVER = 3, + /** Refused user credentials */ MQTT_CONNECT_REFUSED_USERNAME_PASS = 4, + /** Refused not authorized */ MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_ = 5, + /** Disconnected */ MQTT_CONNECT_DISCONNECTED = 256, + /** Timeout */ MQTT_CONNECT_TIMEOUT = 257 } mqtt_connection_status_t; @@ -92,7 +116,7 @@ typedef enum * @ingroup mqtt * Function prototype for mqtt connection status callback. Called when * client has connected to the server after initiating a mqtt connection attempt by - * calling mqtt_connect() or when connection is closed by server or an error + * calling mqtt_client_connect() or when connection is closed by server or an error * * @param client MQTT client itself * @param arg Additional argument to pass to the callback function @@ -149,80 +173,19 @@ typedef void (*mqtt_incoming_publish_cb_t)(void *arg, const char *topic, u32_t t typedef void (*mqtt_request_cb_t)(void *arg, err_t err); -/** - * Pending request item, binds application callback to pending server requests - */ -struct mqtt_request_t -{ - /** Next item in list, NULL means this is the last in chain, - next pointing at itself means request is unallocated */ - struct mqtt_request_t *next; - /** Callback to upper layer */ - mqtt_request_cb_t cb; - void *arg; - /** MQTT packet identifier */ - u16_t pkt_id; - /** Expire time relative to element before this */ - u16_t timeout_diff; -}; - -/** Ring buffer */ -struct mqtt_ringbuf_t { - u16_t put; - u16_t get; - u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE]; -}; - -/** MQTT client */ -struct mqtt_client_t -{ - /** Timers and timeouts */ - u16_t cyclic_tick; - u16_t keep_alive; - u16_t server_watchdog; - /** Packet identifier generator*/ - u16_t pkt_id_seq; - /** Packet identifier of pending incoming publish */ - u16_t inpub_pkt_id; - /** Connection state */ - u8_t conn_state; - struct tcp_pcb *conn; - /** Connection callback */ - void *connect_arg; - mqtt_connection_cb_t connect_cb; - /** Pending requests to server */ - struct mqtt_request_t *pend_req_queue; - struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT]; - void *inpub_arg; - /** Incoming data callback */ - mqtt_incoming_data_cb_t data_cb; - mqtt_incoming_publish_cb_t pub_cb; - /** Input */ - u32_t msg_idx; - u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN]; - /** Output ring-buffer */ - struct mqtt_ringbuf_t output; -}; - - -/** Connect to server */ err_t mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, const struct mqtt_connect_client_info_t *client_info); -/** Disconnect from server */ void mqtt_disconnect(mqtt_client_t *client); -/** Create new client */ mqtt_client_t *mqtt_client_new(void); +void mqtt_client_free(mqtt_client_t* client); -/** Check connection status */ u8_t mqtt_client_is_connected(mqtt_client_t *client); -/** Set callback to call for incoming publish */ void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t, mqtt_incoming_data_cb_t data_cb, void *arg); -/** Common function for subscribe and unsubscribe */ err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub); /** @ingroup mqtt @@ -232,8 +195,6 @@ err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_re * Unsubscribe to topic */ #define mqtt_unsubscribe(client, topic, cb, arg) mqtt_sub_unsub(client, topic, 0, cb, arg, 0) - -/** Publish data to topic */ err_t mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, mqtt_request_cb_t cb, void *arg); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_opts.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_opts.h index ffefacd..4226d21 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/mqtt_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_opts.h @@ -39,7 +39,7 @@ #include "lwip/opt.h" -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_priv.h new file mode 100644 index 0000000..b775913 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/mqtt_priv.h @@ -0,0 +1,104 @@ +/** + * @file + * MQTT client (private interface) + */ + +/* + * Copyright (c) 2016 Erik Andersson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Andersson + * + */ +#ifndef LWIP_HDR_APPS_MQTT_PRIV_H +#define LWIP_HDR_APPS_MQTT_PRIV_H + +#include "lwip/apps/mqtt.h" +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Pending request item, binds application callback to pending server requests */ +struct mqtt_request_t +{ + /** Next item in list, NULL means this is the last in chain, + next pointing at itself means request is unallocated */ + struct mqtt_request_t *next; + /** Callback to upper layer */ + mqtt_request_cb_t cb; + void *arg; + /** MQTT packet identifier */ + u16_t pkt_id; + /** Expire time relative to element before this */ + u16_t timeout_diff; +}; + +/** Ring buffer */ +struct mqtt_ringbuf_t { + u16_t put; + u16_t get; + u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE]; +}; + +/** MQTT client */ +struct mqtt_client_s +{ + /** Timers and timeouts */ + u16_t cyclic_tick; + u16_t keep_alive; + u16_t server_watchdog; + /** Packet identifier generator*/ + u16_t pkt_id_seq; + /** Packet identifier of pending incoming publish */ + u16_t inpub_pkt_id; + /** Connection state */ + u8_t conn_state; + struct altcp_pcb *conn; + /** Connection callback */ + void *connect_arg; + mqtt_connection_cb_t connect_cb; + /** Pending requests to server */ + struct mqtt_request_t *pend_req_queue; + struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT]; + void *inpub_arg; + /** Incoming data callback */ + mqtt_incoming_data_cb_t data_cb; + mqtt_incoming_publish_cb_t pub_cb; + /** Input */ + u32_t msg_idx; + u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN]; + /** Output ring-buffer */ + struct mqtt_ringbuf_t output; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MQTT_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns.h index c9f68d8..a326d33 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns.h @@ -34,10 +34,18 @@ #include "lwip/apps/netbiosns_opts.h" +#ifdef __cplusplus +extern "C" { +#endif + void netbiosns_init(void); #ifndef NETBIOS_LWIP_NAME void netbiosns_set_name(const char* hostname); #endif void netbiosns_stop(void); +#ifdef __cplusplus +} +#endif + #endif /* LWIP_HDR_APPS_NETBIOS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns_opts.h similarity index 92% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns_opts.h index 0909ef7..1f51ab0 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/netbiosns_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/netbiosns_opts.h @@ -52,6 +52,13 @@ #define NETBIOS_LWIP_NAME "NETBIOSLWIPDEV" #endif +/** Respond to NetBIOS name queries + * Default is disabled + */ +#if !defined LWIP_NETBIOS_RESPOND_NAME_QUERY || defined __DOXYGEN__ +#define LWIP_NETBIOS_RESPOND_NAME_QUERY 0 +#endif + /** * @} */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp.h new file mode 100644 index 0000000..fb4a4a7 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp.h @@ -0,0 +1,128 @@ +#ifndef LWIP_HDR_APPS_SMTP_H +#define LWIP_HDR_APPS_SMTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/apps/smtp_opts.h" +#include "lwip/err.h" +#include "lwip/prot/iana.h" + +/** The default TCP port used for SMTP */ +#define SMTP_DEFAULT_PORT LWIP_IANA_PORT_SMTP +/** The default TCP port used for SMTPS */ +#define SMTPS_DEFAULT_PORT LWIP_IANA_PORT_SMTPS + +/** Email successfully sent */ +#define SMTP_RESULT_OK 0 +/** Unknown error */ +#define SMTP_RESULT_ERR_UNKNOWN 1 +/** Connection to server failed */ +#define SMTP_RESULT_ERR_CONNECT 2 +/** Failed to resolve server hostname */ +#define SMTP_RESULT_ERR_HOSTNAME 3 +/** Connection unexpectedly closed by remote server */ +#define SMTP_RESULT_ERR_CLOSED 4 +/** Connection timed out (server didn't respond in time) */ +#define SMTP_RESULT_ERR_TIMEOUT 5 +/** Server responded with an unknown response code */ +#define SMTP_RESULT_ERR_SVR_RESP 6 +/** Out of resources locally */ +#define SMTP_RESULT_ERR_MEM 7 + +/** Prototype of an smtp callback function + * + * @param arg argument specified when initiating the email + * @param smtp_result result of the mail transfer (see defines SMTP_RESULT_*) + * @param srv_err if aborted by the server, this contains the error code received + * @param err an error returned by internal lwip functions, can help to specify + * the source of the error but must not necessarily be != ERR_OK + */ +typedef void (*smtp_result_fn)(void *arg, u8_t smtp_result, u16_t srv_err, err_t err); + +/** This structure is used as argument for smtp_send_mail_int(), + * which in turn can be used with tcpip_callback() to send mail + * from interrupt context, e.g. like this: + * struct smtp_send_request *req; (to be filled) + * tcpip_try_callback(smtp_send_mail_int, (void*)req); + * + * For member description, see parameter description of smtp_send_mail(). + * When using with tcpip_callback, this structure has to stay allocated + * (e.g. using mem_malloc/mem_free) until its 'callback_fn' is called. + */ +struct smtp_send_request { + const char *from; + const char* to; + const char* subject; + const char* body; + smtp_result_fn callback_fn; + void* callback_arg; + /** If this is != 0, data is *not* copied into an extra buffer + * but used from the pointers supplied in this struct. + * This means less memory usage, but data must stay untouched until + * the callback function is called. */ + u8_t static_data; +}; + + +#if SMTP_BODYDH + +#ifndef SMTP_BODYDH_BUFFER_SIZE +#define SMTP_BODYDH_BUFFER_SIZE 256 +#endif /* SMTP_BODYDH_BUFFER_SIZE */ + +struct smtp_bodydh { + u16_t state; + u16_t length; /* Length of content in buffer */ + char buffer[SMTP_BODYDH_BUFFER_SIZE]; /* buffer for generated content */ +#ifdef SMTP_BODYDH_USER_SIZE + u8_t user[SMTP_BODYDH_USER_SIZE]; +#endif /* SMTP_BODYDH_USER_SIZE */ +}; + +enum bdh_retvals_e { + BDH_DONE = 0, + BDH_WORKING +}; + +/** Prototype of an smtp body callback function + * It receives a struct smtp_bodydh, and a buffer to write data, + * must return BDH_WORKING to be called again and BDH_DONE when + * it has finished processing. This one tries to fill one TCP buffer with + * data, your function will be repeatedly called until that happens; so if you + * know you'll be taking too long to serve your request, pause once in a while + * by writing length=0 to avoid hogging system resources + * + * @param arg argument specified when initiating the email + * @param smtp_bodydh state handling + buffer structure + */ +typedef int (*smtp_bodycback_fn)(void *arg, struct smtp_bodydh *bodydh); + +err_t smtp_send_mail_bodycback(const char *from, const char* to, const char* subject, + smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg); + +#endif /* SMTP_BODYDH */ + + +err_t smtp_set_server_addr(const char* server); +void smtp_set_server_port(u16_t port); +#if LWIP_ALTCP && LWIP_ALTCP_TLS +struct altcp_tls_config; +void smtp_set_tls_config(struct altcp_tls_config *tls_config); +#endif +err_t smtp_set_auth(const char* username, const char* pass); +err_t smtp_send_mail(const char *from, const char* to, const char* subject, const char* body, + smtp_result_fn callback_fn, void* callback_arg); +err_t smtp_send_mail_static(const char *from, const char* to, const char* subject, const char* body, + smtp_result_fn callback_fn, void* callback_arg); +void smtp_send_mail_int(void *arg); +#ifdef LWIP_DEBUG +const char* smtp_result_str(u8_t smtp_result); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SMTP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp_opts.h new file mode 100644 index 0000000..bc743f6 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/smtp_opts.h @@ -0,0 +1,81 @@ +#ifndef LWIP_HDR_APPS_SMTP_OPTS_H +#define LWIP_HDR_APPS_SMTP_OPTS_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup smtp_opts Options + * @ingroup smtp + * + * @{ + */ + +/** Set this to 1 to enable data handler callback on BODY */ +#ifndef SMTP_BODYDH +#define SMTP_BODYDH 0 +#endif + +/** SMTP_DEBUG: Enable debugging for SNTP. */ +#ifndef SMTP_DEBUG +#define SMTP_DEBUG LWIP_DBG_OFF +#endif + +/** Maximum length reserved for server name including terminating 0 byte */ +#ifndef SMTP_MAX_SERVERNAME_LEN +#define SMTP_MAX_SERVERNAME_LEN 256 +#endif + +/** Maximum length reserved for username */ +#ifndef SMTP_MAX_USERNAME_LEN +#define SMTP_MAX_USERNAME_LEN 32 +#endif + +/** Maximum length reserved for password */ +#ifndef SMTP_MAX_PASS_LEN +#define SMTP_MAX_PASS_LEN 32 +#endif + +/** Set this to 0 if you know the authentication data will not change + * during the smtp session, which saves some heap space. */ +#ifndef SMTP_COPY_AUTHDATA +#define SMTP_COPY_AUTHDATA 1 +#endif + +/** Set this to 0 to save some code space if you know for sure that all data + * passed to this module conforms to the requirements in the SMTP RFC. + * WARNING: use this with care! + */ +#ifndef SMTP_CHECK_DATA +#define SMTP_CHECK_DATA 1 +#endif + +/** Set this to 1 to enable AUTH PLAIN support */ +#ifndef SMTP_SUPPORT_AUTH_PLAIN +#define SMTP_SUPPORT_AUTH_PLAIN 1 +#endif + +/** Set this to 1 to enable AUTH LOGIN support */ +#ifndef SMTP_SUPPORT_AUTH_LOGIN +#define SMTP_SUPPORT_AUTH_LOGIN 1 +#endif + +/* Memory allocation/deallocation can be overridden... */ +#ifndef SMTP_STATE_MALLOC +#define SMTP_STATE_MALLOC(size) mem_malloc(size) +#define SMTP_STATE_FREE(ptr) mem_free(ptr) +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* SMTP_OPTS_H */ + diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp.h similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp.h index 10e8ff4..a3f8eb1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp.h @@ -106,6 +106,13 @@ err_t snmp_send_trap(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t sp void snmp_set_auth_traps_enabled(u8_t enable); u8_t snmp_get_auth_traps_enabled(void); +u8_t snmp_v1_enabled(void); +u8_t snmp_v2c_enabled(void); +u8_t snmp_v3_enabled(void); +void snmp_v1_enable(u8_t enable); +void snmp_v2c_enable(u8_t enable); +void snmp_v3_enable(u8_t enable); + const char * snmp_get_community(void); const char * snmp_get_community_write(void); const char * snmp_get_community_trap(void); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_core.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_core.h index e781c53..6021c72 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_core.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_core.h @@ -91,7 +91,9 @@ extern "C" { #define SNMP_ASN1_TYPE_UNSIGNED32 SNMP_ASN1_TYPE_GAUGE #define SNMP_ASN1_TYPE_TIMETICKS (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_TIMETICKS) #define SNMP_ASN1_TYPE_OPAQUE (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_OPAQUE) +#if LWIP_HAVE_INT64 #define SNMP_ASN1_TYPE_COUNTER64 (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER64) +#endif #define SNMP_VARBIND_EXCEPTION_OFFSET 0xF0 #define SNMP_VARBIND_EXCEPTION_MASK 0x0F @@ -144,6 +146,9 @@ union snmp_variant_value const void* const_ptr; u32_t u32; s32_t s32; +#if LWIP_HAVE_INT64 + u64_t u64; +#endif }; @@ -186,7 +191,7 @@ typedef snmp_err_t (*node_instance_set_test_method)(struct snmp_node_instance*, typedef snmp_err_t (*node_instance_set_value_method)(struct snmp_node_instance*, u16_t, void*); typedef void (*node_instance_release_method)(struct snmp_node_instance*); -#define SNMP_GET_VALUE_RAW_DATA 0x8000 +#define SNMP_GET_VALUE_RAW_DATA 0x4000 /* do not use 0x8000 because return value of node_instance_get_value_method is signed16 and 0x8000 would be the signed bit */ /** SNMP node instance */ struct snmp_node_instance @@ -286,8 +291,8 @@ struct snmp_next_oid_state void snmp_next_oid_init(struct snmp_next_oid_state *state, const u32_t *start_oid, u8_t start_oid_len, u32_t *next_oid_buf, u8_t next_oid_max_len); -u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len); -u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference); +u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len); +u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void* reference); void snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len); void snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len); @@ -351,6 +356,14 @@ struct snmp_statistics u32_t outsetrequests; u32_t outgetresponses; u32_t outtraps; +#if LWIP_SNMP_V3 + u32_t unsupportedseclevels; + u32_t notintimewindows; + u32_t unknownusernames; + u32_t unknownengineids; + u32_t wrongdigests; + u32_t decryptionerrors; +#endif }; extern struct snmp_statistics snmp_stats; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_mib2.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_mib2.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_mib2.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_opts.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_opts.h index 6c9ba7b..c892d22 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_opts.h @@ -133,11 +133,11 @@ #if !defined SNMP_MAX_VALUE_SIZE || defined __DOXYGEN__ /** - * The maximum size of a value. + * The minimum size of a value. */ #define SNMP_MIN_VALUE_SIZE (2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */ /** - * The minimum size of a value. + * The maximum size of a value. */ #define SNMP_MAX_VALUE_SIZE LWIP_MAX(LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN), sizeof(u32_t)*(SNMP_MAX_OBJ_ID_LEN)), SNMP_MIN_VALUE_SIZE) #endif @@ -282,12 +282,16 @@ #define LWIP_SNMP_V3 0 #endif -#ifndef LWIP_SNMP_V3_CRYPTO -#define LWIP_SNMP_V3_CRYPTO LWIP_SNMP_V3 -#endif - #ifndef LWIP_SNMP_V3_MBEDTLS #define LWIP_SNMP_V3_MBEDTLS LWIP_SNMP_V3 #endif +#ifndef LWIP_SNMP_V3_CRYPTO +#define LWIP_SNMP_V3_CRYPTO LWIP_SNMP_V3_MBEDTLS +#endif + +#ifndef LWIP_SNMP_CONFIGURE_VERSIONS +#define LWIP_SNMP_CONFIGURE_VERSIONS 0 +#endif + #endif /* LWIP_HDR_SNMP_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_scalar.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_scalar.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_scalar.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_framework.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_framework.h new file mode 100644 index 0000000..47409cc --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_framework.h @@ -0,0 +1,32 @@ +/* +Generated by LwipMibCompiler +*/ + +#ifndef LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H +#define LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H + +#include "lwip/apps/snmp_opts.h" +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "lwip/apps/snmp_core.h" + +extern const struct snmp_obj_id usmNoAuthProtocol; +extern const struct snmp_obj_id usmHMACMD5AuthProtocol; +extern const struct snmp_obj_id usmHMACSHAAuthProtocol; + +extern const struct snmp_obj_id usmNoPrivProtocol; +extern const struct snmp_obj_id usmDESPrivProtocol; +extern const struct snmp_obj_id usmAESPrivProtocol; + +extern const struct snmp_mib snmpframeworkmib; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LWIP_SNMP */ +#endif /* LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_usm.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_usm.h new file mode 100644 index 0000000..88cfcd8 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_snmpv2_usm.h @@ -0,0 +1,24 @@ +/* +Generated by LwipMibCompiler +*/ + +#ifndef LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H +#define LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H + +#include "lwip/apps/snmp_opts.h" +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "lwip/apps/snmp_core.h" + +extern const struct snmp_mib snmpusmmib; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LWIP_SNMP */ +#endif /* LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_table.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_table.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_table.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_threadsync.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmp_threadsync.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmp_threadsync.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmpv3.h similarity index 73% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmpv3.h index c99fed4..e0dda64 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/snmpv3.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/snmpv3.h @@ -38,18 +38,34 @@ #include "lwip/apps/snmp_opts.h" #include "lwip/err.h" +#ifdef __cplusplus +extern "C" { +#endif + #if LWIP_SNMP && LWIP_SNMP_V3 -#define SNMP_V3_AUTH_ALGO_INVAL 0 -#define SNMP_V3_AUTH_ALGO_MD5 1 -#define SNMP_V3_AUTH_ALGO_SHA 2 +typedef enum +{ + SNMP_V3_AUTH_ALGO_INVAL = 0, + SNMP_V3_AUTH_ALGO_MD5 = 1, + SNMP_V3_AUTH_ALGO_SHA = 2 +} snmpv3_auth_algo_t; -#define SNMP_V3_PRIV_ALGO_INVAL 0 -#define SNMP_V3_PRIV_ALGO_DES 1 -#define SNMP_V3_PRIV_ALGO_AES 2 +typedef enum +{ + SNMP_V3_PRIV_ALGO_INVAL = 0, + SNMP_V3_PRIV_ALGO_DES = 1, + SNMP_V3_PRIV_ALGO_AES = 2 +} snmpv3_priv_algo_t; -#define SNMP_V3_PRIV_MODE_DECRYPT 0 -#define SNMP_V3_PRIV_MODE_ENCRYPT 1 +typedef enum +{ + SNMP_V3_USER_STORAGETYPE_OTHER = 1, + SNMP_V3_USER_STORAGETYPE_VOLATILE = 2, + SNMP_V3_USER_STORAGETYPE_NONVOLATILE = 3, + SNMP_V3_USER_STORAGETYPE_PERMANENT = 4, + SNMP_V3_USER_STORAGETYPE_READONLY = 5 +} snmpv3_user_storagetype_t; /* * The following callback functions must be implemented by the application. @@ -65,26 +81,34 @@ void snmpv3_set_engine_boots(u32_t boots); u32_t snmpv3_get_engine_time(void); void snmpv3_reset_engine_time(void); -err_t snmpv3_get_user(const char* username, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key); +err_t snmpv3_get_user(const char* username, snmpv3_auth_algo_t *auth_algo, u8_t *auth_key, snmpv3_priv_algo_t *priv_algo, u8_t *priv_key); +u8_t snmpv3_get_amount_of_users(void); +err_t snmpv3_get_user_storagetype(const char *username, snmpv3_user_storagetype_t *storagetype); +err_t snmpv3_get_username(char *username, u8_t index); /* The following functions are provided by the SNMPv3 agent */ void snmpv3_engine_id_changed(void); +s32_t snmpv3_get_engine_time_internal(void); void snmpv3_password_to_key_md5( const u8_t *password, /* IN */ - u8_t passwordlen, /* IN */ + size_t passwordlen, /* IN */ const u8_t *engineID, /* IN - pointer to snmpEngineID */ u8_t engineLength, /* IN - length of snmpEngineID */ u8_t *key); /* OUT - pointer to caller 16-octet buffer */ void snmpv3_password_to_key_sha( const u8_t *password, /* IN */ - u8_t passwordlen, /* IN */ + size_t passwordlen, /* IN */ const u8_t *engineID, /* IN - pointer to snmpEngineID */ u8_t engineLength, /* IN - length of snmpEngineID */ u8_t *key); /* OUT - pointer to caller 20-octet buffer */ #endif +#ifdef __cplusplus +} +#endif + #endif /* LWIP_HDR_APPS_SNMP_V3_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp.h similarity index 85% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp.h index 40df9cc..c415253 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp.h @@ -58,16 +58,20 @@ u8_t sntp_enabled(void); void sntp_setserver(u8_t idx, const ip_addr_t *addr); const ip_addr_t* sntp_getserver(u8_t idx); +#if SNTP_MONITOR_SERVER_REACHABILITY +u8_t sntp_getreachability(u8_t idx); +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ + #if SNTP_SERVER_DNS -void sntp_setservername(u8_t idx, char *server); -char *sntp_getservername(u8_t idx); +void sntp_setservername(u8_t idx, const char *server); +const char *sntp_getservername(u8_t idx); #endif /* SNTP_SERVER_DNS */ -#if SNTP_GET_SERVERS_FROM_DHCP +#if SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 void sntp_servermode_dhcp(int set_servers_from_dhcp); -#else /* SNTP_GET_SERVERS_FROM_DHCP */ +#else /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ #define sntp_servermode_dhcp(x) -#endif /* SNTP_GET_SERVERS_FROM_DHCP */ +#endif /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp_opts.h similarity index 68% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp_opts.h index f3651f9..cb62771 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/sntp_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/sntp_opts.h @@ -38,6 +38,7 @@ #define LWIP_HDR_APPS_SNTP_OPTS_H #include "lwip/opt.h" +#include "lwip/prot/iana.h" /** * @defgroup sntp_opts Options @@ -46,8 +47,10 @@ */ /** SNTP macro to change system time in seconds - * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds instead of this one - * if you need the additional precision. + * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds + * instead of this one if you need the additional precision. Alternatively, + * define SNTP_SET_SYSTEM_TIME_NTP(sec, frac) in order to work with native + * NTP timestamps instead. */ #if !defined SNTP_SET_SYSTEM_TIME || defined __DOXYGEN__ #define SNTP_SET_SYSTEM_TIME(sec) LWIP_UNUSED_ARG(sec) @@ -64,6 +67,12 @@ #define SNTP_GET_SERVERS_FROM_DHCP LWIP_DHCP_GET_NTP_SRV #endif +/** Set this to 1 to implement the callback function called by dhcpv6 when + * NTP servers are received. */ +#if !defined SNTP_GET_SERVERS_FROM_DHCPV6 || defined __DOXYGEN__ +#define SNTP_GET_SERVERS_FROM_DHCPV6 LWIP_DHCP6_GET_NTP_SRV +#endif + /** Set this to 1 to support DNS names (or IP address strings) to set sntp servers * One server address/name can be defined as default if SNTP_SERVER_DNS == 1: * \#define SNTP_SERVER_ADDRESS "pool.ntp.org" @@ -81,12 +90,7 @@ /** SNTP server port */ #if !defined SNTP_PORT || defined __DOXYGEN__ -#define SNTP_PORT 123 -#endif - -/** Set this to 1 to allow config of SNTP server(s) by DNS name */ -#if !defined SNTP_SERVER_DNS || defined __DOXYGEN__ -#define SNTP_SERVER_DNS 0 +#define SNTP_PORT LWIP_IANA_PORT_SNTP #endif /** Sanity check: @@ -96,7 +100,7 @@ * response comes from the server we sent the request to. * - >= 2 to check returned Originate Timestamp against Transmit Timestamp * sent to the server (to ensure response to older request). - * - >= 3 @todo: discard reply if any of the LI, Stratum, or Transmit Timestamp + * - >= 3 @todo: discard reply if any of the VN, Stratum, or Transmit Timestamp * fields is 0 or the Mode field is not 4 (unicast) or 5 (broadcast). * - >= 4 @todo: to check that the Root Delay and Root Dispersion fields are each * greater than or equal to 0 and less than infinity, where infinity is @@ -107,6 +111,30 @@ #define SNTP_CHECK_RESPONSE 0 #endif +/** Enable round-trip delay compensation. + * Compensate for the round-trip delay by calculating the clock offset from + * the originate, receive, transmit and destination timestamps, as per RFC. + * + * The calculation requires compiler support for 64-bit integers. Also, either + * SNTP_SET_SYSTEM_TIME_US or SNTP_SET_SYSTEM_TIME_NTP has to be implemented + * for setting the system clock with sub-second precision. Likewise, either + * SNTP_GET_SYSTEM_TIME or SNTP_GET_SYSTEM_TIME_NTP needs to be implemented + * with sub-second precision. + * + * Although not strictly required, it makes sense to combine this option with + * SNTP_CHECK_RESPONSE >= 2 for sanity-checking of the received timestamps. + * Also, in order for the round-trip calculation to work, the difference + * between the local clock and the NTP server clock must not be larger than + * about 34 years. If that limit is exceeded, the implementation will fall back + * to setting the clock without compensation. In order to ensure that the local + * clock is always within the permitted range for compensation, even at first + * try, it may be necessary to store at least the current year in non-volatile + * memory. + */ +#if !defined SNTP_COMP_ROUNDTRIP || defined __DOXYGEN__ +#define SNTP_COMP_ROUNDTRIP 0 +#endif + /** According to the RFC, this shall be a random delay * between 1 and 5 minutes (in milliseconds) to prevent load peaks. * This can be defined to a random generation function, @@ -114,33 +142,40 @@ * Turned off by default. */ #if !defined SNTP_STARTUP_DELAY || defined __DOXYGEN__ +#ifdef LWIP_RAND +#define SNTP_STARTUP_DELAY 1 +#else #define SNTP_STARTUP_DELAY 0 #endif +#endif /** If you want the startup delay to be a function, define this * to a function (including the brackets) and define SNTP_STARTUP_DELAY to 1. */ #if !defined SNTP_STARTUP_DELAY_FUNC || defined __DOXYGEN__ -#define SNTP_STARTUP_DELAY_FUNC SNTP_STARTUP_DELAY +#define SNTP_STARTUP_DELAY_FUNC (LWIP_RAND() % 5000) #endif /** SNTP receive timeout - in milliseconds * Also used as retry timeout - this shouldn't be too low. - * Default is 3 seconds. + * Default is 15 seconds. Must not be beolw 15 seconds by specification (i.e. 15000) */ #if !defined SNTP_RECV_TIMEOUT || defined __DOXYGEN__ -#define SNTP_RECV_TIMEOUT 3000 +#define SNTP_RECV_TIMEOUT 15000 #endif /** SNTP update delay - in milliseconds - * Default is 1 hour. Must not be beolw 15 seconds by specification (i.e. 15000) + * Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000) */ #if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__ #define SNTP_UPDATE_DELAY 3600000 #endif /** SNTP macro to get system time, used with SNTP_CHECK_RESPONSE >= 2 - * to send in request and compare in response. + * to send in request and compare in response. Also used for round-trip + * delay compensation if SNTP_COMP_ROUNDTRIP != 0. + * Alternatively, define SNTP_GET_SYSTEM_TIME_NTP(sec, frac) in order to + * work with native NTP timestamps instead. */ #if !defined SNTP_GET_SYSTEM_TIME || defined __DOXYGEN__ #define SNTP_GET_SYSTEM_TIME(sec, us) do { (sec) = 0; (us) = 0; } while(0) @@ -166,6 +201,13 @@ #define SNTP_RETRY_TIMEOUT_EXP 1 #endif +/** Keep a reachability shift register per server + * Default is on to conform to RFC. + */ +#if !defined SNTP_MONITOR_SERVER_REACHABILITY || defined __DOXYGEN__ +#define SNTP_MONITOR_SERVER_REACHABILITY 1 +#endif + /** * @} */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_opts.h similarity index 91% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_opts.h index 6968a80..198f632 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_opts.h @@ -1,4 +1,4 @@ -/****************************************************************//** +/** * * @file tftp_opts.h * @@ -9,7 +9,7 @@ * Copyright (c) Deltatee Enterprises Ltd. 2013 * All rights reserved. * - ********************************************************************/ + */ /* * Redistribution and use in source and binary forms, with or without @@ -42,6 +42,7 @@ #define LWIP_HDR_APPS_TFTP_OPTS_H #include "lwip/opt.h" +#include "lwip/prot/iana.h" /** * @defgroup tftp_opts Options @@ -53,14 +54,14 @@ * Enable TFTP debug messages */ #if !defined TFTP_DEBUG || defined __DOXYGEN__ -#define TFTP_DEBUG LWIP_DBG_ON +#define TFTP_DEBUG LWIP_DBG_OFF #endif /** * TFTP server port */ #if !defined TFTP_PORT || defined __DOXYGEN__ -#define TFTP_PORT 69 +#define TFTP_PORT LWIP_IANA_PORT_TFTP #endif /** @@ -81,7 +82,7 @@ * TFTP timer cyclic interval */ #if !defined TFTP_TIMER_MSECS || defined __DOXYGEN__ -#define TFTP_TIMER_MSECS 50 +#define TFTP_TIMER_MSECS (TFTP_TIMEOUT_MSECS / 10) #endif /** diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_server.h similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_server.h index 3fbe701..0a7fbee 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/apps/tftp_server.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/apps/tftp_server.h @@ -1,4 +1,4 @@ -/****************************************************************//** +/** * * @file tftp_server.h * @@ -9,7 +9,7 @@ * Copyright (c) Deltatee Enterprises Ltd. 2013 * All rights reserved. * - ********************************************************************/ + */ /* * Redistribution and use in source and binary forms, with or without @@ -86,6 +86,7 @@ struct tftp_context { }; err_t tftp_init(const struct tftp_context* ctx); +void tftp_cleanup(void); #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/arch.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/arch.h new file mode 100644 index 0000000..312606f --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/arch.h @@ -0,0 +1,404 @@ +/** + * @file + * Support for different processor and compiler architectures + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_ARCH_H +#define LWIP_HDR_ARCH_H + +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif + +#include "arch/cc.h" +#include + +/** Temporary: define format string for size_t if not defined in cc.h */ +#ifndef SZT_F +#define SZT_F U32_F +#endif /* SZT_F */ +/** Temporary upgrade helper: define format string for u8_t as hex if not + defined in cc.h */ +#ifndef X8_F +#define X8_F "02x" +#endif /* X8_F */ + +/** + * @defgroup compiler_abstraction Compiler/platform abstraction + * @ingroup sys_layer + * All defines related to this section must not be placed in lwipopts.h, + * but in arch/cc.h! + * If the compiler does not provide memset() this file must include a + * definition of it, or include a file which defines it. + * These options cannot be \#defined in lwipopts.h since they are not options + * of lwIP itself, but options of the lwIP port to your system. + * @{ + */ + +/** Define the byte order of the system. + * Needed for conversion of network data to host byte order. + * Allowed values: LITTLE_ENDIAN and BIG_ENDIAN + */ +#ifndef BYTE_ORDER +#define BYTE_ORDER LITTLE_ENDIAN +#endif + +/** Define random number generator function of your system */ +#ifdef __DOXYGEN__ +#define LWIP_RAND() ((u32_t)rand()) +#endif + +/** Platform specific diagnostic output.\n + * Note the default implementation pulls in printf, which may + * in turn pull in a lot of standard libary code. In resource-constrained + * systems, this should be defined to something less resource-consuming. + */ +#ifndef LWIP_PLATFORM_DIAG +#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0) +#include +#include +#endif + +/** Platform specific assertion handling.\n + * Note the default implementation pulls in printf, fflush and abort, which may + * in turn pull in a lot of standard libary code. In resource-constrained + * systems, this should be defined to something less resource-consuming. + */ +#ifndef LWIP_PLATFORM_ASSERT +#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion \"%s\" failed at line %d in %s\n", \ + x, __LINE__, __FILE__); fflush(NULL); abort();} while(0) +#include +#include +#endif + +/** Define this to 1 in arch/cc.h of your port if you do not want to + * include stddef.h header to get size_t. You need to typedef size_t + * by yourself in this case. + */ +#ifndef LWIP_NO_STDDEF_H +#define LWIP_NO_STDDEF_H 0 +#endif + +#if !LWIP_NO_STDDEF_H +#include /* for size_t */ +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the stdint.h header. You need to typedef the generic types listed in + * lwip/arch.h yourself in this case (u8_t, u16_t...). + */ +#ifndef LWIP_NO_STDINT_H +#define LWIP_NO_STDINT_H 0 +#endif + +/* Define generic types used in lwIP */ +#if !LWIP_NO_STDINT_H +#include +/* stdint.h is C99 which should also provide support for 64-bit integers */ +#if !defined(LWIP_HAVE_INT64) && defined(UINT64_MAX) +#define LWIP_HAVE_INT64 1 +#endif +typedef uint8_t u8_t; +typedef int8_t s8_t; +typedef uint16_t u16_t; +typedef int16_t s16_t; +typedef uint32_t u32_t; +typedef int32_t s32_t; +#if LWIP_HAVE_INT64 +typedef uint64_t u64_t; +typedef int64_t s64_t; +#endif +typedef uintptr_t mem_ptr_t; +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the inttypes.h header. You need to define the format strings listed in + * lwip/arch.h yourself in this case (X8_F, U16_F...). + */ +#ifndef LWIP_NO_INTTYPES_H +#define LWIP_NO_INTTYPES_H 0 +#endif + +/* Define (sn)printf formatters for these lwIP types */ +#if !LWIP_NO_INTTYPES_H +#include +#ifndef X8_F +#define X8_F "02" PRIx8 +#endif +#ifndef U16_F +#define U16_F PRIu16 +#endif +#ifndef S16_F +#define S16_F PRId16 +#endif +#ifndef X16_F +#define X16_F PRIx16 +#endif +#ifndef U32_F +#define U32_F PRIu32 +#endif +#ifndef S32_F +#define S32_F PRId32 +#endif +#ifndef X32_F +#define X32_F PRIx32 +#endif +#ifndef SZT_F +#define SZT_F PRIuPTR +#endif +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the limits.h header. You need to define the type limits yourself in this case + * (e.g. INT_MAX, SSIZE_MAX). + */ +#ifndef LWIP_NO_LIMITS_H +#define LWIP_NO_LIMITS_H 0 +#endif + +/* Include limits.h? */ +#if !LWIP_NO_LIMITS_H +#include +#endif + +/* Do we need to define ssize_t? This is a compatibility hack: + * Unfortunately, this type seems to be unavailable on some systems (even if + * sys/types or unistd.h are available). + * Being like that, we define it to 'int' if SSIZE_MAX is not defined. + */ +#ifdef SSIZE_MAX +/* If SSIZE_MAX is defined, unistd.h should provide the type as well */ +#ifndef LWIP_NO_UNISTD_H +#define LWIP_NO_UNISTD_H 0 +#endif +#if !LWIP_NO_UNISTD_H +#include +#endif +#else /* SSIZE_MAX */ +typedef int ssize_t; +#define SSIZE_MAX INT_MAX +#endif /* SSIZE_MAX */ + +/* some maximum values needed in lwip code */ +#define LWIP_UINT32_MAX 0xffffffff + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the ctype.h header. If ctype.h is available, a few character functions + * are mapped to the appropriate functions (lwip_islower, lwip_isdigit...), if + * not, a private implementation is provided. + */ +#ifndef LWIP_NO_CTYPE_H +#define LWIP_NO_CTYPE_H 0 +#endif + +#if LWIP_NO_CTYPE_H +#define lwip_in_range(c, lo, up) ((u8_t)(c) >= (lo) && (u8_t)(c) <= (up)) +#define lwip_isdigit(c) lwip_in_range((c), '0', '9') +#define lwip_isxdigit(c) (lwip_isdigit(c) || lwip_in_range((c), 'a', 'f') || lwip_in_range((c), 'A', 'F')) +#define lwip_islower(c) lwip_in_range((c), 'a', 'z') +#define lwip_isspace(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || (c) == '\r' || (c) == '\t' || (c) == '\v') +#define lwip_isupper(c) lwip_in_range((c), 'A', 'Z') +#define lwip_tolower(c) (lwip_isupper(c) ? (c) - 'A' + 'a' : c) +#define lwip_toupper(c) (lwip_islower(c) ? (c) - 'a' + 'A' : c) +#else +#include +#define lwip_isdigit(c) isdigit((unsigned char)(c)) +#define lwip_isxdigit(c) isxdigit((unsigned char)(c)) +#define lwip_islower(c) islower((unsigned char)(c)) +#define lwip_isspace(c) isspace((unsigned char)(c)) +#define lwip_isupper(c) isupper((unsigned char)(c)) +#define lwip_tolower(c) tolower((unsigned char)(c)) +#define lwip_toupper(c) toupper((unsigned char)(c)) +#endif + +/** C++ const_cast(val) equivalent to remove constness from a value (GCC -Wcast-qual) */ +#ifndef LWIP_CONST_CAST +#define LWIP_CONST_CAST(target_type, val) ((target_type)((ptrdiff_t)val)) +#endif + +/** Get rid of alignment cast warnings (GCC -Wcast-align) */ +#ifndef LWIP_ALIGNMENT_CAST +#define LWIP_ALIGNMENT_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Get rid of warnings related to pointer-to-numeric and vice-versa casts, + * e.g. "conversion from 'u8_t' to 'void *' of greater size" + */ +#ifndef LWIP_PTR_NUMERIC_CAST +#define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Avoid warnings/errors related to implicitly casting away packed attributes by doing a explicit cast */ +#ifndef LWIP_PACKED_CAST +#define LWIP_PACKED_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Allocates a memory buffer of specified size that is of sufficient size to align + * its start address using LWIP_MEM_ALIGN. + * You can declare your own version here e.g. to enforce alignment without adding + * trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement + * requirements.\n + * e.g. if you use gcc and need 32 bit alignment:\n + * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \_\_attribute\_\_((aligned(4)))\n + * or more portable:\n + * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] + */ +#ifndef LWIP_DECLARE_MEMORY_ALIGNED +#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)] +#endif + +/** Calculate memory size for an aligned buffer - returns the next highest + * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and + * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). + */ +#ifndef LWIP_MEM_ALIGN_SIZE +#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1U) & ~(MEM_ALIGNMENT-1U)) +#endif + +/** Calculate safe memory size for an aligned buffer when using an unaligned + * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the + * start (e.g. if buffer is u8_t[] and actual data will be u32_t*) + */ +#ifndef LWIP_MEM_ALIGN_BUFFER +#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1U)) +#endif + +/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT + * so that ADDR % MEM_ALIGNMENT == 0 + */ +#ifndef LWIP_MEM_ALIGN +#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Packed structs support. + * Placed BEFORE declaration of a packed struct.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_BEGIN +#define PACK_STRUCT_BEGIN +#endif /* PACK_STRUCT_BEGIN */ + +/** Packed structs support. + * Placed AFTER declaration of a packed struct.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_END +#define PACK_STRUCT_END +#endif /* PACK_STRUCT_END */ + +/** Packed structs support. + * Placed between end of declaration of a packed struct and trailing semicolon.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_STRUCT +#if defined(__GNUC__) || defined(__clang__) +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#else +#define PACK_STRUCT_STRUCT +#endif +#endif /* PACK_STRUCT_STRUCT */ + +/** Packed structs support. + * Wraps u32_t and u16_t members.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FIELD +#define PACK_STRUCT_FIELD(x) x +#endif /* PACK_STRUCT_FIELD */ + +/** Packed structs support. + * Wraps u8_t members, where some compilers warn that packing is not necessary.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FLD_8 +#define PACK_STRUCT_FLD_8(x) PACK_STRUCT_FIELD(x) +#endif /* PACK_STRUCT_FLD_8 */ + +/** Packed structs support. + * Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FLD_S +#define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x) +#endif /* PACK_STRUCT_FLD_S */ + +/** PACK_STRUCT_USE_INCLUDES==1: Packed structs support using \#include files before and after struct to be packed.\n + * The file included BEFORE the struct is "arch/bpstruct.h".\n + * The file included AFTER the struct is "arch/epstruct.h".\n + * This can be used to implement struct packing on MS Visual C compilers, see + * the Win32 port in the lwIP contrib repository for reference. + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifdef __DOXYGEN__ +#define PACK_STRUCT_USE_INCLUDES +#endif + +/** Eliminates compiler warning about unused arguments (GCC -Wextra -Wunused). */ +#ifndef LWIP_UNUSED_ARG +#define LWIP_UNUSED_ARG(x) (void)x +#endif /* LWIP_UNUSED_ARG */ + +/** LWIP_PROVIDE_ERRNO==1: Let lwIP provide ERRNO values and the 'errno' variable. + * If this is disabled, cc.h must either define 'errno', include , + * define LWIP_ERRNO_STDINCLUDE to get included or + * define LWIP_ERRNO_INCLUDE to or equivalent. + */ +#if defined __DOXYGEN__ +#define LWIP_PROVIDE_ERRNO +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_ARCH_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/autoip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/autoip.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/autoip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/autoip.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/debug.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/debug.h similarity index 92% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/debug.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/debug.h index bfeab20..3ce85d9 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/debug.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/debug.h @@ -37,11 +37,10 @@ #ifndef LWIP_HDR_DEBUG_H #define LWIP_HDR_DEBUG_H -#include "lwip/arch.h" #include "lwip/opt.h" +#include "lwip/arch.h" //#define LWIP_DEBUG -#define LWIP_NOASSERT /** * @defgroup debugging_levels LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values @@ -118,17 +117,12 @@ #ifndef LWIP_NOASSERT #define LWIP_ASSERT(message, assertion) do { if (!(assertion)) { \ LWIP_PLATFORM_ASSERT(message); }} while(0) -#ifndef LWIP_PLATFORM_ASSERT -#error "If you want to use LWIP_ASSERT, LWIP_PLATFORM_ASSERT(message) needs to be defined in your arch/cc.h" -#endif #else /* LWIP_NOASSERT */ #define LWIP_ASSERT(message, assertion) #endif /* LWIP_NOASSERT */ #ifndef LWIP_ERROR -#ifndef LWIP_NOASSERT -#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_ASSERT(message) -#elif defined LWIP_DEBUG +#ifdef LWIP_DEBUG #define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_DIAG((message)) #else #define LWIP_PLATFORM_ERROR(message) @@ -148,9 +142,6 @@ #endif #ifdef LWIP_DEBUG -#ifndef LWIP_PLATFORM_DIAG -#error "If you want to use LWIP_DEBUG, LWIP_PLATFORM_DIAG(message) needs to be defined in your arch/cc.h" -#endif #define LWIP_DEBUGF(debug, message) do { \ if ( \ ((debug) & LWIP_DBG_ON) && \ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/def.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/def.h similarity index 80% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/def.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/def.h index 57c3fd0..9975dcc 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/def.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/def.h @@ -34,6 +34,17 @@ * Author: Adam Dunkels * */ + +/** + * @defgroup perf Performance measurement + * @ingroup sys_layer + * All defines related to this section must not be placed in lwipopts.h, + * but in arch/perf.h! + * Measurement calls made throughout lwip, these can be defined to nothing. + * - PERF_START: start measuring something. + * - PERF_STOP(x): stop measuring something, and record the result. + */ + #ifndef LWIP_HDR_DEF_H #define LWIP_HDR_DEF_H @@ -72,14 +83,14 @@ extern "C" { #endif #if BYTE_ORDER == BIG_ENDIAN -#define lwip_htons(x) (x) -#define lwip_ntohs(x) (x) -#define lwip_htonl(x) (x) -#define lwip_ntohl(x) (x) -#define PP_HTONS(x) (x) -#define PP_NTOHS(x) (x) -#define PP_HTONL(x) (x) -#define PP_NTOHL(x) (x) +#define lwip_htons(x) ((u16_t)(x)) +#define lwip_ntohs(x) ((u16_t)(x)) +#define lwip_htonl(x) ((u32_t)(x)) +#define lwip_ntohl(x) ((u32_t)(x)) +#define PP_HTONS(x) ((u16_t)(x)) +#define PP_NTOHS(x) ((u16_t)(x)) +#define PP_HTONL(x) ((u32_t)(x)) +#define PP_NTOHL(x) ((u32_t)(x)) #else /* BYTE_ORDER != BIG_ENDIAN */ #ifndef lwip_htons u16_t lwip_htons(u16_t x); @@ -94,34 +105,30 @@ u32_t lwip_htonl(u32_t x); /* These macros should be calculated by the preprocessor and are used with compile-time constants only (so that there is no little-endian overhead at runtime). */ -#define PP_HTONS(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8)) +#define PP_HTONS(x) ((u16_t)((((x) & (u16_t)0x00ffU) << 8) | (((x) & (u16_t)0xff00U) >> 8))) #define PP_NTOHS(x) PP_HTONS(x) -#define PP_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \ - (((x) & 0x0000ff00UL) << 8) | \ - (((x) & 0x00ff0000UL) >> 8) | \ - (((x) & 0xff000000UL) >> 24)) +#define PP_HTONL(x) ((((x) & (u32_t)0x000000ffUL) << 24) | \ + (((x) & (u32_t)0x0000ff00UL) << 8) | \ + (((x) & (u32_t)0x00ff0000UL) >> 8) | \ + (((x) & (u32_t)0xff000000UL) >> 24)) #define PP_NTOHL(x) PP_HTONL(x) #endif /* BYTE_ORDER == BIG_ENDIAN */ /* Provide usual function names as macros for users, but this can be turned off */ #ifndef LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS -#ifdef htons -#undef htons -#endif /* htons */ -#ifdef htonl -#undef htonl -#endif /* htonl */ -#ifdef ntohs -#undef ntohs -#endif /* ntohs */ -#ifdef ntohl -#undef ntohl -#endif /* ntohl */ +#ifndef htons #define htons(x) lwip_htons(x) +#endif +#ifndef ntohs #define ntohs(x) lwip_ntohs(x) +#endif +#ifndef htonl #define htonl(x) lwip_htonl(x) +#endif +#ifndef ntohl #define ntohl(x) lwip_ntohl(x) #endif +#endif /* Functions that are not available as standard implementations. * In cc.h, you can #define these to implementations available on diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp.h similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp.h index fe339f5..c78aa0b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dhcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp.h @@ -50,7 +50,7 @@ extern "C" { #endif /** period (in seconds) of the application calling dhcp_coarse_tmr() */ -#define DHCP_COARSE_TIMER_SECS 10//60 +#define DHCP_COARSE_TIMER_SECS 60 /** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ #define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) /** period (in milliseconds) of the application calling dhcp_fine_tmr() */ @@ -68,8 +68,6 @@ struct dhcp { /** transaction identifier of last sent request */ u32_t xid; - /** incoming msg */ - struct dhcp_msg *msg_in; /** track PCB allocation state */ u8_t pcb_allocated; /** current DHCP state machine state */ @@ -81,9 +79,6 @@ struct dhcp #endif u8_t subnet_mask_given; - struct pbuf *p_out; /* pbuf of outcoming msg */ - struct dhcp_msg *msg_out; /* outgoing msg */ - u16_t options_out_len; /* outgoing msg options length */ u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ @@ -114,6 +109,7 @@ err_t dhcp_start(struct netif *netif); err_t dhcp_renew(struct netif *netif); err_t dhcp_release(struct netif *netif); void dhcp_stop(struct netif *netif); +void dhcp_release_and_stop(struct netif *netif); void dhcp_inform(struct netif *netif); void dhcp_network_changed(struct netif *netif); #if DHCP_DOES_ARP_CHECK diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp6.h new file mode 100644 index 0000000..5cc4a01 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dhcp6.h @@ -0,0 +1,104 @@ +/** + * @file + * + * DHCPv6 client: IPv6 address autoconfiguration as per + * RFC 3315 (stateful DHCPv6) and + * RFC 3736 (stateless DHCPv6). + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + */ + +#ifndef LWIP_HDR_IP6_DHCP6_H +#define LWIP_HDR_IP6_DHCP6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** period (in milliseconds) of the application calling dhcp6_tmr() */ +#define DHCP6_TIMER_MSECS 500 + +struct dhcp6 +{ + /** transaction identifier of last sent request */ + u32_t xid; + /** track PCB allocation state */ + u8_t pcb_allocated; + /** current DHCPv6 state machine state */ + u8_t state; + /** retries of current request */ + u8_t tries; + /** if request config is triggered while another action is active, this keeps track of it */ + u8_t request_config_pending; + /** #ticks with period DHCP6_TIMER_MSECS for request timeout */ + u16_t request_timeout; +#if LWIP_IPV6_DHCP6_STATEFUL + /* @todo: add more members here to keep track of stateful DHCPv6 data, like lease times */ +#endif /* LWIP_IPV6_DHCP6_STATEFUL */ +}; + +void dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6); +/** Remove a struct dhcp6 previously set to the netif using dhcp6_set_struct() */ +#define dhcp6_remove_struct(netif) netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL) +void dhcp6_cleanup(struct netif *netif); + +err_t dhcp6_enable_stateful(struct netif *netif); +err_t dhcp6_enable_stateless(struct netif *netif); +void dhcp6_disable(struct netif *netif); + +void dhcp6_tmr(void); + +void dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config); + +#if LWIP_DHCP6_GET_NTP_SRV +/** This function must exist, in other to add offered NTP servers to + * the NTP (or SNTP) engine. + * See LWIP_DHCP6_MAX_NTP_SERVERS */ +extern void dhcp6_set_ntp_servers(u8_t num_ntp_servers, const ip_addr_t* ntp_server_addrs); +#endif /* LWIP_DHCP6_GET_NTP_SRV */ + +#define netif_dhcp6_data(netif) ((struct dhcp6*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6_DHCP6 */ + +#endif /* LWIP_HDR_IP6_DHCP6_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dns.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dns.h index 1453d72..0913415 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/dns.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/dns.h @@ -44,6 +44,7 @@ #if LWIP_DNS #include "lwip/ip_addr.h" +#include "lwip/err.h" #ifdef __cplusplus extern "C" { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/err.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/err.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/err.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/err.h index 66a8a5f..887d9b3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/err.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/err.h @@ -49,14 +49,6 @@ extern "C" { * @{ */ -/** Define LWIP_ERR_T in cc.h if you want to use - * a different type for your platform (must be signed). */ -#ifdef LWIP_ERR_T -typedef LWIP_ERR_T err_t; -#else /* LWIP_ERR_T */ -typedef s8_t err_t; -#endif /* LWIP_ERR_T*/ -#if 0 /** Definitions for error constants. */ typedef enum { /** No error, everything OK. */ @@ -95,8 +87,14 @@ typedef enum { /** Illegal argument. */ ERR_ARG = -16 } err_enum_t; -#endif -#define ERR_IS_FATAL(e) ((e) <= ERR_ABRT) + +/** Define LWIP_ERR_T in cc.h if you want to use + * a different type for your platform (must be signed). */ +#ifdef LWIP_ERR_T +typedef LWIP_ERR_T err_t; +#else /* LWIP_ERR_T */ +typedef s8_t err_t; +#endif /* LWIP_ERR_T*/ /** * @} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/errno.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/errno.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/errno.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/errno.h index 641cffb..48d6b53 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/errno.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/errno.h @@ -179,10 +179,15 @@ extern int errno; #else /* LWIP_PROVIDE_ERRNO */ -/* Define LWIP_ERRNO_INCLUDE to to include the error defines here */ +/* Define LWIP_ERRNO_STDINCLUDE if you want to include here */ +#ifdef LWIP_ERRNO_STDINCLUDE +#include +#else /* LWIP_ERRNO_STDINCLUDE */ +/* Define LWIP_ERRNO_INCLUDE to an equivalent of to include the error defines here */ #ifdef LWIP_ERRNO_INCLUDE #include LWIP_ERRNO_INCLUDE #endif /* LWIP_ERRNO_INCLUDE */ +#endif /* LWIP_ERRNO_STDINCLUDE */ #endif /* LWIP_PROVIDE_ERRNO */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/etharp.h similarity index 83% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/etharp.h index 0292284..e831b94 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/etharp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/etharp.h @@ -52,14 +52,14 @@ #include "lwip/ip4.h" #include "lwip/prot/ethernet.h" -#ifdef __cplusplus -extern "C" { -#endif - #if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */ #include "lwip/prot/etharp.h" +#ifdef __cplusplus +extern "C" { +#endif + /** 1 seconds period */ #define ARP_TMR_INTERVAL 1000 @@ -75,9 +75,9 @@ struct etharp_q_entry { #define etharp_init() /* Compatibility define, no init needed. */ void etharp_tmr(void); -s8_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, +ssize_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr **eth_ret, const ip4_addr_t **ip_ret); -u8_t etharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret); +int etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret); err_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr); err_t etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q); err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr); @@ -88,41 +88,20 @@ err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr); #define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif)) void etharp_cleanup_netif(struct netif *netif); -/** - * Update (or insert) a IP/MAC address pair in the ARP cache. - * - * If a pending entry is resolved, any queued packets will be sent - * at this point. - * - * @param netif netif related to this entry (used for NETIF_ADDRHINT) - * @param ipaddr IP address of the inserted ARP entry. - * @param ethaddr Ethernet address of the inserted ARP entry. - * @param flags See @ref etharp_state - * - * @return - * - ERR_OK Successfully updated ARP cache. - * - ERR_MEM If we could not add a new ARP entry when ETHARP_FLAG_TRY_HARD was set. - * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. - * - * @see pbuf_free() - */ -err_t -etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags); - - #if ETHARP_SUPPORT_STATIC_ENTRIES err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr); err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr); #endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ -#endif /* LWIP_IPV4 && LWIP_ARP */ - void etharp_input(struct pbuf *p, struct netif *netif); +err_t +etharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags); #ifdef __cplusplus } #endif +#endif /* LWIP_IPV4 && LWIP_ARP */ #endif /* LWIP_ARP || LWIP_ETHERNET */ #endif /* LWIP_HDR_NETIF_ETHARP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ethip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ethip6.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ethip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ethip6.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/icmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/icmp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/icmp6.h similarity index 91% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/icmp6.h index a29dc8c..0ccb789 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/icmp6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/icmp6.h @@ -57,7 +57,9 @@ void icmp6_input(struct pbuf *p, struct netif *inp); void icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c); void icmp6_packet_too_big(struct pbuf *p, u32_t mtu); void icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c); -void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer); +void icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, + const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr); +void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer); #endif /* LWIP_ICMP6 && LWIP_IPV6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/if_api.h similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/if_api.h index fb93ea0..b7269e2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/if_api.h @@ -1,10 +1,12 @@ /** * @file - * 6LowPAN options list + * Interface Identification APIs from: + * RFC 3493: Basic Socket Interface Extensions for IPv6 + * Section 4: Interface Identification */ /* - * Copyright (c) 2015 Inico Technologies Ltd. + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -31,40 +33,38 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Ivan Delamer + * Author: Joel Cunningham * - * - * Please coordinate changes and requests with Ivan Delamer - * */ - -#ifndef LWIP_HDR_LOWPAN6_OPTS_H -#define LWIP_HDR_LOWPAN6_OPTS_H +#ifndef LWIP_HDR_IF_H +#define LWIP_HDR_IF_H #include "lwip/opt.h" -#ifndef LWIP_6LOWPAN -#define LWIP_6LOWPAN 0 +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { #endif -#ifndef LWIP_6LOWPAN_NUM_CONTEXTS -#define LWIP_6LOWPAN_NUM_CONTEXTS 10 +#ifndef IF_NAMESIZE +#define IF_NAMESIZE NETIF_NAMESIZE #endif -#ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS -#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1 +char * lwip_if_indextoname(unsigned int ifindex, char *ifname); +unsigned int lwip_if_nametoindex(const char *ifname); + +#if LWIP_COMPAT_SOCKETS +#define if_indextoname(ifindex, ifname) lwip_if_indextoname(ifindex,ifname) +#define if_nametoindex(ifname) lwip_if_nametoindex(ifname) +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} #endif -#ifndef LWIP_6LOWPAN_IPHC -#define LWIP_6LOWPAN_IPHC 1 -#endif +#endif /* LWIP_SOCKET */ -#ifndef LWIP_6LOWPAN_HW_CRC -#define LWIP_6LOWPAN_HW_CRC 1 -#endif - -#ifndef LOWPAN6_DEBUG -#define LOWPAN6_DEBUG LWIP_DBG_OFF -#endif - -#endif /* LWIP_HDR_LOWPAN6_OPTS_H */ +#endif /* LWIP_HDR_IF_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/igmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/igmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/igmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/igmp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet.h similarity index 91% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet.h index da9db60..2982a0f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet.h @@ -44,12 +44,11 @@ #include "lwip/def.h" #include "lwip/ip_addr.h" #include "lwip/ip6_addr.h" -#include "wm_sockets.h" #ifdef __cplusplus extern "C" { #endif -#if 0 + /* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED to prevent this code from redefining it. */ #if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED) @@ -85,7 +84,7 @@ struct in6_addr { #define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}} /** This variable is initialized by the system to contain the wildcard IPv6 address. */ extern const struct in6_addr in6addr_any; -#endif + /* Definitions of the bits in an (IPv4) Internet address integer. On subnets, host and network parts are found according to @@ -121,7 +120,7 @@ extern const struct in6_addr in6addr_any; #define IN_LOOPBACKNET IP_LOOPBACKNET -#if 0 + #ifndef INET_ADDRSTRLEN #define INET_ADDRSTRLEN IP4ADDR_STRLEN_MAX #endif @@ -130,21 +129,16 @@ extern const struct in6_addr in6addr_any; #define INET6_ADDRSTRLEN IP6ADDR_STRLEN_MAX #endif #endif -#endif #if LWIP_IPV4 #define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr)) #define inet_addr_to_ip4addr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr)) -/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */ -#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr) ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr)) -#if 0 /* directly map this to the lwip internal functions */ #define inet_addr(cp) ipaddr_addr(cp) #define inet_aton(cp, addr) ip4addr_aton(cp, (ip4_addr_t*)addr) #define inet_ntoa(addr) ip4addr_ntoa((const ip4_addr_t*)&(addr)) -#endif #define inet_ntoa_r(addr, buf, buflen) ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen) #endif /* LWIP_IPV4 */ @@ -157,9 +151,8 @@ extern const struct in6_addr in6addr_any; #define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr) {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \ (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \ (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \ - (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];} -/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */ -#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr) ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr)) + (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3]; \ + ip6_addr_clear_zone(target_ip6addr);} /* directly map this to the lwip internal functions */ #define inet6_aton(cp, addr) ip6addr_aton(cp, (ip6_addr_t*)addr) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet_chksum.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet_chksum.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet_chksum.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet_chksum.h index 4e23d7f..76893ef 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/inet_chksum.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/inet_chksum.h @@ -49,7 +49,7 @@ /** Split an u32_t in two u16_ts and add them up */ #ifndef FOLD_U32T -#define FOLD_U32T(u) (((u) >> 16) + ((u) & 0x0000ffffUL)) +#define FOLD_U32T(u) ((u32_t)(((u) >> 16) + ((u) & 0x0000ffffUL))) #endif #if LWIP_CHECKSUM_ON_COPY diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/init.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h similarity index 93% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/init.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h index 3c234cb..6cabfc8 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/init.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h @@ -52,7 +52,7 @@ extern "C" { /** X.x.x: Major version of the stack */ #define LWIP_VERSION_MAJOR 2 /** x.X.x: Minor version of the stack */ -#define LWIP_VERSION_MINOR 0 +#define LWIP_VERSION_MINOR 1 /** x.x.X: Revision of the stack */ #define LWIP_VERSION_REVISION 3 /** For release candidates, this is set to 1..254 @@ -81,8 +81,8 @@ extern "C" { #endif /** Provides the version of the stack */ -#define LWIP_VERSION (((u32_t)LWIP_VERSION_MAJOR) << 24 | ((u32_t)LWIP_VERSION_MINOR) << 16 | \ - ((u32_t)LWIP_VERSION_REVISION) << 8 | ((u32_t)LWIP_VERSION_RC)) +#define LWIP_VERSION ((LWIP_VERSION_MAJOR) << 24 | (LWIP_VERSION_MINOR) << 16 | \ + (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC)) /** Provides the version of the stack as string */ #define LWIP_VERSION_STRING LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h.cmake.in b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h.cmake.in new file mode 100644 index 0000000..9b609b7 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/init.h.cmake.in @@ -0,0 +1,100 @@ +/** + * @file + * lwIP initialization API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_INIT_H +#define LWIP_HDR_INIT_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup lwip_version Version + * @ingroup lwip + * @{ + */ + +/** X.x.x: Major version of the stack */ +#define LWIP_VERSION_MAJOR ${LWIP_VERSION_MAJOR} +/** x.X.x: Minor version of the stack */ +#define LWIP_VERSION_MINOR ${LWIP_VERSION_MINOR} +/** x.x.X: Revision of the stack */ +#define LWIP_VERSION_REVISION ${LWIP_VERSION_REVISION} +/** For release candidates, this is set to 1..254 + * For official releases, this is set to 255 (LWIP_RC_RELEASE) + * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */ +#define LWIP_VERSION_RC ${LWIP_VERSION_RC} + +/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ +#define LWIP_RC_RELEASE 255 +/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */ +#define LWIP_RC_DEVELOPMENT 0 + +#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) +#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) +#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) + +/* Some helper defines to get a version string */ +#define LWIP_VERSTR2(x) #x +#define LWIP_VERSTR(x) LWIP_VERSTR2(x) +#if LWIP_VERSION_IS_RELEASE +#define LWIP_VERSION_STRING_SUFFIX "" +#elif LWIP_VERSION_IS_DEVELOPMENT +#define LWIP_VERSION_STRING_SUFFIX "d" +#else +#define LWIP_VERSION_STRING_SUFFIX "rc" LWIP_VERSTR(LWIP_VERSION_RC) +#endif + +/** Provides the version of the stack */ +#define LWIP_VERSION ((LWIP_VERSION_MAJOR) << 24 | (LWIP_VERSION_MINOR) << 16 | \ + (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC)) +/** Provides the version of the stack as string */ +#define LWIP_VERSION_STRING LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX + +/** + * @} + */ + +/* Modules initialization */ +void lwip_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_INIT_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip.h similarity index 84% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip.h index 2d90dea..653c3b2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip.h @@ -39,7 +39,6 @@ #include "lwip/opt.h" -#include "wm_sockets.h" #include "lwip/def.h" #include "lwip/pbuf.h" #include "lwip/ip_addr.h" @@ -64,31 +63,33 @@ extern "C" { #define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p) LWIP_ASSERT("p->ref == 1", (p)->ref == 1) #endif -#if LWIP_NETIF_HWADDRHINT -#define IP_PCB_ADDRHINT ;u8_t addr_hint -#else -#define IP_PCB_ADDRHINT -#endif /* LWIP_NETIF_HWADDRHINT */ +#if LWIP_NETIF_USE_HINTS +#define IP_PCB_NETIFHINT ;struct netif_hint netif_hints +#else /* LWIP_NETIF_USE_HINTS */ +#define IP_PCB_NETIFHINT +#endif /* LWIP_NETIF_USE_HINTS */ /** This is the common part of all PCB types. It needs to be at the beginning of a PCB type definition. It is located here so that changes to this common part are made in one location instead of having to change all PCB structs. */ -#define IP_PCB \ +#define IP_PCB \ /* ip addresses in network byte order */ \ - ip_addr_t local_ip; \ - ip_addr_t remote_ip; \ - /* Socket options */ \ - u8_t so_options; \ - /* Type Of Service */ \ - u8_t tos; \ - /* Time To Live */ \ - u8_t ttl \ + ip_addr_t local_ip; \ + ip_addr_t remote_ip; \ + /* Bound netif index */ \ + u8_t netif_idx; \ + /* Socket options */ \ + u8_t so_options; \ + /* Type Of Service */ \ + u8_t tos; \ + /* Time To Live */ \ + u8_t ttl \ /* link layer address resolution hint */ \ - IP_PCB_ADDRHINT + IP_PCB_NETIFHINT struct ip_pcb { -/* Common members of all PCB types */ + /* Common members of all PCB types */ IP_PCB; }; @@ -111,7 +112,7 @@ struct ip_globals struct netif *current_input_netif; #if LWIP_IPV4 /** Header of the input packet currently being processed. */ - struct ip_hdr *current_ip4_header; + const struct ip_hdr *current_ip4_header; #endif /* LWIP_IPV4 */ #if LWIP_IPV6 /** Header of the input IPv6 packet currently being processed. */ @@ -147,7 +148,7 @@ extern struct ip_globals ip_data; /** Get the IPv4 header of the current packet. * This function must only be called from a receive callback (udp_recv, * raw_recv, tcp_accept). It will return NULL otherwise. */ -#define ip4_current_header() ((const struct ip_hdr*)(ip_data.current_ip4_header)) +#define ip4_current_header() ip_data.current_ip4_header /** Get the IPv6 header of the current packet. * This function must only be called from a receive callback (udp_recv, * raw_recv, tcp_accept). It will return NULL otherwise. */ @@ -176,7 +177,7 @@ extern struct ip_globals ip_data; /** Get the IPv4 header of the current packet. * This function must only be called from a receive callback (udp_recv, * raw_recv, tcp_accept). It will return NULL otherwise. */ -#define ip4_current_header() ((const struct ip_hdr*)(ip_data.current_ip4_header)) +#define ip4_current_header() ip_data.current_ip4_header /** Always returns FALSE when only supporting IPv4 only */ #define ip_current_is_v6() 0 /** Get the transport layer protocol */ @@ -199,7 +200,7 @@ extern struct ip_globals ip_data; /** Get the transport layer protocol */ #define ip_current_header_proto() IP6H_NEXTH(ip6_current_header()) /** Get the transport layer header */ -#define ip_next_header_ptr() ((const void*)((const u8_t*)ip6_current_header())) +#define ip_next_header_ptr() ((const void*)(((const u8_t*)ip6_current_header()) + ip_current_header_tot_len())) /** Source IP6 address of current_header */ #define ip6_current_src_addr() (&ip_data.current_iphdr_src) /** Destination IP6 address of current_header */ @@ -215,9 +216,10 @@ extern struct ip_globals ip_data; /** Gets an IP pcb option (SOF_* flags) */ #define ip_get_option(pcb, opt) ((pcb)->so_options & (opt)) /** Sets an IP pcb option (SOF_* flags) */ -#define ip_set_option(pcb, opt) ((pcb)->so_options |= (opt)) +#define ip_set_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options | (opt))) /** Resets an IP pcb option (SOF_* flags) */ -#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt)) +#define ip_reset_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options & ~(opt))) + #if LWIP_IPV4 && LWIP_IPV6 /** * @ingroup ip @@ -243,11 +245,16 @@ extern struct ip_globals ip_data; (IP_IS_V6(dest) ? \ ip6_output_if_src(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \ ip4_output_if_src(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif)) -/** Output IP packet with addr_hint */ -#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \ +/** Output IP packet that already includes an IP header. */ +#define ip_output_if_hdrincl(p, src, dest, netif) \ (IP_IS_V6(dest) ? \ - ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, addr_hint) : \ - ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, addr_hint)) + ip6_output_if(p, ip_2_ip6(src), LWIP_IP_HDRINCL, 0, 0, 0, netif) : \ + ip4_output_if(p, ip_2_ip4(src), LWIP_IP_HDRINCL, 0, 0, 0, netif)) +/** Output IP packet with netif_hint */ +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + (IP_IS_V6(dest) ? \ + ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif_hint) : \ + ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif_hint)) /** * @ingroup ip * Get netif for address combination. See \ref ip6_route and \ref ip4_route @@ -255,7 +262,7 @@ extern struct ip_globals ip_data; #define ip_route(src, dest) \ (IP_IS_V6(dest) ? \ ip6_route(ip_2_ip6(src), ip_2_ip6(dest)) : \ - ip4_route_src(ip_2_ip4(dest), ip_2_ip4(src))) + ip4_route_src(ip_2_ip4(src), ip_2_ip4(dest))) /** * @ingroup ip * Get netif for IP. @@ -275,10 +282,12 @@ err_t ip_input(struct pbuf *p, struct netif *inp); ip4_output_if(p, src, dest, ttl, tos, proto, netif) #define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \ ip4_output_if_src(p, src, dest, ttl, tos, proto, netif) -#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \ - ip4_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + ip4_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) +#define ip_output_if_hdrincl(p, src, dest, netif) \ + ip4_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif) #define ip_route(src, dest) \ - ip4_route_src(dest, src) + ip4_route_src(src, dest) #define ip_netif_get_local_ip(netif, dest) \ ip4_netif_get_local_ip(netif) #define ip_debug_print(is_ipv6, p) ip4_debug_print(p) @@ -293,8 +302,10 @@ err_t ip_input(struct pbuf *p, struct netif *inp); ip6_output_if(p, src, dest, ttl, tos, proto, netif) #define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \ ip6_output_if_src(p, src, dest, ttl, tos, proto, netif) -#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \ - ip6_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + ip6_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) +#define ip_output_if_hdrincl(p, src, dest, netif) \ + ip6_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif) #define ip_route(src, dest) \ ip6_route(src, dest) #define ip_netif_get_local_ip(netif, dest) \ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4.h similarity index 93% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4.h index 48246ec..fd35a33 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4.h @@ -64,9 +64,9 @@ extern "C" { #define ip_init() /* Compatibility define, no init needed. */ struct netif *ip4_route(const ip4_addr_t *dest); #if LWIP_IPV4_SRC_ROUTING -struct netif *ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src); +struct netif *ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest); #else /* LWIP_IPV4_SRC_ROUTING */ -#define ip4_route_src(dest, src) ip4_route(dest) +#define ip4_route_src(src, dest) ip4_route(dest) #endif /* LWIP_IPV4_SRC_ROUTING */ err_t ip4_input(struct pbuf *p, struct netif *inp); err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, @@ -75,10 +75,10 @@ err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *des u8_t ttl, u8_t tos, u8_t proto, struct netif *netif); err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif); -#if LWIP_NETIF_HWADDRHINT +#if LWIP_NETIF_USE_HINTS err_t ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint); -#endif /* LWIP_NETIF_HWADDRHINT */ + u8_t ttl, u8_t tos, u8_t proto, struct netif_hint *netif_hint); +#endif /* LWIP_NETIF_USE_HINTS */ #if IP_OPTIONS_SEND err_t ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4_addr.h similarity index 86% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4_addr.h index e1091ea..f244c4f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_addr.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4_addr.h @@ -45,7 +45,7 @@ #ifdef __cplusplus extern "C" { #endif -#if 0 + /** This is the aligned version of ip4_addr_t, used as local variable, on the stack, etc. */ struct ip4_addr { @@ -55,26 +55,10 @@ struct ip4_addr { /** ip4_addr_t uses a struct for convenience only, so that the same defines can * operate both on ip4_addr_t as well as on ip4_addr_p_t. */ typedef struct ip4_addr ip4_addr_t; -#endif -/** - * struct ipaddr2 is used in the definition of the ARP packet format in - * order to support compilers that don't have structure packing. - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip4_addr2 { - PACK_STRUCT_FIELD(u16_t addrw[2]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif /* Forward declaration to not include netif.h */ struct netif; -#if 0 + /** 255.255.255.255 */ #define IPADDR_NONE ((u32_t)0xffffffffUL) /** 127.0.0.1 */ @@ -83,7 +67,7 @@ struct netif; #define IPADDR_ANY ((u32_t)0x00000000UL) /** 255.255.255.255 */ #define IPADDR_BROADCAST ((u32_t)0xffffffffUL) -#endif + /* Definitions of the bits in an Internet address integer. On subnets, host and network parts are found according to @@ -115,17 +99,10 @@ struct netif; #define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) #define IP_LOOPBACKNET 127 /* official! */ -#if 0 + /** Set an IP address given by the four byte-parts */ #define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) -/** MEMCPY-like copying of IP addresses where addresses are known to be - * 16-bit-aligned if the port is correctly configured (so a port could define - * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ -#ifndef IPADDR2_COPY -#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) -#endif - /** Copy IP address - faster than ip4_addr_set: no NULL check */ #define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) /** Safely copy one IP address to another (src may be NULL) */ @@ -169,10 +146,10 @@ struct netif; #define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY) #define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1))) -#endif + #define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif) u8_t ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif); -#if 0 + #define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) u8_t ip4_addr_netmask_valid(u32_t netmask); @@ -190,22 +167,34 @@ u8_t ip4_addr_netmask_valid(u32_t netmask); (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0)) #define ip4_addr_debug_print_val(debug, ipaddr) \ ip4_addr_debug_print_parts(debug, \ - ip4_addr1_16(&(ipaddr)), \ - ip4_addr2_16(&(ipaddr)), \ - ip4_addr3_16(&(ipaddr)), \ - ip4_addr4_16(&(ipaddr))) + ip4_addr1_16_val(ipaddr), \ + ip4_addr2_16_val(ipaddr), \ + ip4_addr3_16_val(ipaddr), \ + ip4_addr4_16_val(ipaddr)) /* Get one byte from the 4-byte address */ -#define ip4_addr1(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[0]) -#define ip4_addr2(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[1]) -#define ip4_addr3(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[2]) -#define ip4_addr4(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[3]) +#define ip4_addr_get_byte(ipaddr, idx) (((const u8_t*)(&(ipaddr)->addr))[idx]) +#define ip4_addr1(ipaddr) ip4_addr_get_byte(ipaddr, 0) +#define ip4_addr2(ipaddr) ip4_addr_get_byte(ipaddr, 1) +#define ip4_addr3(ipaddr) ip4_addr_get_byte(ipaddr, 2) +#define ip4_addr4(ipaddr) ip4_addr_get_byte(ipaddr, 3) +/* Get one byte from the 4-byte address, but argument is 'ip4_addr_t', + * not a pointer */ +#define ip4_addr_get_byte_val(ipaddr, idx) ((u8_t)(((ipaddr).addr >> (idx * 8)) & 0xff)) +#define ip4_addr1_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 0) +#define ip4_addr2_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 1) +#define ip4_addr3_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 2) +#define ip4_addr4_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 3) /* These are cast to u16_t, with the intent that they are often arguments * to printf using the U16_F format from cc.h. */ #define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) #define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) #define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) #define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) +#define ip4_addr1_16_val(ipaddr) ((u16_t)ip4_addr1_val(ipaddr)) +#define ip4_addr2_16_val(ipaddr) ((u16_t)ip4_addr2_val(ipaddr)) +#define ip4_addr3_16_val(ipaddr) ((u16_t)ip4_addr3_val(ipaddr)) +#define ip4_addr4_16_val(ipaddr) ((u16_t)ip4_addr4_val(ipaddr)) #define IP4ADDR_STRLEN_MAX 16 @@ -218,10 +207,10 @@ int ip4addr_aton(const char *cp, ip4_addr_t *addr); char *ip4addr_ntoa(const ip4_addr_t *addr); char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); -#endif #ifdef __cplusplus } #endif + #endif /* LWIP_IPV4 */ #endif /* LWIP_HDR_IP_ADDR_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4_frag.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip4_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip4_frag.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6.h similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6.h index 099b94f..f894e06 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6.h @@ -66,10 +66,10 @@ err_t ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_add u8_t hl, u8_t tc, u8_t nexth, struct netif *netif); err_t ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, u8_t hl, u8_t tc, u8_t nexth, struct netif *netif); -#if LWIP_NETIF_HWADDRHINT +#if LWIP_NETIF_USE_HINTS err_t ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, - u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint); -#endif /* LWIP_NETIF_HWADDRHINT */ + u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint); +#endif /* LWIP_NETIF_USE_HINTS */ #if LWIP_IPV6_MLD err_t ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value); #endif /* LWIP_IPV6_MLD */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_addr.h similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_addr.h index 7d8c339..29c2a34 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_addr.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_addr.h @@ -47,16 +47,20 @@ #if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ +#include "lwip/ip6_zone.h" #ifdef __cplusplus extern "C" { #endif -#if 0 + /** This is the aligned version of ip6_addr_t, used as local variable, on the stack, etc. */ struct ip6_addr { u32_t addr[4]; +#if LWIP_IPV6_SCOPES + u8_t zone; +#endif /* LWIP_IPV6_SCOPES */ }; /** IPv6 address */ @@ -72,7 +76,8 @@ typedef struct ip6_addr ip6_addr_t; (ip6addr)->addr[0] = idx0; \ (ip6addr)->addr[1] = idx1; \ (ip6addr)->addr[2] = idx2; \ - (ip6addr)->addr[3] = idx3; } while(0) + (ip6addr)->addr[3] = idx3; \ + ip6_addr_clear_zone(ip6addr); } while(0) /** Access address in 16-bit block */ #define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff)) @@ -95,18 +100,34 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ (dest).addr[1] = (src).addr[1]; \ (dest).addr[2] = (src).addr[2]; \ - (dest).addr[3] = (src).addr[3];}while(0) + (dest).addr[3] = (src).addr[3]; \ + ip6_addr_copy_zone((dest), (src)); }while(0) /** Safely copy one IPv6 address to another (src may be NULL) */ #define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \ (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \ (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \ - (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0) + (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \ + ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src)); }while(0) + +/** Copy packed IPv6 address to unpacked IPv6 address; zone is not set */ +#define ip6_addr_copy_from_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3]; \ + ip6_addr_clear_zone(&dest); }while(0) + +/** Copy unpacked IPv6 address to packed IPv6 address; zone is lost */ +#define ip6_addr_copy_to_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3]; }while(0) /** Set complete address to zero */ #define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \ (ip6addr)->addr[1] = 0; \ (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = 0;}while(0) + (ip6addr)->addr[3] = 0; \ + ip6_addr_clear_zone(ip6addr);}while(0) /** Set address to ipv6 'any' (no need for lwip_htonl()) */ #define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr) @@ -114,29 +135,57 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \ (ip6addr)->addr[1] = 0; \ (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) + (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \ + ip6_addr_clear_zone(ip6addr);}while(0) /** Safely copy one IPv6 address to another and change byte order * from host- to network-order. */ #define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \ (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \ (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \ - (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0) + (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \ + ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src));}while(0) +/** Compare IPv6 networks, ignoring zone information. To be used sparingly! */ +#define ip6_addr_netcmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] == (addr2)->addr[1])) + /** * Determine if two IPv6 address are on the same network. * - * @arg addr1 IPv6 address 1 - * @arg addr2 IPv6 address 2 - * @return !0 if the network identifiers of both address match + * @param addr1 IPv6 address 1 + * @param addr2 IPv6 address 2 + * @return 1 if the network identifiers of both address match, 0 if not */ -#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ - ((addr1)->addr[1] == (addr2)->addr[1])) +#define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \ + ip6_addr_cmp_zone((addr1), (addr2))) -#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ +/* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */ +#define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \ + ((addr1)->addr[3] == (addr2)->addr[3])) + +/** Compare IPv6 addresses, ignoring zone information. To be used sparingly! */ +#define ip6_addr_cmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ ((addr1)->addr[1] == (addr2)->addr[1]) && \ ((addr1)->addr[2] == (addr2)->addr[2]) && \ ((addr1)->addr[3] == (addr2)->addr[3])) +/** + * Determine if two IPv6 addresses are the same. In particular, the address + * part of both must be the same, and the zone must be compatible. + * + * @param addr1 IPv6 address 1 + * @param addr2 IPv6 address 2 + * @return 1 if the addresses are considered equal, 0 if not + */ +#define ip6_addr_cmp(addr1, addr2) (ip6_addr_cmp_zoneless((addr1), (addr2)) && \ + ip6_addr_cmp_zone((addr1), (addr2))) + +/** Compare IPv6 address to packed address and zone */ +#define ip6_addr_cmp_packed(ip6addr, paddr, zone_idx) (((ip6addr)->addr[0] == (paddr)->addr[0]) && \ + ((ip6addr)->addr[1] == (paddr)->addr[1]) && \ + ((ip6addr)->addr[2] == (paddr)->addr[2]) && \ + ((ip6addr)->addr[3] == (paddr)->addr[3]) && \ + ip6_addr_equals_zone((ip6addr), (zone_idx))) #define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL) @@ -183,7 +232,13 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL)) #define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL)) -/* @todo define get/set for well-know multicast addresses, e.g. ff02::1 */ +/* Scoping note: while interface-local and link-local multicast addresses do + * have a scope (i.e., they are meaningful only in the context of a particular + * interface), the following functions are not assigning or comparing zone + * indices. The reason for this is backward compatibility. Any call site that + * produces a non-global multicast address must assign a multicast address as + * appropriate itself. */ + #define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \ ((ip6addr)->addr[1] == 0UL) && \ ((ip6addr)->addr[2] == 0UL) && \ @@ -196,7 +251,8 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ (ip6addr)->addr[1] = 0; \ (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) + (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \ + ip6_addr_clear_zone(ip6addr); }while(0) #define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ ((ip6addr)->addr[1] == 0UL) && \ @@ -205,7 +261,8 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ (ip6addr)->addr[1] = 0; \ (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0) + (ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \ + ip6_addr_clear_zone(ip6addr); }while(0) #define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ @@ -214,7 +271,8 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ (ip6addr)->addr[1] = 0; \ (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \ - (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0) + (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \ + ip6_addr_clear_zone(ip6addr); }while(0) #define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ ((ip6addr)->addr[1] == 0) && \ @@ -234,6 +292,7 @@ typedef struct ip6_addr ip6_addr_t; #define IP6_ADDR_VALID 0x10 /* This bit marks an address as valid (preferred or deprecated) */ #define IP6_ADDR_PREFERRED 0x30 #define IP6_ADDR_DEPRECATED 0x10 /* Same as VALID (valid but not preferred) */ +#define IP6_ADDR_DUPLICATED 0x40 /* Failed DAD test, not valid */ #define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */ @@ -242,6 +301,14 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */ #define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED) #define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED) +#define ip6_addr_isduplicated(addr_state) (addr_state == IP6_ADDR_DUPLICATED) + +#if LWIP_IPV6_ADDRESS_LIFETIMES +#define IP6_ADDR_LIFE_STATIC (0) +#define IP6_ADDR_LIFE_INFINITE (0xffffffffUL) +#define ip6_addr_life_isstatic(addr_life) ((addr_life) == IP6_ADDR_LIFE_STATIC) +#define ip6_addr_life_isinfinite(addr_life) ((addr_life) == IP6_ADDR_LIFE_INFINITE) +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ #define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \ LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \ @@ -274,7 +341,7 @@ int ip6addr_aton(const char *cp, ip6_addr_t *addr); char *ip6addr_ntoa(const ip6_addr_t *addr); char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen); -#endif + #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_frag.h similarity index 62% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_frag.h index 6be2747..87e0e86 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip6_frag.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_frag.h @@ -54,24 +54,34 @@ extern "C" { #if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */ -/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, this needs to - * be enabled (to not overwrite part of the data). When enabled, the IPv6 header - * is copied instead of referencing it, which gives more room for struct ip6_reass_helper */ +/** The IPv6 reassembly timer interval in milliseconds. */ +#define IP6_REASS_TMR_INTERVAL 1000 + +/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, "struct + * ip6_reass_helper" is too large to be stored in the IPv6 fragment header, and + * will bleed into the header before it, which may be the IPv6 header or an + * extension header. This means that for each first fragment packet, we need to + * 1) make a copy of some IPv6 header fields (src+dest) that we need later on, + * just in case we do overwrite part of the IPv6 header, and 2) make a copy of + * the header data that we overwrote, so that we can restore it before either + * completing reassembly or sending an ICMPv6 reply. The last part is true even + * if this setting is disabled, but if it is enabled, we need to save a bit + * more data (up to the size of a pointer) because we overwrite more. */ #ifndef IPV6_FRAG_COPYHEADER #define IPV6_FRAG_COPYHEADER 0 #endif -/** The IPv6 reassembly timer interval in milliseconds. */ -#define IP6_REASS_TMR_INTERVAL 1000 - -/* Copy the complete header of the first fragment to struct ip6_reassdata - or just point to its original location in the first pbuf? */ +/* With IPV6_FRAG_COPYHEADER==1, a helper structure may (or, depending on the + * presence of extensions, may not) overwrite part of the IP header. Therefore, + * we copy the fields that we need from the IP header for as long as the helper + * structure may still be in place. This is easier than temporarily restoring + * those fields in the IP header each time we need to perform checks on them. */ #if IPV6_FRAG_COPYHEADER -#define IPV6_FRAG_HDRPTR -#define IPV6_FRAG_HDRREF(hdr) (&(hdr)) +#define IPV6_FRAG_SRC(ipr) ((ipr)->src) +#define IPV6_FRAG_DEST(ipr) ((ipr)->dest) #else /* IPV6_FRAG_COPYHEADER */ -#define IPV6_FRAG_HDRPTR * -#define IPV6_FRAG_HDRREF(hdr) (hdr) +#define IPV6_FRAG_SRC(ipr) ((ipr)->iphdr->src) +#define IPV6_FRAG_DEST(ipr) ((ipr)->iphdr->dest) #endif /* IPV6_FRAG_COPYHEADER */ /** IPv6 reassembly helper struct. @@ -80,11 +90,25 @@ extern "C" { struct ip6_reassdata { struct ip6_reassdata *next; struct pbuf *p; - struct ip6_hdr IPV6_FRAG_HDRPTR iphdr; + struct ip6_hdr *iphdr; /* pointer to the first (original) IPv6 header */ +#if IPV6_FRAG_COPYHEADER + ip6_addr_p_t src; /* copy of the source address in the IP header */ + ip6_addr_p_t dest; /* copy of the destination address in the IP header */ + /* This buffer (for the part of the original header that we overwrite) will + * be slightly oversized, but we cannot compute the exact size from here. */ + u8_t orig_hdr[sizeof(struct ip6_frag_hdr) + sizeof(void*)]; +#else /* IPV6_FRAG_COPYHEADER */ + /* In this case we still need the buffer, for sending ICMPv6 replies. */ + u8_t orig_hdr[sizeof(struct ip6_frag_hdr)]; +#endif /* IPV6_FRAG_COPYHEADER */ u32_t identification; u16_t datagram_len; u8_t nexth; u8_t timer; +#if LWIP_IPV6_SCOPES + u8_t src_zone; /* zone of original packet's source address */ + u8_t dest_zone; /* zone of original packet's destination address */ +#endif /* LWIP_IPV6_SCOPES */ }; #define ip6_reass_init() /* Compatibility define */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_zone.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_zone.h new file mode 100644 index 0000000..525790e --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip6_zone.h @@ -0,0 +1,304 @@ +/** + * @file + * + * IPv6 address scopes, zones, and scoping policy. + * + * This header provides the means to implement support for IPv6 address scopes, + * as per RFC 4007. An address scope can be either global or more constrained. + * In lwIP, we say that an address "has a scope" or "is scoped" when its scope + * is constrained, in which case the address is meaningful only in a specific + * "zone." For unicast addresses, only link-local addresses have a scope; in + * that case, the scope is the link. For multicast addresses, there are various + * scopes defined by RFC 4007 and others. For any constrained scope, a system + * must establish a (potentially one-to-many) mapping between zones and local + * interfaces. For example, a link-local address is valid on only one link (its + * zone). That link may be attached to one or more local interfaces. The + * decisions on which scopes are constrained and the mapping between zones and + * interfaces is together what we refer to as the "scoping policy" - more on + * this in a bit. + * + * In lwIP, each IPv6 address has an associated zone index. This zone index may + * be set to "no zone" (IP6_NO_ZONE, 0) or an actual zone. We say that an + * address "has a zone" or "is zoned" when its zone index is *not* set to "no + * zone." In lwIP, in principle, each address should be "properly zoned," which + * means that if the address has a zone if and only if has a scope. As such, it + * is a rule that an unscoped (e.g., global) address must never have a zone. + * Even though one could argue that there is always one zone even for global + * scopes, this rule exists for implementation simplicity. Violation of the + * rule will trigger assertions or otherwise result in undesired behavior. + * + * Backward compatibility prevents us from requiring that applications always + * provide properly zoned addresses. We do enforce the rule that the in the + * lwIP link layer (everything below netif->output_ip6() and in particular ND6) + * *all* addresses are properly zoned. Thus, on the output paths down the + * stack, various places deal with the case of addresses that lack a zone. + * Some of them are best-effort for efficiency (e.g. the PCB bind and connect + * API calls' attempts to add missing zones); ultimately the IPv6 output + * handler (@ref ip6_output_if_src) will set a zone if necessary. + * + * Aside from dealing with scoped addresses lacking a zone, a proper IPv6 + * implementation must also ensure that a packet with a scoped source and/or + * destination address does not leave its zone. This is currently implemented + * in the input and forward functions. However, for output, these checks are + * deliberately omitted in order to keep the implementation lightweight. The + * routing algorithm in @ref ip6_route will take decisions such that it will + * not cause zone violations unless the application sets bad addresses, though. + * + * In terms of scoping policy, lwIP implements the default policy from RFC 4007 + * using macros in this file. This policy considers link-local unicast + * addresses and (only) interface-local and link-local multicast addresses as + * having a scope. For all these addresses, the zone is equal to the interface. + * As shown below in this file, it is possible to implement a custom policy. + */ + +/* + * Copyright (c) 2017 The MINIX 3 Project. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: David van Moolenbroek + * + */ +#ifndef LWIP_HDR_IP6_ZONE_H +#define LWIP_HDR_IP6_ZONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ip6_zones IPv6 Zones + * @ingroup ip6 + * @{ + */ + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +/** Identifier for "no zone". */ +#define IP6_NO_ZONE 0 + +#if LWIP_IPV6_SCOPES + +/** Zone initializer for static IPv6 address initialization, including comma. */ +#define IPADDR6_ZONE_INIT , IP6_NO_ZONE + +/** Return the zone index of the given IPv6 address; possibly "no zone". */ +#define ip6_addr_zone(ip6addr) ((ip6addr)->zone) + +/** Does the given IPv6 address have a zone set? (0/1) */ +#define ip6_addr_has_zone(ip6addr) (ip6_addr_zone(ip6addr) != IP6_NO_ZONE) + +/** Set the zone field of an IPv6 address to a particular value. */ +#define ip6_addr_set_zone(ip6addr, zone_idx) ((ip6addr)->zone = (zone_idx)) + +/** Clear the zone field of an IPv6 address, setting it to "no zone". */ +#define ip6_addr_clear_zone(ip6addr) ((ip6addr)->zone = IP6_NO_ZONE) + +/** Copy the zone field from the second IPv6 address to the first one. */ +#define ip6_addr_copy_zone(ip6addr1, ip6addr2) ((ip6addr1).zone = (ip6addr2).zone) + +/** Is the zone field of the given IPv6 address equal to the given zone index? (0/1) */ +#define ip6_addr_equals_zone(ip6addr, zone_idx) ((ip6addr)->zone == (zone_idx)) + +/** Are the zone fields of the given IPv6 addresses equal? (0/1) + * This macro must only be used on IPv6 addresses of the same scope. */ +#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) ((ip6addr1)->zone == (ip6addr2)->zone) + +/** Symbolic constants for the 'type' parameters in some of the macros. + * These exist for efficiency only, allowing the macros to avoid certain tests + * when the address is known not to be of a certain type. Dead code elimination + * will do the rest. IP6_MULTICAST is supported but currently not optimized. + * @see ip6_addr_has_scope, ip6_addr_assign_zone, ip6_addr_lacks_zone. + */ +enum lwip_ipv6_scope_type +{ + /** Unknown */ + IP6_UNKNOWN = 0, + /** Unicast */ + IP6_UNICAST = 1, + /** Multicast */ + IP6_MULTICAST = 2 +}; + +/** IPV6_CUSTOM_SCOPES: together, the following three macro definitions, + * @ref ip6_addr_has_scope, @ref ip6_addr_assign_zone, and + * @ref ip6_addr_test_zone, completely define the lwIP scoping policy. + * The definitions below implement the default policy from RFC 4007 Sec. 6. + * Should an implementation desire to implement a different policy, it can + * define IPV6_CUSTOM_SCOPES to 1 and supply its own definitions for the three + * macros instead. + */ +#ifndef IPV6_CUSTOM_SCOPES +#define IPV6_CUSTOM_SCOPES 0 +#endif /* !IPV6_CUSTOM_SCOPES */ + +#if !IPV6_CUSTOM_SCOPES + +/** + * Determine whether an IPv6 address has a constrained scope, and as such is + * meaningful only if accompanied by a zone index to identify the scope's zone. + * The given address type may be used to eliminate at compile time certain + * checks that will evaluate to false at run time anyway. + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined. + * + * Even though the unicast loopback address does have an implied link-local + * scope, in this implementation it does not have an explicitly assigned zone + * index. As such it should not be tested for in this macro. + * + * @param ip6addr the IPv6 address (const); only its address part is examined. + * @param type address type; see @ref lwip_ipv6_scope_type. + * @return 1 if the address has a constrained scope, 0 if it does not. + */ +#define ip6_addr_has_scope(ip6addr, type) \ + (ip6_addr_islinklocal(ip6addr) || (((type) != IP6_UNICAST) && \ + (ip6_addr_ismulticast_iflocal(ip6addr) || \ + ip6_addr_ismulticast_linklocal(ip6addr)))) + +/** + * Assign a zone index to an IPv6 address, based on a network interface. If the + * given address has a scope, the assigned zone index is that scope's zone of + * the given netif; otherwise, the assigned zone index is "no zone". + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined, and the zone index + * of both of those scopes always equals the index of the network interface. + * As such, this default implementation need not distinguish between different + * constrained scopes when assigning the zone. + * + * @param ip6addr the IPv6 address; its address part is examined, and its zone + * index is assigned. + * @param type address type; see @ref lwip_ipv6_scope_type. + * @param netif the network interface (const). + */ +#define ip6_addr_assign_zone(ip6addr, type, netif) \ + (ip6_addr_set_zone((ip6addr), \ + ip6_addr_has_scope((ip6addr), (type)) ? netif_get_index(netif) : 0)) + +/** + * Test whether an IPv6 address is "zone-compatible" with a network interface. + * That is, test whether the network interface is part of the zone associated + * with the address. For efficiency, this macro is only ever called if the + * given address is either scoped or zoned, and thus, it need not test this. + * If an address is scoped but not zoned, or zoned and not scoped, it is + * considered not zone-compatible with any netif. + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined, and the zone index + * of both of those scopes always equals the index of the network interface. + * As such, there is always only one matching netif for a specific zone index, + * but all call sites of this macro currently support multiple matching netifs + * as well (at no additional expense in the common case). + * + * @param ip6addr the IPv6 address (const). + * @param netif the network interface (const). + * @return 1 if the address is scope-compatible with the netif, 0 if not. + */ +#define ip6_addr_test_zone(ip6addr, netif) \ + (ip6_addr_equals_zone((ip6addr), netif_get_index(netif))) + +#endif /* !IPV6_CUSTOM_SCOPES */ + +/** Does the given IPv6 address have a scope, and as such should also have a + * zone to be meaningful, but does not actually have a zone? (0/1) */ +#define ip6_addr_lacks_zone(ip6addr, type) \ + (!ip6_addr_has_zone(ip6addr) && ip6_addr_has_scope((ip6addr), (type))) + +/** + * Try to select a zone for a scoped address that does not yet have a zone. + * Called from PCB bind and connect routines, for two reasons: 1) to save on + * this (relatively expensive) selection for every individual packet route + * operation and 2) to allow the application to obtain the selected zone from + * the PCB as is customary for e.g. getsockname/getpeername BSD socket calls. + * + * Ideally, callers would always supply a properly zoned address, in which case + * this function would not be needed. It exists both for compatibility with the + * BSD socket API (which accepts zoneless destination addresses) and for + * backward compatibility with pre-scoping lwIP code. + * + * It may be impossible to select a zone, e.g. if there are no netifs. In that + * case, the address's zone field will be left as is. + * + * @param dest the IPv6 address for which to select and set a zone. + * @param src source IPv6 address (const); may be equal to dest. + */ +#define ip6_addr_select_zone(dest, src) do { struct netif *selected_netif; \ + selected_netif = ip6_route((src), (dest)); \ + if (selected_netif != NULL) { \ + ip6_addr_assign_zone((dest), IP6_UNKNOWN, selected_netif); \ + } } while (0) + +/** + * @} + */ + +#else /* LWIP_IPV6_SCOPES */ + +#define IPADDR6_ZONE_INIT +#define ip6_addr_zone(ip6addr) (IP6_NO_ZONE) +#define ip6_addr_has_zone(ip6addr) (0) +#define ip6_addr_set_zone(ip6addr, zone_idx) +#define ip6_addr_clear_zone(ip6addr) +#define ip6_addr_copy_zone(ip6addr1, ip6addr2) +#define ip6_addr_equals_zone(ip6addr, zone_idx) (1) +#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) (1) +#define IPV6_CUSTOM_SCOPES 0 +#define ip6_addr_has_scope(ip6addr, type) (0) +#define ip6_addr_assign_zone(ip6addr, type, netif) +#define ip6_addr_test_zone(ip6addr, netif) (1) +#define ip6_addr_lacks_zone(ip6addr, type) (0) +#define ip6_addr_select_zone(ip6addr, src) + +#endif /* LWIP_IPV6_SCOPES */ + +#if LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG + +/** Verify that the given IPv6 address is properly zoned. */ +#define IP6_ADDR_ZONECHECK(ip6addr) LWIP_ASSERT("IPv6 zone check failed", \ + ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) == ip6_addr_has_zone(ip6addr)) + +/** Verify that the given IPv6 address is properly zoned for the given netif. */ +#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) LWIP_ASSERT("IPv6 netif zone check failed", \ + ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) ? \ + (ip6_addr_has_zone(ip6addr) && \ + (((netif) == NULL) || ip6_addr_test_zone((ip6addr), (netif)))) : \ + !ip6_addr_has_zone(ip6addr)) + +#else /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */ + +#define IP6_ADDR_ZONECHECK(ip6addr) +#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) + +#endif /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */ + +#endif /* LWIP_IPV6 */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_IP6_ZONE_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_addr.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip_addr.h similarity index 82% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_addr.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip_addr.h index 171de0c..2f97770 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_addr.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/ip_addr.h @@ -42,14 +42,11 @@ #include "lwip/ip4_addr.h" #include "lwip/ip6_addr.h" -#include "wm_sockets.h" #ifdef __cplusplus extern "C" { #endif -#if 0 - /** @ingroup ipaddr * IP address types for use in ip_addr_t.type member. * @see tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type(). @@ -62,6 +59,7 @@ enum lwip_ip_addr_type { /** IPv4+IPv6 ("dual-stack") */ IPADDR_TYPE_ANY = 46U }; + #if LWIP_IPV4 && LWIP_IPV6 /** * @ingroup ipaddr @@ -80,18 +78,19 @@ typedef struct ip_addr { extern const ip_addr_t ip_addr_any_type; /** @ingroup ip4addr */ -#define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 } +#define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 } /** @ingroup ip4addr */ #define IPADDR4_INIT_BYTES(a,b,c,d) IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d))) + /** @ingroup ip6addr */ -#define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } } }, IPADDR_TYPE_V6 } +#define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 } /** @ingroup ip6addr */ -#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } }, IPADDR_TYPE_V6 } +#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 } /** @ingroup ipaddr */ #define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY) /** @ingroup ipaddr */ -#define IPADDR_ANY_TYPE_INIT { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY } +#define IPADDR_ANY_TYPE_INIT { { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY } /** @ingroup ip4addr */ #define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4) @@ -106,6 +105,8 @@ extern const ip_addr_t ip_addr_any_type; #define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0) #define IP_GET_TYPE(ipaddr) ((ipaddr)->type) +#define IP_ADDR_RAW_SIZE(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4 ? sizeof(ip4_addr_t) : sizeof(ip6_addr_t)) + #define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr)) #define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) @@ -127,26 +128,37 @@ extern const ip_addr_t ip_addr_any_type; /** @ingroup ip6addr */ #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) +#define ip_clear_no4(ipaddr) do { ip_2_ip6(ipaddr)->addr[1] = \ + ip_2_ip6(ipaddr)->addr[2] = \ + ip_2_ip6(ipaddr)->addr[3] = 0; \ + ip6_addr_clear_zone(ip_2_ip6(ipaddr)); }while(0) + /** @ingroup ipaddr */ #define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \ ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \ - ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0) + ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); ip_clear_no4(&dest); }}while(0) /** @ingroup ip6addr */ #define ip_addr_copy_from_ip6(dest, src) do{ \ ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0) +/** @ingroup ip6addr */ +#define ip_addr_copy_from_ip6_packed(dest, src) do{ \ + ip6_addr_copy_from_packed(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0) /** @ingroup ip4addr */ #define ip_addr_copy_from_ip4(dest, src) do{ \ - ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0) + ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); ip_clear_no4(&dest); }while(0) /** @ingroup ip4addr */ #define ip_addr_set_ip4_u32(ipaddr, val) do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \ - IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) + IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ip4addr */ +#define ip_addr_set_ip4_u32_val(ipaddr, val) do{ ip4_addr_set_u32(ip_2_ip4(&(ipaddr)), val); \ + IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }while(0) /** @ingroup ip4addr */ #define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \ ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0) /** @ingroup ipaddr */ #define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \ ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \ - ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0) + ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); ip_clear_no4(dest); }}while(0) /** @ingroup ipaddr */ #define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src) /** @ingroup ipaddr */ @@ -161,15 +173,23 @@ extern const ip_addr_t ip_addr_any_type; /** @ingroup ipaddr */ #define ip_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \ ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) + ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_any_val(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_any(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_any(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0) /** @ingroup ipaddr */ #define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \ ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0) + ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_loopback_val(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_loopback(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_loopback(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0) /** @ingroup ipaddr */ #define ip_addr_set_hton(dest, src) do{if(IP_IS_V6(src)){ \ - ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \ - ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0) + ip6_addr_set_hton(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_hton(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) /** @ingroup ipaddr */ #define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \ ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \ @@ -183,9 +203,13 @@ extern const ip_addr_t ip_addr_any_type; ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) /** @ingroup ipaddr */ -#define ip_addr_isany(ipaddr) ((IP_IS_V6(ipaddr)) ? \ +#define ip_addr_cmp_zoneless(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \ + ip6_addr_cmp_zoneless(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ + ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) +/** @ingroup ipaddr */ +#define ip_addr_isany(ipaddr) (((ipaddr) == NULL) ? 1 : ((IP_IS_V6(ipaddr)) ? \ ip6_addr_isany(ip_2_ip6(ipaddr)) : \ - ip4_addr_isany(ip_2_ip4(ipaddr))) + ip4_addr_isany(ip_2_ip4(ipaddr)))) /** @ingroup ipaddr */ #define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \ ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \ @@ -212,12 +236,8 @@ extern const ip_addr_t ip_addr_any_type; #define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \ ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \ ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0) -/** @ingroup ipaddr */ -#define ipaddr_ntoa(addr) (((addr) == NULL) ? "NULL" : \ - ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr)))) -/** @ingroup ipaddr */ -#define ipaddr_ntoa_r(addr, buf, buflen) (((addr) == NULL) ? "NULL" : \ - ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen))) +char *ipaddr_ntoa(const ip_addr_t *addr); +char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen); int ipaddr_aton(const char *cp, ip_addr_t *addr); /** @ingroup ipaddr */ @@ -228,7 +248,8 @@ int ipaddr_aton(const char *cp, ip_addr_t *addr); (ip6addr)->addr[3] = (ip4addr)->addr; \ (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \ (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[0] = 0; } while(0); + (ip6addr)->addr[0] = 0; \ + ip6_addr_clear_zone(ip6addr); } while(0); /** @ingroup ipaddr */ #define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \ @@ -238,8 +259,11 @@ int ipaddr_aton(const char *cp, ip_addr_t *addr); #else /* LWIP_IPV4 && LWIP_IPV6 */ -#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1 -#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1 +#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1 +#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1 + +#define ip_addr_set_any_val(is_ipv6, ipaddr) ip_addr_set_any(is_ipv6, &(ipaddr)) +#define ip_addr_set_loopback_val(is_ipv6, ipaddr) ip_addr_set_loopback(is_ipv6, &(ipaddr)) #if LWIP_IPV4 @@ -254,12 +278,14 @@ typedef ip4_addr_t ip_addr_t; #define IP_SET_TYPE_VAL(ipaddr, iptype) #define IP_SET_TYPE(ipaddr, iptype) #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4 +#define IP_ADDR_RAW_SIZE(ipaddr) sizeof(ip4_addr_t) #define ip_2_ip4(ipaddr) (ipaddr) #define IP_ADDR4(ipaddr,a,b,c,d) IP4_ADDR(ipaddr,a,b,c,d) #define ip_addr_copy(dest, src) ip4_addr_copy(dest, src) #define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src) #define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val) +#define ip_addr_set_ip4_u32_val(ipaddr, val) ip_addr_set_ip4_u32(&(ipaddr), val) #define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr)) #define ip_addr_set(dest, src) ip4_addr_set(dest, src) #define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src) @@ -290,8 +316,8 @@ typedef ip4_addr_t ip_addr_t; #else /* LWIP_IPV4 */ typedef ip6_addr_t ip_addr_t; -#define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } } -#define IPADDR6_INIT_HOST(a, b, c, d) { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } +#define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } IPADDR6_ZONE_INIT } +#define IPADDR6_INIT_HOST(a, b, c, d) { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT } #define IP_IS_V4_VAL(ipaddr) 0 #define IP_IS_V6_VAL(ipaddr) 1 #define IP_IS_V4(ipaddr) 0 @@ -300,12 +326,14 @@ typedef ip6_addr_t ip_addr_t; #define IP_SET_TYPE_VAL(ipaddr, iptype) #define IP_SET_TYPE(ipaddr, iptype) #define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6 +#define IP_ADDR_RAW_SIZE(ipaddr) sizeof(ip6_addr_t) #define ip_2_ip6(ipaddr) (ipaddr) #define IP_ADDR6(ipaddr,i0,i1,i2,i3) IP6_ADDR(ipaddr,i0,i1,i2,i3) #define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) #define ip_addr_copy(dest, src) ip6_addr_copy(dest, src) #define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src) +#define ip_addr_copy_from_ip6_packed(dest, src) ip6_addr_copy_from_packed(dest, src) #define ip_addr_set(dest, src) ip6_addr_set(dest, src) #define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src) #define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr) @@ -316,6 +344,7 @@ typedef ip6_addr_t ip_addr_t; #define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target) #define ip_addr_netcmp(addr1, addr2, mask) 0 #define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2) +#define ip_addr_cmp_zoneless(addr1, addr2) ip6_addr_cmp_zoneless(addr1, addr2) #define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr) #define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr) #define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr) @@ -334,7 +363,6 @@ typedef ip6_addr_t ip_addr_t; #endif /* LWIP_IPV4 */ #endif /* LWIP_IPV4 && LWIP_IPV6 */ -#endif #if LWIP_IPV4 diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mem.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/mem.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mem.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/mem.h index e57fcfe..ff208d2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mem.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/mem.h @@ -38,7 +38,6 @@ #define LWIP_HDR_MEM_H #include "lwip/opt.h" -#include "wm_mem.h" #ifdef __cplusplus extern "C" { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/memp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/memp.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/memp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/memp.h index 562cd05..1630b26 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/memp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/memp.h @@ -90,7 +90,7 @@ extern const struct memp_desc* const memp_pools[MEMP_MAX]; * - free: LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem); * * To relocate a pool, declare it as extern in cc.h. Example for GCC: - * extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_my_private_pool[]; + * extern u8_t \_\_attribute\_\_((section(".onchip_mem"))) memp_memory_my_private_pool_base[]; */ #define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \ LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mld6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/mld6.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/mld6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/mld6.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/nd6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/nd6.h similarity index 93% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/nd6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/nd6.h index 15ccea2..c30e624 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/nd6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/nd6.h @@ -50,7 +50,6 @@ #include "lwip/ip6_addr.h" #include "lwip/err.h" -#include "wm_sockets.h" #ifdef __cplusplus extern "C" { @@ -59,6 +58,11 @@ extern "C" { /** 1 second period */ #define ND6_TMR_INTERVAL 1000 +/** Router solicitations are sent in 4 second intervals (see RFC 4861, ch. 6.3.7) */ +#ifndef ND6_RTR_SOLICITATION_INTERVAL +#define ND6_RTR_SOLICITATION_INTERVAL 4000 +#endif + struct pbuf; struct netif; @@ -75,6 +79,7 @@ void nd6_cleanup_netif(struct netif *netif); #if LWIP_IPV6_MLD void nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state); #endif /* LWIP_IPV6_MLD */ +void nd6_restart_netif(struct netif *netif); #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netbuf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netbuf.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netbuf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netbuf.h index e6865f8..42a911b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netbuf.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netbuf.h @@ -62,9 +62,7 @@ struct netbuf { ip_addr_t addr; u16_t port; #if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY -#if LWIP_CHECKSUM_ON_COPY u8_t flags; -#endif /* LWIP_CHECKSUM_ON_COPY */ u16_t toport_chksum; #if LWIP_NETBUF_RECVINFO ip_addr_t toaddr; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netdb.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netdb.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netdb.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netdb.h index 2ccfa72..d3d15df 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netdb.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netdb.h @@ -41,7 +41,6 @@ #include "lwip/arch.h" #include "lwip/inet.h" #include "lwip/sockets.h" -#include "wm_sockets.h" #ifdef __cplusplus extern "C" { @@ -90,7 +89,6 @@ extern "C" { #endif /* LWIP_DNS_API_DEFINE_FLAGS */ #if LWIP_DNS_API_DECLARE_STRUCTS -#if 0 struct hostent { char *h_name; /* Official name of the host. */ char **h_aliases; /* A pointer to an array of pointers to alternative host names, @@ -101,7 +99,6 @@ struct hostent { network byte order) for the host, terminated by a null pointer. */ #define h_addr h_addr_list[0] /* for backward compatibility */ }; -#endif struct addrinfo { int ai_flags; /* Input flags. */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netif.h similarity index 68% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netif.h index f6ed4e3..cb6c164 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netif.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netif.h @@ -69,6 +69,12 @@ extern "C" { #define NETIF_MAX_HWADDR_LEN 6U #endif +/** The size of a fully constructed netif name which the + * netif can be identified by in APIs. Composed of + * 2 chars, 3 (max) digits, and 1 \0 + */ +#define NETIF_NAMESIZE 6 + /** * @defgroup netif_flags Flags * @ingroup netif @@ -115,6 +121,7 @@ extern "C" { enum lwip_internal_netif_client_data_index { +#if LWIP_IPV4 #if LWIP_DHCP LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, #endif @@ -124,9 +131,15 @@ enum lwip_internal_netif_client_data_index #if LWIP_IGMP LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, #endif +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 +#if LWIP_IPV6_DHCP6 + LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, +#endif #if LWIP_IPV6_MLD LWIP_NETIF_CLIENT_DATA_INDEX_MLD6, #endif +#endif /* LWIP_IPV6 */ LWIP_NETIF_CLIENT_DATA_INDEX_MAX }; @@ -167,6 +180,9 @@ typedef err_t (*netif_init_fn)(struct netif *netif); * * @param p The received packet, copied into a pbuf * @param inp The netif which received the packet + * @return ERR_OK if the packet was handled + * != ERR_OK is the packet was NOT handled, in this case, the caller has + * to free the pbuf */ typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp); @@ -220,8 +236,10 @@ typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif, typedef err_t (*netif_tcpipoutput_fn)(struct pbuf *p, struct netif *inp, ip_addr_t ipaddr); #endif -#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0) +#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || LWIP_IPV6_DHCP6 || (LWIP_NUM_NETIF_CLIENT_DATA > 0) +#if LWIP_NUM_NETIF_CLIENT_DATA > 0 u8_t netif_alloc_client_data_id(void); +#endif /** @ingroup netif_cd * Set client data. Obtain ID from netif_alloc_client_data_id(). */ @@ -230,14 +248,33 @@ u8_t netif_alloc_client_data_id(void); * Get client data. Obtain ID from netif_alloc_client_data_id(). */ #define netif_get_client_data(netif, id) (netif)->client_data[(id)] -#endif /* LWIP_DHCP || LWIP_AUTOIP || (LWIP_NUM_NETIF_CLIENT_DATA > 0) */ +#endif + +#if (LWIP_IPV4 && LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) || (LWIP_IPV6 && (LWIP_ND6_NUM_DESTINATIONS > 0x7f)) +typedef u16_t netif_addr_idx_t; +#define NETIF_ADDR_IDX_MAX 0x7FFF +#else +typedef u8_t netif_addr_idx_t; +#define NETIF_ADDR_IDX_MAX 0x7F +#endif + +#if LWIP_NETIF_HWADDRHINT +#define LWIP_NETIF_USE_HINTS 1 +struct netif_hint { + netif_addr_idx_t addr_hint; +}; +#else /* LWIP_NETIF_HWADDRHINT */ +#define LWIP_NETIF_USE_HINTS 0 +#endif /* LWIP_NETIF_HWADDRHINT */ /** Generic data structure used for all lwIP network interfaces. * The following fields should be filled in by the initialization * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ struct netif { +#if !LWIP_SINGLE_NETIF /** pointer to next in linked list */ struct netif *next; +#endif #if LWIP_IPV4 /** IP address configuration in network byte order */ @@ -251,6 +288,13 @@ struct netif { /** The state of each IPv6 address (Tentative, Preferred, etc). * @see ip6_addr.h */ u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES]; +#if LWIP_IPV6_ADDRESS_LIFETIMES + /** Remaining valid and preferred lifetime of each IPv6 address, in seconds. + * For valid lifetimes, the special value of IP6_ADDR_LIFE_STATIC (0) + * indicates the address is static and has no lifetimes. */ + u32_t ip6_addr_valid_life[LWIP_IPV6_NUM_ADDRESSES]; + u32_t ip6_addr_pref_life[LWIP_IPV6_NUM_ADDRESSES]; +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ #endif /* LWIP_IPV6 */ /** This function is called by the network device driver * to pass a packet up the TCP/IP stack. */ @@ -296,14 +340,6 @@ struct netif { #ifdef netif_get_client_data void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA]; #endif -#if LWIP_IPV6_AUTOCONFIG - /** is this netif enabled for IPv6 autoconfiguration */ - u8_t ip6_autoconfig_enabled; -#endif /* LWIP_IPV6_AUTOCONFIG */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - /** Number of Router Solicitation messages that remain to be sent. */ - u8_t rs_count; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ #if LWIP_NETIF_HOSTNAME /* the hostname for this netif, NULL is a valid value */ const char* hostname; @@ -313,16 +349,29 @@ struct netif { #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/ /** maximum transfer unit (in bytes) */ u16_t mtu; - /** number of bytes used in hwaddr */ - u8_t hwaddr_len; +#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES + /** maximum transfer unit (in bytes), updated by RA */ + u16_t mtu6; +#endif /* LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES */ /** link level hardware address of this interface */ u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; + /** number of bytes used in hwaddr */ + u8_t hwaddr_len; /** flags (@see @ref netif_flags) */ u8_t flags; /** descriptive abbreviation */ char name[2]; - /** number of this interface */ + /** number of this interface. Used for @ref if_api and @ref netifapi_netif, + * as well as for IPv6 zones */ u8_t num; +#if LWIP_IPV6_AUTOCONFIG + /** is this netif enabled for IPv6 autoconfiguration */ + u8_t ip6_autoconfig_enabled; +#endif /* LWIP_IPV6_AUTOCONFIG */ +#if LWIP_IPV6_SEND_ROUTER_SOLICIT + /** Number of Router Solicitation messages that remain to be sent. */ + u8_t rs_count; +#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ #if MIB2_STATS /** link type (from "snmp_ifType" enum from snmp_mib2.h) */ u8_t link_type; @@ -343,9 +392,9 @@ struct netif { filter table of the ethernet MAC. */ netif_mld_mac_filter_fn mld_mac_filter; #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ -#if LWIP_NETIF_HWADDRHINT - u8_t *addr_hint; -#endif /* LWIP_NETIF_HWADDRHINT */ +#if LWIP_NETIF_USE_HINTS + struct netif_hint *hints; +#endif /* LWIP_NETIF_USE_HINTS */ #if ENABLE_LOOPBACK /* List of packets to be queued for ourselves. */ struct pbuf *loop_first; @@ -353,6 +402,10 @@ struct netif { #if LWIP_LOOPBACK_MAX_PBUFS u16_t loop_cnt_current; #endif /* LWIP_LOOPBACK_MAX_PBUFS */ +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + /* Used if the original scheduling failed. */ + u8_t reschedule_poll; +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ #endif /* ENABLE_LOOPBACK */ }; @@ -365,21 +418,28 @@ struct netif { #define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) #endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */ +#if LWIP_SINGLE_NETIF +#define NETIF_FOREACH(netif) if (((netif) = netif_default) != NULL) +#else /* LWIP_SINGLE_NETIF */ /** The list of network interfaces. */ extern struct netif *netif_list; +#define NETIF_FOREACH(netif) for ((netif) = netif_list; (netif) != NULL; (netif) = (netif)->next) +#endif /* LWIP_SINGLE_NETIF */ /** The default network interface. */ extern struct netif *netif_default; void netif_init(void); +struct netif *netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input); + +#if LWIP_IPV4 struct netif *netif_add(struct netif *netif, -#if LWIP_IPV4 - const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, -#endif /* LWIP_IPV4 */ - void *state, netif_init_fn init, netif_input_fn input); -#if LWIP_IPV4 + const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, + void *state, netif_init_fn init, netif_input_fn input); void netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw); +#else /* LWIP_IPV4 */ +struct netif *netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input); #endif /* LWIP_IPV4 */ void netif_remove(struct netif * netif); @@ -409,6 +469,10 @@ void netif_set_gw(struct netif *netif, const ip4_addr_t *gw); #define netif_ip_gw4(netif) ((const ip_addr_t*)&((netif)->gw)) #endif /* LWIP_IPV4 */ +#define netif_set_flags(netif, set_flags) do { (netif)->flags = (u8_t)((netif)->flags | (set_flags)); } while(0) +#define netif_clear_flags(netif, clr_flags) do { (netif)->flags = (u8_t)((netif)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define netif_is_flag_set(netif, flag) (((netif)->flags & (flag)) != 0) + void netif_set_up(struct netif *netif); void netif_set_down(struct netif *netif); /** @ingroup netif @@ -475,13 +539,148 @@ s8_t netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr); void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit); err_t netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx); #define netif_set_ip6_autoconfig_enabled(netif, action) do { if(netif) { (netif)->ip6_autoconfig_enabled = (action); }}while(0) +#if LWIP_IPV6_ADDRESS_LIFETIMES +#define netif_ip6_addr_valid_life(netif, i) \ + (((netif) != NULL) ? ((netif)->ip6_addr_valid_life[i]) : IP6_ADDR_LIFE_STATIC) +#define netif_ip6_addr_set_valid_life(netif, i, secs) \ + do { if (netif != NULL) { (netif)->ip6_addr_valid_life[i] = (secs); }} while (0) +#define netif_ip6_addr_pref_life(netif, i) \ + (((netif) != NULL) ? ((netif)->ip6_addr_pref_life[i]) : IP6_ADDR_LIFE_STATIC) +#define netif_ip6_addr_set_pref_life(netif, i, secs) \ + do { if (netif != NULL) { (netif)->ip6_addr_pref_life[i] = (secs); }} while (0) +#define netif_ip6_addr_isstatic(netif, i) \ + (netif_ip6_addr_valid_life((netif), (i)) == IP6_ADDR_LIFE_STATIC) +#else /* !LWIP_IPV6_ADDRESS_LIFETIMES */ +#define netif_ip6_addr_isstatic(netif, i) (1) /* all addresses are static */ +#endif /* !LWIP_IPV6_ADDRESS_LIFETIMES */ +#if LWIP_ND6_ALLOW_RA_UPDATES +#define netif_mtu6(netif) ((netif)->mtu6) +#else /* LWIP_ND6_ALLOW_RA_UPDATES */ +#define netif_mtu6(netif) ((netif)->mtu) +#endif /* LWIP_ND6_ALLOW_RA_UPDATES */ #endif /* LWIP_IPV6 */ -#if LWIP_NETIF_HWADDRHINT -#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint)) -#else /* LWIP_NETIF_HWADDRHINT */ -#define NETIF_SET_HWADDRHINT(netif, hint) -#endif /* LWIP_NETIF_HWADDRHINT */ +#if LWIP_NETIF_USE_HINTS +#define NETIF_SET_HINTS(netif, netifhint) (netif)->hints = (netifhint) +#define NETIF_RESET_HINTS(netif) (netif)->hints = NULL +#else /* LWIP_NETIF_USE_HINTS */ +#define NETIF_SET_HINTS(netif, netifhint) +#define NETIF_RESET_HINTS(netif) +#endif /* LWIP_NETIF_USE_HINTS */ + +u8_t netif_name_to_index(const char *name); +char * netif_index_to_name(u8_t idx, char *name); +struct netif* netif_get_by_index(u8_t idx); + +/* Interface indexes always start at 1 per RFC 3493, section 4, num starts at 0 (internal index is 0..254)*/ +#define netif_get_index(netif) ((u8_t)((netif)->num + 1)) +#define NETIF_NO_INDEX (0) + +/** + * @ingroup netif + * Extended netif status callback (NSC) reasons flags. + * May be extended in the future! + */ +typedef u16_t netif_nsc_reason_t; + +/* used for initialization only */ +#define LWIP_NSC_NONE 0x0000 +/** netif was added. arg: NULL. Called AFTER netif was added. */ +#define LWIP_NSC_NETIF_ADDED 0x0001 +/** netif was removed. arg: NULL. Called BEFORE netif is removed. */ +#define LWIP_NSC_NETIF_REMOVED 0x0002 +/** link changed */ +#define LWIP_NSC_LINK_CHANGED 0x0004 +/** netif administrative status changed.\n + * up is called AFTER netif is set up.\n + * down is called BEFORE the netif is actually set down. */ +#define LWIP_NSC_STATUS_CHANGED 0x0008 +/** IPv4 address has changed */ +#define LWIP_NSC_IPV4_ADDRESS_CHANGED 0x0010 +/** IPv4 gateway has changed */ +#define LWIP_NSC_IPV4_GATEWAY_CHANGED 0x0020 +/** IPv4 netmask has changed */ +#define LWIP_NSC_IPV4_NETMASK_CHANGED 0x0040 +/** called AFTER IPv4 address/gateway/netmask changes have been applied */ +#define LWIP_NSC_IPV4_SETTINGS_CHANGED 0x0080 +/** IPv6 address was added */ +#define LWIP_NSC_IPV6_SET 0x0100 +/** IPv6 address state has changed */ +#define LWIP_NSC_IPV6_ADDR_STATE_CHANGED 0x0200 + +/** @ingroup netif + * Argument supplied to netif_ext_callback_fn. + */ +typedef union +{ + /** Args to LWIP_NSC_LINK_CHANGED callback */ + struct link_changed_s + { + /** 1: up; 0: down */ + u8_t state; + } link_changed; + /** Args to LWIP_NSC_STATUS_CHANGED callback */ + struct status_changed_s + { + /** 1: up; 0: down */ + u8_t state; + } status_changed; + /** Args to LWIP_NSC_IPV4_ADDRESS_CHANGED|LWIP_NSC_IPV4_GATEWAY_CHANGED|LWIP_NSC_IPV4_NETMASK_CHANGED|LWIP_NSC_IPV4_SETTINGS_CHANGED callback */ + struct ipv4_changed_s + { + /** Old IPv4 address */ + const ip_addr_t* old_address; + const ip_addr_t* old_netmask; + const ip_addr_t* old_gw; + } ipv4_changed; + /** Args to LWIP_NSC_IPV6_SET callback */ + struct ipv6_set_s + { + /** Index of changed IPv6 address */ + s8_t addr_index; + /** Old IPv6 address */ + const ip_addr_t* old_address; + } ipv6_set; + /** Args to LWIP_NSC_IPV6_ADDR_STATE_CHANGED callback */ + struct ipv6_addr_state_changed_s + { + /** Index of affected IPv6 address */ + s8_t addr_index; + /** Old IPv6 address state */ + u8_t old_state; + /** Affected IPv6 address */ + const ip_addr_t* address; + } ipv6_addr_state_changed; +} netif_ext_callback_args_t; + +/** + * @ingroup netif + * Function used for extended netif status callbacks + * Note: When parsing reason argument, keep in mind that more reasons may be added in the future! + * @param netif netif that is affected by change + * @param reason change reason + * @param args depends on reason, see reason description + */ +typedef void (*netif_ext_callback_fn)(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args); + +#if LWIP_NETIF_EXT_STATUS_CALLBACK +struct netif_ext_callback; +typedef struct netif_ext_callback +{ + netif_ext_callback_fn callback_fn; + struct netif_ext_callback* next; +} netif_ext_callback_t; + +#define NETIF_DECLARE_EXT_CALLBACK(name) static netif_ext_callback_t name; +void netif_add_ext_callback(netif_ext_callback_t* callback, netif_ext_callback_fn fn); +void netif_remove_ext_callback(netif_ext_callback_t* callback); +void netif_invoke_ext_callback(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args); +#else +#define NETIF_DECLARE_EXT_CALLBACK(name) +#define netif_add_ext_callback(callback, fn) +#define netif_remove_ext_callback(callback) +#define netif_invoke_ext_callback(netif, reason, args) +#endif #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netifapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netifapi.h similarity index 63% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netifapi.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netifapi.h index 8bd2b4f..e063179 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/netifapi.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/netifapi.h @@ -41,43 +41,27 @@ #include "lwip/dhcp.h" #include "lwip/autoip.h" #include "lwip/priv/tcpip_priv.h" +#include "lwip/priv/api_msg.h" +#include "lwip/prot/ethernet.h" #ifdef __cplusplus extern "C" { #endif -#if LWIP_MPU_COMPATIBLE -#define NETIFAPI_IPADDR_DEF(type, m) type m -#else /* LWIP_MPU_COMPATIBLE */ -#define NETIFAPI_IPADDR_DEF(type, m) const type * m -#endif /* LWIP_MPU_COMPATIBLE */ - -typedef void (*netifapi_void_fn)(struct netif *netif); -typedef err_t (*netifapi_errt_fn)(struct netif *netif); - -struct netifapi_msg { - struct tcpip_api_call_data call; - struct netif *netif; - union { - struct { -#if LWIP_IPV4 - NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr); - NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask); - NETIFAPI_IPADDR_DEF(ip4_addr_t, gw); -#endif /* LWIP_IPV4 */ - void *state; - netif_init_fn init; - netif_input_fn input; - } add; - struct { - netifapi_void_fn voidfunc; - netifapi_errt_fn errtfunc; - } common; - } msg; +/* API for application */ +#if LWIP_ARP && LWIP_IPV4 +/* Used for netfiapi_arp_* APIs */ +enum netifapi_arp_entry { + NETIFAPI_ARP_PERM /* Permanent entry */ + /* Other entry types can be added here */ }; +/** @ingroup netifapi_arp */ +err_t netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type); +/** @ingroup netifapi_arp */ +err_t netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type); +#endif /* LWIP_ARP && LWIP_IPV4 */ -/* API for application */ err_t netifapi_netif_add(struct netif *netif, #if LWIP_IPV4 const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, @@ -93,16 +77,33 @@ err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, netifapi_errt_fn errtfunc); /** @ingroup netifapi_netif */ +err_t netifapi_netif_name_to_index(const char *name, u8_t *index); +/** @ingroup netifapi_netif */ +err_t netifapi_netif_index_to_name(u8_t index, char *name); + +/** @ingroup netifapi_netif + * @see netif_remove() + */ #define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) -/** @ingroup netifapi_netif */ +/** @ingroup netifapi_netif + * @see netif_set_up() + */ #define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) -/** @ingroup netifapi_netif */ +/** @ingroup netifapi_netif + * @see netif_set_down() + */ #define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) -/** @ingroup netifapi_netif */ +/** @ingroup netifapi_netif + * @see netif_set_default() + */ #define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) -/** @ingroup netifapi_netif */ +/** @ingroup netifapi_netif + * @see netif_set_link_up() + */ #define netifapi_netif_set_link_up(n) netifapi_netif_common(n, netif_set_link_up, NULL) -/** @ingroup netifapi_netif */ +/** @ingroup netifapi_netif + * @see netif_set_link_down() + */ #define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL) /** @@ -110,25 +111,45 @@ err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, * @ingroup netifapi * To be called from non-TCPIP threads */ -/** @ingroup netifapi_dhcp4 */ -#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) -/** @ingroup netifapi_dhcp4 */ -#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) -/** @ingroup netifapi_dhcp4 */ -#define netifapi_dhcp_inform(n) netifapi_netif_common(n, dhcp_inform, NULL) -/** @ingroup netifapi_dhcp4 */ -#define netifapi_dhcp_renew(n) netifapi_netif_common(n, NULL, dhcp_renew) -/** @ingroup netifapi_dhcp4 */ -#define netifapi_dhcp_release(n) netifapi_netif_common(n, NULL, dhcp_release) +/** @ingroup netifapi_dhcp4 + * @see dhcp_start() + */ +#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) +/** + * @ingroup netifapi_dhcp4 + * @deprecated Use netifapi_dhcp_release_and_stop() instead. + */ +#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) +/** @ingroup netifapi_dhcp4 + * @see dhcp_inform() + */ +#define netifapi_dhcp_inform(n) netifapi_netif_common(n, dhcp_inform, NULL) +/** @ingroup netifapi_dhcp4 + * @see dhcp_renew() + */ +#define netifapi_dhcp_renew(n) netifapi_netif_common(n, NULL, dhcp_renew) +/** + * @ingroup netifapi_dhcp4 + * @deprecated Use netifapi_dhcp_release_and_stop() instead. + */ +#define netifapi_dhcp_release(n) netifapi_netif_common(n, NULL, dhcp_release) +/** @ingroup netifapi_dhcp4 + * @see dhcp_release_and_stop() + */ +#define netifapi_dhcp_release_and_stop(n) netifapi_netif_common(n, dhcp_release_and_stop, NULL) /** * @defgroup netifapi_autoip AUTOIP * @ingroup netifapi * To be called from non-TCPIP threads */ -/** @ingroup netifapi_autoip */ +/** @ingroup netifapi_autoip + * @see autoip_start() + */ #define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) -/** @ingroup netifapi_autoip */ +/** @ingroup netifapi_autoip + * @see autoip_stop() + */ #define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) #ifdef __cplusplus diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/opt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/opt.h similarity index 73% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/opt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/opt.h index b0fc31f..d8c82d1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/opt.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/opt.h @@ -144,6 +144,15 @@ #if !defined SMEMCPY || defined __DOXYGEN__ #define SMEMCPY(dst,src,len) memcpy(dst,src,len) #endif + +/** + * MEMMOVE: override this if you have a faster implementation at hand than the + * one included in your C library. lwIP currently uses MEMMOVE only when IPv6 + * fragmentation support is enabled. + */ +#if !defined MEMMOVE || defined __DOXYGEN__ +#define MEMMOVE(dst,src,len) memmove(dst,src,len) +#endif /** * @} */ @@ -203,6 +212,29 @@ #if !defined SYS_LIGHTWEIGHT_PROT || defined __DOXYGEN__ #define SYS_LIGHTWEIGHT_PROT 1 #endif + +/** + * Macro/function to check whether lwIP's threading/locking + * requirements are satisfied during current function call. + * This macro usually calls a function that is implemented in the OS-dependent + * sys layer and performs the following checks: + * - Not in ISR (this should be checked for NO_SYS==1, too!) + * - If @ref LWIP_TCPIP_CORE_LOCKING = 1: TCPIP core lock is held + * - If @ref LWIP_TCPIP_CORE_LOCKING = 0: function is called from TCPIP thread + * @see @ref multithreading + */ +#if !defined LWIP_ASSERT_CORE_LOCKED || defined __DOXYGEN__ +#define LWIP_ASSERT_CORE_LOCKED() +#endif + +/** + * Called as first thing in the lwIP TCPIP thread. Can be used in conjunction + * with @ref LWIP_ASSERT_CORE_LOCKED to check core locking. + * @see @ref multithreading + */ +#if !defined LWIP_MARK_TCPIP_THREAD || defined __DOXYGEN__ +#define LWIP_MARK_TCPIP_THREAD() +#endif /** * @} */ @@ -239,6 +271,15 @@ #define MEMP_MEM_MALLOC 0 #endif +/** + * MEMP_MEM_INIT==1: Force use of memset to initialize pool memory. + * Useful if pool are moved in uninitialized section of memory. This will ensure + * default values in pcbs struct are well initialized in all conditions. + */ +#if !defined MEMP_MEM_INIT || defined __DOXYGEN__ +#define MEMP_MEM_INIT 0 +#endif + /** * MEM_ALIGNMENT: should be set to the alignment of the CPU * 4 byte alignment -> \#define MEM_ALIGNMENT 4 @@ -277,6 +318,27 @@ #define MEMP_SANITY_CHECK 0 #endif +/** + * MEM_OVERFLOW_CHECK: mem overflow protection reserves a configurable + * amount of bytes before and after each heap allocation chunk and fills + * it with a prominent default value. + * MEM_OVERFLOW_CHECK == 0 no checking + * MEM_OVERFLOW_CHECK == 1 checks each element when it is freed + * MEM_OVERFLOW_CHECK >= 2 checks all heap elements every time + * mem_malloc() or mem_free() is called (useful but slow!) + */ +#if !defined MEM_OVERFLOW_CHECK || defined __DOXYGEN__ +#define MEM_OVERFLOW_CHECK 0 +#endif + +/** + * MEM_SANITY_CHECK==1: run a sanity check after each mem_free() to make + * sure that the linked list of heap elements is not corrupted. + */ +#if !defined MEM_SANITY_CHECK || defined __DOXYGEN__ +#define MEM_SANITY_CHECK 0 +#endif + /** * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set * of memory pools of various sizes. When mem_malloc is called, an element of @@ -390,6 +452,16 @@ #define MEMP_NUM_TCP_SEG 16 #endif +/** + * MEMP_NUM_ALTCP_PCB: the number of simultaneously active altcp layer pcbs. + * (requires the LWIP_ALTCP option) + * Connections with multiple layers require more than one altcp_pcb (e.g. TLS + * over TCP requires 2 altcp_pcbs, one for TLS and one for TCP). + */ +#if !defined MEMP_NUM_ALTCP_PCB || defined __DOXYGEN__ +#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB +#endif + /** * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for * reassembly (whole packets, not fragments!) @@ -429,13 +501,19 @@ #define MEMP_NUM_IGMP_GROUP 8 #endif +/** + * The number of sys timeouts used by the core stack (not apps) + * The default number of timeouts is calculated here for all enabled modules. + */ +#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD))) + /** * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. * The default number of timeouts is calculated here for all enabled modules. * The formula expects settings to be either '0' or '1'. */ #if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__ -#define MEMP_NUM_SYS_TIMEOUT (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0)) +#define MEMP_NUM_SYS_TIMEOUT LWIP_NUM_SYS_TIMEOUT_INTERNAL #endif /** @@ -454,6 +532,15 @@ #define MEMP_NUM_NETCONN 4 #endif +/** + * MEMP_NUM_SELECT_CB: the number of struct lwip_select_cb. + * (Only needed if you have LWIP_MPU_COMPATIBLE==1 and use the socket API. + * In that case, you need one per thread calling lwip_select.) + */ +#if !defined MEMP_NUM_SELECT_CB || defined __DOXYGEN__ +#define MEMP_NUM_SELECT_CB 4 +#endif + /** * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used * for callback/timeout API communication. @@ -617,7 +704,7 @@ * (but this should only occur for AutoIP). */ #if !defined ETHARP_TABLE_MATCH_NETIF || defined __DOXYGEN__ -#define ETHARP_TABLE_MATCH_NETIF 0 +#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF #endif /** * @} @@ -692,7 +779,7 @@ * in this time, the whole packet is discarded. */ #if !defined IP_REASS_MAXAGE || defined __DOXYGEN__ -#define IP_REASS_MAXAGE 3 +#define IP_REASS_MAXAGE 15 #endif /** @@ -700,6 +787,8 @@ * Since the received pbufs are enqueued, be sure to configure * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive * packets even if the maximum amount of fragments is enqueued for reassembly! + * When IPv4 *and* IPv6 are enabled, this even changes to + * (PBUF_POOL_SIZE > 2 * IP_REASS_MAX_PBUFS)! */ #if !defined IP_REASS_MAX_PBUFS || defined __DOXYGEN__ #define IP_REASS_MAX_PBUFS 10 @@ -739,15 +828,6 @@ #if !defined IP_FORWARD_ALLOW_TX_ON_RX_NETIF || defined __DOXYGEN__ #define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0 #endif - -/** - * LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first - * local TCP/UDP pcb (default==0). This can prevent creating predictable port - * numbers after booting a device. - */ -#if !defined LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS || defined __DOXYGEN__ -#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 0 -#endif /** * @} */ @@ -774,7 +854,7 @@ * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. */ #if !defined ICMP_TTL || defined __DOXYGEN__ -#define ICMP_TTL (IP_DEFAULT_TTL) +#define ICMP_TTL IP_DEFAULT_TTL #endif /** @@ -808,14 +888,14 @@ * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #if !defined LWIP_RAW || defined __DOXYGEN__ -#define LWIP_RAW 1 +#define LWIP_RAW 0 #endif /** * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. */ #if !defined RAW_TTL || defined __DOXYGEN__ -#define RAW_TTL (IP_DEFAULT_TTL) +#define RAW_TTL IP_DEFAULT_TTL #endif /** * @} @@ -847,17 +927,7 @@ * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. */ #if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__ -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/** - * LWIP_DHCP_CHECK_LINK_UP==1: dhcp_start() only really starts if the netif has - * NETIF_FLAG_LINK_UP set in its flags. As this is only an optimization and - * netif drivers might not set this flag, the default is off. If enabled, - * netif_set_link_up() must be called to continue dhcp starting. - */ -#if !defined LWIP_DHCP_CHECK_LINK_UP -#define LWIP_DHCP_CHECK_LINK_UP 0 +#define DHCP_DOES_ARP_CHECK (LWIP_DHCP && LWIP_ARP) #endif /** @@ -885,7 +955,7 @@ /** * LWIP_DHCP_MAX_DNS_SERVERS > 0: Request DNS servers with discover/select. - * DHCP servers received in the response are passed to DNS via @ref dns_setserver() + * DNS servers received in the response are passed to DNS via @ref dns_setserver() * (up to the maximum limit defined here). */ #if !defined LWIP_DHCP_MAX_DNS_SERVERS || defined __DOXYGEN__ @@ -963,7 +1033,29 @@ /* ---------------------------------- - ----- Multicast/IGMP options ----- + -------- Multicast options ------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_multicast Multicast + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options + * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP, as well as (currently only) + * core support for the corresponding IPv6 options. + */ +#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__ +#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW)) +#endif +/** + * @} + */ + +/* + ---------------------------------- + ---------- IGMP options ---------- ---------------------------------- */ /** @@ -981,14 +1073,6 @@ #undef LWIP_IGMP #define LWIP_IGMP 0 #endif - -/** - * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options - * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP - */ -#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__ -#define LWIP_MULTICAST_TX_OPTIONS (LWIP_IGMP && LWIP_UDP) -#endif /** * @} */ @@ -1029,6 +1113,11 @@ #define DNS_MAX_SERVERS 2 #endif +/** DNS maximum number of retries when asking for a name, before "timeout". */ +#if !defined DNS_MAX_RETRIES || defined __DOXYGEN__ +#define DNS_MAX_RETRIES 4 +#endif + /** DNS do a name checking between the query and the response. */ #if !defined DNS_DOES_NAME_CHECK || defined __DOXYGEN__ #define DNS_DOES_NAME_CHECK 1 @@ -1068,7 +1157,7 @@ /** Set this to 1 to enable querying ".local" names via mDNS * using a One-Shot Multicast DNS Query */ #if !defined LWIP_DNS_SUPPORT_MDNS_QUERIES || defined __DOXYGEN__ -#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0 +#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0 #endif /** * @} @@ -1102,7 +1191,7 @@ * UDP_TTL: Default Time-To-Live value. */ #if !defined UDP_TTL || defined __DOXYGEN__ -#define UDP_TTL (IP_DEFAULT_TTL) +#define UDP_TTL IP_DEFAULT_TTL #endif /** @@ -1136,7 +1225,7 @@ * TCP_TTL: Default Time-To-Live value. */ #if !defined TCP_TTL || defined __DOXYGEN__ -#define TCP_TTL (IP_DEFAULT_TTL) +#define TCP_TTL IP_DEFAULT_TTL #endif /** @@ -1169,7 +1258,28 @@ * Define to 0 if your device is low on memory. */ #if !defined TCP_QUEUE_OOSEQ || defined __DOXYGEN__ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) +#define TCP_QUEUE_OOSEQ LWIP_TCP +#endif + +/** + * LWIP_TCP_SACK_OUT==1: TCP will support sending selective acknowledgements (SACKs). + */ +#if !defined LWIP_TCP_SACK_OUT || defined __DOXYGEN__ +#define LWIP_TCP_SACK_OUT 0 +#endif + +/** + * LWIP_TCP_MAX_SACK_NUM: The maximum number of SACK values to include in TCP segments. + * Must be at least 1, but is only used if LWIP_TCP_SACK_OUT is enabled. + * NOTE: Even though we never send more than 3 or 4 SACK ranges in a single segment + * (depending on other options), setting this option to values greater than 4 is not pointless. + * This is basically the max number of SACK ranges we want to keep track of. + * As new data is delivered, some of the SACK ranges may be removed or merged. + * In that case some of those older SACK ranges may be used again. + * The amount of memory used to store SACK ranges is LWIP_TCP_MAX_SACK_NUM * 8 bytes for each TCP PCB. + */ +#if !defined LWIP_TCP_MAX_SACK_NUM || defined __DOXYGEN__ +#define LWIP_TCP_MAX_SACK_NUM 4 #endif /** @@ -1231,21 +1341,51 @@ #endif /** - * TCP_OOSEQ_MAX_BYTES: The maximum number of bytes queued on ooseq per pcb. - * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1. + * TCP_OOSEQ_MAX_BYTES: The default maximum number of bytes queued on ooseq per + * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). + * Only valid for TCP_QUEUE_OOSEQ==1. */ #if !defined TCP_OOSEQ_MAX_BYTES || defined __DOXYGEN__ #define TCP_OOSEQ_MAX_BYTES 0 #endif /** - * TCP_OOSEQ_MAX_PBUFS: The maximum number of pbufs queued on ooseq per pcb. - * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1. + * TCP_OOSEQ_BYTES_LIMIT(pcb): Return the maximum number of bytes to be queued + * on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 && + * TCP_OOSEQ_MAX_BYTES==1. + * Use this to override TCP_OOSEQ_MAX_BYTES to a dynamic value per pcb. + */ +#if !defined TCP_OOSEQ_BYTES_LIMIT +#if TCP_OOSEQ_MAX_BYTES +#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES +#elif defined __DOXYGEN__ +#define TCP_OOSEQ_BYTES_LIMIT(pcb) +#endif +#endif + +/** + * TCP_OOSEQ_MAX_PBUFS: The default maximum number of pbufs queued on ooseq per + * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). + * Only valid for TCP_QUEUE_OOSEQ==1. */ #if !defined TCP_OOSEQ_MAX_PBUFS || defined __DOXYGEN__ #define TCP_OOSEQ_MAX_PBUFS 0 #endif +/** + * TCP_OOSEQ_PBUFS_LIMIT(pcb): Return the maximum number of pbufs to be queued + * on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 && + * TCP_OOSEQ_MAX_PBUFS==1. + * Use this to override TCP_OOSEQ_MAX_PBUFS to a dynamic value per pcb. + */ +#if !defined TCP_OOSEQ_PBUFS_LIMIT +#if TCP_OOSEQ_MAX_PBUFS +#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS +#elif defined __DOXYGEN__ +#define TCP_OOSEQ_PBUFS_LIMIT(pcb) +#endif +#endif + /** * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. */ @@ -1295,7 +1435,7 @@ * explicit window update */ #if !defined TCP_WND_UPDATE_THRESHOLD || defined __DOXYGEN__ -#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4)) +#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4)) #endif /** @@ -1329,6 +1469,41 @@ #define LWIP_WND_SCALE 0 #define TCP_RCV_SCALE 0 #endif + +/** + * LWIP_TCP_PCB_NUM_EXT_ARGS: + * When this is > 0, every tcp pcb (including listen pcb) includes a number of + * additional argument entries in an array (see tcp_ext_arg_alloc_id) + */ +#if !defined LWIP_TCP_PCB_NUM_EXT_ARGS || defined __DOXYGEN__ +#define LWIP_TCP_PCB_NUM_EXT_ARGS 0 +#endif + +/** LWIP_ALTCP==1: enable the altcp API. + * altcp is an abstraction layer that prevents applications linking against the + * tcp.h functions but provides the same functionality. It is used to e.g. add + * SSL/TLS or proxy-connect support to an application written for the tcp callback + * API without that application knowing the protocol details. + * + * With LWIP_ALTCP==0, applications written against the altcp API can still be + * compiled but are directly linked against the tcp.h callback API and then + * cannot use layered protocols. + * + * See @ref altcp_api + */ +#if !defined LWIP_ALTCP || defined __DOXYGEN__ +#define LWIP_ALTCP 0 +#endif + +/** LWIP_ALTCP_TLS==1: enable TLS support for altcp API. + * This needs a port of the functions in altcp_tls.h to a TLS library. + * A port to ARM mbedtls is provided with lwIP, see apps/altcp_tls/ directory + * and LWIP_ALTCP_TLS_MBEDTLS option. + */ +#if !defined LWIP_ALTCP_TLS || defined __DOXYGEN__ +#define LWIP_ALTCP_TLS 0 +#endif + /** * @} */ @@ -1361,7 +1536,7 @@ * for an additional encapsulation header before ethernet headers (e.g. 802.11) */ #if !defined PBUF_LINK_ENCAPSULATION_HLEN || defined __DOXYGEN__ -#define PBUF_LINK_ENCAPSULATION_HLEN 0u +#define PBUF_LINK_ENCAPSULATION_HLEN 0 #endif /** @@ -1370,7 +1545,23 @@ * TCP_MSS, IP header, and link header. */ #if !defined PBUF_POOL_BUFSIZE || defined __DOXYGEN__ -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN) +#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+PBUF_IP_HLEN+PBUF_TRANSPORT_HLEN+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN) +#endif + +/** + * LWIP_PBUF_REF_T: Refcount type in pbuf. + * Default width of u8_t can be increased if 255 refs are not enough for you. + */ +#if !defined LWIP_PBUF_REF_T || defined __DOXYGEN__ +#define LWIP_PBUF_REF_T u8_t +#endif + +/** + * LWIP_PBUF_CUSTOM_DATA: Store private data on pbufs (e.g. timestamps) + * This extends struct pbuf so user can store custom data on every pbuf. + */ +#if !defined LWIP_PBUF_CUSTOM_DATA || defined __DOXYGEN__ +#define LWIP_PBUF_CUSTOM_DATA #endif /** * @} @@ -1386,6 +1577,14 @@ * @ingroup lwip_opts * @{ */ +/** + * LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for + * small real-life targets. Some code like routing etc. can be left out. + */ +#if !defined LWIP_SINGLE_NETIF || defined __DOXYGEN__ +#define LWIP_SINGLE_NETIF 0 +#endif + /** * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname * field. @@ -1409,6 +1608,15 @@ #define LWIP_NETIF_STATUS_CALLBACK 0 #endif +/** + * LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function + * for several netif related event that supports multiple subscribers. + * @see netif_ext_status_callback + */ +#if !defined LWIP_NETIF_EXT_STATUS_CALLBACK || defined __DOXYGEN__ +#define LWIP_NETIF_EXT_STATUS_CALLBACK 0 +#endif + /** * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface * whenever the link changes (i.e., link down) @@ -1437,24 +1645,33 @@ #endif /** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP *tries* to put all data * to be sent into one single pbuf. This is for compatibility with DMA-enabled * MACs that do not support scatter-gather. * Beware that this might involve CPU-memcpy before transmitting that would not * be needed without this flag! Use this only if you need to! * - * @todo: TCP and IP-frag do not work with this, yet: + * ATTENTION: a driver should *NOT* rely on getting single pbufs but check TX + * pbufs for being in one piece. If not, @ref pbuf_clone can be used to get + * a single pbuf: + * if (p->next != NULL) { + * struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); + * if (q == NULL) { + * return ERR_MEM; + * } + * p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller! + * } */ #if !defined LWIP_NETIF_TX_SINGLE_PBUF || defined __DOXYGEN__ -#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#define LWIP_NETIF_TX_SINGLE_PBUF 0 #endif /* LWIP_NETIF_TX_SINGLE_PBUF */ /** * LWIP_NUM_NETIF_CLIENT_DATA: Number of clients that may store - * data in client_data member array of struct netif. + * data in client_data member array of struct netif (max. 256). */ #if !defined LWIP_NUM_NETIF_CLIENT_DATA || defined __DOXYGEN__ -#define LWIP_NUM_NETIF_CLIENT_DATA 0 +#define LWIP_NUM_NETIF_CLIENT_DATA 0 #endif /** * @} @@ -1476,14 +1693,14 @@ * netif is available, loopback traffic uses this netif. */ #if !defined LWIP_HAVE_LOOPIF || defined __DOXYGEN__ -#define LWIP_HAVE_LOOPIF LWIP_NETIF_LOOPBACK +#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF) #endif /** * LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1). */ #if !defined LWIP_LOOPIF_MULTICAST || defined __DOXYGEN__ -#define LWIP_LOOPIF_MULTICAST 0 +#define LWIP_LOOPIF_MULTICAST 0 #endif /** @@ -1536,7 +1753,7 @@ * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. */ #if !defined TCPIP_THREAD_NAME || defined __DOXYGEN__ -#define TCPIP_THREAD_NAME "tcpip_thread" +#define TCPIP_THREAD_NAME "tcpip_thread" #endif /** @@ -1578,7 +1795,7 @@ * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. */ #if !defined SLIPIF_THREAD_NAME || defined __DOXYGEN__ -#define SLIPIF_THREAD_NAME "slipif_loop" +#define SLIPIF_THREAD_NAME "slipif_loop" #endif /** @@ -1603,7 +1820,7 @@ * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. */ #if !defined DEFAULT_THREAD_NAME || defined __DOXYGEN__ -#define DEFAULT_THREAD_NAME "lwIP" +#define DEFAULT_THREAD_NAME "lwIP" #endif /** @@ -1703,11 +1920,8 @@ /** LWIP_NETCONN_FULLDUPLEX==1: Enable code that allows reading from one thread, * writing from a 2nd thread and closing from a 3rd thread at the same time. - * ATTENTION: This is currently really alpha! Some requirements: - * - LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from - * multiple threads at once - * - sys_mbox_free() has to unblock receive tasks waiting on recvmbox/acceptmbox - * and prevent a task pending on this during/after deletion + * LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from + * multiple threads at once! */ #if !defined LWIP_NETCONN_FULLDUPLEX || defined __DOXYGEN__ #define LWIP_NETCONN_FULLDUPLEX 0 @@ -1733,13 +1947,6 @@ #define LWIP_SOCKET 1 #endif -/* LWIP_SOCKET_SET_ERRNO==1: Set errno when socket functions cannot complete - * successfully, as required by POSIX. Default is POSIX-compliant. - */ -#if !defined LWIP_SOCKET_SET_ERRNO || defined __DOXYGEN__ -#define LWIP_SOCKET_SET_ERRNO 1 -#endif - /** * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names through defines. * LWIP_COMPAT_SOCKETS==2: Same as ==1 but correctly named functions are created. @@ -1858,6 +2065,24 @@ #if !defined LWIP_FIONREAD_LINUXMODE || defined __DOXYGEN__ #define LWIP_FIONREAD_LINUXMODE 0 #endif + +/** + * LWIP_SOCKET_SELECT==1 (default): enable select() for sockets (uses a netconn + * callback to keep track of events). + * This saves RAM (counters per socket) and code (netconn event callback), which + * should improve performance a bit). + */ +#if !defined LWIP_SOCKET_SELECT || defined __DOXYGEN__ +#define LWIP_SOCKET_SELECT 1 +#endif + +/** + * LWIP_SOCKET_POLL==1 (default): enable poll() for sockets (including + * struct pollfd, nfds_t, and constants) + */ +#if !defined LWIP_SOCKET_POLL || defined __DOXYGEN__ +#define LWIP_SOCKET_POLL 1 +#endif /** * @} */ @@ -1876,7 +2101,7 @@ * LWIP_STATS==1: Enable statistics collection in lwip_stats. */ #if !defined LWIP_STATS || defined __DOXYGEN__ -#define LWIP_STATS 0 +#define LWIP_STATS 1 #endif #if LWIP_STATS @@ -2153,6 +2378,46 @@ #define LWIP_IPV6 0 #endif +/** + * IPV6_REASS_MAXAGE: Maximum time (in multiples of IP6_REASS_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#if !defined IPV6_REASS_MAXAGE || defined __DOXYGEN__ +#define IPV6_REASS_MAXAGE 60 +#endif + +/** + * LWIP_IPV6_SCOPES==1: Enable support for IPv6 address scopes, ensuring that + * e.g. link-local addresses are really treated as link-local. Disable this + * setting only for single-interface configurations. + * All addresses that have a scope according to the default policy (link-local + * unicast addresses, interface-local and link-local multicast addresses) should + * now have a zone set on them before being passed to the core API, although + * lwIP will currently attempt to select a zone on the caller's behalf when + * necessary. Applications that directly assign IPv6 addresses to interfaces + * (which is NOT recommended) must now ensure that link-local addresses carry + * the netif's zone. See the new ip6_zone.h header file for more information and + * relevant macros. For now it is still possible to turn off scopes support + * through the new LWIP_IPV6_SCOPES option. When upgrading an implementation that + * uses the core API directly, it is highly recommended to enable + * LWIP_IPV6_SCOPES_DEBUG at least for a while, to ensure e.g. proper address + * initialization. + */ +#if !defined LWIP_IPV6_SCOPES || defined __DOXYGEN__ +#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF) +#endif + +/** + * LWIP_IPV6_SCOPES_DEBUG==1: Perform run-time checks to verify that addresses + * are properly zoned (see ip6_zone.h on what that means) where it matters. + * Enabling this setting is highly recommended when upgrading from an existing + * installation that is not yet scope-aware; otherwise it may be too expensive. + */ +#if !defined LWIP_IPV6_SCOPES_DEBUG || defined __DOXYGEN__ +#define LWIP_IPV6_SCOPES_DEBUG 0 +#endif + /** * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif. */ @@ -2171,14 +2436,14 @@ * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big. */ #if !defined LWIP_IPV6_FRAG || defined __DOXYGEN__ -#define LWIP_IPV6_FRAG 0 +#define LWIP_IPV6_FRAG 1 #endif /** * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented */ #if !defined LWIP_IPV6_REASS || defined __DOXYGEN__ -#define LWIP_IPV6_REASS (LWIP_IPV6) +#define LWIP_IPV6_REASS LWIP_IPV6 #endif /** @@ -2186,14 +2451,25 @@ * network startup. */ #if !defined LWIP_IPV6_SEND_ROUTER_SOLICIT || defined __DOXYGEN__ -#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1 +#define LWIP_IPV6_SEND_ROUTER_SOLICIT LWIP_IPV6 #endif /** * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862. */ #if !defined LWIP_IPV6_AUTOCONFIG || defined __DOXYGEN__ -#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6) +#define LWIP_IPV6_AUTOCONFIG LWIP_IPV6 +#endif + +/** + * LWIP_IPV6_ADDRESS_LIFETIMES==1: Keep valid and preferred lifetimes for each + * IPv6 address. Required for LWIP_IPV6_AUTOCONFIG. May still be enabled + * otherwise, in which case the application may assign address lifetimes with + * the appropriate macros. Addresses with no lifetime are assumed to be static. + * If this option is disabled, all addresses are assumed to be static. + */ +#if !defined LWIP_IPV6_ADDRESS_LIFETIMES || defined __DOXYGEN__ +#define LWIP_IPV6_ADDRESS_LIFETIMES LWIP_IPV6_AUTOCONFIG #endif /** @@ -2215,15 +2491,17 @@ * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC) */ #if !defined LWIP_ICMP6 || defined __DOXYGEN__ -#define LWIP_ICMP6 (LWIP_IPV6) +#define LWIP_ICMP6 LWIP_IPV6 #endif /** * LWIP_ICMP6_DATASIZE: bytes from original packet to send back in - * ICMPv6 error messages. + * ICMPv6 error messages (0 = default of IP6_MIN_MTU_LENGTH) + * ATTENTION: RFC4443 section 2.4 says IP6_MIN_MTU_LENGTH is a MUST, + * so override this only if you absolutely have to! */ #if !defined LWIP_ICMP6_DATASIZE || defined __DOXYGEN__ -#define LWIP_ICMP6_DATASIZE 8 +#define LWIP_ICMP6_DATASIZE 0 #endif /** @@ -2247,7 +2525,7 @@ * indiscriminately pass all inbound IPv6 multicast traffic to lwIP. */ #if !defined LWIP_IPV6_MLD || defined __DOXYGEN__ -#define LWIP_IPV6_MLD (LWIP_IPV6) +#define LWIP_IPV6_MLD LWIP_IPV6 #endif /** @@ -2273,7 +2551,7 @@ * is being resolved. */ #if !defined LWIP_ND6_QUEUEING || defined __DOXYGEN__ -#define LWIP_ND6_QUEUEING (LWIP_IPV6) +#define LWIP_ND6_QUEUEING LWIP_IPV6 #endif /** @@ -2394,12 +2672,60 @@ */ /** - * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful address autoconfiguration. + * @defgroup lwip_opts_dhcpv6 DHCPv6 + * @ingroup lwip_opts_ipv6 + * @{ + */ +/** + * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful/stateless address autoconfiguration. */ #if !defined LWIP_IPV6_DHCP6 || defined __DOXYGEN__ #define LWIP_IPV6_DHCP6 0 #endif +/** + * LWIP_IPV6_DHCP6_STATEFUL==1: enable DHCPv6 stateful address autoconfiguration. + * (not supported, yet!) + */ +#if !defined LWIP_IPV6_DHCP6_STATEFUL || defined __DOXYGEN__ +#define LWIP_IPV6_DHCP6_STATEFUL 0 +#endif + +/** + * LWIP_IPV6_DHCP6_STATELESS==1: enable DHCPv6 stateless address autoconfiguration. + */ +#if !defined LWIP_IPV6_DHCP6_STATELESS || defined __DOXYGEN__ +#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6 +#endif + +/** + * LWIP_DHCP6_GETS_NTP==1: Request NTP servers via DHCPv6. For each + * response packet, a callback is called, which has to be provided by the port: + * void dhcp6_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs); +*/ +#if !defined LWIP_DHCP6_GET_NTP_SRV || defined __DOXYGEN__ +#define LWIP_DHCP6_GET_NTP_SRV 0 +#endif + +/** + * The maximum of NTP servers requested + */ +#if !defined LWIP_DHCP6_MAX_NTP_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP6_MAX_NTP_SERVERS 1 +#endif + +/** + * LWIP_DHCP6_MAX_DNS_SERVERS > 0: Request DNS servers via DHCPv6. + * DNS servers received in the response are passed to DNS via @ref dns_setserver() + * (up to the maximum limit defined here). + */ +#if !defined LWIP_DHCP6_MAX_DNS_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS +#endif +/** + * @} + */ + /* --------------------------------------- ---------- Hook options --------------- @@ -2414,8 +2740,8 @@ */ /** - * LWIP_HOOK_FILENAME: Custom filename to #include in files that provide hooks. - * Declare your hook function prototypes in there, you may also #include all headers + * LWIP_HOOK_FILENAME: Custom filename to \#include in files that provide hooks. + * Declare your hook function prototypes in there, you may also \#include all headers * providing data types that are need in this file. */ #ifdef __DOXYGEN__ @@ -2431,7 +2757,9 @@ * or any other desired algorithm as a replacement. * Called from tcp_connect() and tcp_listen_input() when an ISN is needed for * a new TCP connection, if TCP support (@ref LWIP_TCP) is enabled.\n - * Signature: u32_t my_hook_tcp_isn(const ip_addr_t* local_ip, u16_t local_port, const ip_addr_t* remote_ip, u16_t remote_port); + * Signature:\code{.c} + * u32_t my_hook_tcp_isn(const ip_addr_t* local_ip, u16_t local_port, const ip_addr_t* remote_ip, u16_t remote_port); + * \endcode * - it may be necessary to use "struct ip_addr" (ip4_addr, ip6_addr) instead of "ip_addr_t" in function declarations\n * Arguments: * - local_ip: pointer to the local IP address of the connection @@ -2445,9 +2773,89 @@ #define LWIP_HOOK_TCP_ISN(local_ip, local_port, remote_ip, remote_port) #endif +/** + * LWIP_HOOK_TCP_INPACKET_PCB: + * Hook for intercepting incoming packets before they are passed to a pcb. This + * allows updating some state or even dropping a packet. + * Signature:\code{.c} + * err_t my_hook_tcp_inpkt(struct tcp_pcb *pcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, struct pbuf *p); + * \endcode + * Arguments: + * - pcb: tcp_pcb selected for input of this packet (ATTENTION: this may be + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - hdr: pointer to tcp header (ATTENTION: tcp options may not be in one piece!) + * - optlen: tcp option length + * - opt1len: tcp option length 1st part + * - opt2: if this is != NULL, tcp options are split among 2 pbufs. In that case, + * options start at right after the tcp header ('(u8_t*)(hdr + 1)') for + * the first 'opt1len' bytes and the rest starts at 'opt2'. opt2len can + * be simply calculated: 'opt2len = optlen - opt1len;' + * - p: input packet, p->payload points to application data (that's why tcp hdr + * and options are passed in seperately) + * Return value: + * - ERR_OK: continue input of this packet as normal + * - != ERR_OK: drop this packet for input (don't continue input processing) + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p) +#endif + +/** + * LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH: + * Hook for increasing the size of the options allocated with a tcp header. + * Together with LWIP_HOOK_TCP_OUT_ADD_TCPOPTS, this can be used to add custom + * options to outgoing tcp segments. + * Signature:\code{.c} + * u8_t my_hook_tcp_out_tcpopt_length(const struct tcp_pcb *pcb, u8_t internal_option_length); + * \endcode + * Arguments: + * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - internal_option_length: tcp option length used by the stack internally + * Return value: + * - a number of bytes to allocate for tcp options (internal_option_length <= ret <= 40) + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, internal_len) +#endif + +/** + * LWIP_HOOK_TCP_OUT_ADD_TCPOPTS: + * Hook for adding custom options to outgoing tcp segments. + * Space for these custom options has to be reserved via LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH. + * Signature:\code{.c} + * u32_t *my_hook_tcp_out_add_tcpopts(struct pbuf *p, struct tcp_hdr *hdr, const struct tcp_pcb *pcb, u32_t *opts); + * \endcode + * Arguments: + * - p: output packet, p->payload pointing to tcp header, data follows + * - hdr: tcp header + * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - opts: pointer where to add the custom options (there may already be options + * between the header and these) + * Return value: + * - pointer pointing directly after the inserted options + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, hdr, pcb, opts) +#endif + /** * LWIP_HOOK_IP4_INPUT(pbuf, input_netif): - * - called from ip_input() (IPv4) + * Called from ip_input() (IPv4) + * Signature:\code{.c} + * int my_hook(struct pbuf *pbuf, struct netif *input_netif); + * \endcode + * Arguments: * - pbuf: received struct pbuf passed to ip_input() * - input_netif: struct netif on which the packet has been received * Return values: @@ -2462,30 +2870,71 @@ /** * LWIP_HOOK_IP4_ROUTE(dest): - * - called from ip_route() (IPv4) + * Called from ip_route() (IPv4) + * Signature:\code{.c} + * struct netif *my_hook(const ip4_addr_t *dest); + * \endcode + * Arguments: * - dest: destination IPv4 address - * Returns the destination netif or NULL if no destination netif is found. In - * that case, ip_route() continues as normal. + * Returns values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip_route() continues as normal. */ #ifdef __DOXYGEN__ #define LWIP_HOOK_IP4_ROUTE() #endif /** - * LWIP_HOOK_IP4_ROUTE_SRC(dest, src): - * - source-based routing for IPv4 (see LWIP_HOOK_IP4_ROUTE(), src may be NULL) + * LWIP_HOOK_IP4_ROUTE_SRC(src, dest): + * Source-based routing for IPv4 - called from ip_route() (IPv4) + * Signature:\code{.c} + * struct netif *my_hook(const ip4_addr_t *src, const ip4_addr_t *dest); + * \endcode + * Arguments: + * - src: local/source IPv4 address + * - dest: destination IPv4 address + * Returns values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip_route() continues as normal. */ #ifdef __DOXYGEN__ -#define LWIP_HOOK_IP4_ROUTE_SRC(dest, src) +#define LWIP_HOOK_IP4_ROUTE_SRC(src, dest) +#endif + +/** + * LWIP_HOOK_IP4_CANFORWARD(src, dest): + * Check if an IPv4 can be forwarded - called from: + * ip4_input() -> ip4_forward() -> ip4_canforward() (IPv4) + * - source address is available via ip4_current_src_addr() + * - calling an output function in this context (e.g. multicast router) is allowed + * Signature:\code{.c} + * int my_hook(struct pbuf *p, u32_t dest_addr_hostorder); + * \endcode + * Arguments: + * - p: packet to forward + * - dest: destination IPv4 address + * Returns values: + * - 1: forward + * - 0: don't forward + * - -1: no decision. In that case, ip4_canforward() continues as normal. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP4_CANFORWARD(src, dest) #endif /** * LWIP_HOOK_ETHARP_GET_GW(netif, dest): - * - called from etharp_output() (IPv4) + * Called from etharp_output() (IPv4) + * Signature:\code{.c} + * const ip4_addr_t *my_hook(struct netif *netif, const ip4_addr_t *dest); + * \endcode + * Arguments: * - netif: the netif used for sending * - dest: the destination IPv4 address - * Returns the IPv4 address of the gateway to handle the specified destination - * IPv4 address. If NULL is returned, the netif's default gateway is used. + * Return values: + * - the IPv4 address of the gateway to handle the specified destination IPv4 address + * - NULL, in which case the netif's default gateway is used + * * The returned address MUST be directly reachable on the specified netif! * This function is meant to implement advanced IPv4 routing together with * LWIP_HOOK_IP4_ROUTE(). The actual routing/gateway table implementation is @@ -2497,7 +2946,11 @@ /** * LWIP_HOOK_IP6_INPUT(pbuf, input_netif): - * - called from ip6_input() (IPv6) + * Called from ip6_input() (IPv6) + * Signature:\code{.c} + * int my_hook(struct pbuf *pbuf, struct netif *input_netif); + * \endcode + * Arguments: * - pbuf: received struct pbuf passed to ip6_input() * - input_netif: struct netif on which the packet has been received * Return values: @@ -2512,11 +2965,16 @@ /** * LWIP_HOOK_IP6_ROUTE(src, dest): - * - called from ip6_route() (IPv6) - * - src: sourc IPv6 address + * Called from ip_route() (IPv6) + * Signature:\code{.c} + * struct netif *my_hook(const ip6_addr_t *dest, const ip6_addr_t *src); + * \endcode + * Arguments: + * - src: source IPv6 address * - dest: destination IPv6 address - * Returns the destination netif or NULL if no destination netif is found. In - * that case, ip6_route() continues as normal. + * Return values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip6_route() continues as normal. */ #ifdef __DOXYGEN__ #define LWIP_HOOK_IP6_ROUTE(src, dest) @@ -2524,11 +2982,17 @@ /** * LWIP_HOOK_ND6_GET_GW(netif, dest): - * - called from nd6_get_next_hop_entry() (IPv6) + * Called from nd6_get_next_hop_entry() (IPv6) + * Signature:\code{.c} + * const ip6_addr_t *my_hook(struct netif *netif, const ip6_addr_t *dest); + * \endcode + * Arguments: * - netif: the netif used for sending * - dest: the destination IPv6 address - * Returns the IPv6 address of the next hop to handle the specified destination - * IPv6 address. If NULL is returned, a NDP-discovered router is used instead. + * Return values: + * - the IPv6 address of the next hop to handle the specified destination IPv6 address + * - NULL, in which case a NDP-discovered router is used instead + * * The returned address MUST be directly reachable on the specified netif! * This function is meant to implement advanced IPv6 routing together with * LWIP_HOOK_IP6_ROUTE(). The actual routing/gateway table implementation is @@ -2540,7 +3004,11 @@ /** * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr): - * - called from ethernet_input() if VLAN support is enabled + * Called from ethernet_input() if VLAN support is enabled + * Signature:\code{.c} + * int my_hook(struct netif *netif, struct eth_hdr *eth_hdr, struct eth_vlan_hdr *vlan_hdr); + * \endcode + * Arguments: * - netif: struct netif on which the packet has been received * - eth_hdr: struct eth_hdr of the packet * - vlan_hdr: struct eth_vlan_hdr of the packet @@ -2557,7 +3025,9 @@ * Hook can be used to set prio_vid field of vlan_hdr. If you need to store data * on per-netif basis to implement this callback, see @ref netif_cd. * Called from ethernet_output() if VLAN support (@ref ETHARP_SUPPORT_VLAN) is enabled.\n - * Signature: s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\n + * Signature:\code{.c} + * s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\n + * \endcode * Arguments: * - netif: struct netif that the packet will be sent through * - p: struct pbuf packet to be sent @@ -2576,7 +3046,10 @@ /** * LWIP_HOOK_MEMP_AVAILABLE(memp_t_type): - * - called from memp_free() when a memp pool was empty and an item is now available + * Called from memp_free() when a memp pool was empty and an item is now available + * Signature:\code{.c} + * void my_hook(memp_t type); + * \endcode */ #ifdef __DOXYGEN__ #define LWIP_HOOK_MEMP_AVAILABLE(memp_t_type) @@ -2585,12 +3058,175 @@ /** * LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif): * Called from ethernet_input() when an unknown eth type is encountered. - * Return ERR_OK if packet is accepted, any error code otherwise. + * Signature:\code{.c} + * err_t my_hook(struct pbuf* pbuf, struct netif* netif); + * \endcode + * Arguments: + * - p: rx packet with unknown eth type + * - netif: netif on which the packet has been received + * Return values: + * - ERR_OK if packet is accepted (hook function now owns the pbuf) + * - any error code otherwise (pbuf is freed) + * * Payload points to ethernet header! */ #ifdef __DOXYGEN__ #define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif) #endif + +/** + * LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr): + * Called from various dhcp functions when sending a DHCP message. + * This hook is called just before the DHCP message trailer is added, so the + * options are at the end of a DHCP message. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg, + * u8_t msg_type, u16_t *options_len_ptr); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp: struct dhcp on that netif + * - state: current dhcp state (dhcp_state_enum_t as an u8_t) + * - msg: struct dhcp_msg that will be sent + * - msg_type: dhcp message type to be sent (u8_t) + * - options_len_ptr: pointer to the current length of options in the dhcp_msg "msg" + * (must be increased when options are added!) + * + * Options need to appended like this: + * LWIP_ASSERT("dhcp option overflow", *options_len_ptr + option_len + 2 <= DHCP_OPTIONS_LEN); + * msg->options[(*options_len_ptr)++] = <option_number>; + * msg->options[(*options_len_ptr)++] = <option_len>; + * msg->options[(*options_len_ptr)++] = <option_bytes>; + * [...] + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr) +#endif + +/** + * LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, option_value_offset): + * Called from dhcp_parse_reply when receiving a DHCP message. + * This hook is called for every option in the received message that is not handled internally. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg, + * u8_t msg_type, u8_t option, u8_t option_len, struct pbuf *pbuf, u16_t option_value_offset); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp: struct dhcp on that netif + * - state: current dhcp state (dhcp_state_enum_t as an u8_t) + * - msg: struct dhcp_msg that was received + * - msg_type: dhcp message type received (u8_t, ATTENTION: only valid after + * the message type option has been parsed!) + * - option: option value (u8_t) + * - len: option data length (u8_t) + * - pbuf: pbuf where option data is contained + * - option_value_offset: offset in pbuf where option data begins + * + * A nice way to get the option contents is pbuf_get_contiguous(): + * u8_t buf[32]; + * u8_t *ptr = (u8_t*)pbuf_get_contiguous(p, buf, sizeof(buf), LWIP_MIN(option_len, sizeof(buf)), offset); + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) +#endif + +/** + * LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len): + * Called from various dhcp6 functions when sending a DHCP6 message. + * This hook is called just before the DHCP6 message is sent, so the + * options are at the end of a DHCP6 message. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp6 *dhcp, u8_t state, struct dhcp6_msg *msg, + * u8_t msg_type, u16_t *options_len_ptr); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp6: struct dhcp6 on that netif + * - state: current dhcp6 state (dhcp6_state_enum_t as an u8_t) + * - msg: struct dhcp6_msg that will be sent + * - msg_type: dhcp6 message type to be sent (u8_t) + * - options_len_ptr: pointer to the current length of options in the dhcp6_msg "msg" + * (must be increased when options are added!) + * + * Options need to appended like this: + * u8_t *options = (u8_t *)(msg + 1); + * LWIP_ASSERT("dhcp option overflow", sizeof(struct dhcp6_msg) + *options_len_ptr + newoptlen <= max_len); + * options[(*options_len_ptr)++] = <option_data>; + * [...] + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len) +#endif + +/** + * LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) + * Called from socket API to implement setsockopt() for options not provided by lwIP. + * Core lock is held when this hook is called. + * Signature:\code{.c} + * int my_hook(int s, struct lwip_sock *sock, int level, int optname, const void *optval, socklen_t optlen, int *err) + * \endcode + * Arguments: + * - s: socket file descriptor + * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h) + * - level: protocol level at which the option resides + * - optname: option to set + * - optval: value to set + * - optlen: size of optval + * - err: output error + * Return values: + * - 0: Hook has not consumed the option, code continues as normal (to internal options) + * - != 0: Hook has consumed the option, 'err' is returned + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) +#endif + +/** + * LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err) + * Called from socket API to implement getsockopt() for options not provided by lwIP. + * Core lock is held when this hook is called. + * Signature:\code{.c} + * int my_hook(int s, struct lwip_sock *sock, int level, int optname, void *optval, socklen_t *optlen, int *err) + * \endcode + * Arguments: + * - s: socket file descriptor + * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h) + * - level: protocol level at which the option resides + * - optname: option to get + * - optval: value to get + * - optlen: size of optval + * - err: output error + * Return values: + * - 0: Hook has not consumed the option, code continues as normal (to internal options) + * - != 0: Hook has consumed the option, 'err' is returned + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err) +#endif + +/** + * LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err) + * Called from netconn APIs (not usable with callback apps) allowing an + * external DNS resolver (which uses sequential API) to handle the query. + * Signature:\code{.c} + * int my_hook(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err) + * \endcode + * Arguments: + * - name: hostname to resolve + * - addr: output host address + * - addrtype: type of address to query + * - err: output error + * Return values: + * - 0: Hook has not consumed hostname query, query continues into DNS module + * - != 0: Hook has consumed the query + * + * err must also be checked to determine if the hook consumed the query, but + * the query failed + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err) +#endif /** * @} */ @@ -2849,10 +3485,23 @@ #define IP6_DEBUG LWIP_DBG_OFF #endif +/** + * DHCP6_DEBUG: Enable debugging in dhcp6.c. + */ +#if !defined DHCP6_DEBUG || defined __DOXYGEN__ +#define DHCP6_DEBUG LWIP_DBG_OFF +#endif /** * @} */ +/** + * LWIP_TESTMODE: Changes to make unit test possible + */ +#if !defined LWIP_TESTMODE +#define LWIP_TESTMODE 0 +#endif + /* -------------------------------------------------- ---------- Performance tracking options ---------- diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pbuf.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/pbuf.h similarity index 68% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pbuf.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/pbuf.h index c252fbc..e5daf96 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/pbuf.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/pbuf.h @@ -40,7 +40,6 @@ #include "lwip/opt.h" #include "lwip/err.h" -#include "wm_socket.h" #ifdef __cplusplus extern "C" { @@ -56,6 +55,23 @@ extern "C" { #define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) #endif +/** @ingroup pbuf + * PBUF_NEEDS_COPY(p): return a boolean value indicating whether the given + * pbuf needs to be copied in order to be kept around beyond the current call + * stack without risking being corrupted. The default setting provides safety: + * it will make a copy iof any pbuf chain that does not consist entirely of + * PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined + * to evaluate to true in all cases, for example. However, doing so also has an + * effect on the application side: any buffers that are *not* copied must also + * *not* be reused by the application after passing them to lwIP. For example, + * when setting PBUF_NEEDS_COPY to (0), after using udp_send() with a PBUF_RAM + * pbuf, the application must free the pbuf immediately, rather than reusing it + * for other purposes. For more background information on this, see tasks #6735 + * and #7896, and bugs #11400 and #49914. */ +#ifndef PBUF_NEEDS_COPY +#define PBUF_NEEDS_COPY(p) ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE) +#endif /* PBUF_NEEDS_COPY */ + /* @todo: We need a mechanism to prevent wasting memory in every pbuf (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */ @@ -66,7 +82,6 @@ extern "C" { #define PBUF_IP_HLEN 20 #endif -#if 0 /** * @ingroup pbuf * Enumeration of pbuf layers @@ -75,27 +90,54 @@ typedef enum { /** Includes spare room for transport layer header, e.g. UDP header. * Use this if you intend to pass the pbuf to functions like udp_send(). */ - PBUF_TRANSPORT, + PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN, /** Includes spare room for IP header. * Use this if you intend to pass the pbuf to functions like raw_send(). */ - PBUF_IP, + PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN, /** Includes spare room for link layer header (ethernet header). * Use this if you intend to pass the pbuf to functions like ethernet_output(). * @see PBUF_LINK_HLEN */ - PBUF_LINK, + PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN, /** Includes spare room for additional encapsulation header before ethernet * headers (e.g. 802.11). * Use this if you intend to pass the pbuf to functions like netif->linkoutput(). * @see PBUF_LINK_ENCAPSULATION_HLEN */ - PBUF_RAW_TX, + PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN, /** Use this for input packets in a netif driver when calling netif->input() * in the most common case - ethernet-layer netif driver. */ - PBUF_RAW + PBUF_RAW = 0 } pbuf_layer; + +/* Base flags for pbuf_type definitions: */ + +/** Indicates that the payload directly follows the struct pbuf. + * This makes @ref pbuf_header work in both directions. */ +#define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS 0x80 +/** Indicates the data stored in this pbuf can change. If this pbuf needs + * to be queued, it must be copied/duplicated. */ +#define PBUF_TYPE_FLAG_DATA_VOLATILE 0x40 +/** 4 bits are reserved for 16 allocation sources (e.g. heap, pool1, pool2, etc) + * Internally, we use: 0=heap, 1=MEMP_PBUF, 2=MEMP_PBUF_POOL -> 13 types free*/ +#define PBUF_TYPE_ALLOC_SRC_MASK 0x0F +/** Indicates this pbuf is used for RX (if not set, indicates use for TX). + * This information can be used to keep some spare RX buffers e.g. for + * receiving TCP ACKs to unblock a connection) */ +#define PBUF_ALLOC_FLAG_RX 0x0100 +/** Indicates the application needs the pbuf payload to be in one piece */ +#define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS 0x0200 + +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP 0x00 +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF 0x01 +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL 0x02 +/** First pbuf allocation type for applications */ +#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN 0x03 +/** Last pbuf allocation type for applications */ +#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX PBUF_TYPE_ALLOC_SRC_MASK + /** * @ingroup pbuf * Enumeration of pbuf types @@ -107,24 +149,24 @@ typedef enum { pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might change in future versions). This should be used for all OUTGOING packets (TX).*/ - PBUF_RAM, + PBUF_RAM = (PBUF_ALLOC_FLAG_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP), /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in totally different memory areas. Since it points to ROM, payload does not have to be copied when queued for transmission. */ - PBUF_ROM, + PBUF_ROM = PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF, /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change so it has to be duplicated when queued before transmitting, depending on who has a 'ref' to it. */ - PBUF_REF, + PBUF_REF = (PBUF_TYPE_FLAG_DATA_VOLATILE | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF), /** pbuf payload refers to RAM. This one comes from a pool and should be used for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct pbuf and its payload are allocated in one piece of contiguous memory (so the first payload byte can be calculated from struct pbuf). Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, you are unable to receive TCP acks! */ - PBUF_POOL + PBUF_POOL = (PBUF_ALLOC_FLAG_RX | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) } pbuf_type; -#endif + /** indicates this packet's data should be immediately passed to the application */ #define PBUF_FLAG_PUSH 0x01U @@ -139,7 +181,7 @@ typedef enum { #define PBUF_FLAG_LLMCAST 0x10U /** indicates this pbuf includes a TCP FIN flag */ #define PBUF_FLAG_TCP_FIN 0x20U -#if 0 + /** Main packet buffer struct */ struct pbuf { /** next pbuf in singly linked pbuf chain */ @@ -160,8 +202,10 @@ struct pbuf { /** length of this buffer */ u16_t len; - /** pbuf_type as u8_t instead of enum to save space */ - u8_t /*pbuf_type*/ type; + /** a bit field indicating pbuf type and allocation sources + (see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK) + */ + u8_t type_internal; /** misc flags */ u8_t flags; @@ -171,9 +215,15 @@ struct pbuf { * that refer to this pbuf. This can be pointers from an application, * the stack itself, or pbuf->next pointers from a chain. */ - u16_t ref; + LWIP_PBUF_REF_T ref; + + /** For incoming packets, this contains the input netif's index */ + u8_t if_idx; + + /** In case the user needs to store data custom data on a pbuf */ + LWIP_PBUF_CUSTOM_DATA }; -#endif + /** Helper struct for const-correctness only. * The only meaning of this one is to provide a const payload pointer @@ -222,27 +272,38 @@ void pbuf_free_ooseq(void); /* Initializes the pbuf module. This call is empty for now, but may not be in future. */ #define pbuf_init() -//struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); +struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); +struct pbuf *pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type); #if LWIP_SUPPORT_CUSTOM_PBUF struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, void *payload_mem, u16_t payload_mem_len); #endif /* LWIP_SUPPORT_CUSTOM_PBUF */ void pbuf_realloc(struct pbuf *p, u16_t size); +#define pbuf_get_allocsrc(p) ((p)->type_internal & PBUF_TYPE_ALLOC_SRC_MASK) +#define pbuf_match_allocsrc(p, type) (pbuf_get_allocsrc(p) == ((type) & PBUF_TYPE_ALLOC_SRC_MASK)) +#define pbuf_match_type(p, type) pbuf_match_allocsrc(p, type) u8_t pbuf_header(struct pbuf *p, s16_t header_size); u8_t pbuf_header_force(struct pbuf *p, s16_t header_size); +u8_t pbuf_add_header(struct pbuf *p, size_t header_size_increment); +u8_t pbuf_add_header_force(struct pbuf *p, size_t header_size_increment); +u8_t pbuf_remove_header(struct pbuf *p, size_t header_size); +struct pbuf *pbuf_free_header(struct pbuf *q, u16_t size); void pbuf_ref(struct pbuf *p); -//u8_t pbuf_free(struct pbuf *p); +u8_t pbuf_free(struct pbuf *p); u16_t pbuf_clen(const struct pbuf *p); void pbuf_cat(struct pbuf *head, struct pbuf *tail); void pbuf_chain(struct pbuf *head, struct pbuf *tail); struct pbuf *pbuf_dechain(struct pbuf *p); err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from); -//u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset); +err_t pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset); +u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset); +void *pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset); err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset); struct pbuf *pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset); struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); +struct pbuf *pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p); #if LWIP_CHECKSUM_ON_COPY err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, u16_t len, u16_t *chksum); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/altcp_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/altcp_priv.h new file mode 100644 index 0000000..d1de9b1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/altcp_priv.h @@ -0,0 +1,159 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_PRIV_H +#define LWIP_HDR_ALTCP_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb *altcp_alloc(void); +void altcp_free(struct altcp_pcb *conn); + +/* Function prototypes for application layers */ +typedef void (*altcp_set_poll_fn)(struct altcp_pcb *conn, u8_t interval); +typedef void (*altcp_recved_fn)(struct altcp_pcb *conn, u16_t len); +typedef err_t (*altcp_bind_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +typedef err_t (*altcp_connect_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected); + +typedef struct altcp_pcb *(*altcp_listen_fn)(struct altcp_pcb *conn, u8_t backlog, err_t *err); + +typedef void (*altcp_abort_fn)(struct altcp_pcb *conn); +typedef err_t (*altcp_close_fn)(struct altcp_pcb *conn); +typedef err_t (*altcp_shutdown_fn)(struct altcp_pcb *conn, int shut_rx, int shut_tx); + +typedef err_t (*altcp_write_fn)(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +typedef err_t (*altcp_output_fn)(struct altcp_pcb *conn); + +typedef u16_t (*altcp_mss_fn)(struct altcp_pcb *conn); +typedef u16_t (*altcp_sndbuf_fn)(struct altcp_pcb *conn); +typedef u16_t (*altcp_sndqueuelen_fn)(struct altcp_pcb *conn); +typedef void (*altcp_nagle_disable_fn)(struct altcp_pcb *conn); +typedef void (*altcp_nagle_enable_fn)(struct altcp_pcb *conn); +typedef int (*altcp_nagle_disabled_fn)(struct altcp_pcb *conn); + +typedef void (*altcp_setprio_fn)(struct altcp_pcb *conn, u8_t prio); + +typedef void (*altcp_dealloc_fn)(struct altcp_pcb *conn); + +typedef err_t (*altcp_get_tcp_addrinfo_fn)(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +typedef ip_addr_t *(*altcp_get_ip_fn)(struct altcp_pcb *conn, int local); +typedef u16_t (*altcp_get_port_fn)(struct altcp_pcb *conn, int local); + +#if LWIP_TCP_KEEPALIVE +typedef void (*altcp_keepalive_disable_fn)(struct altcp_pcb *conn); +typedef void (*altcp_keepalive_enable_fn)(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif + +#ifdef LWIP_DEBUG +typedef enum tcp_state (*altcp_dbg_get_tcp_state_fn)(struct altcp_pcb *conn); +#endif + +struct altcp_functions { + altcp_set_poll_fn set_poll; + altcp_recved_fn recved; + altcp_bind_fn bind; + altcp_connect_fn connect; + altcp_listen_fn listen; + altcp_abort_fn abort; + altcp_close_fn close; + altcp_shutdown_fn shutdown; + altcp_write_fn write; + altcp_output_fn output; + altcp_mss_fn mss; + altcp_sndbuf_fn sndbuf; + altcp_sndqueuelen_fn sndqueuelen; + altcp_nagle_disable_fn nagle_disable; + altcp_nagle_enable_fn nagle_enable; + altcp_nagle_disabled_fn nagle_disabled; + altcp_setprio_fn setprio; + altcp_dealloc_fn dealloc; + altcp_get_tcp_addrinfo_fn addrinfo; + altcp_get_ip_fn getip; + altcp_get_port_fn getport; +#if LWIP_TCP_KEEPALIVE + altcp_keepalive_disable_fn keepalive_disable; + altcp_keepalive_enable_fn keepalive_enable; +#endif +#ifdef LWIP_DEBUG + altcp_dbg_get_tcp_state_fn dbg_get_tcp_state; +#endif +}; + +void altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval); +void altcp_default_recved(struct altcp_pcb *conn, u16_t len); +err_t altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +err_t altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); +err_t altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +err_t altcp_default_output(struct altcp_pcb *conn); +u16_t altcp_default_mss(struct altcp_pcb *conn); +u16_t altcp_default_sndbuf(struct altcp_pcb *conn); +u16_t altcp_default_sndqueuelen(struct altcp_pcb *conn); +void altcp_default_nagle_disable(struct altcp_pcb *conn); +void altcp_default_nagle_enable(struct altcp_pcb *conn); +int altcp_default_nagle_disabled(struct altcp_pcb *conn); +void altcp_default_setprio(struct altcp_pcb *conn, u8_t prio); +void altcp_default_dealloc(struct altcp_pcb *conn); +err_t altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_default_get_ip(struct altcp_pcb *conn, int local); +u16_t altcp_default_get_port(struct altcp_pcb *conn, int local); +#if LWIP_TCP_KEEPALIVE +void altcp_default_keepalive_disable(struct altcp_pcb *conn); +void altcp_default_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif +#ifdef LWIP_DEBUG +enum tcp_state altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/api_msg.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/api_msg.h similarity index 80% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/api_msg.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/api_msg.h index f12b8b7..9e8ffc9 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/api_msg.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/api_msg.h @@ -39,10 +39,6 @@ #include "lwip/opt.h" -#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ -/* Note: Netconn API is always available when sockets are enabled - - * sockets are implemented on top of them */ - #include "lwip/arch.h" #include "lwip/ip_addr.h" #include "lwip/err.h" @@ -55,6 +51,10 @@ extern "C" { #endif +#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ +/* Note: Netconn API is always available when sockets are enabled - + * sockets are implemented on top of them */ + #if LWIP_MPU_COMPATIBLE #if LWIP_NETCONN_SEM_PER_THREAD #define API_MSG_M_DEF_SEM(m) *m @@ -94,6 +94,7 @@ struct api_msg { struct { API_MSG_M_DEF_C(ip_addr_t, ipaddr); u16_t port; + u8_t if_idx; } bc; /** used for lwip_netconn_do_getaddr */ struct { @@ -103,8 +104,16 @@ struct api_msg { } ad; /** used for lwip_netconn_do_write */ struct { - const void *dataptr; + /** current vector to write */ + const struct netvector *vector; + /** number of unwritten vectors */ + u16_t vector_cnt; + /** offset into current vector */ + size_t vector_off; + /** total length across vectors */ size_t len; + /** offset into total length/output of bytes written when err == ERR_OK */ + size_t offset; u8_t apiflags; #if LWIP_SO_SNDTIMEO u32_t time_started; @@ -112,7 +121,7 @@ struct api_msg { } w; /** used for lwip_netconn_do_recv */ struct { - u32_t len; + size_t len; } r; #if LWIP_TCP /** used for lwip_netconn_do_close (/shutdown) */ @@ -130,6 +139,7 @@ struct api_msg { struct { API_MSG_M_DEF_C(ip_addr_t, multiaddr); API_MSG_M_DEF_C(ip_addr_t, netif_addr); + u8_t if_idx; enum netconn_igmp join_or_leave; } jl; #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ @@ -177,13 +187,14 @@ struct dns_api_msg { }; #endif /* LWIP_DNS */ -#if LWIP_TCP -extern u8_t netconn_aborted; -#endif /* LWIP_TCP */ - +#if LWIP_NETCONN_FULLDUPLEX +int lwip_netconn_is_deallocated_msg(void *msg); +#endif +int lwip_netconn_is_err_msg(void *msg, err_t *err); void lwip_netconn_do_newconn (void *m); void lwip_netconn_do_delconn (void *m); void lwip_netconn_do_bind (void *m); +void lwip_netconn_do_bind_if (void *m); void lwip_netconn_do_connect (void *m); void lwip_netconn_do_disconnect (void *m); void lwip_netconn_do_listen (void *m); @@ -198,6 +209,7 @@ void lwip_netconn_do_close (void *m); void lwip_netconn_do_shutdown (void *m); #if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) void lwip_netconn_do_join_leave_group(void *m); +void lwip_netconn_do_join_leave_group_netif(void *m); #endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ #if LWIP_DNS @@ -207,10 +219,54 @@ void lwip_netconn_do_gethostbyname(void *arg); struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); void netconn_free(struct netconn *conn); +#endif /* LWIP_NETCONN || LWIP_SOCKET */ + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +/* netifapi related lwIP internal definitions */ + +#if LWIP_MPU_COMPATIBLE +#define NETIFAPI_IPADDR_DEF(type, m) type m +#else /* LWIP_MPU_COMPATIBLE */ +#define NETIFAPI_IPADDR_DEF(type, m) const type * m +#endif /* LWIP_MPU_COMPATIBLE */ + +typedef void (*netifapi_void_fn)(struct netif *netif); +typedef err_t (*netifapi_errt_fn)(struct netif *netif); + +struct netifapi_msg { + struct tcpip_api_call_data call; + struct netif *netif; + union { + struct { +#if LWIP_IPV4 + NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr); + NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask); + NETIFAPI_IPADDR_DEF(ip4_addr_t, gw); +#endif /* LWIP_IPV4 */ + void *state; + netif_init_fn init; + netif_input_fn input; + } add; + struct { + netifapi_void_fn voidfunc; + netifapi_errt_fn errtfunc; + } common; + struct { +#if LWIP_MPU_COMPATIBLE + char name[NETIF_NAMESIZE]; +#else /* LWIP_MPU_COMPATIBLE */ + char *name; +#endif /* LWIP_MPU_COMPATIBLE */ + u8_t index; + } ifs; + } msg; +}; + +#endif /* LWIP_NETIF_API */ + #ifdef __cplusplus } #endif -#endif /* LWIP_NETCONN || LWIP_SOCKET */ - #endif /* LWIP_HDR_API_MSG_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/mem_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/mem_priv.h new file mode 100644 index 0000000..8630d75 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/mem_priv.h @@ -0,0 +1,84 @@ +/** + * @file + * lwIP internal memory implementations (do not use in application code) + */ + +/* + * Copyright (c) 2018 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_MEM_PRIV_H +#define LWIP_HDR_MEM_PRIV_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/mem.h" + +#if MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK +/* if MEM_OVERFLOW_CHECK or MEMP_OVERFLOW_CHECK is turned on, we reserve some + * bytes at the beginning and at the end of each element, initialize them as + * 0xcd and check them later. + * If MEM(P)_OVERFLOW_CHECK is >= 2, on every call to mem(p)_malloc or mem(p)_free, + * every single element in each pool/heap is checked! + * This is VERY SLOW but also very helpful. + * MEM_SANITY_REGION_BEFORE and MEM_SANITY_REGION_AFTER can be overridden in + * lwipopts.h to change the amount reserved for checking. */ +#ifndef MEM_SANITY_REGION_BEFORE +#define MEM_SANITY_REGION_BEFORE 16 +#endif /* MEM_SANITY_REGION_BEFORE*/ +#if MEM_SANITY_REGION_BEFORE > 0 +#define MEM_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_BEFORE) +#else +#define MEM_SANITY_REGION_BEFORE_ALIGNED 0 +#endif /* MEM_SANITY_REGION_BEFORE*/ +#ifndef MEM_SANITY_REGION_AFTER +#define MEM_SANITY_REGION_AFTER 16 +#endif /* MEM_SANITY_REGION_AFTER*/ +#if MEM_SANITY_REGION_AFTER > 0 +#define MEM_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_AFTER) +#else +#define MEM_SANITY_REGION_AFTER_ALIGNED 0 +#endif /* MEM_SANITY_REGION_AFTER*/ + +void mem_overflow_init_raw(void *p, size_t size); +void mem_overflow_check_raw(void *p, size_t size, const char *descr1, const char *descr2); + +#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MEMP_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_priv.h similarity index 80% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_priv.h index f246061..1f14cb1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_priv.h @@ -45,36 +45,14 @@ extern "C" { #endif #include "lwip/mem.h" +#include "lwip/priv/mem_priv.h" #if MEMP_OVERFLOW_CHECK -/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning - * and at the end of each element, initialize them as 0xcd and check - * them later. */ -/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free, - * every single element in each pool is checked! - * This is VERY SLOW but also very helpful. */ -/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in - * lwipopts.h to change the amount reserved for checking. */ -#ifndef MEMP_SANITY_REGION_BEFORE -#define MEMP_SANITY_REGION_BEFORE 16 -#endif /* MEMP_SANITY_REGION_BEFORE*/ -#if MEMP_SANITY_REGION_BEFORE > 0 -#define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE) -#else -#define MEMP_SANITY_REGION_BEFORE_ALIGNED 0 -#endif /* MEMP_SANITY_REGION_BEFORE*/ -#ifndef MEMP_SANITY_REGION_AFTER -#define MEMP_SANITY_REGION_AFTER 16 -#endif /* MEMP_SANITY_REGION_AFTER*/ -#if MEMP_SANITY_REGION_AFTER > 0 -#define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER) -#else -#define MEMP_SANITY_REGION_AFTER_ALIGNED 0 -#endif /* MEMP_SANITY_REGION_AFTER*/ + /* MEMP_SIZE: save space for struct memp and for sanity check */ -#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED) -#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED) +#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEM_SANITY_REGION_BEFORE_ALIGNED) +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEM_SANITY_REGION_AFTER_ALIGNED) #else /* MEMP_OVERFLOW_CHECK */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_std.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_std.h similarity index 88% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_std.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_std.h index ce9fd50..669ad4d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/memp_std.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/memp_std.h @@ -28,7 +28,7 @@ #ifndef LWIP_PBUF_MEMPOOL /* This treats "pbuf pools" just like any other pool. * Allocates buffers for a pbuf struct AND a payload size */ -#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc) +#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) + LWIP_MEM_ALIGN_SIZE(payload)), desc) #endif /* LWIP_PBUF_MEMPOOL */ @@ -52,6 +52,10 @@ LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_lis LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") #endif /* LWIP_TCP */ +#if LWIP_ALTCP && LWIP_TCP +LWIP_MEMPOOL(ALTCP_PCB, MEMP_NUM_ALTCP_PCB, sizeof(struct altcp_pcb), "ALTCP_PCB") +#endif /* LWIP_ALTCP && LWIP_TCP */ + #if LWIP_IPV4 && IP_REASSEMBLY LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") #endif /* LWIP_IPV4 && IP_REASSEMBLY */ @@ -74,6 +78,9 @@ LWIP_MEMPOOL(DNS_API_MSG, MEMP_NUM_DNS_API_MSG, sizeof(struct dns_api_msg #if LWIP_SOCKET && !LWIP_TCPIP_CORE_LOCKING LWIP_MEMPOOL(SOCKET_SETGETSOCKOPT_DATA, MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA, sizeof(struct lwip_setgetsockopt_data), "SOCKET_SETGETSOCKOPT_DATA") #endif +#if LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL) +LWIP_MEMPOOL(SELECT_CB, MEMP_NUM_SELECT_CB, sizeof(struct lwip_select_cb), "SELECT_CB") +#endif /* LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL) */ #if LWIP_NETIF_API LWIP_MEMPOOL(NETIFAPI_MSG, MEMP_NUM_NETIFAPI_MSG, sizeof(struct netifapi_msg), "NETIFAPI_MSG") #endif @@ -103,15 +110,15 @@ LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, #endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ #if LWIP_IPV6 && LWIP_ND6_QUEUEING -LWIP_MEMPOOL(ND6_QUEUE, MEMP_NUM_ND6_QUEUE, sizeof(struct nd6_q_entry), "ND6_QUEUE") +LWIP_MEMPOOL(ND6_QUEUE, MEMP_NUM_ND6_QUEUE, sizeof(struct nd6_q_entry), "ND6_QUEUE") #endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */ #if LWIP_IPV6 && LWIP_IPV6_REASS -LWIP_MEMPOOL(IP6_REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip6_reassdata), "IP6_REASSDATA") +LWIP_MEMPOOL(IP6_REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip6_reassdata), "IP6_REASSDATA") #endif /* LWIP_IPV6 && LWIP_IPV6_REASS */ #if LWIP_IPV6 && LWIP_IPV6_MLD -LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), "MLD6_GROUP") +LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), "MLD6_GROUP") #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ @@ -123,7 +130,7 @@ LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), * This allocates enough space for the pbuf struct and a payload. * (Example: pbuf_payload_size=0 allocates only size for the struct) */ -LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM") +LWIP_MEMPOOL(PBUF, MEMP_NUM_PBUF, sizeof(struct pbuf), "PBUF_REF/ROM") LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/nd6_priv.h similarity index 89% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/nd6_priv.h index 4bda0b7..cc3007d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/nd6_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/nd6_priv.h @@ -83,7 +83,7 @@ struct nd6_neighbor_cache_entry { u8_t state; u8_t isrouter; union { - u32_t reachable_time; /* in ms since value may originate from network packet */ + u32_t reachable_time; /* in seconds */ u32_t delay_time; /* ticks (ND6_TMR_INTERVAL) */ u32_t probes_sent; u32_t stale_time; /* ticks (ND6_TMR_INTERVAL) */ @@ -100,18 +100,12 @@ struct nd6_destination_cache_entry { struct nd6_prefix_list_entry { ip6_addr_t prefix; struct netif *netif; - u32_t invalidation_timer; /* in ms since value may originate from network packet */ -#if LWIP_IPV6_AUTOCONFIG - u8_t flags; -#define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01 -#define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02 -#define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04 -#endif /* LWIP_IPV6_AUTOCONFIG */ + u32_t invalidation_timer; /* in seconds */ }; struct nd6_router_list_entry { struct nd6_neighbor_cache_entry *neighbor_entry; - u32_t invalidation_timer; /* in ms since value may originate from network packet */ + u32_t invalidation_timer; /* in seconds */ u8_t flags; }; @@ -124,6 +118,10 @@ enum nd6_neighbor_cache_entry_state { ND6_PROBE }; +#define ND6_HOPLIM 255 /* maximum hop limit, required in all ND packets */ + +#define ND6_2HRS 7200 /* two hours, expressed in number of seconds */ + /* Router tables. */ /* @todo make these static? and entries accessible through API? */ extern struct nd6_neighbor_cache_entry neighbor_cache[]; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/raw_priv.h similarity index 64% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/raw_priv.h index 6f302aa..d4561d4 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/PP_Macro.cs +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/raw_priv.h @@ -1,4 +1,9 @@ -/* +/** + * @file + * raw API internal implementations (do not use in application code) + */ + +/* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * @@ -26,34 +31,39 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Martin Hentschel + * Author: Adam Dunkels * */ +#ifndef LWIP_HDR_RAW_PRIV_H +#define LWIP_HDR_RAW_PRIV_H -namespace CCodeGeneration +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/raw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** return codes for raw_input */ +typedef enum raw_input_state { - public class PP_Macro: CodeElement - { - public string Name { get; set; } - public string Value { get; set; } + RAW_INPUT_NONE = 0, /* pbuf did not match any pcbs */ + RAW_INPUT_EATEN, /* pbuf handed off and delivered to pcb */ + RAW_INPUT_DELIVERED /* pbuf only delivered to pcb (pbuf can still be referenced) */ +} raw_input_state_t; - public PP_Macro() - { - } +/* The following functions are the lower layer interface to RAW. */ +raw_input_state_t raw_input(struct pbuf *p, struct netif *inp); - public PP_Macro(string name, string value) - { - this.Name = name; - this.Value = value; - } +void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); - - public override void GenerateCode(int level, CGenerator generator) - { - // macros are not indented at all - generator.OutputStream.Write("#define " + this.Name + " "); - generator.WriteMultilineString(this.Value); - generator.WriteNewLine(); - } - } +#ifdef __cplusplus } +#endif + +#endif /* LWIP_RAW */ + +#endif /* LWIP_HDR_RAW_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/sockets_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/sockets_priv.h new file mode 100644 index 0000000..d8f9904 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/sockets_priv.h @@ -0,0 +1,175 @@ +/** + * @file + * Sockets API internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Joel Cunningham + * + */ +#ifndef LWIP_HDR_SOCKETS_PRIV_H +#define LWIP_HDR_SOCKETS_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NUM_SOCKETS MEMP_NUM_NETCONN + +/** This is overridable for the rare case where more than 255 threads + * select on the same socket... + */ +#ifndef SELWAIT_T +#define SELWAIT_T u8_t +#endif + +union lwip_sock_lastdata { + struct netbuf *netbuf; + struct pbuf *pbuf; +}; + +/** Contains all internal pointers and states used for a socket */ +struct lwip_sock { + /** sockets currently are built on netconns, each socket has one netconn */ + struct netconn *conn; + /** data that was left from the previous read */ + union lwip_sock_lastdata lastdata; +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL + /** number of times data was received, set by event_callback(), + tested by the receive and select functions */ + s16_t rcvevent; + /** number of times data was ACKed (free send buffer), set by event_callback(), + tested by select */ + u16_t sendevent; + /** error happened for this socket, set by event_callback(), tested by select */ + u16_t errevent; + /** counter of how many threads are waiting for this socket using select */ + SELWAIT_T select_waiting; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ +#if LWIP_NETCONN_FULLDUPLEX + /* counter of how many threads are using a struct lwip_sock (not the 'int') */ + u8_t fd_used; + /* status of pending close/delete actions */ + u8_t fd_free_pending; +#define LWIP_SOCK_FD_FREE_TCP 1 +#define LWIP_SOCK_FD_FREE_FREE 2 +#endif +}; + +#ifndef set_errno +#define set_errno(err) do { if (err) { errno = (err); } } while(0) +#endif + +#if !LWIP_TCPIP_CORE_LOCKING +/** Maximum optlen used by setsockopt/getsockopt */ +#define LWIP_SETGETSOCKOPT_MAXOPTLEN LWIP_MAX(16, sizeof(struct ifreq)) + +/** This struct is used to pass data to the set/getsockopt_internal + * functions running in tcpip_thread context (only a void* is allowed) */ +struct lwip_setgetsockopt_data { + /** socket index for which to change options */ + int s; + /** level of the option to process */ + int level; + /** name of the option to process */ + int optname; + /** set: value to set the option to + * get: value of the option is stored here */ +#if LWIP_MPU_COMPATIBLE + u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN]; +#else + union { + void *p; + const void *pc; + } optval; +#endif + /** size of *optval */ + socklen_t optlen; + /** if an error occurs, it is temporarily stored here */ + int err; + /** semaphore to wake up the calling task */ + void* completed_sem; +}; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + +#ifdef __cplusplus +} +#endif + +struct lwip_sock* lwip_socket_dbg_get_socket(int fd); + +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL + +#if LWIP_NETCONN_SEM_PER_THREAD +#define SELECT_SEM_T sys_sem_t* +#define SELECT_SEM_PTR(sem) (sem) +#else /* LWIP_NETCONN_SEM_PER_THREAD */ +#define SELECT_SEM_T sys_sem_t +#define SELECT_SEM_PTR(sem) (&(sem)) +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + +/** Description for a task waiting in select */ +struct lwip_select_cb { + /** Pointer to the next waiting task */ + struct lwip_select_cb *next; + /** Pointer to the previous waiting task */ + struct lwip_select_cb *prev; +#if LWIP_SOCKET_SELECT + /** readset passed to select */ + fd_set *readset; + /** writeset passed to select */ + fd_set *writeset; + /** unimplemented: exceptset passed to select */ + fd_set *exceptset; +#endif /* LWIP_SOCKET_SELECT */ +#if LWIP_SOCKET_POLL + /** fds passed to poll; NULL if select */ + struct pollfd *poll_fds; + /** nfds passed to poll; 0 if select */ + nfds_t poll_nfds; +#endif /* LWIP_SOCKET_POLL */ + /** don't signal the same semaphore twice: set to 1 when signalled */ + int sem_signalled; + /** semaphore to wake up a task waiting for select */ + SELECT_SEM_T sem; +}; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + +#endif /* LWIP_SOCKET */ + +#endif /* LWIP_HDR_SOCKETS_PRIV_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcp_priv.h similarity index 90% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcp_priv.h index f6524b5..72f9126 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcp_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcp_priv.h @@ -77,9 +77,12 @@ void tcp_txnow (void); void tcp_input (struct pbuf *p, struct netif *inp); /* Used within the TCP code only: */ struct tcp_pcb * tcp_alloc (u8_t prio); +void tcp_free (struct tcp_pcb *pcb); void tcp_abandon (struct tcp_pcb *pcb, int reset); err_t tcp_send_empty_ack(struct tcp_pcb *pcb); -void tcp_rexmit (struct tcp_pcb *pcb); +err_t tcp_rexmit (struct tcp_pcb *pcb); +err_t tcp_rexmit_rto_prepare(struct tcp_pcb *pcb); +void tcp_rexmit_rto_commit(struct tcp_pcb *pcb); void tcp_rexmit_rto (struct tcp_pcb *pcb); void tcp_rexmit_fast (struct tcp_pcb *pcb); u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); @@ -131,12 +134,12 @@ err_t tcp_process_refused_data(struct tcp_pcb *pcb); #define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ #ifndef TCP_MSL -#define TCP_MSL 1000UL//60000UL /* The maximum segment lifetime in milliseconds */ +#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ #endif /* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ #ifndef TCP_KEEPIDLE_DEFAULT -#define TCP_KEEPIDLE_DEFAULT 200000UL //7200000UL /* Default KEEPALIVE timer in milliseconds */ +#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ #endif #ifndef TCP_KEEPINTVL_DEFAULT @@ -174,6 +177,8 @@ err_t tcp_process_refused_data(struct tcp_pcb *pcb); ret = lwip_tcp_event((pcb)->callback_arg, (pcb), LWIP_EVENT_POLL, NULL, 0, ERR_OK); \ } else { \ ret = ERR_ARG; } } while(0) +/* For event API, last state SYN_RCVD must be excluded here: the application + has not seen this pcb, yet! */ #define TCP_EVENT_ERR(last_state,errf,arg,err) do { if (last_state != SYN_RCVD) { \ lwip_tcp_event((arg), NULL, LWIP_EVENT_ERR, NULL, 0, (err)); } } while(0) @@ -259,11 +264,12 @@ struct tcp_seg { u8_t chksum_swapped; #endif /* TCP_CHECKSUM_ON_COPY */ u8_t flags; -#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ +#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option (only used in SYN segments) */ #define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ #define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is checksummed into 'chksum' */ -#define TF_SEG_OPTS_WND_SCALE (u8_t)0x08U /* Include WND SCALE option */ +#define TF_SEG_OPTS_WND_SCALE (u8_t)0x08U /* Include WND SCALE option (only used in SYN segments) */ +#define TF_SEG_OPTS_SACK_PERM (u8_t)0x10U /* Include SACK Permitted option (only used in SYN segments) */ struct tcp_hdr *tcphdr; /* the TCP header */ }; @@ -271,6 +277,7 @@ struct tcp_seg { #define LWIP_TCP_OPT_NOP 1 #define LWIP_TCP_OPT_MSS 2 #define LWIP_TCP_OPT_WS 3 +#define LWIP_TCP_OPT_SACK_PERM 4 #define LWIP_TCP_OPT_TS 8 #define LWIP_TCP_OPT_LEN_MSS 4 @@ -287,10 +294,18 @@ struct tcp_seg { #define LWIP_TCP_OPT_LEN_WS_OUT 0 #endif +#if LWIP_TCP_SACK_OUT +#define LWIP_TCP_OPT_LEN_SACK_PERM 2 +#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 4 /* aligned for output (includes NOP padding) */ +#else +#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 0 +#endif + #define LWIP_TCP_OPT_LENGTH(flags) \ - (flags & TF_SEG_OPTS_MSS ? LWIP_TCP_OPT_LEN_MSS : 0) + \ - (flags & TF_SEG_OPTS_TS ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \ - (flags & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0) + ((flags) & TF_SEG_OPTS_MSS ? LWIP_TCP_OPT_LEN_MSS : 0) + \ + ((flags) & TF_SEG_OPTS_TS ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \ + ((flags) & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0) + \ + ((flags) & TF_SEG_OPTS_SACK_PERM ? LWIP_TCP_OPT_LEN_SACK_PERM_OUT : 0) /** This returns a TCP header option for MSS in an u32_t */ #define TCP_BUILD_MSS_OPTION(mss) lwip_htonl(0x02040000 | ((mss) & 0xFFFF)) @@ -342,7 +357,7 @@ extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS]; #if TCP_DEBUG_PCB_LISTS #define TCP_REG(pcbs, npcb) do {\ struct tcp_pcb *tcp_tmp_pcb; \ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %"U16_F"\n", (void *)(npcb), (npcb)->local_port)); \ for (tcp_tmp_pcb = *(pcbs); \ tcp_tmp_pcb != NULL; \ tcp_tmp_pcb = tcp_tmp_pcb->next) { \ @@ -352,13 +367,13 @@ extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS]; (npcb)->next = *(pcbs); \ LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \ *(pcbs) = (npcb); \ - LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + LWIP_ASSERT("TCP_REG: tcp_pcbs sane", tcp_pcbs_sane()); \ tcp_timer_needed(); \ } while(0) #define TCP_RMV(pcbs, npcb) do { \ struct tcp_pcb *tcp_tmp_pcb; \ LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \ if(*(pcbs) == (npcb)) { \ *(pcbs) = (*pcbs)->next; \ } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ @@ -369,7 +384,7 @@ extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS]; } \ (npcb)->next = NULL; \ LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \ } while(0) #else /* LWIP_DEBUG */ @@ -433,45 +448,38 @@ struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); #define tcp_ack(pcb) \ do { \ if((pcb)->flags & TF_ACK_DELAY) { \ - (pcb)->flags &= ~TF_ACK_DELAY; \ - (pcb)->flags |= TF_ACK_NOW; \ + tcp_clear_flags(pcb, TF_ACK_DELAY); \ + tcp_ack_now(pcb); \ } \ else { \ - (pcb)->flags |= TF_ACK_DELAY; \ + tcp_set_flags(pcb, TF_ACK_DELAY); \ } \ } while (0) #define tcp_ack_now(pcb) \ - do { \ - (pcb)->flags |= TF_ACK_NOW; \ - } while (0) + tcp_set_flags(pcb, TF_ACK_NOW) err_t tcp_send_fin(struct tcp_pcb *pcb); err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags); void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); -void tcp_rst(u32_t seqno, u32_t ackno, +void tcp_rst(const struct tcp_pcb* pcb, u32_t seqno, u32_t ackno, const ip_addr_t *local_ip, const ip_addr_t *remote_ip, u16_t local_port, u16_t remote_port); u32_t tcp_next_iss(struct tcp_pcb *pcb); err_t tcp_keepalive(struct tcp_pcb *pcb); +err_t tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split); err_t tcp_zero_window_probe(struct tcp_pcb *pcb); void tcp_trigger_input_pcb_close(void); #if TCP_CALCULATE_EFF_SEND_MSS -u16_t tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest -#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING - , const ip_addr_t *src -#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ - ); -#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING -#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest, src) -#else /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ -#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest) -#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */ +u16_t tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, + const ip_addr_t *dest); +#define tcp_eff_send_mss(sendmss, src, dest) \ + tcp_eff_send_mss_netif(sendmss, ip_route(src, dest), dest) #endif /* TCP_CALCULATE_EFF_SEND_MSS */ #if LWIP_CALLBACK_API @@ -498,6 +506,14 @@ void tcp_timer_needed(void); void tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); +#if TCP_QUEUE_OOSEQ +void tcp_free_ooseq(struct tcp_pcb *pcb); +#endif + +#if LWIP_TCP_PCB_NUM_EXT_ARGS +err_t tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb); +#endif + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcpip_priv.h similarity index 90% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcpip_priv.h index 55e0c10..c15d5b8 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/priv/tcpip_priv.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/priv/tcpip_priv.h @@ -55,12 +55,13 @@ struct netif; #if LWIP_MPU_COMPATIBLE #define API_VAR_REF(name) (*(name)) #define API_VAR_DECLARE(type, name) type * name -#define API_VAR_ALLOC(type, pool, name, errorval) do { \ +#define API_VAR_ALLOC_EXT(type, pool, name, errorblock) do { \ name = (type *)memp_malloc(pool); \ if (name == NULL) { \ - return errorval; \ + errorblock; \ } \ } while(0) +#define API_VAR_ALLOC(type, pool, name, errorval) API_VAR_ALLOC_EXT(type, pool, name, return errorval) #define API_VAR_ALLOC_POOL(type, pool, name, errorval) do { \ name = (type *)LWIP_MEMPOOL_ALLOC(pool); \ if (name == NULL) { \ @@ -81,6 +82,7 @@ struct netif; #else /* LWIP_MPU_COMPATIBLE */ #define API_VAR_REF(name) name #define API_VAR_DECLARE(type, name) type name +#define API_VAR_ALLOC_EXT(type, pool, name, errorblock) #define API_VAR_ALLOC(type, pool, name, errorval) #define API_VAR_ALLOC_POOL(type, pool, name, errorval) #define API_VAR_FREE(pool, name) @@ -109,9 +111,13 @@ typedef err_t (*tcpip_api_call_fn)(struct tcpip_api_call_data* call); err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call); enum tcpip_msg_type { +#if !LWIP_TCPIP_CORE_LOCKING TCPIP_MSG_API, TCPIP_MSG_API_CALL, +#endif /* !LWIP_TCPIP_CORE_LOCKING */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT TCPIP_MSG_INPKT, +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ #if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS TCPIP_MSG_TIMEOUT, TCPIP_MSG_UNTIMEOUT, @@ -126,6 +132,7 @@ enum tcpip_msg_type { struct tcpip_msg { enum tcpip_msg_type type; union { +#if !LWIP_TCPIP_CORE_LOCKING struct { tcpip_callback_fn function; void* msg; @@ -135,11 +142,14 @@ struct tcpip_msg { struct tcpip_api_call_data *arg; sys_sem_t *sem; } api_call; +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT struct { struct pbuf *p; struct netif *netif; netif_input_fn input_fn; } inp; +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ struct { tcpip_callback_fn function; void *ctx; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/autoip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/autoip.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/autoip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/autoip.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dhcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dhcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp.h index 112953c..806d11f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dhcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp.h @@ -39,6 +39,8 @@ #define LWIP_HDR_PROT_DHCP_H #include "lwip/opt.h" +#include "lwip/arch.h" +#include "lwip/prot/ip4.h" #ifdef __cplusplus extern "C" { @@ -128,9 +130,6 @@ typedef enum { #define DHCP_RELEASE 7 #define DHCP_INFORM 8 -/** DHCP hardware type, currently only ethernet is supported */ -#define DHCP_HTYPE_ETH 1 - #define DHCP_MAGIC_COOKIE 0x63825363UL /* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */ @@ -180,4 +179,4 @@ typedef enum { } #endif -#endif /*LWIP_HDR_PROT_DHCP_H*/ +#endif /* LWIP_HDR_PROT_DHCP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp6.h new file mode 100644 index 0000000..0754c91 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dhcp6.h @@ -0,0 +1,138 @@ +/** + * @file + * DHCPv6 protocol definitions + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_PROT_DHCP6_H +#define LWIP_HDR_PROT_DHCP6_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DHCP6_CLIENT_PORT 546 +#define DHCP6_SERVER_PORT 547 + + + /* DHCPv6 message item offsets and length */ +#define DHCP6_TRANSACTION_ID_LEN 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** minimum set of fields of any DHCPv6 message */ +struct dhcp6_msg +{ + PACK_STRUCT_FLD_8(u8_t msgtype); + PACK_STRUCT_FLD_8(u8_t transaction_id[DHCP6_TRANSACTION_ID_LEN]); + /* options follow */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +/* DHCP6 client states */ +typedef enum { + DHCP6_STATE_OFF = 0, + DHCP6_STATE_STATELESS_IDLE = 1, + DHCP6_STATE_REQUESTING_CONFIG = 2 +} dhcp6_state_enum_t; + +/* DHCPv6 message types */ +#define DHCP6_SOLICIT 1 +#define DHCP6_ADVERTISE 2 +#define DHCP6_REQUEST 3 +#define DHCP6_CONFIRM 4 +#define DHCP6_RENEW 5 +#define DHCP6_REBIND 6 +#define DHCP6_REPLY 7 +#define DHCP6_RELEASE 8 +#define DHCP6_DECLINE 9 +#define DHCP6_RECONFIGURE 10 +#define DHCP6_INFOREQUEST 11 +#define DHCP6_RELAYFORW 12 +#define DHCP6_RELAYREPL 13 +/* More message types see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ + +/** DHCPv6 status codes */ +#define DHCP6_STATUS_SUCCESS 0 /* Success. */ +#define DHCP6_STATUS_UNSPECFAIL 1 /* Failure, reason unspecified; this status code is sent by either a client or a server to indicate a failure not explicitly specified in this document. */ +#define DHCP6_STATUS_NOADDRSAVAIL 2 /* Server has no addresses available to assign to the IA(s). */ +#define DHCP6_STATUS_NOBINDING 3 /* Client record (binding) unavailable. */ +#define DHCP6_STATUS_NOTONLINK 4 /* The prefix for the address is not appropriate for the link to which the client is attached. */ +#define DHCP6_STATUS_USEMULTICAST 5 /* Sent by a server to a client to force the client to send messages to the server using the All_DHCP_Relay_Agents_and_Servers address. */ +/* More status codes see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ + +/** DHCPv6 DUID types */ +#define DHCP6_DUID_LLT 1 /* LLT: Link-layer Address Plus Time */ +#define DHCP6_DUID_EN 2 /* EN: Enterprise number */ +#define DHCP6_DUID_LL 3 /* LL: Link-layer Address */ +#define DHCP6_DUID_UUID 4 /* UUID (RFC 6355) */ + +/* DHCPv6 options */ +#define DHCP6_OPTION_CLIENTID 1 +#define DHCP6_OPTION_SERVERID 2 +#define DHCP6_OPTION_IA_NA 3 +#define DHCP6_OPTION_IA_TA 4 +#define DHCP6_OPTION_IAADDR 5 +#define DHCP6_OPTION_ORO 6 +#define DHCP6_OPTION_PREFERENCE 7 +#define DHCP6_OPTION_ELAPSED_TIME 8 +#define DHCP6_OPTION_RELAY_MSG 9 +#define DHCP6_OPTION_AUTH 11 +#define DHCP6_OPTION_UNICAST 12 +#define DHCP6_OPTION_STATUS_CODE 13 +#define DHCP6_OPTION_RAPID_COMMIT 14 +#define DHCP6_OPTION_USER_CLASS 15 +#define DHCP6_OPTION_VENDOR_CLASS 16 +#define DHCP6_OPTION_VENDOR_OPTS 17 +#define DHCP6_OPTION_INTERFACE_ID 18 +#define DHCP6_OPTION_RECONF_MSG 19 +#define DHCP6_OPTION_RECONF_ACCEPT 20 +/* More options see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ +#define DHCP6_OPTION_DNS_SERVERS 23 /* RFC 3646 */ +#define DHCP6_OPTION_DOMAIN_LIST 24 /* RFC 3646 */ +#define DHCP6_OPTION_SNTP_SERVERS 31 /* RFC 4075 */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_DHCP6_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dns.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dns.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/dns.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/dns.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/etharp.h similarity index 67% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/etharp.h index ec78305..811c228 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/etharp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/etharp.h @@ -39,7 +39,6 @@ #include "lwip/arch.h" #include "lwip/prot/ethernet.h" -#include "lwip/ip4_addr.h" #ifdef __cplusplus extern "C" { @@ -49,6 +48,36 @@ extern "C" { #define ETHARP_HWADDR_LEN ETH_HWADDR_LEN #endif +/** + * struct ip4_addr_wordaligned is used in the definition of the ARP packet format in + * order to support compilers that don't have structure packing. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip4_addr_wordaligned { + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** MEMCPY-like copying of IP addresses where addresses are known to be + * 16-bit-aligned if the port is correctly configured (so a port could define + * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ +#ifndef IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T +#define IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) +#endif + + /** MEMCPY-like copying of IP addresses where addresses are known to be + * 16-bit-aligned if the port is correctly configured (so a port could define + * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ +#ifndef IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T +#define IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) +#endif + #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif @@ -61,9 +90,9 @@ struct etharp_hdr { PACK_STRUCT_FLD_8(u8_t protolen); PACK_STRUCT_FIELD(u16_t opcode); PACK_STRUCT_FLD_S(struct eth_addr shwaddr); - PACK_STRUCT_FLD_S(struct ip4_addr2 sipaddr); + PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned sipaddr); PACK_STRUCT_FLD_S(struct eth_addr dhwaddr); - PACK_STRUCT_FLD_S(struct ip4_addr2 dipaddr); + PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned dipaddr); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES @@ -72,12 +101,6 @@ PACK_STRUCT_END #define SIZEOF_ETHARP_HDR 28 -/* ARP hwtype values */ -enum etharp_hwtype { - HWTYPE_ETHERNET = 1 - /* others not used */ -}; - /* ARP message types (opcodes) */ enum etharp_opcode { ARP_REQUEST = 1, diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ethernet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ethernet.h similarity index 68% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ethernet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ethernet.h index e4baa29..309e574 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ethernet.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ethernet.h @@ -38,6 +38,7 @@ #define LWIP_HDR_PROT_ETHERNET_H #include "lwip/arch.h" +#include "lwip/prot/ieee.h" #ifdef __cplusplus extern "C" { @@ -55,6 +56,7 @@ extern "C" { # include "arch/bpstruct.h" #endif PACK_STRUCT_BEGIN +/** An Ethernet MAC address */ struct eth_addr { PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]); } PACK_STRUCT_STRUCT; @@ -63,6 +65,9 @@ PACK_STRUCT_END # include "arch/epstruct.h" #endif +/** Initialize a struct eth_addr with its 6 bytes (takes care of correct braces) */ +#define ETH_ADDR(b0, b1, b2, b3, b4, b5) {{b0, b1, b2, b3, b4, b5}} + #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif @@ -102,44 +107,6 @@ PACK_STRUCT_END #define SIZEOF_VLAN_HDR 4 #define VLAN_ID(vlan_hdr) (lwip_htons((vlan_hdr)->prio_vid) & 0xFFF) -/** - * @ingroup ethernet - * A list of often ethtypes (although lwIP does not use all of them): */ -enum eth_type { - /** Internet protocol v4 */ - ETHTYPE_IP = 0x0800U, - /** Address resolution protocol */ - ETHTYPE_ARP = 0x0806U, - /** Wake on lan */ - ETHTYPE_WOL = 0x0842U, - /** RARP */ - ETHTYPE_RARP = 0x8035U, - /** Virtual local area network */ - ETHTYPE_VLAN = 0x8100U, - /** Internet protocol v6 */ - ETHTYPE_IPV6 = 0x86DDU, - /** PPP Over Ethernet Discovery Stage */ - ETHTYPE_PPPOEDISC = 0x8863U, - /** PPP Over Ethernet Session Stage */ - ETHTYPE_PPPOE = 0x8864U, - /** Jumbo Frames */ - ETHTYPE_JUMBO = 0x8870U, - /** Process field network */ - ETHTYPE_PROFINET = 0x8892U, - /** Ethernet for control automation technology */ - ETHTYPE_ETHERCAT = 0x88A4U, - /** Link layer discovery protocol */ - ETHTYPE_LLDP = 0x88CCU, - /** Serial real-time communication system */ - ETHTYPE_SERCOS = 0x88CDU, - /** Media redundancy protocol */ - ETHTYPE_MRP = 0x88E3U, - /** Precision time protocol */ - ETHTYPE_PTP = 0x88F7U, - /** Q-in-Q, 802.1ad */ - ETHTYPE_QINQ = 0x9100U -}; - /** The 24-bit IANA IPv4-multicast OUI is 01-00-5e: */ #define LL_IP4_MULTICAST_ADDR_0 0x01 #define LL_IP4_MULTICAST_ADDR_1 0x00 @@ -149,18 +116,6 @@ enum eth_type { #define LL_IP6_MULTICAST_ADDR_0 0x33 #define LL_IP6_MULTICAST_ADDR_1 0x33 -/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables - * or known to be 32-bit aligned within the protocol header. */ -#ifndef ETHADDR32_COPY -#define ETHADDR32_COPY(dst, src) SMEMCPY(dst, src, ETH_HWADDR_LEN) -#endif - -/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local - * variables and known to be 16-bit aligned within the protocol header. */ -#ifndef ETHADDR16_COPY -#define ETHADDR16_COPY(dst, src) SMEMCPY(dst, src, ETH_HWADDR_LEN) -#endif - #define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0) #ifdef __cplusplus diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/iana.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/iana.h new file mode 100644 index 0000000..32890cc --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/iana.h @@ -0,0 +1,97 @@ +/** + * @file + * IANA assigned numbers (RFC 1700 and successors) + * + * @defgroup iana IANA assigned numbers + * @ingroup infrastructure + */ + +/* + * Copyright (c) 2017 Dirk Ziegelmeier. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ + +#ifndef LWIP_HDR_PROT_IANA_H +#define LWIP_HDR_PROT_IANA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup iana + * Hardware types + */ +enum lwip_iana_hwtype { + /** Ethernet */ + LWIP_IANA_HWTYPE_ETHERNET = 1 +}; + +/** + * @ingroup iana + * Port numbers + * https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt + */ +enum lwip_iana_port_number { + /** SMTP */ + LWIP_IANA_PORT_SMTP = 25, + /** DHCP server */ + LWIP_IANA_PORT_DHCP_SERVER = 67, + /** DHCP client */ + LWIP_IANA_PORT_DHCP_CLIENT = 68, + /** TFTP */ + LWIP_IANA_PORT_TFTP = 69, + /** HTTP */ + LWIP_IANA_PORT_HTTP = 80, + /** SNTP */ + LWIP_IANA_PORT_SNTP = 123, + /** NETBIOS */ + LWIP_IANA_PORT_NETBIOS = 137, + /** SNMP */ + LWIP_IANA_PORT_SNMP = 161, + /** SNMP traps */ + LWIP_IANA_PORT_SNMP_TRAP = 162, + /** HTTPS */ + LWIP_IANA_PORT_HTTPS = 443, + /** SMTPS */ + LWIP_IANA_PORT_SMTPS = 465, + /** MQTT */ + LWIP_IANA_PORT_MQTT = 1883, + /** MDNS */ + LWIP_IANA_PORT_MDNS = 5353, + /** Secure MQTT */ + LWIP_IANA_PORT_SECURE_MQTT = 8883 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IANA_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/icmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/icmp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/icmp6.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/icmp6.h index 3461120..36989f6 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/icmp6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/icmp6.h @@ -146,6 +146,8 @@ PACK_STRUCT_END # include "arch/epstruct.h" #endif +#define ICMP6_HLEN 8 + /** This is the ICMP6 header adapted for echo req/resp. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ieee.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ieee.h new file mode 100644 index 0000000..abbb9e3 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ieee.h @@ -0,0 +1,91 @@ +/** + * @file + * IEEE assigned numbers + * + * @defgroup ieee IEEE assigned numbers + * @ingroup infrastructure + */ + +/* + * Copyright (c) 2017 Dirk Ziegelmeier. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ + +#ifndef LWIP_HDR_PROT_IEEE_H +#define LWIP_HDR_PROT_IEEE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup ieee + * A list of often ethtypes (although lwIP does not use all of them). + */ +enum lwip_ieee_eth_type { + /** Internet protocol v4 */ + ETHTYPE_IP = 0x0800U, + /** Address resolution protocol */ + ETHTYPE_ARP = 0x0806U, + /** Wake on lan */ + ETHTYPE_WOL = 0x0842U, + /** RARP */ + ETHTYPE_RARP = 0x8035U, + /** Virtual local area network */ + ETHTYPE_VLAN = 0x8100U, + /** Internet protocol v6 */ + ETHTYPE_IPV6 = 0x86DDU, + /** PPP Over Ethernet Discovery Stage */ + ETHTYPE_PPPOEDISC = 0x8863U, + /** PPP Over Ethernet Session Stage */ + ETHTYPE_PPPOE = 0x8864U, + /** Jumbo Frames */ + ETHTYPE_JUMBO = 0x8870U, + /** Process field network */ + ETHTYPE_PROFINET = 0x8892U, + /** Ethernet for control automation technology */ + ETHTYPE_ETHERCAT = 0x88A4U, + /** Link layer discovery protocol */ + ETHTYPE_LLDP = 0x88CCU, + /** Serial real-time communication system */ + ETHTYPE_SERCOS = 0x88CDU, + /** Media redundancy protocol */ + ETHTYPE_MRP = 0x88E3U, + /** Precision time protocol */ + ETHTYPE_PTP = 0x88F7U, + /** Q-in-Q, 802.1ad */ + ETHTYPE_QINQ = 0x9100U +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IEEE_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/igmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/igmp.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/igmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/igmp.h index d60cb31..46b81a9 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/igmp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/igmp.h @@ -38,7 +38,7 @@ #define LWIP_HDR_PROT_IGMP_H #include "lwip/arch.h" -#include "lwip/ip4_addr.h" +#include "lwip/prot/ip4.h" #ifdef __cplusplus extern "C" { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip.h index bbfae36..223158f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip.h @@ -39,6 +39,10 @@ #include "lwip/arch.h" +#ifdef __cplusplus +extern "C" { +#endif + #define IP_PROTO_ICMP 1 #define IP_PROTO_IGMP 2 #define IP_PROTO_UDP 17 @@ -48,4 +52,8 @@ /** This operates on a void* by loading the first byte */ #define IP_HDR_GET_VERSION(ptr) ((*(u8_t*)(ptr)) >> 4) +#ifdef __cplusplus +} +#endif + #endif /* LWIP_HDR_PROT_IP_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip4.h similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip4.h index bd442c6..9347461 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip4.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip4.h @@ -62,6 +62,8 @@ typedef struct ip4_addr_packed ip4_addr_p_t; /* Size of the IPv4 header. Same as 'sizeof(struct ip_hdr)'. */ #define IP_HLEN 20 +/* Maximum size of the IPv4 header with options. */ +#define IP_HLEN_MAX 60 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" @@ -101,10 +103,12 @@ PACK_STRUCT_END /* Macros to get struct ip_hdr fields: */ #define IPH_V(hdr) ((hdr)->_v_hl >> 4) #define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f) +#define IPH_HL_BYTES(hdr) ((u8_t)(IPH_HL(hdr) * 4)) #define IPH_TOS(hdr) ((hdr)->_tos) #define IPH_LEN(hdr) ((hdr)->_len) #define IPH_ID(hdr) ((hdr)->_id) #define IPH_OFFSET(hdr) ((hdr)->_offset) +#define IPH_OFFSET_BYTES(hdr) ((u16_t)((lwip_ntohs(IPH_OFFSET(hdr)) & IP_OFFMASK) * 8U)) #define IPH_TTL(hdr) ((hdr)->_ttl) #define IPH_PROTO(hdr) ((hdr)->_proto) #define IPH_CHKSUM(hdr) ((hdr)->_chksum) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip6.h similarity index 67% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip6.h index 6e1e263..7df81ed 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/ip6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/ip6.h @@ -43,7 +43,9 @@ #ifdef __cplusplus extern "C" { #endif - + +#define IP6_MIN_MTU_LENGTH 1280 + /** This is the packed version of ip6_addr_t, used in network headers that are itself packed */ #ifdef PACK_STRUCT_USE_INCLUDES @@ -94,13 +96,50 @@ PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif +#define IP6H_V(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f) +#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff) +#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff) +#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen)) +#define IP6H_NEXTH(hdr) ((hdr)->_nexth) +#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6) +#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim) +#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl))) +#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen) +#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth) +#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl) + +/* ipv6 extended options header */ +#define IP6_PAD1_OPTION 0 +#define IP6_PADN_OPTION 1 +#define IP6_ROUTER_ALERT_OPTION 5 +#define IP6_JUMBO_OPTION 194 +#define IP6_HOME_ADDRESS_OPTION 201 +#define IP6_ROUTER_ALERT_DLEN 2 +#define IP6_ROUTER_ALERT_VALUE_MLD 0 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_opt_hdr { + /* router alert option type */ + PACK_STRUCT_FLD_8(u8_t _opt_type); + /* router alert option data len */ + PACK_STRUCT_FLD_8(u8_t _opt_dlen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_OPT_HLEN 2 +#define IP6_OPT_TYPE_ACTION(hdr) ((((hdr)->_opt_type) >> 6) & 0x3) +#define IP6_OPT_TYPE_CHANGE(hdr) ((((hdr)->_opt_type) >> 5) & 0x1) +#define IP6_OPT_TYPE(hdr) ((hdr)->_opt_type) +#define IP6_OPT_DLEN(hdr) ((hdr)->_opt_dlen) + +/* Hop-by-Hop header. */ +#define IP6_HBH_HLEN 2 -/* Hop-by-hop router alert option. */ -#define IP6_HBH_HLEN 8 -#define IP6_PAD1_OPTION 0 -#define IP6_PADN_ALERT_OPTION 1 -#define IP6_ROUTER_ALERT_OPTION 5 -#define IP6_ROUTER_ALERT_VALUE_MLD 0 #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif @@ -108,28 +147,65 @@ PACK_STRUCT_BEGIN struct ip6_hbh_hdr { /* next header */ PACK_STRUCT_FLD_8(u8_t _nexth); - /* header length */ + /* header length in 8-octet units */ PACK_STRUCT_FLD_8(u8_t _hlen); - /* router alert option type */ - PACK_STRUCT_FLD_8(u8_t _ra_opt_type); - /* router alert option data len */ - PACK_STRUCT_FLD_8(u8_t _ra_opt_dlen); - /* router alert option data */ - PACK_STRUCT_FIELD(u16_t _ra_opt_data); - /* PadN option type */ - PACK_STRUCT_FLD_8(u8_t _padn_opt_type); - /* PadN option data len */ - PACK_STRUCT_FLD_8(u8_t _padn_opt_dlen); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif +#define IP6_HBH_NEXTH(hdr) ((hdr)->_nexth) + +/* Destination header. */ +#define IP6_DEST_HLEN 2 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_dest_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* header length in 8-octet units */ + PACK_STRUCT_FLD_8(u8_t _hlen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_DEST_NEXTH(hdr) ((hdr)->_nexth) + +/* Routing header */ +#define IP6_ROUT_TYPE2 2 +#define IP6_ROUT_RPL 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_rout_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* reserved */ + PACK_STRUCT_FLD_8(u8_t _hlen); + /* fragment offset */ + PACK_STRUCT_FIELD(u8_t _routing_type); + /* fragmented packet identification */ + PACK_STRUCT_FIELD(u8_t _segments_left); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_ROUT_NEXTH(hdr) ((hdr)->_nexth) +#define IP6_ROUT_TYPE(hdr) ((hdr)->_routing_type) +#define IP6_ROUT_SEG_LEFT(hdr) ((hdr)->_segments_left) /* Fragment header. */ #define IP6_FRAG_HLEN 8 #define IP6_FRAG_OFFSET_MASK 0xfff8 #define IP6_FRAG_MORE_FLAG 0x0001 + #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif @@ -148,19 +224,9 @@ PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif - -#define IP6H_V(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f) -#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff) -#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff) -#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen)) -#define IP6H_NEXTH(hdr) ((hdr)->_nexth) -#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6) -#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim) - -#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl))) -#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen) -#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth) -#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl) +#define IP6_FRAG_NEXTH(hdr) ((hdr)->_nexth) +#define IP6_FRAG_MBIT(hdr) (lwip_ntohs((hdr)->_fragment_offset) & 0x1) +#define IP6_FRAG_ID(hdr) (lwip_ntohl((hdr)->_identification)) #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/mld6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/mld6.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/mld6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/mld6.h index be3a006..71f1dcb 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/mld6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/mld6.h @@ -44,6 +44,7 @@ extern "C" { #endif +#define MLD6_HBH_HLEN 8 /** Multicast listener report/query/done message header. */ #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/nd6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/nd6.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/nd6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/nd6.h index 2d4903d..c270d07 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/nd6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/nd6.h @@ -248,11 +248,6 @@ PACK_STRUCT_END #endif /** Recursive DNS Server Option. */ -#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS -#define LWIP_RDNSS_OPTION_MAX_SERVERS LWIP_ND6_RDNSS_MAX_DNS_SERVERS -#else -#define LWIP_RDNSS_OPTION_MAX_SERVERS 1 -#endif #define ND6_OPTION_TYPE_RDNSS (25) #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" @@ -263,13 +258,15 @@ struct rdnss_option { PACK_STRUCT_FLD_8(u8_t length); PACK_STRUCT_FIELD(u16_t reserved); PACK_STRUCT_FIELD(u32_t lifetime); - PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[LWIP_RDNSS_OPTION_MAX_SERVERS]); + PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[1]); } PACK_STRUCT_STRUCT; PACK_STRUCT_END #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif +#define SIZEOF_RDNSS_OPTION_BASE 8 /* size without addresses */ + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/tcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/tcp.h similarity index 94% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/tcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/tcp.h index 67fe7b9..c1d7de1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/tcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/tcp.h @@ -80,8 +80,11 @@ PACK_STRUCT_END /* Valid TCP header flags */ #define TCP_FLAGS 0x3fU +#define TCP_MAX_OPTION_BYTES 40 + #define TCPH_HDRLEN(phdr) ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)) -#define TCPH_FLAGS(phdr) ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)) +#define TCPH_HDRLEN_BYTES(phdr) ((u8_t)(TCPH_HDRLEN(phdr) << 2)) +#define TCPH_FLAGS(phdr) ((u8_t)((lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS))) #define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = lwip_htons(((len) << 12) | TCPH_FLAGS(phdr)) #define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS(~TCP_FLAGS)) | lwip_htons(flags)) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/udp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/udp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/prot/udp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/prot/udp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/raw.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/raw.h similarity index 72% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/raw.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/raw.h index 30aa147..b129bd3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/raw.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/raw.h @@ -52,6 +52,10 @@ extern "C" { #endif +#define RAW_FLAGS_CONNECTED 0x01U +#define RAW_FLAGS_HDRINCL 0x02U +#define RAW_FLAGS_MULTICAST_LOOP 0x04U + struct raw_pcb; /** Function prototype for raw pcb receive callback functions. @@ -75,6 +79,14 @@ struct raw_pcb { struct raw_pcb *next; u8_t protocol; + u8_t flags; + +#if LWIP_MULTICAST_TX_OPTIONS + /** outgoing network interface for multicast packets, by interface index (if nonzero) */ + u8_t mcast_ifindex; + /** TTL for outgoing multicast packets */ + u8_t mcast_ttl; +#endif /* LWIP_MULTICAST_TX_OPTIONS */ /** receive callback function */ raw_recv_fn recv; @@ -93,22 +105,35 @@ struct raw_pcb * raw_new (u8_t proto); struct raw_pcb * raw_new_ip_type(u8_t type, u8_t proto); void raw_remove (struct raw_pcb *pcb); err_t raw_bind (struct raw_pcb *pcb, const ip_addr_t *ipaddr); +void raw_bind_netif (struct raw_pcb *pcb, const struct netif *netif); err_t raw_connect (struct raw_pcb *pcb, const ip_addr_t *ipaddr); +void raw_disconnect (struct raw_pcb *pcb); err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr); +err_t raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip); err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg); -/* The following functions are the lower layer interface to RAW. */ -u8_t raw_input (struct pbuf *p, struct netif *inp); -#define raw_init() /* Compatibility define, no init needed. */ +#define raw_flags(pcb) ((pcb)->flags) +#define raw_setflags(pcb,f) ((pcb)->flags = (f)) -void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); +#define raw_set_flags(pcb, set_flags) do { (pcb)->flags = (u8_t)((pcb)->flags | (set_flags)); } while(0) +#define raw_clear_flags(pcb, clr_flags) do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define raw_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) + +#define raw_init() /* Compatibility define, no init needed. */ /* for compatibility with older implementation */ #define raw_new_ip6(proto) raw_new_ip_type(IPADDR_TYPE_V6, proto) +#if LWIP_MULTICAST_TX_OPTIONS +#define raw_set_multicast_netif_index(pcb, idx) ((pcb)->mcast_ifindex = (idx)) +#define raw_get_multicast_netif_index(pcb) ((pcb)->mcast_ifindex) +#define raw_set_multicast_ttl(pcb, value) ((pcb)->mcast_ttl = (value)) +#define raw_get_multicast_ttl(pcb) ((pcb)->mcast_ttl) +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sio.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sio.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sio.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sio.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/snmp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/snmp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/snmp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/snmp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sockets.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sockets.h similarity index 70% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sockets.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sockets.h index 2c15363..08ed0db 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sockets.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sockets.h @@ -44,17 +44,18 @@ #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ #include "lwip/ip_addr.h" +#include "lwip/netif.h" #include "lwip/err.h" #include "lwip/inet.h" #include "lwip/errno.h" -#include "wm_sockets.h" + +#include #include #ifdef __cplusplus extern "C" { #endif -#if 0 /* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED to prevent this code from redefining it. */ #if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED) @@ -111,40 +112,11 @@ struct sockaddr_storage { typedef u32_t socklen_t; #endif -struct lwip_sock; -#endif - -#if !LWIP_TCPIP_CORE_LOCKING -/** Maximum optlen used by setsockopt/getsockopt */ -#define LWIP_SETGETSOCKOPT_MAXOPTLEN 16 - -/** This struct is used to pass data to the set/getsockopt_internal - * functions running in tcpip_thread context (only a void* is allowed) */ -struct lwip_setgetsockopt_data { - /** socket index for which to change options */ - int s; - /** level of the option to process */ - int level; - /** name of the option to process */ - int optname; - /** set: value to set the option to - * get: value of the option is stored here */ -#if LWIP_MPU_COMPATIBLE - u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN]; -#else - union { - void *p; - const void *pc; - } optval; -#endif - /** size of *optval */ - socklen_t optlen; - /** if an error occurs, it is temporarily stored here */ - err_t err; - /** semaphore to wake up the calling task */ - void* completed_sem; -}; -#endif /* !LWIP_TCPIP_CORE_LOCKING */ +#if !defined IOV_MAX +#define IOV_MAX 0xFFFF +#elif IOV_MAX > 0xFFFF +#error "IOV_MAX larger than supported by LwIP" +#endif /* IOV_MAX */ #if !defined(iovec) struct iovec { @@ -162,7 +134,57 @@ struct msghdr { socklen_t msg_controllen; int msg_flags; }; -#if 0 + +/* struct msghdr->msg_flags bit field values */ +#define MSG_TRUNC 0x04 +#define MSG_CTRUNC 0x08 + +/* RFC 3542, Section 20: Ancillary Data */ +struct cmsghdr { + socklen_t cmsg_len; /* number of bytes, including header */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +}; +/* Data section follows header and possible padding, typically referred to as + unsigned char cmsg_data[]; */ + +/* cmsg header/data alignment. NOTE: we align to native word size (double word +size on 16-bit arch) so structures are not placed at an unaligned address. +16-bit arch needs double word to ensure 32-bit alignment because socklen_t +could be 32 bits. If we ever have cmsg data with a 64-bit variable, alignment +will need to increase long long */ +#define ALIGN_H(size) (((size) + sizeof(long) - 1U) & ~(sizeof(long)-1U)) +#define ALIGN_D(size) ALIGN_H(size) + +#define CMSG_FIRSTHDR(mhdr) \ + ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ + (struct cmsghdr *)(mhdr)->msg_control : \ + (struct cmsghdr *)NULL) + +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : \ + (((u8_t *)(cmsg) + ALIGN_H((cmsg)->cmsg_len) \ + + ALIGN_D(sizeof(struct cmsghdr)) > \ + (u8_t *)((mhdr)->msg_control) + (mhdr)->msg_controllen) ? \ + (struct cmsghdr *)NULL : \ + (struct cmsghdr *)((void*)((u8_t *)(cmsg) + \ + ALIGN_H((cmsg)->cmsg_len))))) + +#define CMSG_DATA(cmsg) ((void*)((u8_t *)(cmsg) + \ + ALIGN_D(sizeof(struct cmsghdr)))) + +#define CMSG_SPACE(length) (ALIGN_D(sizeof(struct cmsghdr)) + \ + ALIGN_H(length)) + +#define CMSG_LEN(length) (ALIGN_D(sizeof(struct cmsghdr)) + \ + length) + +/* Set socket options argument */ +//#define IFNAMSIZ NETIF_NAMESIZE +struct ifreq { + char ifr_name[NETIF_NAMESIZE]; /* Interface name */ +}; + /* Socket protocol types (TCP/UDP/RAW) */ #define SOCK_STREAM 1 #define SOCK_DGRAM 2 @@ -179,32 +201,32 @@ struct msghdr { /* * Additional options, not kept in so_options. */ -#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ -#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ -#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ -#define SO_LINGER 0x0080 /* linger on close if data present */ -#define SO_DONTLINGER ((int)(~SO_LINGER)) -#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ -#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ -#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ -#define SO_RCVBUF 0x1002 /* receive buffer size */ -#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ -#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ -#define SO_ERROR 0x1007 /* get error status and clear */ -#define SO_TYPE 0x1008 /* get socket type */ -#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ -#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ - +#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ +#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_DONTLINGER ((int)(~SO_LINGER)) +#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ +#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ +#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ +#define SO_BINDTODEVICE 0x100b /* bind to device */ /* * Structure used for manipulating linger option. */ struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time in seconds */ + int l_onoff; /* option on/off */ + int l_linger; /* linger time in seconds */ }; /* @@ -218,7 +240,7 @@ struct linger { #if LWIP_IPV6 #define AF_INET6 10 #else /* LWIP_IPV6 */ -#define AF_INET6 AF_UNSPEC +//#define AF_INET6 AF_UNSPEC #endif /* LWIP_IPV6 */ #define PF_INET AF_INET #define PF_INET6 AF_INET6 @@ -241,6 +263,7 @@ struct linger { #define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ #define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ #define MSG_MORE 0x10 /* Sender will send more */ +#define MSG_NOSIGNAL 0x20 /* Uninmplemented: Requests not to send the SIGPIPE signal if an attempt to send is made on a stream-oriented socket that is no longer connected. */ /* @@ -248,6 +271,7 @@ struct linger { */ #define IP_TOS 1 #define IP_TTL 2 +#define IP_PKTINFO 8 #if LWIP_TCP /* @@ -299,6 +323,28 @@ typedef struct ip_mreq { } ip_mreq; #endif /* LWIP_IGMP */ +#if LWIP_IPV4 +struct in_pktinfo { + unsigned int ipi_ifindex; /* Interface index */ + struct in_addr ipi_addr; /* Destination (from header) address */ +}; +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6_MLD +/* + * Options and types related to IPv6 multicast membership + */ +#define IPV6_JOIN_GROUP 12 +#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP +#define IPV6_LEAVE_GROUP 13 +#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP + +typedef struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast addr */ + unsigned int ipv6mr_interface; /* interface index, or 0 */ +} ipv6_mreq; +#endif /* LWIP_IPV6_MLD */ + /* * The Type of Service provides an indication of the abstract * parameters of the quality of service desired. These parameters are @@ -362,11 +408,11 @@ typedef struct ip_mreq { #define IOC_INOUT (IOC_IN|IOC_OUT) /* 0x20000000 distinguishes new & old ioctl's */ -#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) +#define _IO(x,y) ((long)(IOC_VOID|((x)<<8)|(y))) -#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOR(x,y,t) ((long)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))) -#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#define _IOW(x,y,t) ((long)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))) #endif /* !defined(FIONREAD) || !defined(FIONBIO) */ #ifndef FIONREAD @@ -399,7 +445,16 @@ typedef struct ip_mreq { #define O_NONBLOCK 1 /* nonblocking I/O */ #endif #ifndef O_NDELAY -#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */ +#define O_NDELAY O_NONBLOCK /* same as O_NONBLOCK, for compatibility */ +#endif +#ifndef O_RDONLY +#define O_RDONLY 2 +#endif +#ifndef O_WRONLY +#define O_WRONLY 4 +#endif +#ifndef O_RDWR +#define O_RDWR (O_RDONLY|O_WRONLY) #endif #ifndef SHUT_RD @@ -413,13 +468,14 @@ typedef struct ip_mreq { #undef FD_SETSIZE /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ #define FD_SETSIZE MEMP_NUM_NETCONN +#define LWIP_SELECT_MAXNFDS (FD_SETSIZE + LWIP_SOCKET_OFFSET) #define FDSETSAFESET(n, code) do { \ if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \ code; }} while(0) #define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\ (code) : 0) -#define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |= (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) -#define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) +#define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] | (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))) +#define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))) #define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) #define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) @@ -428,12 +484,35 @@ typedef struct fd_set unsigned char fd_bits [(FD_SETSIZE+7)/8]; } fd_set; -#elif LWIP_SOCKET_OFFSET -#error LWIP_SOCKET_OFFSET does not work with external FD_SET! -#elif FD_SETSIZE < MEMP_NUM_NETCONN +#elif FD_SETSIZE < (LWIP_SOCKET_OFFSET + MEMP_NUM_NETCONN) #error "external FD_SETSIZE too small for number of sockets" +#else +#define LWIP_SELECT_MAXNFDS FD_SETSIZE #endif /* FD_SET */ +/* poll-related defines and types */ +/* @todo: find a better way to guard the definition of these defines and types if already defined */ +#if !defined(POLLIN) && !defined(POLLOUT) +#define POLLIN 0x1 +#define POLLOUT 0x2 +#define POLLERR 0x4 +#define POLLNVAL 0x8 +/* Below values are unimplemented */ +#define POLLRDNORM 0x10 +#define POLLRDBAND 0x20 +#define POLLPRI 0x40 +#define POLLWRNORM 0x80 +#define POLLWRBAND 0x100 +#define POLLHUP 0x200 +typedef unsigned int nfds_t; +struct pollfd +{ + int fd; + short events; + short revents; +}; +#endif + /** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided * by your system, set this to 0 and include in cc.h */ #ifndef LWIP_TIMEVAL_PRIVATE @@ -446,7 +525,7 @@ struct timeval { long tv_usec; /* and microseconds */ }; #endif /* LWIP_TIMEVAL_PRIVATE */ -#endif + #define lwip_socket_init() /* Compatibility define, no init needed. */ void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */ void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */ @@ -464,23 +543,34 @@ void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destro #define lwip_connect connect #define lwip_listen listen #define lwip_recv recv +#define lwip_recvmsg recvmsg #define lwip_recvfrom recvfrom #define lwip_send send #define lwip_sendmsg sendmsg #define lwip_sendto sendto #define lwip_socket socket +#if LWIP_SOCKET_SELECT #define lwip_select select -#define lwip_ioctlsocket ioctl +#endif +#if LWIP_SOCKET_POLL +#define lwip_poll poll +#endif +#define lwip_ioctl ioctlsocket +#define lwip_inet_ntop inet_ntop +#define lwip_inet_pton inet_pton #if LWIP_POSIX_SOCKETS_IO_NAMES #define lwip_read read +#define lwip_readv readv #define lwip_write write #define lwip_writev writev #undef lwip_close #define lwip_close close #define closesocket(s) close(s) -#define lwip_fcntl fcntl +int fcntl(int s, int cmd, ...); +#undef lwip_ioctl #define lwip_ioctl ioctl +#define ioctlsocket ioctl #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ #endif /* LWIP_COMPAT_SOCKETS == 2 */ @@ -491,28 +581,36 @@ int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); -int lwip_close(int s); + int lwip_close(int s); int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); int lwip_listen(int s, int backlog); -int lwip_recv(int s, void *mem, size_t len, int flags); -int lwip_read(int s, void *mem, size_t len); -int lwip_recvfrom(int s, void *mem, size_t len, int flags, +ssize_t lwip_recv(int s, void *mem, size_t len, int flags); +ssize_t lwip_read(int s, void *mem, size_t len); +ssize_t lwip_readv(int s, const struct iovec *iov, int iovcnt); +ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); -int lwip_send(int s, const void *dataptr, size_t size, int flags); -int lwip_sendmsg(int s, const struct msghdr *message, int flags); -int lwip_sendto(int s, const void *dataptr, size_t size, int flags, +ssize_t lwip_recvmsg(int s, struct msghdr *message, int flags); +ssize_t lwip_send(int s, const void *dataptr, size_t size, int flags); +ssize_t lwip_sendmsg(int s, const struct msghdr *message, int flags); +ssize_t lwip_sendto(int s, const void *dataptr, size_t size, int flags, const struct sockaddr *to, socklen_t tolen); int lwip_socket(int domain, int type, int protocol); -int lwip_write(int s, const void *dataptr, size_t size); -int lwip_writev(int s, const struct iovec *iov, int iovcnt); +ssize_t lwip_write(int s, const void *dataptr, size_t size); +ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt); +#if LWIP_SOCKET_SELECT int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout); +#endif +#if LWIP_SOCKET_POLL +int lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout); +#endif int lwip_ioctl(int s, long cmd, void *argp); int lwip_fcntl(int s, int cmd, int val); +const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size); +int lwip_inet_pton(int af, const char *src, void *dst); #if LWIP_COMPAT_SOCKETS #if LWIP_COMPAT_SOCKETS != 2 -#if 0 /** @ingroup socket */ #define accept(s,addr,addrlen) lwip_accept(s,addr,addrlen) /** @ingroup socket */ @@ -536,6 +634,8 @@ int lwip_fcntl(int s, int cmd, int val); /** @ingroup socket */ #define recv(s,mem,len,flags) lwip_recv(s,mem,len,flags) /** @ingroup socket */ +#define recvmsg(s,message,flags) lwip_recvmsg(s,message,flags) +/** @ingroup socket */ #define recvfrom(s,mem,len,flags,from,fromlen) lwip_recvfrom(s,mem,len,flags,from,fromlen) /** @ingroup socket */ #define send(s,dataptr,size,flags) lwip_send(s,dataptr,size,flags) @@ -545,53 +645,39 @@ int lwip_fcntl(int s, int cmd, int val); #define sendto(s,dataptr,size,flags,to,tolen) lwip_sendto(s,dataptr,size,flags,to,tolen) /** @ingroup socket */ #define socket(domain,type,protocol) lwip_socket(domain,type,protocol) +#if LWIP_SOCKET_SELECT /** @ingroup socket */ #define select(maxfdp1,readset,writeset,exceptset,timeout) lwip_select(maxfdp1,readset,writeset,exceptset,timeout) +#endif +#if LWIP_SOCKET_POLL +/** @ingroup socket */ +#define poll(fds,nfds,timeout) lwip_poll(fds,nfds,timeout) +#endif /** @ingroup socket */ #define ioctlsocket(s,cmd,argp) lwip_ioctl(s,cmd,argp) -#endif +/** @ingroup socket */ +#define inet_ntop(af,src,dst,size) lwip_inet_ntop(af,src,dst,size) +/** @ingroup socket */ +#define inet_pton(af,src,dst) lwip_inet_pton(af,src,dst) + #if LWIP_POSIX_SOCKETS_IO_NAMES -#if 0 /** @ingroup socket */ #define read(s,mem,len) lwip_read(s,mem,len) /** @ingroup socket */ +#define readv(s,iov,iovcnt) lwip_readv(s,iov,iovcnt) +/** @ingroup socket */ #define write(s,dataptr,len) lwip_write(s,dataptr,len) -#endif /** @ingroup socket */ #define writev(s,iov,iovcnt) lwip_writev(s,iov,iovcnt) -#if 0 /** @ingroup socket */ #define close(s) lwip_close(s) /** @ingroup socket */ #define fcntl(s,cmd,val) lwip_fcntl(s,cmd,val) /** @ingroup socket */ #define ioctl(s,cmd,argp) lwip_ioctl(s,cmd,argp) -#endif #endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ #endif /* LWIP_COMPAT_SOCKETS != 2 */ -#if 0 -#if LWIP_IPV4 && LWIP_IPV6 -/** @ingroup socket */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \ - : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)) -/** @ingroup socket */ -#define inet_pton(af,src,dst) \ - (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \ - : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)) -#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL) -#define inet_pton(af,src,dst) \ - (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0) -#else /* LWIP_IPV4 && LWIP_IPV6 */ -#define inet_ntop(af,src,dst,size) \ - (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL) -#define inet_pton(af,src,dst) \ - (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0) -#endif /* LWIP_IPV4 && LWIP_IPV6 */ -#endif #endif /* LWIP_COMPAT_SOCKETS */ #ifdef __cplusplus diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/stats.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/stats.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/stats.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/stats.h index 5cde4a0..b570dba 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/stats.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/stats.h @@ -308,7 +308,7 @@ void stats_init(void); #define STATS_INC(x) ++lwip_stats.x #define STATS_DEC(x) --lwip_stats.x -#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \ +#define STATS_INC_USED(x, y, type) do { lwip_stats.x.used = (type)(lwip_stats.x.used + y); \ if (lwip_stats.x.max < lwip_stats.x.used) { \ lwip_stats.x.max = lwip_stats.x.used; \ } \ @@ -318,7 +318,7 @@ void stats_init(void); #define stats_init() #define STATS_INC(x) #define STATS_DEC(x) -#define STATS_INC_USED(x) +#define STATS_INC_USED(x, y, type) #endif /* LWIP_STATS */ #if TCP_STATS @@ -387,9 +387,9 @@ void stats_init(void); #if MEM_STATS #define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y -#define MEM_STATS_INC(x) SYS_ARCH_INC(lwip_stats.mem.x, 1) -#define MEM_STATS_INC_USED(x, y) SYS_ARCH_INC(lwip_stats.mem.x, y) -#define MEM_STATS_DEC_USED(x, y) SYS_ARCH_DEC(lwip_stats.mem.x, y) +#define MEM_STATS_INC(x) STATS_INC(mem.x) +#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y, mem_size_t) +#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x = (mem_size_t)((lwip_stats.mem.x) - (y)) #define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") #else #define MEM_STATS_AVAIL(x, y) @@ -412,7 +412,7 @@ void stats_init(void); #if SYS_STATS #define SYS_STATS_INC(x) STATS_INC(sys.x) #define SYS_STATS_DEC(x) STATS_DEC(sys.x) -#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1) +#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1, STAT_COUNTER) #define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) #else #define SYS_STATS_INC(x) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sys.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sys.h similarity index 66% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sys.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sys.h index d12bae0..168e465 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/sys.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/sys.h @@ -125,39 +125,51 @@ typedef void (*lwip_thread_fn)(void *arg); * Create a new mutex. * Note that mutexes are expected to not be taken recursively by the lwIP code, * so both implementation types (recursive or non-recursive) should work. + * The mutex is allocated to the memory that 'mutex' + * points to (which can be both a pointer or the actual OS structure). + * If the mutex has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * * @param mutex pointer to the mutex to create * @return ERR_OK if successful, another err_t otherwise */ err_t sys_mutex_new(sys_mutex_t *mutex); /** * @ingroup sys_mutex - * Lock a mutex + * Blocks the thread until the mutex can be grabbed. * @param mutex the mutex to lock */ void sys_mutex_lock(sys_mutex_t *mutex); /** * @ingroup sys_mutex - * Unlock a mutex + * Releases the mutex previously locked through 'sys_mutex_lock()'. * @param mutex the mutex to unlock */ void sys_mutex_unlock(sys_mutex_t *mutex); /** * @ingroup sys_mutex - * Delete a semaphore + * Deallocates a mutex. * @param mutex the mutex to delete */ void sys_mutex_free(sys_mutex_t *mutex); #ifndef sys_mutex_valid /** * @ingroup sys_mutex - * Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid + * Returns 1 if the mutes is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. */ int sys_mutex_valid(sys_mutex_t *mutex); #endif #ifndef sys_mutex_set_invalid /** * @ingroup sys_mutex - * Set a mutex invalid so that sys_mutex_valid returns 0 + * Invalidate a mutex so that sys_mutex_valid() returns 0. + * ATTENTION: This does NOT mean that the mutex shall be deallocated: + * sys_mutex_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. */ void sys_mutex_set_invalid(sys_mutex_t *mutex); #endif @@ -168,6 +180,14 @@ void sys_mutex_set_invalid(sys_mutex_t *mutex); /** * @ingroup sys_sem * Create a new semaphore + * Creates a new semaphore. The semaphore is allocated to the memory that 'sem' + * points to (which can be both a pointer or the actual OS structure). + * The "count" argument specifies the initial state of the semaphore (which is + * either 0 or 1). + * If the semaphore has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * * @param sem pointer to the semaphore to create * @param count initial count of the semaphore * @return ERR_OK if successful, another err_t otherwise @@ -181,16 +201,25 @@ err_t sys_sem_new(sys_sem_t *sem, u8_t count); void sys_sem_signal(sys_sem_t *sem); /** * @ingroup sys_sem - * Wait for a semaphore for the specified timeout + * Blocks the thread while waiting for the semaphore to be signaled. If the + * "timeout" argument is non-zero, the thread should only be blocked for the + * specified time (measured in milliseconds). If the "timeout" argument is zero, + * the thread should be blocked until the semaphore is signalled. + * + * The return value is SYS_ARCH_TIMEOUT if the semaphore wasn't signaled within + * the specified time or any other value if it was signaled (with or without + * waiting). + * Notice that lwIP implements a function with a similar name, + * sys_sem_wait(), that uses the sys_arch_sem_wait() function. + * * @param sem the semaphore to wait for * @param timeout timeout in milliseconds to wait (0 = wait forever) - * @return time (in milliseconds) waited for the semaphore - * or SYS_ARCH_TIMEOUT on timeout + * @return SYS_ARCH_TIMEOUT on timeout, any other value on success */ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout); /** * @ingroup sys_sem - * Delete a semaphore + * Deallocates a semaphore. * @param sem semaphore to delete */ void sys_sem_free(sys_sem_t *sem); @@ -199,14 +228,20 @@ void sys_sem_free(sys_sem_t *sem); #ifndef sys_sem_valid /** * @ingroup sys_sem - * Check if a semaphore is valid/allocated: return 1 for valid, 0 for invalid + * Returns 1 if the semaphore is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. */ int sys_sem_valid(sys_sem_t *sem); #endif #ifndef sys_sem_set_invalid /** * @ingroup sys_sem - * Set a semaphore invalid so that sys_sem_valid returns 0 + * Invalidate a semaphore so that sys_sem_valid() returns 0. + * ATTENTION: This does NOT mean that the semaphore shall be deallocated: + * sys_sem_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. */ void sys_sem_set_invalid(sys_sem_t *sem); #endif @@ -235,7 +270,14 @@ void sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */ /** * @ingroup sys_mbox - * Create a new mbox of specified size + * Creates an empty mailbox for maximum "size" elements. Elements stored + * in mailboxes are pointers. You have to define macros "_MBOX_SIZE" + * in your lwipopts.h, or ignore this parameter in your implementation + * and use a default size. + * If the mailbox has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * * @param mbox pointer to the mbox to create * @param size (minimum) number of messages in this mbox * @return ERR_OK if successful, another err_t otherwise @@ -244,34 +286,67 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int size); /** * @ingroup sys_mbox * Post a message to an mbox - may not fail - * -> blocks if full, only used from tasks not from ISR + * -> blocks if full, only to be used from tasks NOT from ISR! + * * @param mbox mbox to posts the message * @param msg message to post (ATTENTION: can be NULL) */ void sys_mbox_post(sys_mbox_t *mbox, void *msg); /** * @ingroup sys_mbox - * Try to post a message to an mbox - may fail if full or ISR + * Try to post a message to an mbox - may fail if full. + * Can be used from ISR (if the sys arch layer allows this). + * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted. + * * @param mbox mbox to posts the message * @param msg message to post (ATTENTION: can be NULL) */ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg); /** * @ingroup sys_mbox - * Wait for a new message to arrive in the mbox + * Try to post a message to an mbox - may fail if full. + * To be be used from ISR. + * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted. + * + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) + */ +err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg); +/** + * @ingroup sys_mbox + * Blocks the thread until a message arrives in the mailbox, but does + * not block the thread longer than "timeout" milliseconds (similar to + * the sys_arch_sem_wait() function). If "timeout" is 0, the thread should + * be blocked until a message arrives. The "msg" argument is a result + * parameter that is set by the function (i.e., by doing "*msg = + * ptr"). The "msg" parameter maybe NULL to indicate that the message + * should be dropped. + * The return values are the same as for the sys_arch_sem_wait() function: + * SYS_ARCH_TIMEOUT if there was a timeout, any other value if a messages + * is received. + * + * Note that a function with a similar name, sys_mbox_fetch(), is + * implemented by lwIP. + * * @param mbox mbox to get a message from * @param msg pointer where the message is stored * @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever) - * @return time (in milliseconds) waited for a message, may be 0 if not waited - or SYS_ARCH_TIMEOUT on timeout - * The returned time has to be accurate to prevent timer jitter! + * @return SYS_ARCH_TIMEOUT on timeout, any other value if a message has been received */ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout); /* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */ #ifndef sys_arch_mbox_tryfetch /** * @ingroup sys_mbox - * Wait for a new message to arrive in the mbox + * This is similar to sys_arch_mbox_fetch, however if a message is not + * present in the mailbox, it immediately returns with the code + * SYS_MBOX_EMPTY. On success 0 is returned. + * To allow for efficient implementations, this can be defined as a + * function-like macro in sys_arch.h instead of a normal function. For + * example, a naive implementation could be: + * \#define sys_arch_mbox_tryfetch(mbox,msg) sys_arch_mbox_fetch(mbox,msg,1) + * although this would introduce unnecessary delays. + * * @param mbox mbox to get a message from * @param msg pointer where the message is stored * @return 0 (milliseconds) if a message has been received @@ -285,7 +360,10 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg); #define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) /** * @ingroup sys_mbox - * Delete an mbox + * Deallocates a mailbox. If there are messages still present in the + * mailbox when the mailbox is deallocated, it is an indication of a + * programming error in lwIP and the developer should be notified. + * * @param mbox mbox to delete */ void sys_mbox_free(sys_mbox_t *mbox); @@ -293,14 +371,20 @@ void sys_mbox_free(sys_mbox_t *mbox); #ifndef sys_mbox_valid /** * @ingroup sys_mbox - * Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid + * Returns 1 if the mailbox is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. */ int sys_mbox_valid(sys_mbox_t *mbox); #endif #ifndef sys_mbox_set_invalid /** * @ingroup sys_mbox - * Set an mbox invalid so that sys_mbox_valid returns 0 + * Invalidate a mailbox so that sys_mbox_valid() returns 0. + * ATTENTION: This does NOT mean that the mailbox shall be deallocated: + * sys_mbox_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. */ void sys_mbox_set_invalid(sys_mbox_t *mbox); #endif @@ -321,8 +405,13 @@ void sys_mbox_set_invalid(sys_mbox_t *mbox); /** * @ingroup sys_misc * The only thread function: - * Creates a new thread + * Starts a new thread named "name" with priority "prio" that will begin its + * execution in the function "thread()". The "arg" argument will be passed as an + * argument to the thread() function. The stack size to used for this thread is + * the "stacksize" parameter. The id of the new thread is returned. Both the id + * and the priority are system dependent. * ATTENTION: although this function returns a value, it MUST NOT FAIL (ports have to assert this!) + * * @param name human-readable name for the thread (used for debugging purposes) * @param thread thread-function * @param arg parameter passed to 'thread' @@ -332,7 +421,11 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, #endif /* NO_SYS */ -/* sys_init() must be called before anything else. */ +/** + * @ingroup sys_misc + * sys_init() must be called before anything else. + * Initialize the sys_arch layer. + */ void sys_init(void); #ifndef sys_jiffies @@ -346,6 +439,9 @@ u32_t sys_jiffies(void); * @ingroup sys_time * Returns the current time in milliseconds, * may be the same as sys_jiffies or at least based on it. + * Don't care for wraparound, this is only used for time diffs. + * Not implementing this function means you cannot use some modules (e.g. TCP + * timestamps, internal timeouts for NO_SYS==1). */ u32_t sys_now(void); @@ -447,6 +543,15 @@ void sys_arch_unprotect(sys_prot_t pval); } while(0) #endif /* SYS_ARCH_SET */ +#ifndef SYS_ARCH_LOCKED +#define SYS_ARCH_LOCKED(code) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + code; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_LOCKED */ + #ifdef __cplusplus } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcp.h similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcp.h index 8731f9f..daf7599 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcp.h @@ -42,6 +42,7 @@ #if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ +#include "lwip/tcpbase.h" #include "lwip/mem.h" #include "lwip/pbuf.h" #include "lwip/ip.h" @@ -55,6 +56,7 @@ extern "C" { #endif struct tcp_pcb; +struct tcp_pcb_listen; /** Function prototype for tcp accept callback functions. Called when a new * connection can be accepted on a listening pcb. @@ -136,34 +138,73 @@ typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err); #define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale)) #define TCPWND16(x) ((u16_t)LWIP_MIN((x), 0xFFFF)) #define TCP_WND_MAX(pcb) ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND))) -typedef u32_t tcpwnd_size_t; #else #define RCV_WND_SCALE(pcb, wnd) (wnd) #define SND_WND_SCALE(pcb, wnd) (wnd) #define TCPWND16(x) (x) #define TCP_WND_MAX(pcb) TCP_WND -typedef u16_t tcpwnd_size_t; #endif +/* Increments a tcpwnd_size_t and holds at max value rather than rollover */ +#define TCP_WND_INC(wnd, inc) do { \ + if ((tcpwnd_size_t)(wnd + inc) >= wnd) { \ + wnd = (tcpwnd_size_t)(wnd + inc); \ + } else { \ + wnd = (tcpwnd_size_t)-1; \ + } \ + } while(0) -#if LWIP_WND_SCALE || TCP_LISTEN_BACKLOG || LWIP_TCP_TIMESTAMPS -typedef u16_t tcpflags_t; -#else -typedef u8_t tcpflags_t; -#endif - -enum tcp_state { - CLOSED = 0, - LISTEN = 1, - SYN_SENT = 2, - SYN_RCVD = 3, - ESTABLISHED = 4, - FIN_WAIT_1 = 5, - FIN_WAIT_2 = 6, - CLOSE_WAIT = 7, - CLOSING = 8, - LAST_ACK = 9, - TIME_WAIT = 10 +#if LWIP_TCP_SACK_OUT +/** SACK ranges to include in ACK packets. + * SACK entry is invalid if left==right. */ +struct tcp_sack_range { + /** Left edge of the SACK: the first acknowledged sequence number. */ + u32_t left; + /** Right edge of the SACK: the last acknowledged sequence number +1 (so first NOT acknowledged). */ + u32_t right; }; +#endif /* LWIP_TCP_SACK_OUT */ + +/** Function prototype for deallocation of arguments. Called *just before* the + * pcb is freed, so don't expect to be able to do anything with this pcb! + * + * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id) + * @param data pointer to the data (set via @ref tcp_ext_arg_set before) + */ +typedef void (*tcp_extarg_callback_pcb_destroyed_fn)(u8_t id, void *data); + +/** Function prototype to transition arguments from a listening pcb to an accepted pcb + * + * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id) + * @param lpcb the listening pcb accepting a connection + * @param cpcb the newly allocated connection pcb + * @return ERR_OK if OK, any error if connection should be dropped + */ +typedef err_t (*tcp_extarg_callback_passive_open_fn)(u8_t id, struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb); + +/** A table of callback functions that is invoked for ext arguments */ +struct tcp_ext_arg_callbacks { + /** @ref tcp_extarg_callback_pcb_destroyed_fn */ + tcp_extarg_callback_pcb_destroyed_fn destroy; + /** @ref tcp_extarg_callback_passive_open_fn */ + tcp_extarg_callback_passive_open_fn passive_open; +}; + +#define LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID 0xFF + +#if LWIP_TCP_PCB_NUM_EXT_ARGS +/* This is the structure for ext args in tcp pcbs (used as array) */ +struct tcp_pcb_ext_args { + const struct tcp_ext_arg_callbacks *callbacks; + void *data; +}; +/* This is a helper define to prevent zero size arrays if disabled */ +#define TCP_PCB_EXTARGS struct tcp_pcb_ext_args ext_args[LWIP_TCP_PCB_NUM_EXT_ARGS]; +#else +#define TCP_PCB_EXTARGS +#endif + +typedef u16_t tcpflags_t; +#define TCP_ALLFLAGS 0xffffU /** * members common to struct tcp_pcb and struct tcp_listen_pcb @@ -171,6 +212,7 @@ enum tcp_state { #define TCP_PCB_COMMON(type) \ type *next; /* for the linked list */ \ void *callback_arg; \ + TCP_PCB_EXTARGS \ enum tcp_state state; /* TCP state */ \ u8_t prio; \ /* ports are in host byte order */ \ @@ -223,6 +265,10 @@ struct tcp_pcb { #endif #if LWIP_TCP_TIMESTAMPS #define TF_TIMESTAMP 0x0400U /* Timestamp option enabled */ +#endif +#define TF_RTO 0x0800U /* RTO timer has fired, in-flight data moved to unsent and being retransmitted */ +#if LWIP_TCP_SACK_OUT +#define TF_SACK 0x1000U /* Selective ACKs enabled */ #endif /* the rest of the fields are in host byte order @@ -239,6 +285,12 @@ struct tcp_pcb { tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */ u32_t rcv_ann_right_edge; /* announced right edge of window */ +#if LWIP_TCP_SACK_OUT + /* SACK ranges to include in ACK packets (entry is invalid if left==right) */ + struct tcp_sack_range rcv_sacks[LWIP_TCP_MAX_SACK_NUM]; +#define LWIP_TCP_SACK_VALID(pcb, idx) ((pcb)->rcv_sacks[idx].left != (pcb)->rcv_sacks[idx].right) +#endif /* LWIP_TCP_SACK_OUT */ + /* Retransmission timer. */ s16_t rtime; @@ -247,9 +299,9 @@ struct tcp_pcb { /* RTT (round trip time) estimation variables */ u32_t rttest; /* RTT estimate in 500ms ticks */ u32_t rtseq; /* sequence number being timed */ - s16_t sa, sv; /* @todo document this */ + s16_t sa, sv; /* @see "Congestion Avoidance and Control" by Van Jacobson and Karels */ - s16_t rto; /* retransmission time-out */ + s16_t rto; /* retransmission time-out (in ticks of TCP_SLOW_INTERVAL) */ u8_t nrtx; /* number of retransmissions */ /* fast retransmit/recovery */ @@ -260,6 +312,9 @@ struct tcp_pcb { tcpwnd_size_t cwnd; tcpwnd_size_t ssthresh; + /* first byte following last rto byte */ + u32_t rto_end; + /* sender variables */ u32_t snd_nxt; /* next new seqno to be sent */ u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last @@ -277,6 +332,8 @@ struct tcp_pcb { u16_t unsent_oversize; #endif /* TCP_OVERSIZE */ + tcpwnd_size_t bytes_acked; + /* These are ordered by sequence number: */ struct tcp_seg *unsent; /* Unsent (queued) segments. */ struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ @@ -319,6 +376,8 @@ struct tcp_pcb { u8_t persist_cnt; /* Persist timer back-off */ u8_t persist_backoff; + /* Number of persist probes */ + u8_t persist_probe; /* KEEPALIVE counter */ u8_t keep_cnt_sent; @@ -361,26 +420,26 @@ void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept); #endif /* LWIP_CALLBACK_API */ void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval); -#define SNDBUF_SHARE 1 //share tx sndbuf +#define tcp_set_flags(pcb, set_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags | (set_flags)); } while(0) +#define tcp_clear_flags(pcb, clr_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags & (tcpflags_t)(~(clr_flags) & TCP_ALLFLAGS)); } while(0) +#define tcp_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) #if LWIP_TCP_TIMESTAMPS #define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss) #else /* LWIP_TCP_TIMESTAMPS */ +/** @ingroup tcp_raw */ #define tcp_mss(pcb) ((pcb)->mss) #endif /* LWIP_TCP_TIMESTAMPS */ -#if SNDBUF_SHARE -extern s32 sndbuf_len; -#define tcp_sndbuf(pcb) (TCPWND16(sndbuf_len)) -#else +/** @ingroup tcp_raw */ #define tcp_sndbuf(pcb) (TCPWND16((pcb)->snd_buf)) -#endif +/** @ingroup tcp_raw */ #define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen) /** @ingroup tcp_raw */ -#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) +#define tcp_nagle_disable(pcb) tcp_set_flags(pcb, TF_NODELAY) /** @ingroup tcp_raw */ -#define tcp_nagle_enable(pcb) ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY)) +#define tcp_nagle_enable(pcb) tcp_clear_flags(pcb, TF_NODELAY) /** @ingroup tcp_raw */ -#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) +#define tcp_nagle_disabled(pcb) tcp_is_flag_set(pcb, TF_NODELAY) #if TCP_LISTEN_BACKLOG #define tcp_backlog_set(pcb, new_backlog) do { \ @@ -393,11 +452,12 @@ void tcp_backlog_accepted(struct tcp_pcb* pcb); #define tcp_backlog_delayed(pcb) #define tcp_backlog_accepted(pcb) #endif /* TCP_LISTEN_BACKLOG */ -#define tcp_accepted(pcb) /* compatibility define, not needed any more */ +#define tcp_accepted(pcb) do { LWIP_UNUSED_ARG(pcb); } while(0) /* compatibility define, not needed any more */ void tcp_recved (struct tcp_pcb *pcb, u16_t len); err_t tcp_bind (struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port); +void tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif); err_t tcp_connect (struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port, tcp_connected_fn connected); @@ -410,27 +470,27 @@ void tcp_abort (struct tcp_pcb *pcb); err_t tcp_close (struct tcp_pcb *pcb); err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx); -/* Flags for "apiflags" parameter in tcp_write */ -#define TCP_WRITE_FLAG_COPY 0x01 -#define TCP_WRITE_FLAG_MORE 0x02 - err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t apiflags); void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); -#define TCP_PRIO_MIN 1 -#define TCP_PRIO_NORMAL 64 -#define TCP_PRIO_MAX 127 - err_t tcp_output (struct tcp_pcb *pcb); +err_t tcp_tcp_get_tcp_addrinfo(struct tcp_pcb *pcb, int local, ip_addr_t *addr, u16_t *port); -const char* tcp_debug_state_str(enum tcp_state s); +#define tcp_dbg_get_tcp_state(pcb) ((pcb)->state) /* for compatibility with older implementation */ #define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6) +#if LWIP_TCP_PCB_NUM_EXT_ARGS +u8_t tcp_ext_arg_alloc_id(void); +void tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks * const callbacks); +void tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg); +void *tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id); +#endif + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpbase.h similarity index 58% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpbase.h index 38a4166..0023074 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/apps/snmp/LwipMibCompiler/CCodeGeneration/VariablePrototype.cs +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpbase.h @@ -1,4 +1,10 @@ -/* +/** + * @file + * Base TCP API definitions shared by TCP and ALTCP\n + * See also @ref tcp_raw + */ + +/* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved. * @@ -26,48 +32,57 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Martin Hentschel + * Author: Adam Dunkels * */ +#ifndef LWIP_HDR_TCPBASE_H +#define LWIP_HDR_TCPBASE_H -namespace CCodeGeneration -{ - public class VariablePrototype : CodeElement - { - public VariableType Type { get; set; } +#include "lwip/opt.h" - public VariablePrototype() - : base() - { - } +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - public VariablePrototype(VariableType type) : - base() - { - Type = type; - } - - public static VariablePrototype FromVariableDeclaration(VariableDeclaration declaration) - { - return new VariablePrototype(declaration.Type); - } +#ifdef __cplusplus +extern "C" { +#endif - public override void GenerateCode(int level, CGenerator generator) - { - if (this.Type != null) - { - generator.IndentLine(level); +#if LWIP_WND_SCALE +typedef u32_t tcpwnd_size_t; +#else +typedef u16_t tcpwnd_size_t; +#endif - generator.OutputStream.Write("extern "); +enum tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; +/* ATTENTION: this depends on state number ordering! */ +#define TCP_STATE_IS_CLOSING(state) ((state) >= FIN_WAIT_1) - // declare the variable - this.Type.GenerateCode(generator); +/* Flags for "apiflags" parameter in tcp_write */ +#define TCP_WRITE_FLAG_COPY 0x01 +#define TCP_WRITE_FLAG_MORE 0x02 - generator.OutputStream.Write(";"); - generator.WriteNewLine(); - } - } +#define TCP_PRIO_MIN 1 +#define TCP_PRIO_NORMAL 64 +#define TCP_PRIO_MAX 127 - } +const char* tcp_debug_state_str(enum tcp_state s); + +#ifdef __cplusplus } +#endif + +#endif /* LWIP_TCP */ + +#endif /* LWIP_HDR_TCPBASE_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcpip.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpip.h similarity index 84% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcpip.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpip.h index 2004bf7..1201c87 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/tcpip.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/tcpip.h @@ -52,10 +52,12 @@ extern "C" { #if LWIP_TCPIP_CORE_LOCKING /** The global semaphore to lock the stack. */ extern sys_mutex_t lock_tcpip_core; +#if !defined LOCK_TCPIP_CORE || defined __DOXYGEN__ /** Lock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ #define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core) /** Unlock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ #define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core) +#endif /* LOCK_TCPIP_CORE */ #else /* LWIP_TCPIP_CORE_LOCKING */ #define LOCK_TCPIP_CORE() #define UNLOCK_TCPIP_CORE() @@ -79,16 +81,17 @@ err_t tcpip_input(struct pbuf *p, struct netif *inp); #if TLS_CONFIG_AP_OPT_FWD err_t tcpip_output(struct pbuf *p, struct netif *inp, ip_addr_t ipaddr); #endif -err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block); -/** - * @ingroup lwip_os - * @see tcpip_callback_with_block +err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx); +err_t tcpip_callback(tcpip_callback_fn function, void *ctx); +/** @ingroup lwip_os + * @deprecated use tcpip_try_callback() or tcpip_callback() instead */ -#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) +#define tcpip_callback_with_block(function, ctx, block) ((block != 0)? tcpip_callback(function, ctx) : tcpip_try_callback(function, ctx)) struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx); void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg); -err_t tcpip_trycallback(struct tcpip_callback_msg* msg); +err_t tcpip_callbackmsg_trycallback(struct tcpip_callback_msg* msg); +err_t tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg* msg); /* free pbufs or heap memory from another context without blocking */ err_t pbuf_free_callback(struct pbuf *p); @@ -99,6 +102,10 @@ err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); err_t tcpip_untimeout(sys_timeout_handler h, void *arg); #endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ +#ifdef TCPIP_THREAD_TEST +int tcpip_thread_poll_one(void); +#endif + #ifdef __cplusplus } #endif diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timeouts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/timeouts.h similarity index 76% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timeouts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/timeouts.h index afa4b07..b601f9e 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/timeouts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/timeouts.h @@ -56,6 +56,11 @@ extern "C" { #endif /* LWIP_DEBUG*/ #endif +/** Returned by sys_timeouts_sleeptime() to indicate there is no timer, so we + * can sleep forever. + */ +#define SYS_TIMEOUTS_SLEEPTIME_INFINITE 0xFFFFFFFF + /** Function prototype for a stack-internal timer function that has to be * called at a defined interval */ typedef void (* lwip_cyclic_timer_handler)(void); @@ -71,8 +76,10 @@ struct lwip_cyclic_timer { }; /** This array contains all stack-internal cyclic timers. To get the number of - * timers, use LWIP_ARRAYSIZE() */ + * timers, use lwip_num_cyclic_timers */ extern const struct lwip_cyclic_timer lwip_cyclic_timers[]; +/** Array size of lwip_cyclic_timers[] */ +extern const int lwip_num_cyclic_timers; #if LWIP_TIMERS @@ -96,25 +103,21 @@ struct sys_timeo { void sys_timeouts_init(void); #if LWIP_DEBUG_TIMERNAMES -void sys_timeout_debug_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); -#define sys_timeout_p(timeo_assigned, msecs, handler, arg) sys_timeout_debug_p(timeo_assigned, msecs, handler, arg, #handler) -#define sys_timeout(msecs, handler, arg) sys_timeout_p(0, msecs, handler, arg) +void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); +#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler) #else /* LWIP_DEBUG_TIMERNAMES */ -void sys_timeout_p(u8 timeo_assigned, u32_t msecs, sys_timeout_handler handler, void *arg); -#define sys_timeout(msecs, handler, arg) sys_timeout_p(0, msecs, handler, arg) +void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg); #endif /* LWIP_DEBUG_TIMERNAMES */ -void sys_untimeout_p(u8 timeo_assigned, sys_timeout_handler handler, void *arg); -#define sys_untimeout(handler, arg) sys_untimeout_p(0, handler, arg) -#if NO_SYS +void sys_untimeout(sys_timeout_handler handler, void *arg); +void sys_restart_timeouts(void); void sys_check_timeouts(void); -u32_t sys_timeouts_sleeptime_p(u8 timeo_assigned); -#define sys_timeouts_sleeptime() sys_timeouts_sleeptime_p(0) -#else /* NO_SYS */ -void sys_timeouts_mbox_fetch_p(u8 timeo_assigned, sys_mbox_t *mbox, void **msg); -#define sys_timeouts_mbox_fetch(mbox, msg) sys_timeouts_mbox_fetch_p(0, mbox, msg) -#endif /* NO_SYS */ +u32_t sys_timeouts_sleeptime(void); +#if LWIP_TESTMODE +struct sys_timeo** sys_timeouts_get_next_timeout(void); +void lwip_cyclic_timer(void *arg); +#endif #endif /* LWIP_TIMERS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/udp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/udp.h similarity index 85% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/udp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/udp.h index 9c3c87e..b1c78e5 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/udp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwip/udp.h @@ -91,8 +91,12 @@ struct udp_pcb { u16_t local_port, remote_port; #if LWIP_MULTICAST_TX_OPTIONS - /** outgoing network interface for multicast packets */ - ip_addr_t multicast_ip; +#if LWIP_IPV4 + /** outgoing network interface for multicast packets, by IPv4 address (if not 'any') */ + ip4_addr_t mcast_ip4; +#endif /* LWIP_IPV4 */ + /** outgoing network interface for multicast packets, by interface index (if nonzero) */ + u8_t mcast_ifindex; /** TTL for outgoing multicast packets */ u8_t mcast_ttl; #endif /* LWIP_MULTICAST_TX_OPTIONS */ @@ -117,6 +121,7 @@ struct udp_pcb * udp_new_ip_type(u8_t type); void udp_remove (struct udp_pcb *pcb); err_t udp_bind (struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port); +void udp_bind_netif (struct udp_pcb *pcb, const struct netif* netif); err_t udp_connect (struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port); void udp_disconnect (struct udp_pcb *pcb); @@ -131,8 +136,6 @@ err_t udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, u16_t dst_port); err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); -err_t udp_bind_multicast_netif(struct udp_pcb *pcb, ip_addr_t *ipaddr); - #if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, @@ -152,6 +155,10 @@ err_t udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, #define udp_flags(pcb) ((pcb)->flags) #define udp_setflags(pcb, f) ((pcb)->flags = (f)) +#define udp_set_flags(pcb, set_flags) do { (pcb)->flags = (u8_t)((pcb)->flags | (set_flags)); } while(0) +#define udp_clear_flags(pcb, clr_flags) do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define udp_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) + /* The following functions are the lower layer interface to UDP. */ void udp_input (struct pbuf *p, struct netif *inp); @@ -161,9 +168,13 @@ void udp_init (void); #define udp_new_ip6() udp_new_ip_type(IPADDR_TYPE_V6) #if LWIP_MULTICAST_TX_OPTIONS -#define udp_set_multicast_netif_addr(pcb, ip4addr) ip_addr_copy_from_ip4((pcb)->multicast_ip, *(ip4addr)) -#define udp_get_multicast_netif_addr(pcb) ip_2_ip4(&(pcb)->multicast_ip) -#define udp_set_multicast_ttl(pcb, value) do { (pcb)->mcast_ttl = value; } while(0) +#if LWIP_IPV4 +#define udp_set_multicast_netif_addr(pcb, ip4addr) ip4_addr_copy((pcb)->mcast_ip4, *(ip4addr)) +#define udp_get_multicast_netif_addr(pcb) (&(pcb)->mcast_ip4) +#endif /* LWIP_IPV4 */ +#define udp_set_multicast_netif_index(pcb, idx) ((pcb)->mcast_ifindex = (idx)) +#define udp_get_multicast_netif_index(pcb) ((pcb)->mcast_ifindex) +#define udp_set_multicast_ttl(pcb, value) ((pcb)->mcast_ttl = (value)) #define udp_get_multicast_ttl(pcb) ((pcb)->mcast_ttl) #endif /* LWIP_MULTICAST_TX_OPTIONS */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/lwipopts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwipopts.h similarity index 91% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/lwipopts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwipopts.h index 68fe66a..e96eb0c 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/lwipopts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/lwipopts.h @@ -6,6 +6,8 @@ #include #include "wm_config.h" #include "wm_mem.h" + + //#include "wm_sockets.h" /** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library @@ -16,8 +18,10 @@ #define MEMP_MEM_MALLOC 1 #define MEM_USE_POOLS 0 #define MEMP_USE_CUSTOM_POOLS 0 +#define MEMP_OVERFLOW_CHECK 2 -#define LWIP_COMPAT_SOCKETS 1 + +#define LWIP_COMPAT_SOCKETS 2 #define LWIP_SOCKET (TLS_CONFIG_SOCKET_RAW || TLS_CONFIG_SOCKET_STD) #define LWIP_NETCONN TLS_CONFIG_SOCKET_STD @@ -56,6 +60,8 @@ //#define TCP_SND_QUEUELEN ((2 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) #define TCP_SND_QUEUELEN 30 +#define TCP_MSL 2000UL /* The maximum segment lifetime in milliseconds */ + #define MEMP_NUM_TCP_SEG 32 /** @@ -99,6 +105,7 @@ #endif +#define LWIP_RAW 1 #define LWIP_IGMP TLS_CONFIG_IGMP #define LWIP_RAND rand #define LWIP_SO_RCVTIMEO 1 @@ -119,6 +126,7 @@ #define LWIP_HAVE_LOOPIF 1 #define ETHARP_SUPPORT_STATIC_ENTRIES 1 +#define ETHARP_TABLE_MATCH_NETIF 0 #define ARP_QUEUEING 1 #define TCPIP_THREAD_STACKSIZE 1000 #define MEM_ALIGNMENT 4 @@ -126,7 +134,7 @@ #define LWIP_NETIF_HOSTNAME 1 #define LWIP_TCP_KEEPALIVE 1 -#define LWIP_HOOK_IP4_ROUTE_SRC wm_ip4_route_src + #define LWIP_NETCONN_SEM_PER_THREAD 1 #define LWIP_NETCONN_FULLDUPLEX 1 @@ -141,5 +149,13 @@ extern sys_sem_t* sys_lwip_netconn_thread_sem_get(); #define LWIP_NETCONN_THREAD_SEM_FREE() do { } while(0) #endif +#define LWIP_NO_INTTYPES_H 1 +#define LWIP_TIMEVAL_PRIVATE 0 +#define LWIP_SOCKET_OFFSET 1 +#include "lwip/ip4_addr.h" + +extern struct netif *wm_ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src); +#define LWIP_HOOK_IP4_ROUTE_SRC wm_ip4_route_src + #endif /* end of __LWIP_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif.h new file mode 100644 index 0000000..f4f8cf1 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif.h @@ -0,0 +1,127 @@ +/** + * @file + * lwIP netif implementing an IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_NETIF_BRIDGEIF_H +#define LWIP_HDR_NETIF_BRIDGEIF_H + +#include "netif/bridgeif_opts.h" + +#include "lwip/err.h" +#include "lwip/prot/ethernet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct netif; + +#if (BRIDGEIF_MAX_PORTS < 0) || (BRIDGEIF_MAX_PORTS >= 64) +#error BRIDGEIF_MAX_PORTS must be [1..63] +#elif BRIDGEIF_MAX_PORTS < 8 +typedef u8_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 16 +typedef u16_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 32 +typedef u32_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 64 +typedef u64_t bridgeif_portmask_t; +#endif + +#define BR_FLOOD ((bridgeif_portmask_t)-1) + +/** @ingroup bridgeif + * Initialisation data for @ref bridgeif_init. + * An instance of this type must be passed as parameter 'state' to @ref netif_add + * when the bridge is added. + */ +typedef struct bridgeif_initdata_s { + /** MAC address of the bridge (cannot use the netif's addresses) */ + struct eth_addr ethaddr; + /** Maximum number of ports in the bridge (ports are stored in an array, this + influences memory allocated for netif->state of the bridge netif). */ + u8_t max_ports; + /** Maximum number of dynamic/learning entries in the bridge's forwarding database. + In the default implementation, this controls memory consumption only. */ + u16_t max_fdb_dynamic_entries; + /** Maximum number of static forwarding entries. Influences memory consumption! */ + u16_t max_fdb_static_entries; +} bridgeif_initdata_t; + +/** @ingroup bridgeif + * Use this for constant initialization of a bridgeif_initdat_t + * (ethaddr must be passed as ETH_ADDR()) + */ +#define BRIDGEIF_INITDATA1(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, ethaddr) {ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries} +/** @ingroup bridgeif + * Use this for constant initialization of a bridgeif_initdat_t + * (each byte of ethaddr must be passed) + */ +#define BRIDGEIF_INITDATA2(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, e0, e1, e2, e3, e4, e5) {{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries} + +err_t bridgeif_init(struct netif *netif); +err_t bridgeif_add_port(struct netif *bridgeif, struct netif *portif); +err_t bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports); +err_t bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr); + +/* FDB interface, can be replaced by own implementation */ +void bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx); +bridgeif_portmask_t bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr); +void* bridgeif_fdb_init(u16_t max_fdb_entries); + +#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT +#ifndef BRIDGEIF_DECL_PROTECT +/* define bridgeif protection to sys_arch_protect... */ +#include "lwip/sys.h" +#define BRIDGEIF_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev) +#define BRIDGEIF_READ_PROTECT(lev) SYS_ARCH_PROTECT(lev) +#define BRIDGEIF_READ_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev) +#define BRIDGEIF_WRITE_PROTECT(lev) +#define BRIDGEIF_WRITE_UNPROTECT(lev) +#endif +#else /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */ +#include "lwip/tcpip.h" +#define BRIDGEIF_DECL_PROTECT(lev) +#define BRIDGEIF_READ_PROTECT(lev) +#define BRIDGEIF_READ_UNPROTECT(lev) +#define BRIDGEIF_WRITE_PROTECT(lev) +#define BRIDGEIF_WRITE_UNPROTECT(lev) +#endif /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_BRIDGEIF_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif_opts.h new file mode 100644 index 0000000..b85c301 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/bridgeif_opts.h @@ -0,0 +1,90 @@ +/** + * @file + * lwIP netif implementing an IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_NETIF_BRIDGEIF_OPTS_H +#define LWIP_HDR_NETIF_BRIDGEIF_OPTS_H + +#include "lwip/opt.h" + +/** + * @defgroup bridgeif_opts Options + * @ingroup bridgeif + * @{ + */ + +/** BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT==1: set port netif's 'input' function + * to call directly into bridgeif code and on top of that, directly call into + * the selected forwarding port's 'linkoutput' function. + * This means that the bridgeif input/output path is protected from concurrent access + * but as well, *all* bridge port netif's drivers must correctly handle concurrent access! + * == 0: get into tcpip_thread for every input packet (no multithreading) + * ATTENTION: as ==0 relies on tcpip.h, the default depends on NO_SYS setting + */ +#ifndef BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT +#define BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT NO_SYS +#endif + +/** BRIDGEIF_MAX_PORTS: this is used to create a typedef used for forwarding + * bit-fields: the number of bits required is this + 1 (for the internal/cpu port) + * (63 is the maximum, resulting in an u64_t for the bit mask) + * ATTENTION: this controls the maximum number of the implementation only! + * The max. number of ports per bridge must still be passed via netif_add parameter! + */ +#ifndef BRIDGEIF_MAX_PORTS +#define BRIDGEIF_MAX_PORTS 7 +#endif + +/** BRIDGEIF_DEBUG: Enable generic debugging in bridgeif.c. */ +#ifndef BRIDGEIF_DEBUG +#define BRIDGEIF_DEBUG LWIP_DBG_OFF +#endif + +/** BRIDGEIF_DEBUG: Enable FDB debugging in bridgeif.c. */ +#ifndef BRIDGEIF_FDB_DEBUG +#define BRIDGEIF_FDB_DEBUG LWIP_DBG_OFF +#endif + +/** BRIDGEIF_DEBUG: Enable forwarding debugging in bridgeif.c. */ +#ifndef BRIDGEIF_FW_DEBUG +#define BRIDGEIF_FW_DEBUG LWIP_DBG_OFF +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_NETIF_BRIDGEIF_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/etharp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/etharp.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/etharp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/etharp.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernet.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ethernet.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernet.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ethernet.h index a3060e5..754f2b1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernet.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ethernet.h @@ -42,6 +42,7 @@ #define LWIP_HDR_NETIF_ETHERNET_H #include "lwip/opt.h" +#include "wm_netif.h" #include "lwip/pbuf.h" #include "lwip/netif.h" diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernetif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ethernetif.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ethernetif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ethernetif.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ieee802154.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ieee802154.h new file mode 100644 index 0000000..54e019f --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ieee802154.h @@ -0,0 +1,112 @@ +/** + * @file + * Definitions for IEEE 802.15.4 MAC frames + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_NETIF_IEEE802154_H +#define LWIP_HDR_NETIF_IEEE802154_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** General MAC frame format + * This shows the full featured header, mainly for documentation. + * Some fields are omitted or shortened to achieve frame compression. + */ +struct ieee_802154_hdr { + /** See IEEE_802154_FC_* defines */ + PACK_STRUCT_FIELD(u16_t frame_control); + /** Sequence number is omitted if IEEE_802154_FC_SEQNO_SUPPR is set in frame_control */ + PACK_STRUCT_FLD_8(u8_t sequence_number); + /** Destination PAN ID is omitted if Destination Addressing Mode is 0 */ + PACK_STRUCT_FIELD(u16_t destination_pan_id); + /** Destination Address is omitted if Destination Addressing Mode is 0 */ + PACK_STRUCT_FLD_8(u8_t destination_address[8]); + /** Source PAN ID is omitted if Source Addressing Mode is 0 + or if IEEE_802154_FC_PANID_COMPR is set in frame control*/ + PACK_STRUCT_FIELD(u16_t source_pan_id); + /** Source Address is omitted if Source Addressing Mode is 0 */ + PACK_STRUCT_FLD_8(u8_t source_address[8]); + /* The rest is variable */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Addressing modes (2 bits) */ +#define IEEE_802154_ADDR_MODE_NO_ADDR 0x00 /* PAN ID and address fields are not present */ +#define IEEE_802154_ADDR_MODE_RESERVED 0x01 /* Reserved */ +#define IEEE_802154_ADDR_MODE_SHORT 0x02 /* Address field contains a short address (16 bit) */ +#define IEEE_802154_ADDR_MODE_EXT 0x03 /* Address field contains an extended address (64 bit) */ + +/* IEEE 802.15.4 Frame Control definitions (2 bytes; see IEEE 802.15.4-2015 ch. 7.2.1) */ +#define IEEE_802154_FC_FT_MASK 0x0007 /* bits 0..2: Frame Type */ +#define IEEE_802154_FC_FT_BEACON 0x00 +#define IEEE_802154_FC_FT_DATA 0x01 +#define IEEE_802154_FC_FT_ACK 0x02 +#define IEEE_802154_FC_FT_MAC_CMD 0x03 +#define IEEE_802154_FC_FT_RESERVED 0x04 +#define IEEE_802154_FC_FT_MULTIPURPOSE 0x05 +#define IEEE_802154_FC_FT_FRAG 0x06 +#define IEEE_802154_FC_FT_EXT 0x07 +#define IEEE_802154_FC_SEC_EN 0x0008 /* bit 3: Security Enabled */ +#define IEEE_802154_FC_FRAME_PEND 0x0010 /* bit 4: Frame Pending */ +#define IEEE_802154_FC_ACK_REQ 0x0020 /* bit 5: AR (ACK required) */ +#define IEEE_802154_FC_PANID_COMPR 0x0040 /* bit 6: PAN ID Compression (src and dst are equal, src PAN ID omitted) */ +#define IEEE_802154_FC_RESERVED 0x0080 +#define IEEE_802154_FC_SEQNO_SUPPR 0x0100 /* bit 8: Sequence Number Suppression */ +#define IEEE_802154_FC_IE_PRESENT 0x0200 /* bit 9: IE Present */ +#define IEEE_802154_FC_DST_ADDR_MODE_MASK 0x0c00 /* bits 10..11: Destination Addressing Mode */ +#define IEEE_802154_FC_DST_ADDR_MODE_NO_ADDR (IEEE_802154_ADDR_MODE_NO_ADDR << 10) +#define IEEE_802154_FC_DST_ADDR_MODE_SHORT (IEEE_802154_ADDR_MODE_SHORT << 10) +#define IEEE_802154_FC_DST_ADDR_MODE_EXT (IEEE_802154_ADDR_MODE_EXT << 10) +#define IEEE_802154_FC_FRAME_VERSION_MASK 0x3000 /* bits 12..13: Frame Version */ +#define IEEE_802154_FC_FRAME_VERSION_GET(x) (((x) & IEEE_802154_FC_FRAME_VERSION_MASK) >> 12) +#define IEEE_802154_FC_SRC_ADDR_MODE_MASK 0xc000 /* bits 14..15: Source Addressing Mode */ +#define IEEE_802154_FC_SRC_ADDR_MODE_SHORT (IEEE_802154_ADDR_MODE_SHORT << 14) +#define IEEE_802154_FC_SRC_ADDR_MODE_EXT (IEEE_802154_ADDR_MODE_EXT << 14) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_IEEE802154_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6.h similarity index 92% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6.h index 4174644..ecff24b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/lowpan6.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6.h @@ -44,8 +44,9 @@ #include "netif/lowpan6_opts.h" -#if LWIP_IPV6 && LWIP_6LOWPAN /* don't build if not configured for use in lwipopts.h */ +#if LWIP_IPV6 +#include "netif/lowpan6_common.h" #include "lwip/pbuf.h" #include "lwip/ip.h" #include "lwip/ip_addr.h" @@ -55,12 +56,12 @@ extern "C" { #endif -/** 1 second period */ +/** 1 second period for reassembly */ #define LOWPAN6_TMR_INTERVAL 1000 void lowpan6_tmr(void); -err_t lowpan6_set_context(u8_t index, const ip6_addr_t * context); +err_t lowpan6_set_context(u8_t idx, const ip6_addr_t * context); err_t lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low); #if LWIP_IPV4 @@ -73,6 +74,8 @@ err_t lowpan6_if_init(struct netif *netif); /* pan_id in network byte order. */ err_t lowpan6_set_pan_id(u16_t pan_id); +u16_t lowpan6_calc_crc(const void *buf, u16_t len); + #if !NO_SYS err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp); #endif /* !NO_SYS */ @@ -81,6 +84,6 @@ err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp); } #endif -#endif /* LWIP_IPV6 && LWIP_6LOWPAN */ +#endif /* LWIP_IPV6 */ #endif /* LWIP_HDR_LOWPAN6_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_frag.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_ble.h similarity index 51% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_frag.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_ble.h index deeb2f4..01896a7 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/lwip/ip_frag.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_ble.h @@ -1,5 +1,12 @@ +/** + * @file + * 6LowPAN over BLE for IPv6 (RFC7668). + */ + /* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * Copyright (c) 2017 Benjamin Aigner + * Copyright (c) 2015 Inico Technologies Ltd. , Author: Ivan Delamer + * * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -24,72 +31,48 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Jani Monoses - * + * Author: Benjamin Aigner + * + * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c) */ + +#ifndef LWIP_HDR_LOWPAN6_BLE_H +#define LWIP_HDR_LOWPAN6_BLE_H -#ifndef LWIP_HDR_IP_FRAG_H -#define LWIP_HDR_IP_FRAG_H +#include "netif/lowpan6_opts.h" -#include "lwip/opt.h" -#include "lwip/err.h" +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "netif/lowpan6_common.h" #include "lwip/pbuf.h" -#include "lwip/netif.h" -#include "lwip/ip_addr.h" #include "lwip/ip.h" - -#if LWIP_IPV4 +#include "lwip/ip_addr.h" +#include "lwip/netif.h" #ifdef __cplusplus extern "C" { #endif -#if IP_REASSEMBLY -/* The IP reassembly timer interval in milliseconds. */ -#define IP_TMR_INTERVAL 1000 +err_t rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr); +err_t rfc7668_input(struct pbuf * p, struct netif *netif); +err_t rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len); +err_t rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr); +err_t rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len); +err_t rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr); +err_t rfc7668_set_context(u8_t index, const ip6_addr_t * context); +err_t rfc7668_if_init(struct netif *netif); -/* IP reassembly helper struct. - * This is exported because memp needs to know the size. - */ -struct ip_reassdata { - struct ip_reassdata *next; - struct pbuf *p; - struct ip_hdr iphdr; - u16_t datagram_len; - u8_t flags; - u8_t timer; -}; +#if !NO_SYS +err_t tcpip_rfc7668_input(struct pbuf *p, struct netif *inp); +#endif -void ip_reass_init(void); -void ip_reass_tmr(void); -struct pbuf * ip4_reass(struct pbuf *p); -#endif /* IP_REASSEMBLY */ - -#if IP_FRAG -#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF -/** A custom pbuf that holds a reference to another pbuf, which is freed - * when this custom pbuf is freed. This is used to create a custom PBUF_REF - * that points into the original pbuf. */ -#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED -#define LWIP_PBUF_CUSTOM_REF_DEFINED -struct pbuf_custom_ref { - /** 'base class' */ - struct pbuf_custom pc; - /** pointer to the original pbuf that is referenced */ - struct pbuf *original; -}; -#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */ -#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */ - -err_t ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest); -#endif /* IP_FRAG */ +void ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr); +void eui64_to_ble_addr(uint8_t *dst, const uint8_t *src); #ifdef __cplusplus } #endif -#endif /* LWIP_IPV4 */ +#endif /* LWIP_IPV6 */ -#endif /* LWIP_HDR_IP_FRAG_H */ +#endif /* LWIP_HDR_LOWPAN6_BLE_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_common.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_common.h new file mode 100644 index 0000000..0dc13ab --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_common.h @@ -0,0 +1,82 @@ +/** + * @file + * + * Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_LOWPAN6_COMMON_H +#define LWIP_HDR_LOWPAN6_COMMON_H + +#include "netif/lowpan6_opts.h" + +#if LWIP_IPV6 /* don't build if IPv6 is disabled in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/ip6_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Helper define for a link layer address, which can be encoded as 0, 2 or 8 bytes */ +struct lowpan6_link_addr { + /* encoded length of the address */ + u8_t addr_len; + /* address bytes */ + u8_t addr[8]; +}; + +s8_t lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct lowpan6_link_addr *mac_addr); + +#if LWIP_6LOWPAN_IPHC +err_t lowpan6_compress_headers(struct netif *netif, u8_t *inbuf, size_t inbuf_size, u8_t *outbuf, size_t outbuf_size, + u8_t *lowpan6_header_len_out, u8_t *hidden_header_len_out, ip6_addr_t *lowpan6_contexts, + const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst); +struct pbuf *lowpan6_decompress(struct pbuf *p, u16_t datagram_size, ip6_addr_t *lowpan6_contexts, + struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest); +#endif /* LWIP_6LOWPAN_IPHC */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_LOWPAN6_COMMON_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_opts.h new file mode 100644 index 0000000..17d46cd --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/lowpan6_opts.h @@ -0,0 +1,122 @@ +/** + * @file + * 6LowPAN options list + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_LOWPAN6_OPTS_H +#define LWIP_HDR_LOWPAN6_OPTS_H + +#include "lwip/opt.h" + +/** LWIP_6LOWPAN_NUM_CONTEXTS: define the number of compression + * contexts per netif type + */ +#ifndef LWIP_6LOWPAN_NUM_CONTEXTS +#define LWIP_6LOWPAN_NUM_CONTEXTS 10 +#endif + +/** LWIP_6LOWPAN_INFER_SHORT_ADDRESS: set this to 0 to disable creating + * short addresses for matching addresses (debug only) + */ +#ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS +#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1 +#endif + +/** LWIP_6LOWPAN_IPHC: set this to 0 to disable IP header compression as per + * RFC 6282 (which is mandatory for BLE) + */ +#ifndef LWIP_6LOWPAN_IPHC +#define LWIP_6LOWPAN_IPHC 1 +#endif + +/** Set this to 1 if your IEEE 802.15.4 interface can calculate and check the + * CRC in hardware. This means TX packets get 2 zero bytes added on transmission + * which are to be filled with the CRC. + */ +#ifndef LWIP_6LOWPAN_802154_HW_CRC +#define LWIP_6LOWPAN_802154_HW_CRC 0 +#endif + +/** If LWIP_6LOWPAN_802154_HW_CRC==0, this can override the default slow + * implementation of the CRC used for 6LoWPAN over IEEE 802.15.4 (which uses + * a shift register). + */ +#ifndef LWIP_6LOWPAN_CALC_CRC +#define LWIP_6LOWPAN_CALC_CRC(buf, len) lowpan6_calc_crc(buf, len) +#endif + +/** Debug level for 6LoWPAN in general */ +#ifndef LWIP_LOWPAN6_DEBUG +#define LWIP_LOWPAN6_DEBUG LWIP_DBG_OFF +#endif + +/** Debug level for 6LoWPAN over IEEE 802.15.4 */ +#ifndef LWIP_LOWPAN6_802154_DEBUG +#define LWIP_LOWPAN6_802154_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_LOWPAN6_IP_COMPRESSED_DEBUG: enable compressed IP frame + * output debugging + */ +#ifndef LWIP_LOWPAN6_IP_COMPRESSED_DEBUG +#define LWIP_LOWPAN6_IP_COMPRESSED_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_LOWPAN6_DECOMPRESSION_DEBUG: enable decompression debug output + */ +#ifndef LWIP_LOWPAN6_DECOMPRESSION_DEBUG +#define LWIP_LOWPAN6_DECOMPRESSION_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG: enable decompressed IP frame + * output debugging */ +#ifndef LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG +#define LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS: + * Currently, the linux kernel driver for 6lowpan sets/clears a bit in + * the address, depending on the BD address (either public or not). + * Might not be RFC7668 conform, so you may select to do that (=1) or + * not (=0) */ +#ifndef LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS +#define LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS 1 +#endif + + +#endif /* LWIP_HDR_LOWPAN6_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ccp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ccp.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ccp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ccp.h index 14dd659..b228522 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ccp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ccp.h @@ -36,6 +36,10 @@ #ifndef CCP_H #define CCP_H +#ifdef __cplusplus +extern "C" { +#endif + /* * CCP codes. */ @@ -152,5 +156,9 @@ extern const struct protent ccp_protent; void ccp_resetrequest(ppp_pcb *pcb); /* Issue a reset-request. */ +#ifdef __cplusplus +} +#endif + #endif /* CCP_H */ #endif /* PPP_SUPPORT && CCP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap-md5.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-md5.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap-md5.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-new.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap-new.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-new.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap-new.h index 64eae32..2d8cd9c 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap-new.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap-new.h @@ -36,6 +36,10 @@ #include "ppp.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * CHAP packets begin with a standard header with code, id, len (2 bytes). */ @@ -188,5 +192,9 @@ extern void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_c /* Represents the CHAP protocol to the main pppd code */ extern const struct protent chap_protent; +#ifdef __cplusplus +} +#endif + #endif /* CHAP_H */ #endif /* PPP_SUPPORT && CHAP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap_ms.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/chap_ms.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/chap_ms.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eap.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/eap.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eap.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/eap.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ecp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ecp.h similarity index 94% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ecp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ecp.h index 5cdce29..d8808c3 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ecp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ecp.h @@ -34,6 +34,13 @@ #include "netif/ppp/ppp_opts.h" #if PPP_SUPPORT && ECP_SUPPORT /* don't build if not configured for use in lwipopts.h */ +#ifndef ECP_H +#define ECP_H + +#ifdef __cplusplus +extern "C" { +#endif + typedef struct ecp_options { bool required; /* Is ECP required? */ unsigned enctype; /* Encryption type */ @@ -47,4 +54,9 @@ extern ecp_options ecp_hisoptions[]; extern const struct protent ecp_protent; +#ifdef __cplusplus +} +#endif + +#endif /* ECP_H */ #endif /* PPP_SUPPORT && ECP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eui64.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/eui64.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eui64.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/eui64.h index 20ac22e..5adeb48 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/eui64.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/eui64.h @@ -41,6 +41,10 @@ #ifndef EUI64_H #define EUI64_H +#ifdef __cplusplus +extern "C" { +#endif + /* * @todo: * @@ -90,5 +94,9 @@ typedef union char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */ +#ifdef __cplusplus +} +#endif + #endif /* EUI64_H */ #endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/fsm.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/fsm.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/fsm.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/fsm.h index b6915d3..8dec700 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/fsm.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/fsm.h @@ -50,6 +50,10 @@ #include "ppp.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Packet header = Code, id, length. */ @@ -170,6 +174,9 @@ void fsm_input(fsm *f, u_char *inpacket, int l); void fsm_protreject(fsm *f); void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen); +#ifdef __cplusplus +} +#endif #endif /* FSM_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipcp.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipcp.h index 45f46b3..32fdd1c 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipcp.h @@ -48,6 +48,10 @@ #ifndef IPCP_H #define IPCP_H +#ifdef __cplusplus +extern "C" { +#endif + /* * Options. */ @@ -122,5 +126,9 @@ char *ip_ntoa (u32_t); extern const struct protent ipcp_protent; +#ifdef __cplusplus +} +#endif + #endif /* IPCP_H */ #endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipv6cp.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipv6cp.h index 07d1ae3..9099973 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ipv6cp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ipv6cp.h @@ -146,6 +146,10 @@ #include "eui64.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Options. */ @@ -179,5 +183,9 @@ typedef struct ipv6cp_options { extern const struct protent ipv6cp_protent; +#ifdef __cplusplus +} +#endif + #endif /* IPV6CP_H */ #endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/lcp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/lcp.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/lcp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/lcp.h index 12e2a05..18ad1cb 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/lcp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/lcp.h @@ -50,6 +50,10 @@ #include "ppp.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Options. */ @@ -167,5 +171,9 @@ extern const struct protent lcp_protent; #define DEFLOOPBACKFAIL 10 #endif /* moved to ppp_opts.h */ +#ifdef __cplusplus +} +#endif + #endif /* LCP_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/magic.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/magic.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/magic.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/magic.h index a2a9b53..a165e18 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/magic.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/magic.h @@ -80,6 +80,10 @@ #ifndef MAGIC_H #define MAGIC_H +#ifdef __cplusplus +extern "C" { +#endif + /*********************** *** PUBLIC FUNCTIONS *** ***********************/ @@ -117,6 +121,10 @@ void magic_random_bytes(unsigned char *buf, u32_t buf_len); */ u32_t magic_pow(u8_t pow); +#ifdef __cplusplus +} +#endif + #endif /* MAGIC_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/mppe.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/mppe.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/mppe.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/mppe.h index 1ae8a5d..5de1128 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/mppe.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/mppe.h @@ -41,6 +41,10 @@ #include "netif/ppp/pppcrypt.h" +#ifdef __cplusplus +extern "C" { +#endif + #define MPPE_PAD 4 /* MPPE growth per frame */ #define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */ @@ -169,5 +173,9 @@ err_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state); err_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb); +#ifdef __cplusplus +} +#endif + #endif /* MPPE_H */ #endif /* PPP_SUPPORT && MPPE_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/arc4.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/arc4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/arc4.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/des.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/des.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/des.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/md4.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md4.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/md4.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/md5.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/md5.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/md5.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/sha1.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/polarssl/sha1.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/polarssl/sha1.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp.h similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp.h index d9ea097..3d73c36 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp.h @@ -47,6 +47,10 @@ #include "lwip/ip6_addr.h" #endif /* PPP_IPV6_SUPPORT */ +#ifdef __cplusplus +extern "C" { +#endif + /* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat ppp_opts.h with them */ #ifndef PPP_OPTIONS #define PPP_OPTIONS 0 @@ -685,6 +689,10 @@ err_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg); #define ppp_set_netif_linkcallback(ppp, link_cb) \ netif_set_link_callback(ppp->netif, link_cb); +#ifdef __cplusplus +} +#endif + #endif /* PPP_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_impl.h similarity index 86% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_impl.h index 1d4c774..40843d5 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_impl.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_impl.h @@ -53,6 +53,10 @@ #include "ppp.h" #include "pppdebug.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Memory used for control packets. * @@ -406,9 +410,6 @@ void ppp_link_end(ppp_pcb *pcb); /* function called to process input packet */ void ppp_input(ppp_pcb *pcb, struct pbuf *pb); -/* helper function, merge a pbuf chain into one pbuf */ -struct pbuf *ppp_singlebuf(struct pbuf *p); - /* * Functions called by PPP protocols. @@ -624,6 +625,98 @@ void ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len); /* dump packet to debug log if interesting */ #endif /* PRINTPKT_SUPPORT */ +/* + * Number of necessary timers analysis. + * + * PPP use at least one timer per each of its protocol, but not all protocols are + * active at the same time, thus the number of necessary timeouts is actually + * lower than enabled protocols. Here is the actual necessary timeouts based + * on code analysis. + * + * Note that many features analysed here are not working at all and are only + * there for a comprehensive analysis of necessary timers in order to prevent + * having to redo that each time we add a feature. + * + * Timer list + * + * | holdoff timeout + * | low level protocol timeout (PPPoE or PPPoL2P) + * | LCP delayed UP + * | LCP retransmit (FSM) + * | LCP Echo timer + * .| PAP or CHAP or EAP authentication + * . | ECP retransmit (FSM) + * . | CCP retransmit (FSM) when MPPE is enabled + * . | CCP retransmit (FSM) when MPPE is NOT enabled + * . | IPCP retransmit (FSM) + * . .| IP6CP retransmit (FSM) + * . . | Idle time limit + * . . | Max connect time + * . . | Max octets + * . . | CCP RACK timeout + * . . . + * PPP_PHASE_DEAD + * PPP_PHASE_HOLDOFF + * | . . . + * PPP_PHASE_INITIALIZE + * | . . . + * PPP_PHASE_ESTABLISH + * | . . . + * |. . . + * | . . + * PPP_PHASE_AUTHENTICATE + * | . . + * || . . + * PPP_PHASE_NETWORK + * | || . . + * | ||| . + * PPP_PHASE_RUNNING + * | .||||| + * | . |||| + * PPP_PHASE_TERMINATE + * | . |||| + * PPP_PHASE_NETWORK + * |. . + * PPP_PHASE_ESTABLISH + * PPP_PHASE_DISCONNECT + * PPP_PHASE_DEAD + * + * Alright, PPP basic retransmission and LCP Echo consume one timer. + * 1 + * + * If authentication is enabled one timer is necessary during authentication. + * 1 + PPP_AUTH_SUPPORT + * + * If ECP is enabled one timer is necessary before IPCP and/or IP6CP, one more + * is necessary if CCP is enabled (only with MPPE support but we don't care much + * up to this detail level). + * 1 + ECP_SUPPORT + CCP_SUPPORT + * + * If CCP is enabled it might consume a timer during IPCP or IP6CP, thus + * we might use IPCP, IP6CP and CCP timers simultaneously. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT + * + * When entering running phase, IPCP or IP6CP is still running. If idle time limit + * is enabled one more timer is necessary. Same for max connect time and max + * octets features. Furthermore CCP RACK might be used past this point. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT + * + * IPv4 or IPv6 must be enabled, therefore we don't need to take care the authentication + * and the CCP + ECP case, thus reducing overall complexity. + * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT) + * + * We don't support PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS features + * and adding those defines to ppp_opts.h just for having the value always + * defined to 0 isn't worth it. + * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + CCP_SUPPORT) + * + * Thus, the following is enough for now. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT + */ + +#ifdef __cplusplus +} +#endif #endif /* PPP_SUPPORT */ #endif /* LWIP_HDR_PPP_IMPL_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_opts.h similarity index 94% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_opts.h index fa79c09..479a006 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/ppp_opts.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/ppp_opts.h @@ -44,6 +44,13 @@ #define PPPOE_SUPPORT 0 #endif +/** + * PPPOE_SCNAME_SUPPORT==1: Enable PPP Over Ethernet Service Name and Concentrator Name support + */ +#ifndef PPPOE_SCNAME_SUPPORT +#define PPPOE_SCNAME_SUPPORT 0 +#endif + /** * PPPOL2TP_SUPPORT==1: Enable PPP Over L2TP */ @@ -72,15 +79,27 @@ #define LWIP_PPP_API (PPP_SUPPORT && (NO_SYS == 0)) #endif +#if PPP_SUPPORT + /** * MEMP_NUM_PPP_PCB: the number of simultaneously active PPP * connections (requires the PPP_SUPPORT option) */ #ifndef MEMP_NUM_PPP_PCB -#define MEMP_NUM_PPP_PCB 1 +#define MEMP_NUM_PPP_PCB 1 #endif -#if PPP_SUPPORT +/** + * PPP_NUM_TIMEOUTS_PER_PCB: the number of sys_timeouts running in parallel per + * ppp_pcb. See the detailed explanation at the end of ppp_impl.h about simultaneous + * timers analysis. + */ +#ifndef PPP_NUM_TIMEOUTS_PER_PCB +#define PPP_NUM_TIMEOUTS_PER_PCB (1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT) +#endif + +/* The number of sys_timeouts required for the PPP module */ +#define PPP_NUM_TIMEOUTS (PPP_SUPPORT * PPP_NUM_TIMEOUTS_PER_PCB * MEMP_NUM_PPP_PCB) /** * MEMP_NUM_PPPOS_INTERFACES: the number of concurrently active PPPoS @@ -590,4 +609,9 @@ #endif /* PPP_SUPPORT */ +/* Default value if unset */ +#ifndef PPP_NUM_TIMEOUTS +#define PPP_NUM_TIMEOUTS 0 +#endif /* PPP_NUM_TIMEOUTS */ + #endif /* LWIP_PPP_OPTS_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppapi.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppapi.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppapi.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppapi.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppcrypt.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppcrypt.h index a7b2099..c0230bb 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppcrypt.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppcrypt.h @@ -44,6 +44,10 @@ */ #include "lwip/arch.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Map hashes and ciphers functions to PolarSSL */ @@ -131,6 +135,10 @@ void pppcrypt_56_to_64_bit_key(u_char *key, u_char *des_key); +#ifdef __cplusplus +} +#endif + #endif /* PPPCRYPT_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppdebug.h similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppdebug.h index 7ead045..36ee4f9 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppdebug.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppdebug.h @@ -40,6 +40,10 @@ #ifndef PPPDEBUG_H #define PPPDEBUG_H +#ifdef __cplusplus +extern "C" { +#endif + /* Trace levels. */ #define LOG_CRITICAL (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) #define LOG_ERR (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) @@ -75,6 +79,10 @@ #endif /* PPP_DEBUG */ +#ifdef __cplusplus +} +#endif + #endif /* PPPDEBUG_H */ #endif /* PPP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppoe.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppoe.h similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppoe.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppoe.h index 9f8f289..8994d38 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppoe.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppoe.h @@ -76,6 +76,10 @@ #include "ppp.h" #include "lwip/etharp.h" +#ifdef __cplusplus +extern "C" { +#endif + #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif @@ -145,10 +149,10 @@ struct pppoe_softc { u16_t sc_session; /* PPPoE session id */ u8_t sc_state; /* discovery phase or session connected */ -#ifdef PPPOE_TODO - u8_t *sc_service_name; /* if != NULL: requested name of service */ - u8_t *sc_concentrator_name; /* if != NULL: requested concentrator id */ -#endif /* PPPOE_TODO */ +#if PPPOE_SCNAME_SUPPORT + const char *sc_service_name; /* if != NULL: requested name of service */ + const char *sc_concentrator_name; /* if != NULL: requested concentrator id */ +#endif /* PPPOE_SCNAME_SUPPORT */ u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */ u8_t sc_ac_cookie_len; /* length of cookie data */ #ifdef PPPOE_SERVER @@ -174,6 +178,10 @@ ppp_pcb *pppoe_create(struct netif *pppif, void pppoe_disc_input(struct netif *netif, struct pbuf *p); void pppoe_data_input(struct netif *netif, struct pbuf *p); +#ifdef __cplusplus +} +#endif + #endif /* PPP_OE_H */ #endif /* PPP_SUPPORT && PPPOE_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppol2tp.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppol2tp.h index f03950e..1221ca1 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppol2tp.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppol2tp.h @@ -39,6 +39,10 @@ #include "ppp.h" +#ifdef __cplusplus +extern "C" { +#endif + /* Timeout */ #define PPPOL2TP_CONTROL_TIMEOUT (5*1000) /* base for quick timeout calculation */ #define PPPOL2TP_SLOW_RETRY (60*1000) /* persistent retry interval */ @@ -179,7 +183,7 @@ struct pppol2tp_pcb_s { u16_t tunnel_port; /* Tunnel port */ u16_t our_ns; /* NS to peer */ u16_t peer_nr; /* NR from peer */ - u16_t peer_ns; /* NS from peer */ + u16_t peer_ns; /* Expected NS from peer */ u16_t source_tunnel_id; /* Tunnel ID assigned by peer */ u16_t remote_tunnel_id; /* Tunnel ID assigned to peer */ u16_t source_session_id; /* Session ID assigned by peer */ @@ -197,5 +201,9 @@ ppp_pcb *pppol2tp_create(struct netif *pppif, const u8_t *secret, u8_t secret_len, ppp_link_status_cb_fn link_status_cb, void *ctx_cb); +#ifdef __cplusplus +} +#endif + #endif /* PPPOL2TP_H */ #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppos.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppos.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppos.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppos.h index d924a9f..380a965 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/pppos.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/pppos.h @@ -42,6 +42,10 @@ #include "ppp.h" #include "vj.h" +#ifdef __cplusplus +extern "C" { +#endif + /* PPP packet parser states. Current state indicates operation yet to be * completed. */ enum { @@ -114,5 +118,9 @@ void pppos_input(ppp_pcb *ppp, u8_t* data, int len); err_t pppos_input_sys(struct pbuf *p, struct netif *inp); #endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */ +#ifdef __cplusplus +} +#endif + #endif /* PPPOS_H */ #endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/upap.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/upap.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/upap.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/upap.h index 7da792e..540d981 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/upap.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/upap.h @@ -50,6 +50,10 @@ #include "ppp.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Packet header = Code, id, length. */ @@ -119,5 +123,9 @@ void upap_authpeer(ppp_pcb *pcb); extern const struct protent pap_protent; +#ifdef __cplusplus +} +#endif + #endif /* UPAP_H */ #endif /* PPP_SUPPORT && PAP_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/vj.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/vj.h similarity index 98% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/vj.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/vj.h index 7f389c8..77d9976 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/ppp/vj.h +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/ppp/vj.h @@ -31,6 +31,10 @@ #include "lwip/ip.h" #include "lwip/priv/tcp_priv.h" +#ifdef __cplusplus +extern "C" { +#endif + #define MAX_SLOTS 16 /* must be > 2 and < 256 */ #define MAX_HDR 128 @@ -156,6 +160,10 @@ extern void vj_uncompress_err (struct vjcompress *comp); extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp); extern int vj_uncompress_tcp (struct pbuf **nb, struct vjcompress *comp); +#ifdef __cplusplus +} +#endif + #endif /* VJ_H */ #endif /* PPP_SUPPORT && VJ_SUPPORT */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/slipif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/slipif.h similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/include/netif/slipif.h rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/slipif.h diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/zepif.h b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/zepif.h new file mode 100644 index 0000000..2a801b4 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/include/netif/zepif.h @@ -0,0 +1,81 @@ +/** + * @file + * + * A netif implementing the ZigBee Eencapsulation Protocol (ZEP). + * This is used to tunnel 6LowPAN over UDP. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_ZEPIF_H +#define LWIP_HDR_ZEPIF_H + +#include "lwip/opt.h" +#include "netif/lowpan6.h" + +#if LWIP_IPV6 && LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZEPIF_DEFAULT_UDP_PORT 17754 + +/** Pass this struct as 'state' to netif_add to control the behaviour + * of this netif. If NULL is passed, default behaviour is chosen */ +struct zepif_init { + /** The UDP port used to ZEP frames from (0 = default) */ + u16_t zep_src_udp_port; + /** The UDP port used to ZEP frames to (0 = default) */ + u16_t zep_dst_udp_port; + /** The IP address to sed ZEP frames from (NULL = ANY) */ + const ip_addr_t *zep_src_ip_addr; + /** The IP address to sed ZEP frames to (NULL = BROADCAST) */ + const ip_addr_t *zep_dst_ip_addr; + /** If != NULL, the udp pcb is bound to this netif */ + const struct netif *zep_netif; + /** MAC address of the 6LowPAN device */ + u8_t addr[6]; +}; + +err_t zepif_init(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 && LWIP_UDP */ + +#endif /* LWIP_HDR_ZEPIF_H */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/FILES b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/FILES similarity index 76% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/FILES rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/FILES index a3ff431..1ffd6f2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/FILES +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/FILES @@ -5,14 +5,13 @@ are: ethernet.c Shared code for Ethernet based interfaces. -ethernetif.c - An example of how an Ethernet device driver could look. This - file can be used as a "skeleton" for developing new Ethernet - network device drivers. It uses the etharp.c ARP code. - lowpan6.c A 6LoWPAN implementation as a netif. +lowpan6_ble.c + A 6LoWPAN over Bluetooth Low Energy (BLE) implementation as netif, + according to RFC-7668. + slipif.c A generic implementation of the SLIP (Serial Line IP) protocol. It requires a sio (serial I/O) module to work. diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/Makefile b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/Makefile similarity index 72% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/Makefile rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/Makefile index 86cb247..53e2f16 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/Makefile +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/Makefile @@ -9,8 +9,8 @@ endif sinclude $(TOP_DIR)/tools/w800/rules.mk -INCLUDES := $(INCLUDES) -I $(PDIR)include -INCLUDES += -I ./ +#INCLUDES := $(INCLUDES) -I $(PDIR)include +#INCLUDES += -I ./ INCLUDES := $(INCLUDES) -I $(PDIR)include PDIR := ../$(PDIR) diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif.c new file mode 100644 index 0000000..8a97bce --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif.c @@ -0,0 +1,563 @@ +/** + * @file + * lwIP netif implementing an IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +/** + * @defgroup bridgeif IEEE 802.1D bridge + * @ingroup netifs + * This file implements an IEEE 802.1D bridge by using a multilayer netif approach + * (one hardware-independent netif for the bridge that uses hardware netifs for its ports). + * On transmit, the bridge selects the outgoing port(s). + * On receive, the port netif calls into the bridge (via its netif->input function) and + * the bridge selects the port(s) (and/or its netif->input function) to pass the received pbuf to. + * + * Usage: + * - add the port netifs just like you would when using them as dedicated netif without a bridge + * - only NETIF_FLAG_ETHARP/NETIF_FLAG_ETHERNET netifs are supported as bridge ports + * - add the bridge port netifs without IPv4 addresses (i.e. pass 'NULL, NULL, NULL') + * - don't add IPv6 addresses to the port netifs! + * - set up the bridge configuration in a global variable of type 'bridgeif_initdata_t' that contains + * - the MAC address of the bridge + * - some configuration options controlling the memory consumption (maximum number of ports + * and FDB entries) + * - e.g. for a bridge MAC address 00-01-02-03-04-05, 2 bridge ports, 1024 FDB entries + 16 static MAC entries: + * bridgeif_initdata_t mybridge_initdata = BRIDGEIF_INITDATA1(2, 1024, 16, ETH_ADDR(0, 1, 2, 3, 4, 5)); + * - add the bridge netif (with IPv4 config): + * struct netif bridge_netif; + * netif_add(&bridge_netif, &my_ip, &my_netmask, &my_gw, &mybridge_initdata, bridgeif_init, tcpip_input); + * NOTE: the passed 'input' function depends on BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT setting, + * which controls where the forwarding is done (netif low level input context vs. tcpip_thread) + * - set up all ports netifs and the bridge netif + * + * - When adding a port netif, NETIF_FLAG_ETHARP flag will be removed from a port + * to prevent ETHARP working on that port netif (we only want one IP per bridge not per port). + * - When adding a port netif, its input function is changed to call into the bridge. + * + * + * @todo: + * - compact static FDB entries (instead of walking the whole array) + * - add FDB query/read access + * - add FDB change callback (when learning or dropping auto-learned entries) + * - prefill FDB with MAC classes that should never be forwarded + * - multicast snooping? (and only forward group addresses to interested ports) + * - support removing ports + * - check SNMP integration + * - VLAN handling / trunk ports + * - priority handling? (although that largely depends on TX queue limitations and lwIP doesn't provide tx-done handling) + */ + +#include "netif/bridgeif.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/etharp.h" +#include "lwip/ethip6.h" +#include "lwip/snmp.h" +#include "lwip/timeouts.h" +#include + +#if LWIP_NUM_NETIF_CLIENT_DATA + +/* Define those to better describe your network interface. */ +#define IFNAME0 'b' +#define IFNAME1 'r' + +struct bridgeif_private_s; +typedef struct bridgeif_port_private_s { + struct bridgeif_private_s *bridge; + struct netif *port_netif; + u8_t port_num; +} bridgeif_port_t; + +typedef struct bridgeif_fdb_static_entry_s { + u8_t used; + bridgeif_portmask_t dst_ports; + struct eth_addr addr; +} bridgeif_fdb_static_entry_t; + +typedef struct bridgeif_private_s { + struct netif *netif; + struct eth_addr ethaddr; + u8_t max_ports; + u8_t num_ports; + bridgeif_port_t *ports; + u16_t max_fdbs_entries; + bridgeif_fdb_static_entry_t *fdbs; + u16_t max_fdbd_entries; + void *fdbd; +} bridgeif_private_t; + +/* netif data index to get the bridge on input */ +u8_t bridgeif_netif_client_id = 0xff; + +/** + * @ingroup bridgeif + * Add a static entry to the forwarding database. + * A static entry marks where frames to a specific eth address (unicast or group address) are + * forwarded. + * bits [0..(BRIDGEIF_MAX_PORTS-1)]: hw ports + * bit [BRIDGEIF_MAX_PORTS]: cpu port + * 0: drop + */ +err_t +bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports) +{ + int i; + bridgeif_private_t *br; + BRIDGEIF_DECL_PROTECT(lev); + LWIP_ASSERT("invalid netif", bridgeif != NULL); + br = (bridgeif_private_t *)bridgeif->state; + LWIP_ASSERT("invalid state", br != NULL); + + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < br->max_fdbs_entries; i++) { + if (!br->fdbs[i].used) { + BRIDGEIF_WRITE_PROTECT(lev); + if (!br->fdbs[i].used) { + br->fdbs[i].used = 1; + br->fdbs[i].dst_ports = ports; + memcpy(&br->fdbs[i].addr, addr, sizeof(struct eth_addr)); + BRIDGEIF_WRITE_UNPROTECT(lev); + BRIDGEIF_READ_UNPROTECT(lev); + return ERR_OK; + } + BRIDGEIF_WRITE_UNPROTECT(lev); + } + } + BRIDGEIF_READ_UNPROTECT(lev); + return ERR_MEM; +} + +/** + * @ingroup bridgeif + * Remove a static entry from the forwarding database + */ +err_t +bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr) +{ + int i; + bridgeif_private_t *br; + BRIDGEIF_DECL_PROTECT(lev); + LWIP_ASSERT("invalid netif", bridgeif != NULL); + br = (bridgeif_private_t *)bridgeif->state; + LWIP_ASSERT("invalid state", br != NULL); + + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < br->max_fdbs_entries; i++) { + if (br->fdbs[i].used && !memcmp(&br->fdbs[i].addr, addr, sizeof(struct eth_addr))) { + BRIDGEIF_WRITE_PROTECT(lev); + if (br->fdbs[i].used && !memcmp(&br->fdbs[i].addr, addr, sizeof(struct eth_addr))) { + memset(&br->fdbs[i], 0, sizeof(bridgeif_fdb_static_entry_t)); + BRIDGEIF_WRITE_UNPROTECT(lev); + BRIDGEIF_READ_UNPROTECT(lev); + return ERR_OK; + } + BRIDGEIF_WRITE_UNPROTECT(lev); + } + } + BRIDGEIF_READ_UNPROTECT(lev); + return ERR_VAL; +} + +/** Get the forwarding port(s) (as bit mask) for the specified destination mac address */ +static bridgeif_portmask_t +bridgeif_find_dst_ports(bridgeif_private_t *br, struct eth_addr *dst_addr) +{ + int i; + BRIDGEIF_DECL_PROTECT(lev); + BRIDGEIF_READ_PROTECT(lev); + /* first check for static entries */ + for (i = 0; i < br->max_fdbs_entries; i++) { + if (br->fdbs[i].used) { + if (!memcmp(&br->fdbs[i].addr, dst_addr, sizeof(struct eth_addr))) { + bridgeif_portmask_t ret = br->fdbs[i].dst_ports; + BRIDGEIF_READ_UNPROTECT(lev); + return ret; + } + } + } + if (dst_addr->addr[0] & 1) { + /* no match found: flood remaining group address */ + BRIDGEIF_READ_UNPROTECT(lev); + return BR_FLOOD; + } + BRIDGEIF_READ_UNPROTECT(lev); + /* no match found: check dynamic fdb for port or fall back to flooding */ + return bridgeif_fdb_get_dst_ports(br->fdbd, dst_addr); +} + +/** Helper function to see if a destination mac belongs to the bridge + * (bridge netif or one of the port netifs), in which case the frame + * is sent to the cpu only. + */ +static int +bridgeif_is_local_mac(bridgeif_private_t *br, struct eth_addr *addr) +{ + int i; + BRIDGEIF_DECL_PROTECT(lev); + if (!memcmp(br->netif->hwaddr, addr, sizeof(struct eth_addr))) { + return 1; + } + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < br->num_ports; i++) { + struct netif *portif = br->ports[i].port_netif; + if (portif != NULL) { + if (!memcmp(portif->hwaddr, addr, sizeof(struct eth_addr))) { + BRIDGEIF_READ_UNPROTECT(lev); + return 1; + } + } + } + BRIDGEIF_READ_UNPROTECT(lev); + return 0; +} + +/* Output helper function */ +static err_t +bridgeif_send_to_port(bridgeif_private_t *br, struct pbuf *p, u8_t dstport_idx) +{ + if (dstport_idx < BRIDGEIF_MAX_PORTS) { + /* possibly an external port */ + if (dstport_idx < br->max_ports) { + struct netif *portif = br->ports[dstport_idx].port_netif; + if ((portif != NULL) && (portif->linkoutput != NULL)) { + /* prevent sending out to rx port */ + if (netif_get_index(portif) != p->if_idx) { + if (netif_is_link_up(portif)) { + LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> flood(%p:%d) -> %d\n", (void *)p, p->if_idx, netif_get_index(portif))); + return portif->linkoutput(portif, p); + } + } + } + } + } else { + LWIP_ASSERT("invalid port index", dstport_idx == BRIDGEIF_MAX_PORTS); + } + return ERR_OK; +} + +/** Helper function to pass a pbuf to all ports marked in 'dstports' + */ +static err_t +bridgeif_send_to_ports(bridgeif_private_t *br, struct pbuf *p, bridgeif_portmask_t dstports) +{ + err_t err, ret_err = ERR_OK; + u8_t i; + bridgeif_portmask_t mask = 1; + BRIDGEIF_DECL_PROTECT(lev); + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < BRIDGEIF_MAX_PORTS; i++, mask = (bridgeif_portmask_t)(mask << 1)) { + if (dstports & mask) { + err = bridgeif_send_to_port(br, p, i); + if (err != ERR_OK) { + ret_err = err; + } + } + } + BRIDGEIF_READ_UNPROTECT(lev); + return ret_err; +} + +/** Output function of the application port of the bridge (the one with an ip address). + * The forwarding port(s) where this pbuf is sent on is/are automatically selected + * from the FDB. + */ +static err_t +bridgeif_output(struct netif *netif, struct pbuf *p) +{ + err_t err; + bridgeif_private_t *br = (bridgeif_private_t *)netif->state; + struct eth_addr *dst = (struct eth_addr *)(p->payload); + + bridgeif_portmask_t dstports = bridgeif_find_dst_ports(br, dst); + err = bridgeif_send_to_ports(br, p, dstports); + + MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len); + if (((u8_t *)p->payload)[0] & 1) { + /* broadcast or multicast packet*/ + MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts); + } else { + /* unicast packet */ + MIB2_STATS_NETIF_INC(netif, ifoutucastpkts); + } + /* increase ifoutdiscards or ifouterrors on error */ + + LINK_STATS_INC(link.xmit); + + return err; +} + +/** The actual bridge input function. Port netif's input is changed to call + * here. This function decides where the frame is forwarded. + */ +static err_t +bridgeif_input(struct pbuf *p, struct netif *netif) +{ + u8_t rx_idx; + bridgeif_portmask_t dstports; + struct eth_addr *src, *dst; + bridgeif_private_t *br; + bridgeif_port_t *port; + if (p == NULL || netif == NULL) { + return ERR_VAL; + } + port = (bridgeif_port_t *)netif_get_client_data(netif, bridgeif_netif_client_id); + LWIP_ASSERT("port data not set", port != NULL); + if (port == NULL || port->bridge == NULL) { + return ERR_VAL; + } + br = (bridgeif_private_t *)port->bridge; + rx_idx = netif_get_index(netif); + /* store receive index in pbuf */ + p->if_idx = rx_idx; + + dst = (struct eth_addr *)p->payload; + src = (struct eth_addr *)(((u8_t *)p->payload) + sizeof(struct eth_addr)); + + if ((src->addr[0] & 1) == 0) { + /* update src for all non-group addresses */ + bridgeif_fdb_update_src(br->fdbd, src, port->port_num); + } + + if (dst->addr[0] & 1) { + /* group address -> flood + cpu? */ + dstports = bridgeif_find_dst_ports(br, dst); + bridgeif_send_to_ports(br, p, dstports); + if (dstports & (1 << BRIDGEIF_MAX_PORTS)) { + /* we pass the reference to ->input or have to free it */ + LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> input(%p)\n", (void *)p)); + if (br->netif->input(p, br->netif) != ERR_OK) { + pbuf_free(p); + } + } else { + /* all references done */ + pbuf_free(p); + } + /* always return ERR_OK here to prevent the caller freeing the pbuf */ + return ERR_OK; + } else { + /* is this for one of the local ports? */ + if (bridgeif_is_local_mac(br, dst)) { + /* yes, send to cpu port only */ + LWIP_DEBUGF(BRIDGEIF_FW_DEBUG, ("br -> input(%p)\n", (void *)p)); + return br->netif->input(p, br->netif); + } + + /* get dst port */ + dstports = bridgeif_find_dst_ports(br, dst); + bridgeif_send_to_ports(br, p, dstports); + /* no need to send to cpu, flooding is for external ports only */ + /* by this, we consumed the pbuf */ + pbuf_free(p); + /* always return ERR_OK here to prevent the caller freeing the pbuf */ + return ERR_OK; + } +} + +#if !BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT +/** Input function for port netifs used to synchronize into tcpip_thread. + */ +static err_t +bridgeif_tcpip_input(struct pbuf *p, struct netif *netif) +{ + return tcpip_inpkt(p, netif, bridgeif_input); +} +#endif /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */ + +/** + * @ingroup bridgeif + * Initialization function passed to netif_add(). + * + * ATTENTION: A pointer to a @ref bridgeif_initdata_t must be passed as 'state' + * to @ref netif_add when adding the bridge. I supplies MAC address + * and controls memory allocation (number of ports, FDB size). + * + * @param netif the lwip network interface structure for this ethernetif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + * any other err_t on error + */ +err_t +bridgeif_init(struct netif *netif) +{ + bridgeif_initdata_t *init_data; + bridgeif_private_t *br; + size_t alloc_len_sizet; + mem_size_t alloc_len; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("bridgeif needs an input callback", (netif->input != NULL)); +#if !BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT + if (netif->input == tcpip_input) { + LWIP_DEBUGF(BRIDGEIF_DEBUG | LWIP_DBG_ON, ("bridgeif does not need tcpip_input, use netif_input/ethernet_input instead")); + } +#endif + + if (bridgeif_netif_client_id == 0xFF) { + bridgeif_netif_client_id = netif_alloc_client_data_id(); + } + + init_data = (bridgeif_initdata_t *)netif->state; + LWIP_ASSERT("init_data != NULL", (init_data != NULL)); + LWIP_ASSERT("init_data->max_ports <= BRIDGEIF_MAX_PORTS", + init_data->max_ports <= BRIDGEIF_MAX_PORTS); + + alloc_len_sizet = sizeof(bridgeif_private_t) + (init_data->max_ports * sizeof(bridgeif_port_t) + (init_data->max_fdb_static_entries * sizeof(bridgeif_fdb_static_entry_t))); + alloc_len = (mem_size_t)alloc_len_sizet; + LWIP_ASSERT("alloc_len == alloc_len_sizet", alloc_len == alloc_len_sizet); + LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_init: allocating %d bytes for private data\n", (int)alloc_len)); + br = (bridgeif_private_t *)mem_calloc(1, alloc_len); + if (br == NULL) { + LWIP_DEBUGF(NETIF_DEBUG, ("bridgeif_init: out of memory\n")); + return ERR_MEM; + } + memcpy(&br->ethaddr, &init_data->ethaddr, sizeof(br->ethaddr)); + br->netif = netif; + + br->max_ports = init_data->max_ports; + br->ports = (bridgeif_port_t *)(br + 1); + + br->max_fdbs_entries = init_data->max_fdb_static_entries; + br->fdbs = (bridgeif_fdb_static_entry_t *)(((u8_t *)(br + 1)) + (init_data->max_ports * sizeof(bridgeif_port_t))); + + br->max_fdbd_entries = init_data->max_fdb_dynamic_entries; + br->fdbd = bridgeif_fdb_init(init_data->max_fdb_dynamic_entries); + if (br->fdbd == NULL) { + LWIP_DEBUGF(NETIF_DEBUG, ("bridgeif_init: out of memory in fdb_init\n")); + mem_free(br); + return ERR_MEM; + } + +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + netif->hostname = "lwip"; +#endif /* LWIP_NETIF_HOSTNAME */ + + /* + * Initialize the snmp variables and counters inside the struct netif. + * The last argument should be replaced with your link speed, in units + * of bits per second. + */ + MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, 0); + + netif->state = br; + netif->name[0] = IFNAME0; + netif->name[1] = IFNAME1; + /* We directly use etharp_output() here to save a function call. + * You can instead declare your own function an call etharp_output() + * from it if you have to do some checks before sending (e.g. if link + * is available...) */ +#if LWIP_IPV4 + netif->output = etharp_output; +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 + netif->output_ip6 = ethip6_output; +#endif /* LWIP_IPV6 */ + netif->linkoutput = bridgeif_output; + + /* set MAC hardware address length */ + netif->hwaddr_len = ETH_HWADDR_LEN; + + /* set MAC hardware address */ + memcpy(netif->hwaddr, &br->ethaddr, ETH_HWADDR_LEN); + + /* maximum transfer unit */ + netif->mtu = 1500; + + /* device capabilities */ + /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6 | NETIF_FLAG_LINK_UP; + +#if LWIP_IPV6 && LWIP_IPV6_MLD + /* + * For hardware/netifs that implement MAC filtering. + * All-nodes link-local is handled by default, so we must let the hardware know + * to allow multicast packets in. + * Should set mld_mac_filter previously. */ + if (netif->mld_mac_filter != NULL) { + ip6_addr_t ip6_allnodes_ll; + ip6_addr_set_allnodes_linklocal(&ip6_allnodes_ll); + netif->mld_mac_filter(netif, &ip6_allnodes_ll, NETIF_ADD_MAC_FILTER); + } +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ + + return ERR_OK; +} + +/** + * @ingroup bridgeif + * Add a port to the bridge + */ +err_t +bridgeif_add_port(struct netif *bridgeif, struct netif *portif) +{ + bridgeif_private_t *br; + bridgeif_port_t *port; + + LWIP_ASSERT("bridgeif != NULL", bridgeif != NULL); + LWIP_ASSERT("bridgeif->state != NULL", bridgeif->state != NULL); + LWIP_ASSERT("portif != NULL", portif != NULL); + + if (!(portif->flags & NETIF_FLAG_ETHARP) || !(portif->flags & NETIF_FLAG_ETHERNET)) { + /* can only add ETHERNET/ETHARP interfaces */ + return ERR_VAL; + } + + br = (bridgeif_private_t *)bridgeif->state; + + if (br->num_ports >= br->max_ports) { + return ERR_VAL; + } + port = &br->ports[br->num_ports]; + port->port_netif = portif; + port->port_num = br->num_ports; + port->bridge = br; + br->num_ports++; + + /* let the port call us on input */ +#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT + portif->input = bridgeif_input; +#else + portif->input = bridgeif_tcpip_input; +#endif + /* store pointer to bridge in netif */ + netif_set_client_data(portif, bridgeif_netif_client_id, port); + /* remove ETHARP flag to prevent sending report events on netif-up */ + netif_clear_flags(portif, NETIF_FLAG_ETHARP); + + return ERR_OK; +} + +#endif /* LWIP_NUM_NETIF_CLIENT_DATA */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif_fdb.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif_fdb.c new file mode 100644 index 0000000..6739fc2 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/bridgeif_fdb.c @@ -0,0 +1,212 @@ +/** + * @file + * lwIP netif implementing an FDB for IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +/** + * @defgroup bridgeif_fdb FDB example code + * @ingroup bridgeif + * This file implements an example for an FDB (Forwarding DataBase) + */ + +#include "netif/bridgeif.h" +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/timeouts.h" +#include + +#define BRIDGEIF_AGE_TIMER_MS 1000 + +#define BR_FDB_TIMEOUT_SEC (60*5) /* 5 minutes FDB timeout */ + +typedef struct bridgeif_dfdb_entry_s { + u8_t used; + u8_t port; + u32_t ts; + struct eth_addr addr; +} bridgeif_dfdb_entry_t; + +typedef struct bridgeif_dfdb_s { + u16_t max_fdb_entries; + bridgeif_dfdb_entry_t *fdb; +} bridgeif_dfdb_t; + +/** + * @ingroup bridgeif_fdb + * A real simple and slow implementation of an auto-learning forwarding database that + * remembers known src mac addresses to know which port to send frames destined for that + * mac address. + * + * ATTENTION: This is meant as an example only, in real-world use, you should + * provide a better implementation :-) + */ +void +bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx) +{ + int i; + bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)fdb_ptr; + BRIDGEIF_DECL_PROTECT(lev); + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < fdb->max_fdb_entries; i++) { + bridgeif_dfdb_entry_t *e = &fdb->fdb[i]; + if (e->used && e->ts) { + if (!memcmp(&e->addr, src_addr, sizeof(struct eth_addr))) { + LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: update src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n", + src_addr->addr[0], src_addr->addr[1], src_addr->addr[2], src_addr->addr[3], src_addr->addr[4], src_addr->addr[5], + port_idx, i)); + BRIDGEIF_WRITE_PROTECT(lev); + e->ts = BR_FDB_TIMEOUT_SEC; + e->port = port_idx; + BRIDGEIF_WRITE_UNPROTECT(lev); + BRIDGEIF_READ_UNPROTECT(lev); + return; + } + } + } + /* not found, allocate new entry from free */ + for (i = 0; i < fdb->max_fdb_entries; i++) { + bridgeif_dfdb_entry_t *e = &fdb->fdb[i]; + if (!e->used || !e->ts) { + BRIDGEIF_WRITE_PROTECT(lev); + /* check again when protected */ + if (!e->used || !e->ts) { + LWIP_DEBUGF(BRIDGEIF_FDB_DEBUG, ("br: create src %02x:%02x:%02x:%02x:%02x:%02x (from %d) @ idx %d\n", + src_addr->addr[0], src_addr->addr[1], src_addr->addr[2], src_addr->addr[3], src_addr->addr[4], src_addr->addr[5], + port_idx, i)); + memcpy(&e->addr, src_addr, sizeof(struct eth_addr)); + e->ts = BR_FDB_TIMEOUT_SEC; + e->port = port_idx; + e->used = 1; + BRIDGEIF_WRITE_UNPROTECT(lev); + BRIDGEIF_READ_UNPROTECT(lev); + return; + } + BRIDGEIF_WRITE_UNPROTECT(lev); + } + } + BRIDGEIF_READ_UNPROTECT(lev); + /* not found, no free entry -> flood */ +} + +/** + * @ingroup bridgeif_fdb + * Walk our list of auto-learnt fdb entries and return a port to forward or BR_FLOOD if unknown + */ +bridgeif_portmask_t +bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr) +{ + int i; + bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)fdb_ptr; + BRIDGEIF_DECL_PROTECT(lev); + BRIDGEIF_READ_PROTECT(lev); + for (i = 0; i < fdb->max_fdb_entries; i++) { + bridgeif_dfdb_entry_t *e = &fdb->fdb[i]; + if (e->used && e->ts) { + if (!memcmp(&e->addr, dst_addr, sizeof(struct eth_addr))) { + bridgeif_portmask_t ret = (bridgeif_portmask_t)(1 << e->port); + BRIDGEIF_READ_UNPROTECT(lev); + return ret; + } + } + } + BRIDGEIF_READ_UNPROTECT(lev); + return BR_FLOOD; +} + +/** + * @ingroup bridgeif_fdb + * Aging implementation of our simple fdb + */ +static void +bridgeif_fdb_age_one_second(void *fdb_ptr) +{ + int i; + bridgeif_dfdb_t *fdb; + BRIDGEIF_DECL_PROTECT(lev); + + fdb = (bridgeif_dfdb_t *)fdb_ptr; + BRIDGEIF_READ_PROTECT(lev); + + for (i = 0; i < fdb->max_fdb_entries; i++) { + bridgeif_dfdb_entry_t *e = &fdb->fdb[i]; + if (e->used && e->ts) { + BRIDGEIF_WRITE_PROTECT(lev); + /* check again when protected */ + if (e->used && e->ts) { + if (--e->ts == 0) { + e->used = 0; + } + } + BRIDGEIF_WRITE_UNPROTECT(lev); + } + } + BRIDGEIF_READ_UNPROTECT(lev); +} + +/** Timer callback for fdb aging, called once per second */ +static void +bridgeif_age_tmr(void *arg) +{ + bridgeif_dfdb_t *fdb = (bridgeif_dfdb_t *)arg; + + LWIP_ASSERT("invalid arg", arg != NULL); + + bridgeif_fdb_age_one_second(fdb); + sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, arg); +} + +/** + * @ingroup bridgeif_fdb + * Init our simple fdb list + */ +void * +bridgeif_fdb_init(u16_t max_fdb_entries) +{ + bridgeif_dfdb_t *fdb; + size_t alloc_len_sizet = sizeof(bridgeif_dfdb_t) + (max_fdb_entries * sizeof(bridgeif_dfdb_entry_t)); + mem_size_t alloc_len = (mem_size_t)alloc_len_sizet; + LWIP_ASSERT("alloc_len == alloc_len_sizet", alloc_len == alloc_len_sizet); + LWIP_DEBUGF(BRIDGEIF_DEBUG, ("bridgeif_fdb_init: allocating %d bytes for private FDB data\n", (int)alloc_len)); + fdb = (bridgeif_dfdb_t *)mem_calloc(1, alloc_len); + if (fdb == NULL) { + return NULL; + } + fdb->max_fdb_entries = max_fdb_entries; + fdb->fdb = (bridgeif_dfdb_entry_t *)(fdb + 1); + + sys_timeout(BRIDGEIF_AGE_TIMER_MS, bridgeif_age_tmr, fdb); + + return fdb; +} diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernet.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ethernet.c similarity index 75% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernet.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ethernet.c index 52ea423..dd171e2 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernet.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ethernet.c @@ -1,7 +1,7 @@ /** * @file * Ethernet common functions - * + * * @defgroup ethernet Ethernet * @ingroup callbackstyle_api */ @@ -60,8 +60,8 @@ #include LWIP_HOOK_FILENAME #endif -const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; -const struct eth_addr ethzero = {{0,0,0,0,0,0}}; +const struct eth_addr ethbroadcast = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; +const struct eth_addr ethzero = {{0, 0, 0, 0, 0, 0}}; /** * @ingroup lwip_nosys @@ -72,7 +72,7 @@ const struct eth_addr ethzero = {{0,0,0,0,0,0}}; * * @param p the received packet, p->payload pointing to the ethernet header * @param netif the network interface on which the packet was received - * + * * @see LWIP_HOOK_UNKNOWN_ETH_PROTOCOL * @see ETHARP_SUPPORT_VLAN * @see LWIP_HOOK_VLAN_CHECK @@ -80,12 +80,14 @@ const struct eth_addr ethzero = {{0,0,0,0,0,0}}; err_t ethernet_input(struct pbuf *p, struct netif *netif) { - struct eth_hdr* ethhdr; + struct eth_hdr *ethhdr; u16_t type; #if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6 - s16_t ip_hdr_offset = SIZEOF_ETH_HDR; + u16_t next_hdr_offset = SIZEOF_ETH_HDR; #endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */ + LWIP_ASSERT_CORE_LOCKED(); + if (p->len <= SIZEOF_ETH_HDR) { /* a packet with only an ethernet header (or less) is not valid for us */ ETHARP_STATS_INC(etharp.proterr); @@ -94,20 +96,25 @@ ethernet_input(struct pbuf *p, struct netif *netif) goto free_and_return; } + if (p->if_idx == NETIF_NO_INDEX) { + p->if_idx = netif_get_index(netif); + } + /* points to packet payload, which starts with an Ethernet header */ ethhdr = (struct eth_hdr *)p->payload; LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, - ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n", - (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2], - (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5], - (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2], - (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5], - lwip_htons(ethhdr->type))); + ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n", + (unsigned char)ethhdr->dest.addr[0], (unsigned char)ethhdr->dest.addr[1], (unsigned char)ethhdr->dest.addr[2], + (unsigned char)ethhdr->dest.addr[3], (unsigned char)ethhdr->dest.addr[4], (unsigned char)ethhdr->dest.addr[5], + (unsigned char)ethhdr->src.addr[0], (unsigned char)ethhdr->src.addr[1], (unsigned char)ethhdr->src.addr[2], + (unsigned char)ethhdr->src.addr[3], (unsigned char)ethhdr->src.addr[4], (unsigned char)ethhdr->src.addr[5], + lwip_htons(ethhdr->type))); type = ethhdr->type; #if ETHARP_SUPPORT_VLAN if (type == PP_HTONS(ETHTYPE_VLAN)) { - struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR); + struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr *)(((char *)ethhdr) + SIZEOF_ETH_HDR); + next_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR; if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) { /* a packet with only an ethernet/vlan header (or less) is not valid for us */ ETHARP_STATS_INC(etharp.proterr); @@ -129,7 +136,6 @@ ethernet_input(struct pbuf *p, struct netif *netif) } #endif /* defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) */ type = vlan->tpid; - ip_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR; } #endif /* ETHARP_SUPPORT_VLAN */ @@ -151,8 +157,8 @@ ethernet_input(struct pbuf *p, struct netif *netif) #if LWIP_IPV6 else if ((ethhdr->dest.addr[0] == LL_IP6_MULTICAST_ADDR_0) && (ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) { - /* mark the pbuf as link-layer multicast */ - p->flags |= PBUF_FLAG_LLMCAST; + /* mark the pbuf as link-layer multicast */ + p->flags |= PBUF_FLAG_LLMCAST; } #endif /* LWIP_IPV6 */ else if (eth_addr_cmp(ðhdr->dest, ðbroadcast)) { @@ -168,11 +174,11 @@ ethernet_input(struct pbuf *p, struct netif *netif) if (!(netif->flags & NETIF_FLAG_ETHARP)) { goto free_and_return; } - /* skip Ethernet header */ - if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) { + /* skip Ethernet header (min. size checked above) */ + if (pbuf_remove_header(p, next_hdr_offset)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("ethernet_input: IPv4 packet dropped, too short (%"S16_F"/%"S16_F")\n", - p->tot_len, ip_hdr_offset)); + ("ethernet_input: IPv4 packet dropped, too short (%"U16_F"/%"U16_F")\n", + p->tot_len, next_hdr_offset)); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet")); goto free_and_return; } else { @@ -185,11 +191,11 @@ ethernet_input(struct pbuf *p, struct netif *netif) if (!(netif->flags & NETIF_FLAG_ETHARP)) { goto free_and_return; } - /* skip Ethernet header */ - if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) { + /* skip Ethernet header (min. size checked above) */ + if (pbuf_remove_header(p, next_hdr_offset)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("ethernet_input: ARP response packet dropped, too short (%"S16_F"/%"S16_F")\n", - p->tot_len, ip_hdr_offset)); + ("ethernet_input: ARP response packet dropped, too short (%"U16_F"/%"U16_F")\n", + p->tot_len, next_hdr_offset)); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("Can't move over header in packet")); ETHARP_STATS_INC(etharp.lenerr); ETHARP_STATS_INC(etharp.drop); @@ -213,10 +219,10 @@ ethernet_input(struct pbuf *p, struct netif *netif) #if LWIP_IPV6 case PP_HTONS(ETHTYPE_IPV6): /* IPv6 */ /* skip Ethernet header */ - if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) { + if ((p->len < next_hdr_offset) || pbuf_remove_header(p, next_hdr_offset)) { LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, - ("ethernet_input: IPv6 packet dropped, too short (%"S16_F"/%"S16_F")\n", - p->tot_len, ip_hdr_offset)); + ("ethernet_input: IPv6 packet dropped, too short (%"U16_F"/%"U16_F")\n", + p->tot_len, next_hdr_offset)); goto free_and_return; } else { /* pass to IPv6 layer */ @@ -227,7 +233,7 @@ ethernet_input(struct pbuf *p, struct netif *netif) default: #ifdef LWIP_HOOK_UNKNOWN_ETH_PROTOCOL - if(LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p, netif) == ERR_OK) { + if (LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p, netif) == ERR_OK) { break; } #endif @@ -257,28 +263,27 @@ free_and_return: * @param p the packet to send. pbuf layer must be @ref PBUF_LINK. * @param src the source MAC address to be copied into the ethernet header * @param dst the destination MAC address to be copied into the ethernet header - * @param eth_type ethernet type (@ref eth_type) + * @param eth_type ethernet type (@ref lwip_ieee_eth_type) * @return ERR_OK if the packet was sent, any other err_t on failure */ err_t -ethernet_output(struct netif* netif, struct pbuf* p, - const struct eth_addr* src, const struct eth_addr* dst, - u16_t eth_type) -{ - struct eth_hdr* ethhdr; +ethernet_output(struct netif * netif, struct pbuf * p, + const struct eth_addr * src, const struct eth_addr * dst, + u16_t eth_type) { + struct eth_hdr *ethhdr; u16_t eth_type_be = lwip_htons(eth_type); #if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) s32_t vlan_prio_vid = LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type); if (vlan_prio_vid >= 0) { - struct eth_vlan_hdr* vlanhdr; + struct eth_vlan_hdr *vlanhdr; LWIP_ASSERT("prio_vid must be <= 0xFFFF", vlan_prio_vid <= 0xFFFF); - if (pbuf_header(p, SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) != 0) { + if (pbuf_add_header(p, SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) != 0) { goto pbuf_header_failed; } - vlanhdr = (struct eth_vlan_hdr*)(((u8_t*)p->payload) + SIZEOF_ETH_HDR); + vlanhdr = (struct eth_vlan_hdr *)(((u8_t *)p->payload) + SIZEOF_ETH_HDR); vlanhdr->tpid = eth_type_be; vlanhdr->prio_vid = lwip_htons((u16_t)vlan_prio_vid); @@ -286,27 +291,29 @@ ethernet_output(struct netif* netif, struct pbuf* p, } else #endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */ { - if (pbuf_header(p, SIZEOF_ETH_HDR) != 0) { + if (pbuf_add_header(p, SIZEOF_ETH_HDR) != 0) { goto pbuf_header_failed; } } - ethhdr = (struct eth_hdr*)p->payload; + LWIP_ASSERT_CORE_LOCKED(); + + ethhdr = (struct eth_hdr *)p->payload; ethhdr->type = eth_type_be; - ETHADDR32_COPY(ðhdr->dest, dst); - ETHADDR16_COPY(ðhdr->src, src); + SMEMCPY(ðhdr->dest, dst, ETH_HWADDR_LEN); + SMEMCPY(ðhdr->src, src, ETH_HWADDR_LEN); LWIP_ASSERT("netif->hwaddr_len must be 6 for ethernet_output!", - (netif->hwaddr_len == ETH_HWADDR_LEN)); + (netif->hwaddr_len == ETH_HWADDR_LEN)); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, - ("ethernet_output: sending packet %p\n", (void *)p)); + ("ethernet_output: sending packet %p\n", (void *)p)); /* send the packet */ return netif->linkoutput(netif, p); pbuf_header_failed: LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, - ("ethernet_output: could not allocate room for header.\n")); + ("ethernet_output: could not allocate room for header.\n")); LINK_STATS_INC(link.lenerr); return ERR_BUF; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernetif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ethernetif.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ethernetif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ethernetif.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6.c new file mode 100644 index 0000000..5e6f009 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6.c @@ -0,0 +1,920 @@ +/** + * @file + * + * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. + * + * This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282. + * @todo: RFC 6775. + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +/** + * @defgroup sixlowpan 6LoWPAN (RFC4944) + * @ingroup netifs + * 6LowPAN netif implementation + */ + +#include "netif/lowpan6.h" + +#if LWIP_IPV6 + +#include "lwip/ip.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/nd6.h" +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/tcpip.h" +#include "lwip/snmp.h" +#include "netif/ieee802154.h" + +#include + +#if LWIP_6LOWPAN_802154_HW_CRC +#define LWIP_6LOWPAN_DO_CALC_CRC(buf, len) 0 +#else +#define LWIP_6LOWPAN_DO_CALC_CRC(buf, len) LWIP_6LOWPAN_CALC_CRC(buf, len) +#endif + +/** This is a helper struct for reassembly of fragments + * (IEEE 802.15.4 limits to 127 bytes) + */ +struct lowpan6_reass_helper { + struct lowpan6_reass_helper *next_packet; + struct pbuf *reass; + struct pbuf *frags; + u8_t timer; + struct lowpan6_link_addr sender_addr; + u16_t datagram_size; + u16_t datagram_tag; +}; + +/** This struct keeps track of per-netif state */ +struct lowpan6_ieee802154_data { + /** fragment reassembly list */ + struct lowpan6_reass_helper *reass_list; +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + /** address context for compression */ + ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS]; +#endif + /** Datagram Tag for fragmentation */ + u16_t tx_datagram_tag; + /** local PAN ID for IEEE 802.15.4 header */ + u16_t ieee_802154_pan_id; + /** Sequence Number for IEEE 802.15.4 transmission */ + u8_t tx_frame_seq_num; +}; + +/* Maximum frame size is 127 bytes minus CRC size */ +#define LOWPAN6_MAX_PAYLOAD (127 - 2) + +/** Currently, this state is global, since there's only one 6LoWPAN netif */ +static struct lowpan6_ieee802154_data lowpan6_data; + +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 +#define LWIP_6LOWPAN_CONTEXTS(netif) lowpan6_data.lowpan6_context +#else +#define LWIP_6LOWPAN_CONTEXTS(netif) NULL +#endif + +static const struct lowpan6_link_addr ieee_802154_broadcast = {2, {0xff, 0xff}}; + +#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS +static struct lowpan6_link_addr short_mac_addr = {2, {0, 0}}; +#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ + +/* IEEE 802.15.4 specific functions: */ + +/** Write the IEEE 802.15.4 header that encapsulates the 6LoWPAN frame. + * Src and dst PAN IDs are filled with the ID set by @ref lowpan6_set_pan_id. + * + * Since the length is variable: + * @returns the header length + */ +static u8_t +lowpan6_write_iee802154_header(struct ieee_802154_hdr *hdr, const struct lowpan6_link_addr *src, + const struct lowpan6_link_addr *dst) +{ + u8_t ieee_header_len; + u8_t *buffer; + u8_t i; + u16_t fc; + + fc = IEEE_802154_FC_FT_DATA; /* send data packet (2003 frame version) */ + fc |= IEEE_802154_FC_PANID_COMPR; /* set PAN ID compression, for now src and dst PANs are equal */ + if (dst != &ieee_802154_broadcast) { + fc |= IEEE_802154_FC_ACK_REQ; /* data packet, no broadcast: ack required. */ + } + if (dst->addr_len == 2) { + fc |= IEEE_802154_FC_DST_ADDR_MODE_SHORT; + } else { + LWIP_ASSERT("invalid dst address length", dst->addr_len == 8); + fc |= IEEE_802154_FC_DST_ADDR_MODE_EXT; + } + if (src->addr_len == 2) { + fc |= IEEE_802154_FC_SRC_ADDR_MODE_SHORT; + } else { + LWIP_ASSERT("invalid src address length", src->addr_len == 8); + fc |= IEEE_802154_FC_SRC_ADDR_MODE_EXT; + } + hdr->frame_control = fc; + hdr->sequence_number = lowpan6_data.tx_frame_seq_num++; + hdr->destination_pan_id = lowpan6_data.ieee_802154_pan_id; /* pan id */ + + buffer = (u8_t *)hdr; + ieee_header_len = 5; + i = dst->addr_len; + /* reverse memcpy of dst addr */ + while (i-- > 0) { + buffer[ieee_header_len++] = dst->addr[i]; + } + /* Source PAN ID skipped due to PAN ID Compression */ + i = src->addr_len; + /* reverse memcpy of src addr */ + while (i-- > 0) { + buffer[ieee_header_len++] = src->addr[i]; + } + return ieee_header_len; +} + +/** Parse the IEEE 802.15.4 header from a pbuf. + * If successful, the header is hidden from the pbuf. + * + * PAN IDs and seuqence number are not checked + * + * @param p input pbuf, p->payload pointing at the IEEE 802.15.4 header + * @param src pointer to source address filled from the header + * @param dest pointer to destination address filled from the header + * @returns ERR_OK if successful + */ +static err_t +lowpan6_parse_iee802154_header(struct pbuf *p, struct lowpan6_link_addr *src, + struct lowpan6_link_addr *dest) +{ + u8_t *puc; + s8_t i; + u16_t frame_control, addr_mode; + u16_t datagram_offset; + + /* Parse IEEE 802.15.4 header */ + puc = (u8_t *)p->payload; + frame_control = puc[0] | (puc[1] << 8); + datagram_offset = 2; + if (frame_control & IEEE_802154_FC_SEQNO_SUPPR) { + if (IEEE_802154_FC_FRAME_VERSION_GET(frame_control) <= 1) { + /* sequence number suppressed, this is not valid for versions 0/1 */ + return ERR_VAL; + } + } else { + datagram_offset++; + } + datagram_offset += 2; /* Skip destination PAN ID */ + addr_mode = frame_control & IEEE_802154_FC_DST_ADDR_MODE_MASK; + if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_EXT) { + /* extended address (64 bit) */ + dest->addr_len = 8; + /* reverse memcpy: */ + for (i = 0; i < 8; i++) { + dest->addr[i] = puc[datagram_offset + 7 - i]; + } + datagram_offset += 8; + } else if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_SHORT) { + /* short address (16 bit) */ + dest->addr_len = 2; + /* reverse memcpy: */ + dest->addr[0] = puc[datagram_offset + 1]; + dest->addr[1] = puc[datagram_offset]; + datagram_offset += 2; + } else { + /* unsupported address mode (do we need "no address"?) */ + return ERR_VAL; + } + + if (!(frame_control & IEEE_802154_FC_PANID_COMPR)) { + /* No PAN ID compression, skip source PAN ID */ + datagram_offset += 2; + } + + addr_mode = frame_control & IEEE_802154_FC_SRC_ADDR_MODE_MASK; + if (addr_mode == IEEE_802154_FC_SRC_ADDR_MODE_EXT) { + /* extended address (64 bit) */ + src->addr_len = 8; + /* reverse memcpy: */ + for (i = 0; i < 8; i++) { + src->addr[i] = puc[datagram_offset + 7 - i]; + } + datagram_offset += 8; + } else if (addr_mode == IEEE_802154_FC_DST_ADDR_MODE_SHORT) { + /* short address (16 bit) */ + src->addr_len = 2; + src->addr[0] = puc[datagram_offset + 1]; + src->addr[1] = puc[datagram_offset]; + datagram_offset += 2; + } else { + /* unsupported address mode (do we need "no address"?) */ + return ERR_VAL; + } + + /* hide IEEE802.15.4 header. */ + if (pbuf_remove_header(p, datagram_offset)) { + return ERR_VAL; + } + return ERR_OK; +} + +/** Calculate the 16-bit CRC as required by IEEE 802.15.4 */ +u16_t +lowpan6_calc_crc(const void* buf, u16_t len) +{ +#define CCITT_POLY_16 0x8408U + u16_t i; + u8_t b; + u16_t crc = 0; + const u8_t* p = (const u8_t*)buf; + + for (i = 0; i < len; i++) { + u8_t data = *p; + for (b = 0U; b < 8U; b++) { + if (((data ^ crc) & 1) != 0) { + crc = (u16_t)((crc >> 1) ^ CCITT_POLY_16); + } else { + crc = (u16_t)(crc >> 1); + } + data = (u8_t)(data >> 1); + } + p++; + } + return crc; +} + +/* Fragmentation specific functions: */ + +static void +free_reass_datagram(struct lowpan6_reass_helper *lrh) +{ + if (lrh->reass) { + pbuf_free(lrh->reass); + } + if (lrh->frags) { + pbuf_free(lrh->frags); + } + mem_free(lrh); +} + +/** + * Removes a datagram from the reassembly queue. + **/ +static void +dequeue_datagram(struct lowpan6_reass_helper *lrh, struct lowpan6_reass_helper *prev) +{ + if (lowpan6_data.reass_list == lrh) { + lowpan6_data.reass_list = lowpan6_data.reass_list->next_packet; + } else { + /* it wasn't the first, so it must have a valid 'prev' */ + LWIP_ASSERT("sanity check linked list", prev != NULL); + prev->next_packet = lrh->next_packet; + } +} + +/** + * Periodic timer for 6LowPAN functions: + * + * - Remove incomplete/old packets + */ +void +lowpan6_tmr(void) +{ + struct lowpan6_reass_helper *lrh, *lrh_next, *lrh_prev = NULL; + + lrh = lowpan6_data.reass_list; + while (lrh != NULL) { + lrh_next = lrh->next_packet; + if ((--lrh->timer) == 0) { + dequeue_datagram(lrh, lrh_prev); + free_reass_datagram(lrh); + } else { + lrh_prev = lrh; + } + lrh = lrh_next; + } +} + +/* + * Encapsulates data into IEEE 802.15.4 frames. + * Fragments an IPv6 datagram into 6LowPAN units, which fit into IEEE 802.15.4 frames. + * If configured, will compress IPv6 and or UDP headers. + * */ +static err_t +lowpan6_frag(struct netif *netif, struct pbuf *p, const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst) +{ + struct pbuf *p_frag; + u16_t frag_len, remaining_len, max_data_len; + u8_t *buffer; + u8_t ieee_header_len; + u8_t lowpan6_header_len; + u8_t hidden_header_len; + u16_t crc; + u16_t datagram_offset; + err_t err = ERR_IF; + + LWIP_ASSERT("lowpan6_frag: netif->linkoutput not set", netif->linkoutput != NULL); + + /* We'll use a dedicated pbuf for building 6LowPAN fragments. */ + p_frag = pbuf_alloc(PBUF_RAW, 127, PBUF_RAM); + if (p_frag == NULL) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + return ERR_MEM; + } + LWIP_ASSERT("this needs a pbuf in one piece", p_frag->len == p_frag->tot_len); + + /* Write IEEE 802.15.4 header. */ + buffer = (u8_t *)p_frag->payload; + ieee_header_len = lowpan6_write_iee802154_header((struct ieee_802154_hdr *)buffer, src, dst); + LWIP_ASSERT("ieee_header_len < p_frag->len", ieee_header_len < p_frag->len); + +#if LWIP_6LOWPAN_IPHC + /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */ + /* do the header compression (this does NOT copy any non-compressed data) */ + err = lowpan6_compress_headers(netif, (u8_t *)p->payload, p->len, + &buffer[ieee_header_len], p_frag->len - ieee_header_len, &lowpan6_header_len, + &hidden_header_len, LWIP_6LOWPAN_CONTEXTS(netif), src, dst); + if (err != ERR_OK) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + pbuf_free(p_frag); + return err; + } + pbuf_remove_header(p, hidden_header_len); + +#else /* LWIP_6LOWPAN_IPHC */ + /* Send uncompressed IPv6 header with appropriate dispatch byte. */ + lowpan6_header_len = 1; + buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */ +#endif /* LWIP_6LOWPAN_IPHC */ + + /* Calculate remaining packet length */ + remaining_len = p->tot_len; + + if (remaining_len > 0x7FF) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + /* datagram_size must fit into 11 bit */ + pbuf_free(p_frag); + return ERR_VAL; + } + + /* Fragment, or 1 packet? */ + max_data_len = LOWPAN6_MAX_PAYLOAD - ieee_header_len - lowpan6_header_len; + if (remaining_len > max_data_len) { + u16_t data_len; + /* We must move the 6LowPAN header to make room for the FRAG header. */ + memmove(&buffer[ieee_header_len + 4], &buffer[ieee_header_len], lowpan6_header_len); + + /* Now we need to fragment the packet. FRAG1 header first */ + buffer[ieee_header_len] = 0xc0 | (((p->tot_len + hidden_header_len) >> 8) & 0x7); + buffer[ieee_header_len + 1] = (p->tot_len + hidden_header_len) & 0xff; + + lowpan6_data.tx_datagram_tag++; + buffer[ieee_header_len + 2] = (lowpan6_data.tx_datagram_tag >> 8) & 0xff; + buffer[ieee_header_len + 3] = lowpan6_data.tx_datagram_tag & 0xff; + + /* Fragment follows. */ + data_len = (max_data_len - 4) & 0xf8; + frag_len = data_len + lowpan6_header_len; + + pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len + 4, frag_len - lowpan6_header_len, 0); + remaining_len -= frag_len - lowpan6_header_len; + /* datagram offset holds the offset before compression */ + datagram_offset = frag_len - lowpan6_header_len + hidden_header_len; + LWIP_ASSERT("datagram offset must be a multiple of 8", (datagram_offset & 7) == 0); + + /* Calculate frame length */ + p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 bytes for crc*/ + + /* 2 bytes CRC */ + crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2); + pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2); + + /* send the packet */ + MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); + LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); + err = netif->linkoutput(netif, p_frag); + + while ((remaining_len > 0) && (err == ERR_OK)) { + struct ieee_802154_hdr *hdr = (struct ieee_802154_hdr *)buffer; + /* new frame, new seq num for ACK */ + hdr->sequence_number = lowpan6_data.tx_frame_seq_num++; + + buffer[ieee_header_len] |= 0x20; /* Change FRAG1 to FRAGN */ + + LWIP_ASSERT("datagram offset must be a multiple of 8", (datagram_offset & 7) == 0); + buffer[ieee_header_len + 4] = (u8_t)(datagram_offset >> 3); /* datagram offset in FRAGN header (datagram_offset is max. 11 bit) */ + + frag_len = (127 - ieee_header_len - 5 - 2) & 0xf8; + if (frag_len > remaining_len) { + frag_len = remaining_len; + } + + pbuf_copy_partial(p, buffer + ieee_header_len + 5, frag_len, p->tot_len - remaining_len); + remaining_len -= frag_len; + datagram_offset += frag_len; + + /* Calculate frame length */ + p_frag->len = p_frag->tot_len = frag_len + 5 + ieee_header_len + 2; + + /* 2 bytes CRC */ + crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2); + pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2); + + /* send the packet */ + MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); + LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); + err = netif->linkoutput(netif, p_frag); + } + } else { + /* It fits in one frame. */ + frag_len = remaining_len; + + /* Copy IPv6 packet */ + pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len, frag_len, 0); + remaining_len = 0; + + /* Calculate frame length */ + p_frag->len = p_frag->tot_len = frag_len + lowpan6_header_len + ieee_header_len + 2; + LWIP_ASSERT("", p_frag->len <= 127); + + /* 2 bytes CRC */ + crc = LWIP_6LOWPAN_DO_CALC_CRC(p_frag->payload, p_frag->len - 2); + pbuf_take_at(p_frag, &crc, 2, p_frag->len - 2); + + /* send the packet */ + MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); + LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG | LWIP_DBG_TRACE, ("lowpan6_send: sending packet %p\n", (void *)p)); + err = netif->linkoutput(netif, p_frag); + } + + pbuf_free(p_frag); + + return err; +} + +/** + * @ingroup sixlowpan + * Set context + */ +err_t +lowpan6_set_context(u8_t idx, const ip6_addr_t *context) +{ +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) { + return ERR_ARG; + } + + IP6_ADDR_ZONECHECK(context); + + ip6_addr_set(&lowpan6_data.lowpan6_context[idx], context); + + return ERR_OK; +#else + LWIP_UNUSED_ARG(idx); + LWIP_UNUSED_ARG(context); + return ERR_ARG; +#endif +} + +#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS +/** + * @ingroup sixlowpan + * Set short address + */ +err_t +lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low) +{ + short_mac_addr.addr[0] = addr_high; + short_mac_addr.addr[1] = addr_low; + + return ERR_OK; +} +#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ + +/* Create IEEE 802.15.4 address from netif address */ +static err_t +lowpan6_hwaddr_to_addr(struct netif *netif, struct lowpan6_link_addr *addr) +{ + addr->addr_len = 8; + if (netif->hwaddr_len == 8) { + LWIP_ERROR("NETIF_MAX_HWADDR_LEN >= 8 required", sizeof(netif->hwaddr) >= 8, return ERR_VAL;); + SMEMCPY(addr->addr, netif->hwaddr, 8); + } else if (netif->hwaddr_len == 6) { + /* Copy from MAC-48 */ + SMEMCPY(addr->addr, netif->hwaddr, 3); + addr->addr[3] = addr->addr[4] = 0xff; + SMEMCPY(&addr->addr[5], &netif->hwaddr[3], 3); + } else { + /* Invalid address length, don't know how to convert this */ + return ERR_VAL; + } + return ERR_OK; +} + +/** + * @ingroup sixlowpan + * Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet. + * + * Perform Header Compression and fragment if necessary. + * + * @param netif The lwIP network interface which the IP packet will be sent on. + * @param q The pbuf(s) containing the IP packet to be sent. + * @param ip6addr The IP address of the packet destination. + * + * @return err_t + */ +err_t +lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr) +{ + err_t result; + const u8_t *hwaddr; + struct lowpan6_link_addr src, dest; +#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS + ip6_addr_t ip6_src; + struct ip6_hdr *ip6_hdr; +#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ + +#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS + /* Check if we can compress source address (use aligned copy) */ + ip6_hdr = (struct ip6_hdr *)q->payload; + ip6_addr_copy_from_packed(ip6_src, ip6_hdr->src); + ip6_addr_assign_zone(&ip6_src, IP6_UNICAST, netif); + if (lowpan6_get_address_mode(&ip6_src, &short_mac_addr) == 3) { + src.addr_len = 2; + src.addr[0] = short_mac_addr.addr[0]; + src.addr[1] = short_mac_addr.addr[1]; + } else +#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ + { + result = lowpan6_hwaddr_to_addr(netif, &src); + if (result != ERR_OK) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + return result; + } + } + + /* multicast destination IP address? */ + if (ip6_addr_ismulticast(ip6addr)) { + MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts); + /* We need to send to the broadcast address.*/ + return lowpan6_frag(netif, q, &src, &ieee_802154_broadcast); + } + + /* We have a unicast destination IP address */ + /* @todo anycast? */ + +#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS + if (src.addr_len == 2) { + /* If source address was compressable to short_mac_addr, and dest has same subnet and + * is also compressable to 2-bytes, assume we can infer dest as a short address too. */ + dest.addr_len = 2; + dest.addr[0] = ((u8_t *)q->payload)[38]; + dest.addr[1] = ((u8_t *)q->payload)[39]; + if ((src.addr_len == 2) && (ip6_addr_netcmp_zoneless(&ip6_hdr->src, &ip6_hdr->dest)) && + (lowpan6_get_address_mode(ip6addr, &dest) == 3)) { + MIB2_STATS_NETIF_INC(netif, ifoutucastpkts); + return lowpan6_frag(netif, q, &src, &dest); + } + } +#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */ + + /* Ask ND6 what to do with the packet. */ + result = nd6_get_next_hop_addr_or_queue(netif, q, ip6addr, &hwaddr); + if (result != ERR_OK) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + return result; + } + + /* If no hardware address is returned, nd6 has queued the packet for later. */ + if (hwaddr == NULL) { + return ERR_OK; + } + + /* Send out the packet using the returned hardware address. */ + dest.addr_len = netif->hwaddr_len; + /* XXX: Inferring the length of the source address from the destination address + * is not correct for IEEE 802.15.4, but currently we don't get this information + * from the neighbor cache */ + SMEMCPY(dest.addr, hwaddr, netif->hwaddr_len); + MIB2_STATS_NETIF_INC(netif, ifoutucastpkts); + return lowpan6_frag(netif, q, &src, &dest); +} +/** + * @ingroup sixlowpan + * NETIF input function: don't free the input pbuf when returning != ERR_OK! + */ +err_t +lowpan6_input(struct pbuf *p, struct netif *netif) +{ + u8_t *puc, b; + s8_t i; + struct lowpan6_link_addr src, dest; + u16_t datagram_size = 0; + u16_t datagram_offset, datagram_tag; + struct lowpan6_reass_helper *lrh, *lrh_next, *lrh_prev = NULL; + + if (p == NULL) { + return ERR_OK; + } + + MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len); + + if (p->len != p->tot_len) { + /* for now, this needs a pbuf in one piece */ + goto lowpan6_input_discard; + } + + if (lowpan6_parse_iee802154_header(p, &src, &dest) != ERR_OK) { + goto lowpan6_input_discard; + } + + /* Check dispatch. */ + puc = (u8_t *)p->payload; + + b = *puc; + if ((b & 0xf8) == 0xc0) { + /* FRAG1 dispatch. add this packet to reassembly list. */ + datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1]; + datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3]; + + /* check for duplicate */ + lrh = lowpan6_data.reass_list; + while (lrh != NULL) { + uint8_t discard = 0; + lrh_next = lrh->next_packet; + if ((lrh->sender_addr.addr_len == src.addr_len) && + (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0)) { + /* address match with packet in reassembly. */ + if ((datagram_tag == lrh->datagram_tag) && (datagram_size == lrh->datagram_size)) { + /* duplicate fragment. */ + goto lowpan6_input_discard; + } else { + /* We are receiving the start of a new datagram. Discard old one (incomplete). */ + discard = 1; + } + } + if (discard) { + dequeue_datagram(lrh, lrh_prev); + free_reass_datagram(lrh); + } else { + lrh_prev = lrh; + } + /* Check next datagram in queue. */ + lrh = lrh_next; + } + + pbuf_remove_header(p, 4); /* hide frag1 dispatch */ + + lrh = (struct lowpan6_reass_helper *) mem_malloc(sizeof(struct lowpan6_reass_helper)); + if (lrh == NULL) { + goto lowpan6_input_discard; + } + + lrh->sender_addr.addr_len = src.addr_len; + for (i = 0; i < src.addr_len; i++) { + lrh->sender_addr.addr[i] = src.addr[i]; + } + lrh->datagram_size = datagram_size; + lrh->datagram_tag = datagram_tag; + lrh->frags = NULL; + if (*(u8_t *)p->payload == 0x41) { + /* This is a complete IPv6 packet, just skip dispatch byte. */ + pbuf_remove_header(p, 1); /* hide dispatch byte. */ + lrh->reass = p; + } else if ((*(u8_t *)p->payload & 0xe0 ) == 0x60) { + lrh->reass = lowpan6_decompress(p, datagram_size, LWIP_6LOWPAN_CONTEXTS(netif), &src, &dest); + if (lrh->reass == NULL) { + /* decompression failed */ + mem_free(lrh); + goto lowpan6_input_discard; + } + } + /* TODO: handle the case where we already have FRAGN received */ + lrh->next_packet = lowpan6_data.reass_list; + lrh->timer = 2; + lowpan6_data.reass_list = lrh; + + return ERR_OK; + } else if ((b & 0xf8) == 0xe0) { + /* FRAGN dispatch, find packet being reassembled. */ + datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1]; + datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3]; + datagram_offset = (u16_t)puc[4] << 3; + pbuf_remove_header(p, 4); /* hide frag1 dispatch but keep datagram offset for reassembly */ + + for (lrh = lowpan6_data.reass_list; lrh != NULL; lrh_prev = lrh, lrh = lrh->next_packet) { + if ((lrh->sender_addr.addr_len == src.addr_len) && + (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0) && + (datagram_tag == lrh->datagram_tag) && + (datagram_size == lrh->datagram_size)) { + break; + } + } + if (lrh == NULL) { + /* rogue fragment */ + goto lowpan6_input_discard; + } + /* Insert new pbuf into list of fragments. Each fragment is a pbuf, + this only works for unchained pbufs. */ + LWIP_ASSERT("p->next == NULL", p->next == NULL); + if (lrh->reass != NULL) { + /* FRAG1 already received, check this offset against first len */ + if (datagram_offset < lrh->reass->len) { + /* fragment overlap, discard old fragments */ + dequeue_datagram(lrh, lrh_prev); + free_reass_datagram(lrh); + goto lowpan6_input_discard; + } + } + if (lrh->frags == NULL) { + /* first FRAGN */ + lrh->frags = p; + } else { + /* find the correct place to insert */ + struct pbuf *q, *last; + u16_t new_frag_len = p->len - 1; /* p->len includes datagram_offset byte */ + for (q = lrh->frags, last = NULL; q != NULL; last = q, q = q->next) { + u16_t q_datagram_offset = ((u8_t *)q->payload)[0] << 3; + u16_t q_frag_len = q->len - 1; + if (datagram_offset < q_datagram_offset) { + if (datagram_offset + new_frag_len > q_datagram_offset) { + /* overlap, discard old fragments */ + dequeue_datagram(lrh, lrh_prev); + free_reass_datagram(lrh); + goto lowpan6_input_discard; + } + /* insert here */ + break; + } else if (datagram_offset == q_datagram_offset) { + if (q_frag_len != new_frag_len) { + /* fragment mismatch, discard old fragments */ + dequeue_datagram(lrh, lrh_prev); + free_reass_datagram(lrh); + goto lowpan6_input_discard; + } + /* duplicate, ignore */ + pbuf_free(p); + return ERR_OK; + } + } + /* insert fragment */ + if (last == NULL) { + lrh->frags = p; + } else { + last->next = p; + p->next = q; + } + } + /* check if all fragments were received */ + if (lrh->reass) { + u16_t offset = lrh->reass->len; + struct pbuf *q; + for (q = lrh->frags; q != NULL; q = q->next) { + u16_t q_datagram_offset = ((u8_t *)q->payload)[0] << 3; + if (q_datagram_offset != offset) { + /* not complete, wait for more fragments */ + return ERR_OK; + } + offset += q->len - 1; + } + if (offset == datagram_size) { + /* all fragments received, combine pbufs */ + u16_t datagram_left = datagram_size - lrh->reass->len; + for (q = lrh->frags; q != NULL; q = q->next) { + /* hide datagram_offset byte now */ + pbuf_remove_header(q, 1); + q->tot_len = datagram_left; + datagram_left -= q->len; + } + LWIP_ASSERT("datagram_left == 0", datagram_left == 0); + q = lrh->reass; + q->tot_len = datagram_size; + q->next = lrh->frags; + lrh->frags = NULL; + lrh->reass = NULL; + dequeue_datagram(lrh, lrh_prev); + mem_free(lrh); + + /* @todo: distinguish unicast/multicast */ + MIB2_STATS_NETIF_INC(netif, ifinucastpkts); + return ip6_input(q, netif); + } + } + /* pbuf enqueued, waiting for more fragments */ + return ERR_OK; + } else { + if (b == 0x41) { + /* This is a complete IPv6 packet, just skip dispatch byte. */ + pbuf_remove_header(p, 1); /* hide dispatch byte. */ + } else if ((b & 0xe0 ) == 0x60) { + /* IPv6 headers are compressed using IPHC. */ + p = lowpan6_decompress(p, datagram_size, LWIP_6LOWPAN_CONTEXTS(netif), &src, &dest); + if (p == NULL) { + MIB2_STATS_NETIF_INC(netif, ifindiscards); + return ERR_OK; + } + } else { + goto lowpan6_input_discard; + } + + /* @todo: distinguish unicast/multicast */ + MIB2_STATS_NETIF_INC(netif, ifinucastpkts); + + return ip6_input(p, netif); + } +lowpan6_input_discard: + MIB2_STATS_NETIF_INC(netif, ifindiscards); + pbuf_free(p); + /* always return ERR_OK here to prevent the caller freeing the pbuf */ + return ERR_OK; +} + +/** + * @ingroup sixlowpan + */ +err_t +lowpan6_if_init(struct netif *netif) +{ + netif->name[0] = 'L'; + netif->name[1] = '6'; + netif->output_ip6 = lowpan6_output; + + MIB2_INIT_NETIF(netif, snmp_ifType_other, 0); + + /* maximum transfer unit */ + netif->mtu = IP6_MIN_MTU_LENGTH; + + /* broadcast capability */ + netif->flags = NETIF_FLAG_BROADCAST /* | NETIF_FLAG_LOWPAN6 */; + + return ERR_OK; +} + +/** + * @ingroup sixlowpan + * Set PAN ID + */ +err_t +lowpan6_set_pan_id(u16_t pan_id) +{ + lowpan6_data.ieee_802154_pan_id = pan_id; + + return ERR_OK; +} + +#if !NO_SYS +/** + * @ingroup sixlowpan + * Pass a received packet to tcpip_thread for input processing + * + * @param p the received packet, p->payload pointing to the + * IEEE 802.15.4 header. + * @param inp the network interface on which the packet was received + */ +err_t +tcpip_6lowpan_input(struct pbuf *p, struct netif *inp) +{ + return tcpip_inpkt(p, inp, lowpan6_input); +} +#endif /* !NO_SYS */ + +#endif /* LWIP_IPV6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_ble.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_ble.c new file mode 100644 index 0000000..6de0ae3 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_ble.c @@ -0,0 +1,447 @@ +/** + * @file + * 6LowPAN over BLE output for IPv6 (RFC7668). +*/ + +/* + * Copyright (c) 2017 Benjamin Aigner + * Copyright (c) 2015 Inico Technologies Ltd. , Author: Ivan Delamer + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Benjamin Aigner + * + * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c) + */ + + +/** + * @defgroup rfc7668if 6LoWPAN over BLE (RFC7668) + * @ingroup netifs + * This file implements a RFC7668 implementation for 6LoWPAN over + * Bluetooth Low Energy. The specification is very similar to 6LoWPAN, + * so most of the code is re-used. + * Compared to 6LoWPAN, much functionality is already implemented in + * lower BLE layers (fragmenting, session management,...). + * + * Usage: + * - add this netif + * - don't add IPv4 addresses (no IPv4 support in RFC7668), pass 'NULL','NULL','NULL' + * - use the BLE to EUI64 conversation util to create an IPv6 link-local address from the BLE MAC (@ref ble_addr_to_eui64) + * - input function: @ref rfc7668_input + * - set the link output function, which transmits output data to an established L2CAP channel + * - If data arrives (HCI event "L2CAP_DATA_PACKET"): + * - allocate a @ref PBUF_RAW buffer + * - let the pbuf struct point to the incoming data or copy it to the buffer + * - call netif->input + * + * @todo: + * - further testing + * - support compression contexts + * - support multiple addresses + * - support multicast + * - support neighbor discovery + */ + + +#include "netif/lowpan6_ble.h" + +#if LWIP_IPV6 + +#include "lwip/ip.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/nd6.h" +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/tcpip.h" +#include "lwip/snmp.h" + +#include + +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 +/** context memory, containing IPv6 addresses */ +static ip6_addr_t rfc7668_context[LWIP_6LOWPAN_NUM_CONTEXTS]; +#else +#define rfc7668_context NULL +#endif + +static struct lowpan6_link_addr rfc7668_local_addr; +static struct lowpan6_link_addr rfc7668_peer_addr; + +/** + * @ingroup rfc7668if + * convert BT address to EUI64 addr + * + * This method converts a Bluetooth MAC address to an EUI64 address, + * which is used within IPv6 communication + * + * @param dst IPv6 destination space + * @param src BLE MAC address source + * @param public_addr If the LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS + * option is set, bit 0x02 will be set if param=0 (no public addr); cleared otherwise + * + * @see LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS + */ +void +ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr) +{ + /* according to RFC7668 ch 3.2.2. */ + memcpy(dst, src, 3); + dst[3] = 0xFF; + dst[4] = 0xFE; + memcpy(&dst[5], &src[3], 3); +#if LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS + if(public_addr) { + dst[0] &= ~0x02; + } else { + dst[0] |= 0x02; + } +#else + LWIP_UNUSED_ARG(public_addr); +#endif +} + +/** + * @ingroup rfc7668if + * convert EUI64 address to Bluetooth MAC addr + * + * This method converts an EUI64 address to a Bluetooth MAC address, + * + * @param dst BLE MAC address destination + * @param src IPv6 source + * + */ +void +eui64_to_ble_addr(uint8_t *dst, const uint8_t *src) +{ + /* according to RFC7668 ch 3.2.2. */ + memcpy(dst,src,3); + memcpy(&dst[3],&src[5],3); +} + +/** Set an address used for stateful compression. + * This expects an address of 6 or 8 bytes. + */ +static err_t +rfc7668_set_addr(struct lowpan6_link_addr *addr, const u8_t *in_addr, size_t in_addr_len, int is_mac_48, int is_public_addr) +{ + if ((in_addr == NULL) || (addr == NULL)) { + return ERR_VAL; + } + if (is_mac_48) { + if (in_addr_len != 6) { + return ERR_VAL; + } + addr->addr_len = 8; + ble_addr_to_eui64(addr->addr, in_addr, is_public_addr); + } else { + if (in_addr_len != 8) { + return ERR_VAL; + } + addr->addr_len = 8; + memcpy(addr->addr, in_addr, 8); + } + return ERR_OK; +} + + +/** Set the local address used for stateful compression. + * This expects an address of 8 bytes. + */ +err_t +rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len) +{ + /* netif not used for now, the address is stored globally... */ + LWIP_UNUSED_ARG(netif); + return rfc7668_set_addr(&rfc7668_local_addr, local_addr, local_addr_len, 0, 0); +} + +/** Set the local address used for stateful compression. + * This expects an address of 6 bytes. + */ +err_t +rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr) +{ + /* netif not used for now, the address is stored globally... */ + LWIP_UNUSED_ARG(netif); + return rfc7668_set_addr(&rfc7668_local_addr, local_addr, local_addr_len, 1, is_public_addr); +} + +/** Set the peer address used for stateful compression. + * This expects an address of 8 bytes. + */ +err_t +rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len) +{ + /* netif not used for now, the address is stored globally... */ + LWIP_UNUSED_ARG(netif); + return rfc7668_set_addr(&rfc7668_peer_addr, peer_addr, peer_addr_len, 0, 0); +} + +/** Set the peer address used for stateful compression. + * This expects an address of 6 bytes. + */ +err_t +rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr) +{ + /* netif not used for now, the address is stored globally... */ + LWIP_UNUSED_ARG(netif); + return rfc7668_set_addr(&rfc7668_peer_addr, peer_addr, peer_addr_len, 1, is_public_addr); +} + +/** Encapsulate IPv6 frames for BLE transmission + * + * This method implements the IPv6 header compression: + * *) According to RFC6282 + * *) See Figure 2, contains base format of bit positions + * *) Fragmentation not necessary (done at L2CAP layer of BLE) + * @note Currently the pbuf allocation uses 256 bytes. If longer packets are used (possible due to MTU=1480Bytes), increase it here! + * + * @param p Pbuf struct, containing the payload data + * @param netif Output network interface. Should be of RFC7668 type + * + * @return Same as netif->output. + */ +static err_t +rfc7668_compress(struct netif *netif, struct pbuf *p) +{ + struct pbuf *p_frag; + u16_t remaining_len; + u8_t *buffer; + u8_t lowpan6_header_len; + u8_t hidden_header_len; + err_t err; + + LWIP_ASSERT("lowpan6_frag: netif->linkoutput not set", netif->linkoutput != NULL); + +#if LWIP_6LOWPAN_IPHC + + /* We'll use a dedicated pbuf for building BLE fragments. + * We'll over-allocate it by the bytes saved for header compression. + */ + p_frag = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if (p_frag == NULL) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + return ERR_MEM; + } + LWIP_ASSERT("this needs a pbuf in one piece", p_frag->len == p_frag->tot_len); + + /* Write IP6 header (with IPHC). */ + buffer = (u8_t*)p_frag->payload; + + err = lowpan6_compress_headers(netif, (u8_t *)p->payload, p->len, buffer, p_frag->len, + &lowpan6_header_len, &hidden_header_len, rfc7668_context, &rfc7668_local_addr, &rfc7668_peer_addr); + if (err != ERR_OK) { + MIB2_STATS_NETIF_INC(netif, ifoutdiscards); + pbuf_free(p_frag); + return err; + } + pbuf_remove_header(p, hidden_header_len); + + /* Calculate remaining packet length */ + remaining_len = p->tot_len; + + /* Copy IPv6 packet */ + pbuf_copy_partial(p, buffer + lowpan6_header_len, remaining_len, 0); + + /* Calculate frame length */ + p_frag->len = p_frag->tot_len = remaining_len + lowpan6_header_len; + + /* send the packet */ + MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len); + LWIP_DEBUGF(LWIP_LOWPAN6_DEBUG|LWIP_DBG_TRACE, ("rfc7668_output: sending packet %p\n", (void *)p)); + err = netif->linkoutput(netif, p_frag); + + pbuf_free(p_frag); + + return err; +#else /* LWIP_6LOWPAN_IPHC */ + /* 6LoWPAN over BLE requires IPHC! */ + return ERR_IF; +#endif/* LWIP_6LOWPAN_IPHC */ +} + +/** + * @ingroup rfc7668if + * Set context id IPv6 address + * + * Store one IPv6 address to a given context id. + * + * @param idx Context id + * @param context IPv6 addr for this context + * + * @return ERR_OK (if everything is fine), ERR_ARG (if the context id is out of range), ERR_VAL (if contexts disabled) + */ +err_t +rfc7668_set_context(u8_t idx, const ip6_addr_t *context) +{ +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + /* check if the ID is possible */ + if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) { + return ERR_ARG; + } + /* copy IPv6 address to context storage */ + ip6_addr_set(&rfc7668_context[idx], context); + return ERR_OK; +#else + LWIP_UNUSED_ARG(idx); + LWIP_UNUSED_ARG(context); + return ERR_VAL; +#endif +} + +/** + * @ingroup rfc7668if + * Compress outgoing IPv6 packet and pass it on to netif->linkoutput + * + * @param netif The lwIP network interface which the IP packet will be sent on. + * @param q The pbuf(s) containing the IP packet to be sent. + * @param ip6addr The IP address of the packet destination. + * + * @return See rfc7668_compress + */ +err_t +rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr) +{ + /* dst ip6addr is not used here, we only have one peer */ + LWIP_UNUSED_ARG(ip6addr); + + return rfc7668_compress(netif, q); +} + +/** + * @ingroup rfc7668if + * Process a received raw payload from an L2CAP channel + * + * @param p the received packet, p->payload pointing to the + * IPv6 header (maybe compressed) + * @param netif the network interface on which the packet was received + * + * @return ERR_OK if everything was fine + */ +err_t +rfc7668_input(struct pbuf * p, struct netif *netif) +{ + u8_t * puc; + + MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len); + + /* Load first header byte */ + puc = (u8_t*)p->payload; + + /* no IP header compression */ + if (*puc == 0x41) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, removing dispatch: 0x%2x \n", *puc)); + /* This is a complete IPv6 packet, just skip header byte. */ + pbuf_remove_header(p, 1); + /* IPHC header compression */ + } else if ((*puc & 0xe0 )== 0x60) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, decompress dispatch: 0x%2x \n", *puc)); + /* IPv6 headers are compressed using IPHC. */ + p = lowpan6_decompress(p, 0, rfc7668_context, &rfc7668_peer_addr, &rfc7668_local_addr); + /* if no pbuf is returned, handle as discarded packet */ + if (p == NULL) { + MIB2_STATS_NETIF_INC(netif, ifindiscards); + return ERR_OK; + } + /* invalid header byte, discard */ + } else { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Completed packet, discarding: 0x%2x \n", *puc)); + MIB2_STATS_NETIF_INC(netif, ifindiscards); + pbuf_free(p); + return ERR_OK; + } + /* @todo: distinguish unicast/multicast */ + MIB2_STATS_NETIF_INC(netif, ifinucastpkts); + +#if LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG + { + u16_t i; + LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("IPv6 payload:\n")); + for (i = 0; i < p->len; i++) { + if ((i%4)==0) { + LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("\n")); + } + LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("%2X ", *((uint8_t *)p->payload+i))); + } + LWIP_DEBUGF(LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG, ("\np->len: %d\n", p->len)); + } +#endif + /* pass data to ip6_input */ + return ip6_input(p, netif); +} + +/** + * @ingroup rfc7668if + * Initialize the netif + * + * No flags are used (broadcast not possible, not ethernet, ...) + * The shortname for this netif is "BT" + * + * @param netif the network interface to be initialized as RFC7668 netif + * + * @return ERR_OK if everything went fine + */ +err_t +rfc7668_if_init(struct netif *netif) +{ + netif->name[0] = 'b'; + netif->name[1] = 't'; + /* local function as IPv6 output */ + netif->output_ip6 = rfc7668_output; + + MIB2_INIT_NETIF(netif, snmp_ifType_other, 0); + + /* maximum transfer unit, set according to RFC7668 ch2.4 */ + netif->mtu = IP6_MIN_MTU_LENGTH; + + /* no flags set (no broadcast, ethernet,...)*/ + netif->flags = 0; + + /* everything fine */ + return ERR_OK; +} + +#if !NO_SYS +/** + * Pass a received packet to tcpip_thread for input processing + * + * @param p the received packet, p->payload pointing to the + * IEEE 802.15.4 header. + * @param inp the network interface on which the packet was received + * + * @return see @ref tcpip_inpkt, same return values + */ +err_t +tcpip_rfc7668_input(struct pbuf *p, struct netif *inp) +{ + /* send data to upper layer, return the result */ + return tcpip_inpkt(p, inp, rfc7668_input); +} +#endif /* !NO_SYS */ + +#endif /* LWIP_IPV6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_common.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_common.c new file mode 100644 index 0000000..4db1ebb --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/lowpan6_common.c @@ -0,0 +1,841 @@ +/** + * @file + * + * Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. + * + * This implementation aims to conform to IEEE 802.15.4(-2015), RFC 4944 and RFC 6282. + * @todo: RFC 6775. + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +/** + * @defgroup sixlowpan 6LoWPAN (RFC4944) + * @ingroup netifs + * 6LowPAN netif implementation + */ + +#include "netif/lowpan6_common.h" + +#if LWIP_IPV6 + +#include "lwip/ip.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/udp.h" + +#include + +/* Determine compression mode for unicast address. */ +s8_t +lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct lowpan6_link_addr *mac_addr) +{ + if (mac_addr->addr_len == 2) { + if ((ip6addr->addr[2] == (u32_t)PP_HTONL(0x000000ff)) && + ((ip6addr->addr[3] & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000))) { + if ((ip6addr->addr[3] & PP_HTONL(0x0000ffff)) == lwip_ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) { + return 3; + } + } + } else if (mac_addr->addr_len == 8) { + if ((ip6addr->addr[2] == lwip_ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) && + (ip6addr->addr[3] == lwip_ntohl((mac_addr->addr[4] << 24) | (mac_addr->addr[5] << 16) | mac_addr->addr[6] << 8 | mac_addr->addr[7]))) { + return 3; + } + } + + if ((ip6addr->addr[2] == PP_HTONL(0x000000ffUL)) && + ((ip6addr->addr[3] & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000UL))) { + return 2; + } + + return 1; +} + +#if LWIP_6LOWPAN_IPHC + +/* Determine compression mode for multicast address. */ +static s8_t +lowpan6_get_address_mode_mc(const ip6_addr_t *ip6addr) +{ + if ((ip6addr->addr[0] == PP_HTONL(0xff020000)) && + (ip6addr->addr[1] == 0) && + (ip6addr->addr[2] == 0) && + ((ip6addr->addr[3] & PP_HTONL(0xffffff00)) == 0)) { + return 3; + } else if (((ip6addr->addr[0] & PP_HTONL(0xff00ffff)) == PP_HTONL(0xff000000)) && + (ip6addr->addr[1] == 0)) { + if ((ip6addr->addr[2] == 0) && + ((ip6addr->addr[3] & PP_HTONL(0xff000000)) == 0)) { + return 2; + } else if ((ip6addr->addr[2] & PP_HTONL(0xffffff00)) == 0) { + return 1; + } + } + + return 0; +} + +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 +static s8_t +lowpan6_context_lookup(const ip6_addr_t *lowpan6_contexts, const ip6_addr_t *ip6addr) +{ + s8_t i; + + for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) { + if (ip6_addr_netcmp(&lowpan6_contexts[i], ip6addr)) { + return i; + } + } + return -1; +} +#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */ + +/* + * Compress IPv6 and/or UDP headers. + * */ +err_t +lowpan6_compress_headers(struct netif *netif, u8_t *inbuf, size_t inbuf_size, u8_t *outbuf, size_t outbuf_size, + u8_t *lowpan6_header_len_out, u8_t *hidden_header_len_out, ip6_addr_t *lowpan6_contexts, + const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst) +{ + u8_t *buffer, *inptr; + u8_t lowpan6_header_len; + u8_t hidden_header_len = 0; + s8_t i; + struct ip6_hdr *ip6hdr; + ip_addr_t ip6src, ip6dst; + + LWIP_ASSERT("netif != NULL", netif != NULL); + LWIP_ASSERT("inbuf != NULL", inbuf != NULL); + LWIP_ASSERT("outbuf != NULL", outbuf != NULL); + LWIP_ASSERT("lowpan6_header_len_out != NULL", lowpan6_header_len_out != NULL); + LWIP_ASSERT("hidden_header_len_out != NULL", hidden_header_len_out != NULL); + + /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */ + buffer = outbuf; + inptr = inbuf; + + if (inbuf_size < IP6_HLEN) { + /* input buffer too short */ + return ERR_VAL; + } + if (outbuf_size < IP6_HLEN) { + /* output buffer too short for worst case */ + return ERR_MEM; + } + + /* Point to ip6 header and align copies of src/dest addresses. */ + ip6hdr = (struct ip6_hdr *)inptr; + ip_addr_copy_from_ip6_packed(ip6dst, ip6hdr->dest); + ip6_addr_assign_zone(ip_2_ip6(&ip6dst), IP6_UNKNOWN, netif); + ip_addr_copy_from_ip6_packed(ip6src, ip6hdr->src); + ip6_addr_assign_zone(ip_2_ip6(&ip6src), IP6_UNKNOWN, netif); + + /* Basic length of 6LowPAN header, set dispatch and clear fields. */ + lowpan6_header_len = 2; + buffer[0] = 0x60; + buffer[1] = 0; + + /* Determine whether there will be a Context Identifier Extension byte or not. + * If so, set it already. */ +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + buffer[2] = 0; + + i = lowpan6_context_lookup(lowpan6_contexts, ip_2_ip6(&ip6src)); + if (i >= 0) { + /* Stateful source address compression. */ + buffer[1] |= 0x40; + buffer[2] |= (i & 0x0f) << 4; + } + + i = lowpan6_context_lookup(lowpan6_contexts, ip_2_ip6(&ip6dst)); + if (i >= 0) { + /* Stateful destination address compression. */ + buffer[1] |= 0x04; + buffer[2] |= i & 0x0f; + } + + if (buffer[2] != 0x00) { + /* Context identifier extension byte is appended. */ + buffer[1] |= 0x80; + lowpan6_header_len++; + } +#else /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */ + LWIP_UNUSED_ARG(lowpan6_contexts); +#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */ + + /* Determine TF field: Traffic Class, Flow Label */ + if (IP6H_FL(ip6hdr) == 0) { + /* Flow label is elided. */ + buffer[0] |= 0x10; + if (IP6H_TC(ip6hdr) == 0) { + /* Traffic class (ECN+DSCP) elided too. */ + buffer[0] |= 0x08; + } else { + /* Traffic class (ECN+DSCP) appended. */ + buffer[lowpan6_header_len++] = IP6H_TC(ip6hdr); + } + } else { + if (((IP6H_TC(ip6hdr) & 0x3f) == 0)) { + /* DSCP portion of Traffic Class is elided, ECN and FL are appended (3 bytes) */ + buffer[0] |= 0x08; + + buffer[lowpan6_header_len] = IP6H_TC(ip6hdr) & 0xc0; + buffer[lowpan6_header_len++] |= (IP6H_FL(ip6hdr) >> 16) & 0x0f; + buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff; + buffer[lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff; + } else { + /* Traffic class and flow label are appended (4 bytes) */ + buffer[lowpan6_header_len++] = IP6H_TC(ip6hdr); + buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 16) & 0x0f; + buffer[lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff; + buffer[lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff; + } + } + + /* Compress NH? + * Only if UDP for now. @todo support other NH compression. */ + if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) { + buffer[0] |= 0x04; + } else { + /* append nexth. */ + buffer[lowpan6_header_len++] = IP6H_NEXTH(ip6hdr); + } + + /* Compress hop limit? */ + if (IP6H_HOPLIM(ip6hdr) == 255) { + buffer[0] |= 0x03; + } else if (IP6H_HOPLIM(ip6hdr) == 64) { + buffer[0] |= 0x02; + } else if (IP6H_HOPLIM(ip6hdr) == 1) { + buffer[0] |= 0x01; + } else { + /* append hop limit */ + buffer[lowpan6_header_len++] = IP6H_HOPLIM(ip6hdr); + } + + /* Compress source address */ + if (((buffer[1] & 0x40) != 0) || + (ip6_addr_islinklocal(ip_2_ip6(&ip6src)))) { + /* Context-based or link-local source address compression. */ + i = lowpan6_get_address_mode(ip_2_ip6(&ip6src), src); + buffer[1] |= (i & 0x03) << 4; + if (i == 1) { + MEMCPY(buffer + lowpan6_header_len, inptr + 16, 8); + lowpan6_header_len += 8; + } else if (i == 2) { + MEMCPY(buffer + lowpan6_header_len, inptr + 22, 2); + lowpan6_header_len += 2; + } + } else if (ip6_addr_isany(ip_2_ip6(&ip6src))) { + /* Special case: mark SAC and leave SAM=0 */ + buffer[1] |= 0x40; + } else { + /* Append full address. */ + MEMCPY(buffer + lowpan6_header_len, inptr + 8, 16); + lowpan6_header_len += 16; + } + + /* Compress destination address */ + if (ip6_addr_ismulticast(ip_2_ip6(&ip6dst))) { + /* @todo support stateful multicast address compression */ + + buffer[1] |= 0x08; + + i = lowpan6_get_address_mode_mc(ip_2_ip6(&ip6dst)); + buffer[1] |= i & 0x03; + if (i == 0) { + MEMCPY(buffer + lowpan6_header_len, inptr + 24, 16); + lowpan6_header_len += 16; + } else if (i == 1) { + buffer[lowpan6_header_len++] = inptr[25]; + MEMCPY(buffer + lowpan6_header_len, inptr + 35, 5); + lowpan6_header_len += 5; + } else if (i == 2) { + buffer[lowpan6_header_len++] = inptr[25]; + MEMCPY(buffer + lowpan6_header_len, inptr + 37, 3); + lowpan6_header_len += 3; + } else if (i == 3) { + buffer[lowpan6_header_len++] = (inptr)[39]; + } + } else if (((buffer[1] & 0x04) != 0) || + (ip6_addr_islinklocal(ip_2_ip6(&ip6dst)))) { + /* Context-based or link-local destination address compression. */ + i = lowpan6_get_address_mode(ip_2_ip6(&ip6dst), dst); + buffer[1] |= i & 0x03; + if (i == 1) { + MEMCPY(buffer + lowpan6_header_len, inptr + 32, 8); + lowpan6_header_len += 8; + } else if (i == 2) { + MEMCPY(buffer + lowpan6_header_len, inptr + 38, 2); + lowpan6_header_len += 2; + } + } else { + /* Append full address. */ + MEMCPY(buffer + lowpan6_header_len, inptr + 24, 16); + lowpan6_header_len += 16; + } + + /* Move to payload. */ + inptr += IP6_HLEN; + hidden_header_len += IP6_HLEN; + +#if LWIP_UDP + /* Compress UDP header? */ + if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) { + /* @todo support optional checksum compression */ + + if (inbuf_size < IP6_HLEN + UDP_HLEN) { + /* input buffer too short */ + return ERR_VAL; + } + if (outbuf_size < (size_t)(hidden_header_len + 7)) { + /* output buffer too short for worst case */ + return ERR_MEM; + } + + buffer[lowpan6_header_len] = 0xf0; + + /* determine port compression mode. */ + if ((inptr[0] == 0xf0) && ((inptr[1] & 0xf0) == 0xb0) && + (inptr[2] == 0xf0) && ((inptr[3] & 0xf0) == 0xb0)) { + /* Compress source and dest ports. */ + buffer[lowpan6_header_len++] |= 0x03; + buffer[lowpan6_header_len++] = ((inptr[1] & 0x0f) << 4) | (inptr[3] & 0x0f); + } else if (inptr[0] == 0xf0) { + /* Compress source port. */ + buffer[lowpan6_header_len++] |= 0x02; + buffer[lowpan6_header_len++] = inptr[1]; + buffer[lowpan6_header_len++] = inptr[2]; + buffer[lowpan6_header_len++] = inptr[3]; + } else if (inptr[2] == 0xf0) { + /* Compress dest port. */ + buffer[lowpan6_header_len++] |= 0x01; + buffer[lowpan6_header_len++] = inptr[0]; + buffer[lowpan6_header_len++] = inptr[1]; + buffer[lowpan6_header_len++] = inptr[3]; + } else { + /* append full ports. */ + lowpan6_header_len++; + buffer[lowpan6_header_len++] = inptr[0]; + buffer[lowpan6_header_len++] = inptr[1]; + buffer[lowpan6_header_len++] = inptr[2]; + buffer[lowpan6_header_len++] = inptr[3]; + } + + /* elide length and copy checksum */ + buffer[lowpan6_header_len++] = inptr[6]; + buffer[lowpan6_header_len++] = inptr[7]; + + hidden_header_len += UDP_HLEN; + } +#endif /* LWIP_UDP */ + + *lowpan6_header_len_out = lowpan6_header_len; + *hidden_header_len_out = hidden_header_len; + + return ERR_OK; +} + +/** Decompress IPv6 and UDP headers compressed according to RFC 6282 + * + * @param lowpan6_buffer compressed headers, first byte is the dispatch byte + * @param lowpan6_bufsize size of lowpan6_buffer (may include data after headers) + * @param decomp_buffer buffer where the decompressed headers are stored + * @param decomp_bufsize size of decomp_buffer + * @param hdr_size_comp returns the size of the compressed headers (skip to get to data) + * @param hdr_size_decomp returns the size of the decompressed headers (IPv6 + UDP) + * @param datagram_size datagram size from fragments or 0 if unfragmented + * @param compressed_size compressed datagram size (for unfragmented rx) + * @param lowpan6_contexts context addresses + * @param src source address of the outer layer, used for address compression + * @param dest destination address of the outer layer, used for address compression + * @return ERR_OK if decompression succeeded, an error otherwise + */ +static err_t +lowpan6_decompress_hdr(u8_t *lowpan6_buffer, size_t lowpan6_bufsize, + u8_t *decomp_buffer, size_t decomp_bufsize, + u16_t *hdr_size_comp, u16_t *hdr_size_decomp, + u16_t datagram_size, u16_t compressed_size, + ip6_addr_t *lowpan6_contexts, + struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest) +{ + u16_t lowpan6_offset; + struct ip6_hdr *ip6hdr; + s8_t i; + u32_t header_temp; + u16_t ip6_offset = IP6_HLEN; + + LWIP_ASSERT("lowpan6_buffer != NULL", lowpan6_buffer != NULL); + LWIP_ASSERT("decomp_buffer != NULL", decomp_buffer != NULL); + LWIP_ASSERT("src != NULL", src != NULL); + LWIP_ASSERT("dest != NULL", dest != NULL); + LWIP_ASSERT("hdr_size_comp != NULL", hdr_size_comp != NULL); + LWIP_ASSERT("dehdr_size_decompst != NULL", hdr_size_decomp != NULL); + + ip6hdr = (struct ip6_hdr *)decomp_buffer; + if (decomp_bufsize < IP6_HLEN) { + return ERR_MEM; + } + + /* output the full compressed packet, if set in @see lowpan6_opts.h */ +#if LWIP_LOWPAN6_IP_COMPRESSED_DEBUG + { + u16_t j; + LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("lowpan6_decompress_hdr: IP6 payload (compressed): \n")); + for (j = 0; j < lowpan6_bufsize; j++) { + if ((j % 4) == 0) { + LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\n")); + } + LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("%2X ", lowpan6_buffer[j])); + } + LWIP_DEBUGF(LWIP_LOWPAN6_IP_COMPRESSED_DEBUG, ("\np->len: %d", lowpan6_bufsize)); + } +#endif + + /* offset for inline IP headers (RFC 6282 ch3)*/ + lowpan6_offset = 2; + /* if CID is set (context identifier), the context byte + * follows immediately after the header, so other IPHC fields are @+3 */ + if (lowpan6_buffer[1] & 0x80) { + lowpan6_offset++; + } + + /* Set IPv6 version, traffic class and flow label. (RFC6282, ch 3.1.1.)*/ + if ((lowpan6_buffer[0] & 0x18) == 0x00) { + header_temp = ((lowpan6_buffer[lowpan6_offset+1] & 0x0f) << 16) | \ + (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset+3]; + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 00, ECN: 0x%"X8_F", Flowlabel+DSCP: 0x%8"X32_F"\n", \ + lowpan6_buffer[lowpan6_offset],header_temp)); + IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset], header_temp); + /* increase offset, processed 4 bytes here: + * TF=00: ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)*/ + lowpan6_offset += 4; + } else if ((lowpan6_buffer[0] & 0x18) == 0x08) { + header_temp = ((lowpan6_buffer[lowpan6_offset] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset+2]; + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 01, ECN: 0x%"X8_F", Flowlabel: 0x%2"X32_F", DSCP ignored\n", \ + lowpan6_buffer[lowpan6_offset] & 0xc0,header_temp)); + IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset] & 0xc0, header_temp); + /* increase offset, processed 3 bytes here: + * TF=01: ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided.*/ + lowpan6_offset += 3; + } else if ((lowpan6_buffer[0] & 0x18) == 0x10) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 10, DCSP+ECN: 0x%"X8_F", Flowlabel ignored\n", lowpan6_buffer[lowpan6_offset])); + IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset],0); + /* increase offset, processed 1 byte here: + * ECN + DSCP (1 byte), Flow Label is elided.*/ + lowpan6_offset += 1; + } else if ((lowpan6_buffer[0] & 0x18) == 0x18) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("TF: 11, DCSP/ECN & Flowlabel ignored\n")); + /* don't increase offset, no bytes processed here */ + IP6H_VTCFL_SET(ip6hdr, 6, 0, 0); + } + + /* Set Next Header (NH) */ + if ((lowpan6_buffer[0] & 0x04) == 0x00) { + /* 0: full next header byte carried inline (increase offset)*/ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NH: 0x%2X\n", lowpan6_buffer[lowpan6_offset+1])); + IP6H_NEXTH_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]); + } else { + /* 1: NH compression, LOWPAN_NHC (RFC6282, ch 4.1) */ + /* We should fill this later with NHC decoding */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NH: skipped, later done with NHC\n")); + IP6H_NEXTH_SET(ip6hdr, 0); + } + + /* Set Hop Limit, either carried inline or 3 different hops (1,64,255) */ + if ((lowpan6_buffer[0] & 0x03) == 0x00) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: full value: %d\n", lowpan6_buffer[lowpan6_offset+1])); + IP6H_HOPLIM_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]); + } else if ((lowpan6_buffer[0] & 0x03) == 0x01) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 1\n")); + IP6H_HOPLIM_SET(ip6hdr, 1); + } else if ((lowpan6_buffer[0] & 0x03) == 0x02) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 64\n")); + IP6H_HOPLIM_SET(ip6hdr, 64); + } else if ((lowpan6_buffer[0] & 0x03) == 0x03) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Hops: compressed: 255\n")); + IP6H_HOPLIM_SET(ip6hdr, 255); + } + + /* Source address decoding. */ + if ((lowpan6_buffer[1] & 0x40) == 0x00) { + /* Source address compression (SAC) = 0 -> stateless compression */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAC == 0, no context byte\n")); + /* Stateless compression */ + if ((lowpan6_buffer[1] & 0x30) == 0x00) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 00, no src compression, fetching 128bits inline\n")); + /* copy full address, increase offset by 16 Bytes */ + MEMCPY(&ip6hdr->src.addr[0], lowpan6_buffer + lowpan6_offset, 16); + lowpan6_offset += 16; + } else if ((lowpan6_buffer[1] & 0x30) == 0x10) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 01, src compression, 64bits inline\n")); + /* set 64 bits to link local */ + ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); + ip6hdr->src.addr[1] = 0; + /* copy 8 Bytes, increase offset */ + MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8); + lowpan6_offset += 8; + } else if ((lowpan6_buffer[1] & 0x30) == 0x20) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 10, src compression, 16bits inline\n")); + /* set 96 bits to link local */ + ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); + ip6hdr->src.addr[1] = 0; + ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); + /* extract remaining 16bits from inline bytes, increase offset */ + ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | + lowpan6_buffer[lowpan6_offset + 1]); + lowpan6_offset += 2; + } else if ((lowpan6_buffer[1] & 0x30) == 0x30) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 11, src compression, 0bits inline, using other headers\n")); + /* no information avalaible, using other layers, see RFC6282 ch 3.2.2 */ + ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL); + ip6hdr->src.addr[1] = 0; + if (src->addr_len == 2) { + ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); + ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]); + } else if (src->addr_len == 8) { + ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | + (src->addr[2] << 8) | src->addr[3]); + ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | + (src->addr[6] << 8) | src->addr[7]); + } else { + /* invalid source address length */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid source address length\n")); + return ERR_VAL; + } + } + } else { + /* Source address compression (SAC) = 1 -> stateful/context-based compression */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAC == 1, additional context byte\n")); + if ((lowpan6_buffer[1] & 0x30) == 0x00) { + /* SAM=00, address=> :: (ANY) */ + ip6hdr->src.addr[0] = 0; + ip6hdr->src.addr[1] = 0; + ip6hdr->src.addr[2] = 0; + ip6hdr->src.addr[3] = 0; + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 00, context compression, ANY (::)\n")); + } else { + /* Set prefix from context info */ + if (lowpan6_buffer[1] & 0x80) { + i = (lowpan6_buffer[2] >> 4) & 0x0f; + } else { + i = 0; + } + if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) { + /* Error */ + return ERR_VAL; + } +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + ip6hdr->src.addr[0] = lowpan6_contexts[i].addr[0]; + ip6hdr->src.addr[1] = lowpan6_contexts[i].addr[1]; + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == xx, context compression found @%d: %8"X32_F", %8"X32_F"\n", (int)i, ip6hdr->src.addr[0], ip6hdr->src.addr[1])); +#else + LWIP_UNUSED_ARG(lowpan6_contexts); +#endif + } + + /* determine further address bits */ + if ((lowpan6_buffer[1] & 0x30) == 0x10) { + /* SAM=01, load additional 64bits */ + MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8); + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 01, context compression, 64bits inline\n")); + lowpan6_offset += 8; + } else if ((lowpan6_buffer[1] & 0x30) == 0x20) { + /* SAM=01, load additional 16bits */ + ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); + ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]); + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 10, context compression, 16bits inline\n")); + lowpan6_offset += 2; + } else if ((lowpan6_buffer[1] & 0x30) == 0x30) { + /* SAM=11, address is fully elided, load from other layers */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("SAM == 11, context compression, 0bits inline, using other headers\n")); + if (src->addr_len == 2) { + ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL); + ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]); + } else if (src->addr_len == 8) { + ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]); + ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | (src->addr[6] << 8) | src->addr[7]); + } else { + /* invalid source address length */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid source address length\n")); + return ERR_VAL; + } + } + } + + /* Destination address decoding. */ + if (lowpan6_buffer[1] & 0x08) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("M=1: multicast\n")); + /* Multicast destination */ + if (lowpan6_buffer[1] & 0x04) { + LWIP_DEBUGF(LWIP_DBG_ON,("DAC == 1, context multicast: unsupported!!!\n")); + /* @todo support stateful multicast addressing */ + return ERR_VAL; + } + + if ((lowpan6_buffer[1] & 0x03) == 0x00) { + /* DAM = 00, copy full address (128bits) */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 00, no dst compression, fetching 128bits inline\n")); + MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16); + lowpan6_offset += 16; + } else if ((lowpan6_buffer[1] & 0x03) == 0x01) { + /* DAM = 01, copy 4 bytes (32bits) */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst address form (48bits): ffXX::00XX:XXXX:XXXX\n")); + ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16)); + ip6hdr->dest.addr[1] = 0; + ip6hdr->dest.addr[2] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]); + ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 24) | (lowpan6_buffer[lowpan6_offset + 1] << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset + 3]); + lowpan6_offset += 4; + } else if ((lowpan6_buffer[1] & 0x03) == 0x02) { + /* DAM = 10, copy 3 bytes (24bits) */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 10, dst address form (32bits): ffXX::00XX:XXXX\n")); + ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16)); + ip6hdr->dest.addr[1] = 0; + ip6hdr->dest.addr[2] = 0; + ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset + 2]); + lowpan6_offset += 3; + } else if ((lowpan6_buffer[1] & 0x03) == 0x03) { + /* DAM = 11, copy 1 byte (8bits) */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 11, dst address form (8bits): ff02::00XX\n")); + ip6hdr->dest.addr[0] = PP_HTONL(0xff020000UL); + ip6hdr->dest.addr[1] = 0; + ip6hdr->dest.addr[2] = 0; + ip6hdr->dest.addr[3] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]); + } + + } else { + /* no Multicast (M=0) */ + if (lowpan6_buffer[1] & 0x04) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAC == 1, stateful compression\n")); + /* Stateful destination compression */ + /* Set prefix from context info */ + if (lowpan6_buffer[1] & 0x80) { + i = lowpan6_buffer[2] & 0x0f; + } else { + i = 0; + } + if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) { + /* Error */ + return ERR_VAL; + } +#if LWIP_6LOWPAN_NUM_CONTEXTS > 0 + ip6hdr->dest.addr[0] = lowpan6_contexts[i].addr[0]; + ip6hdr->dest.addr[1] = lowpan6_contexts[i].addr[1]; +#endif + } else { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAC == 0, stateless compression, setting link local prefix\n")); + /* Link local address compression */ + ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL); + ip6hdr->dest.addr[1] = 0; + } + + /* M=0, DAC=0, determining destination address length via DAM=xx */ + if ((lowpan6_buffer[1] & 0x03) == 0x00) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 00, no dst compression, fetching 128bits inline")); + /* DAM=00, copy full address */ + MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16); + lowpan6_offset += 16; + } else if ((lowpan6_buffer[1] & 0x03) == 0x01) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst compression, 64bits inline\n")); + /* DAM=01, copy 64 inline bits, increase offset */ + MEMCPY(&ip6hdr->dest.addr[2], lowpan6_buffer + lowpan6_offset, 8); + lowpan6_offset += 8; + } else if ((lowpan6_buffer[1] & 0x03) == 0x02) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("DAM == 01, dst compression, 16bits inline\n")); + /* DAM=10, copy 16 inline bits, increase offset */ + ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL); + ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]); + lowpan6_offset += 2; + } else if ((lowpan6_buffer[1] & 0x03) == 0x03) { + /* DAM=11, no bits available, use other headers (not done here) */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG,("DAM == 01, dst compression, 0bits inline, using other headers\n")); + if (dest->addr_len == 2) { + ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL); + ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]); + } else if (dest->addr_len == 8) { + ip6hdr->dest.addr[2] = lwip_htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]); + ip6hdr->dest.addr[3] = lwip_htonl((dest->addr[4] << 24) | (dest->addr[5] << 16) | dest->addr[6] << 8 | dest->addr[7]); + } else { + /* invalid destination address length */ + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("Invalid destination address length\n")); + return ERR_VAL; + } + } + } + + + /* Next Header Compression (NHC) decoding? */ + if (lowpan6_buffer[0] & 0x04) { + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NHC decoding\n")); +#if LWIP_UDP + if ((lowpan6_buffer[lowpan6_offset] & 0xf8) == 0xf0) { + /* NHC: UDP */ + struct udp_hdr *udphdr; + LWIP_DEBUGF(LWIP_LOWPAN6_DECOMPRESSION_DEBUG, ("NHC: UDP\n")); + + /* UDP compression */ + IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_UDP); + udphdr = (struct udp_hdr *)((u8_t *)decomp_buffer + ip6_offset); + if (decomp_bufsize < IP6_HLEN + UDP_HLEN) { + return ERR_MEM; + } + + /* Checksum decompression */ + if (lowpan6_buffer[lowpan6_offset] & 0x04) { + /* @todo support checksum decompress */ + LWIP_DEBUGF(LWIP_DBG_ON, ("NHC: UDP chechsum decompression UNSUPPORTED\n")); + return ERR_VAL; + } + + /* Decompress ports, according to RFC4944 */ + i = lowpan6_buffer[lowpan6_offset++] & 0x03; + if (i == 0) { + udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); + udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]); + lowpan6_offset += 4; + } else if (i == 0x01) { + udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); + udphdr->dest = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]); + lowpan6_offset += 3; + } else if (i == 0x02) { + udphdr->src = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset]); + udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]); + lowpan6_offset += 3; + } else if (i == 0x03) { + udphdr->src = lwip_htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f)); + udphdr->dest = lwip_htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f)); + lowpan6_offset += 1; + } + + udphdr->chksum = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]); + lowpan6_offset += 2; + ip6_offset += UDP_HLEN; + if (datagram_size == 0) { + datagram_size = compressed_size - lowpan6_offset + ip6_offset; + } + udphdr->len = lwip_htons(datagram_size - IP6_HLEN); + + } else +#endif /* LWIP_UDP */ + { + LWIP_DEBUGF(LWIP_DBG_ON,("NHC: unsupported protocol!\n")); + /* @todo support NHC other than UDP */ + return ERR_VAL; + } + } + if (datagram_size == 0) { + datagram_size = compressed_size - lowpan6_offset + ip6_offset; + } + /* Infer IPv6 payload length for header */ + IP6H_PLEN_SET(ip6hdr, datagram_size - IP6_HLEN); + + if (lowpan6_offset > lowpan6_bufsize) { + /* input buffer overflow */ + return ERR_VAL; + } + *hdr_size_comp = lowpan6_offset; + *hdr_size_decomp = ip6_offset; + + return ERR_OK; +} + +struct pbuf * +lowpan6_decompress(struct pbuf *p, u16_t datagram_size, ip6_addr_t *lowpan6_contexts, + struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest) +{ + struct pbuf *q; + u16_t lowpan6_offset, ip6_offset; + err_t err; + +#if LWIP_UDP +#define UDP_HLEN_ALLOC UDP_HLEN +#else +#define UDP_HLEN_ALLOC 0 +#endif + + /* Allocate a buffer for decompression. This buffer will be too big and will be + trimmed once the final size is known. */ + q = pbuf_alloc(PBUF_IP, p->len + IP6_HLEN + UDP_HLEN_ALLOC, PBUF_POOL); + if (q == NULL) { + pbuf_free(p); + return NULL; + } + if (q->len < IP6_HLEN + UDP_HLEN_ALLOC) { + /* The headers need to fit into the first pbuf */ + pbuf_free(p); + pbuf_free(q); + return NULL; + } + + /* Decompress the IPv6 (and possibly UDP) header(s) into the new pbuf */ + err = lowpan6_decompress_hdr((u8_t *)p->payload, p->len, (u8_t *)q->payload, q->len, + &lowpan6_offset, &ip6_offset, datagram_size, p->tot_len, lowpan6_contexts, src, dest); + if (err != ERR_OK) { + pbuf_free(p); + pbuf_free(q); + return NULL; + } + + /* Now we copy leftover contents from p to q, so we have all L2 and L3 headers + (and L4?) in a single pbuf: */ + + /* Hide the compressed headers in p */ + pbuf_remove_header(p, lowpan6_offset); + /* Temporarily hide the headers in q... */ + pbuf_remove_header(q, ip6_offset); + /* ... copy the rest of p into q... */ + pbuf_copy(q, p); + /* ... and reveal the headers again... */ + pbuf_add_header_force(q, ip6_offset); + /* ... trim the pbuf to its correct size... */ + pbuf_realloc(q, ip6_offset + p->len); + /* ... and cat possibly remaining (data-only) pbufs */ + if (p->next != NULL) { + pbuf_cat(q, p->next); + } + /* the original (first) pbuf can now be freed */ + p->next = NULL; + pbuf_free(p); + + /* all done */ + return q; +} + +#endif /* LWIP_6LOWPAN_IPHC */ +#endif /* LWIP_IPV6 */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/PPPD_FOLLOWUP similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/PPPD_FOLLOWUP rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/PPPD_FOLLOWUP diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/auth.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/auth.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/auth.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/auth.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ccp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ccp.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ccp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ccp.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-md5.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap-md5.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-md5.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap-md5.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-new.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap-new.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap-new.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap-new.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap_ms.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap_ms.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/chap_ms.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/chap_ms.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/demand.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/demand.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/demand.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/demand.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eap.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/eap.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eap.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/eap.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ecp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ecp.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ecp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ecp.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eui64.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/eui64.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/eui64.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/eui64.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/fsm.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/fsm.c similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/fsm.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/fsm.c index 81eba11..b1f08af 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/fsm.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/fsm.c @@ -236,7 +236,7 @@ static void terminate_layer(fsm *f, int nextstate) { */ void fsm_close(fsm *f, const char *reason) { f->term_reason = reason; - f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) ); + f->term_reason_len = (reason == NULL? 0: (u8_t)LWIP_MIN(strlen(reason), 0xFF) ); switch( f->state ){ case PPP_FSM_STARTING: f->state = PPP_FSM_INITIAL; diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ipcp.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ipcp.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipv6cp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ipv6cp.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ipv6cp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ipv6cp.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/lcp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/lcp.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/lcp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/lcp.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/magic.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/magic.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/magic.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/magic.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/mppe.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/mppe.c similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/mppe.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/mppe.c index 331039f..4cca89d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/mppe.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/mppe.c @@ -201,13 +201,13 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto /* TCP stack requires that we don't change the packet payload, therefore we copy * the whole packet before encryption. */ - np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_POOL); + np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_RAM); if (!np) { return ERR_MEM; } /* Hide MPPE header + protocol */ - pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol))); + pbuf_remove_header(np, MPPE_OVHD + sizeof(protocol)); if ((err = pbuf_copy(np, *pb)) != ERR_OK) { pbuf_free(np); @@ -215,7 +215,7 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto } /* Reveal MPPE header + protocol */ - pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol))); + pbuf_add_header(np, MPPE_OVHD + sizeof(protocol)); *pb = np; pl = (u8_t*)np->payload; @@ -246,7 +246,7 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto pl[1] = protocol; /* Hide MPPE header */ - pbuf_header(np, -(s16_t)MPPE_OVHD); + pbuf_remove_header(np, MPPE_OVHD); /* Encrypt packet */ for (n = np; n != NULL; n = n->next) { @@ -257,7 +257,7 @@ mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t proto } /* Reveal MPPE header */ - pbuf_header(np, (s16_t)MPPE_OVHD); + pbuf_add_header(np, MPPE_OVHD); return ERR_OK; } @@ -382,7 +382,7 @@ mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb) } /* Hide MPPE header */ - pbuf_header(n0, -(s16_t)(MPPE_OVHD)); + pbuf_remove_header(n0, MPPE_OVHD); /* Decrypt the packet. */ for (n = n0; n != NULL; n = n->next) { diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/multilink.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/multilink.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/multilink.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/multilink.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/README b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/README similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/README rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/README diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/arc4.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/arc4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/arc4.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/des.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/des.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/des.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/des.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/md4.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md4.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/md4.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/md5.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/md5.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/md5.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/sha1.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/polarssl/sha1.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/polarssl/sha1.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ppp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ppp.c similarity index 97% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ppp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ppp.c index 8b77765..be58553 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/ppp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/ppp.c @@ -80,8 +80,8 @@ */ /** - * @defgroup ppp PPP netif - * @ingroup addons + * @defgroup ppp PPP + * @ingroup netifs * @verbinclude "ppp.txt" */ @@ -203,9 +203,9 @@ const struct protent* const protocols[] = { /* Prototypes for procedures local to this file. */ static void ppp_do_connect(void *arg); static err_t ppp_netif_init_cb(struct netif *netif); -#if LWIP_IPV4 +#if PPP_IPV4_SUPPORT static err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr); -#endif /* LWIP_IPV4 */ +#endif /* PPP_IPV4_SUPPORT */ #if PPP_IPV6_SUPPORT static err_t ppp_netif_output_ip6(struct netif *netif, struct pbuf *pb, const ip6_addr_t *ipaddr); #endif /* PPP_IPV6_SUPPORT */ @@ -216,6 +216,8 @@ static err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u16_t protoc /***********************************/ #if PPP_AUTH_SUPPORT void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd) { + LWIP_ASSERT("pcb->phase == PPP_PHASE_DEAD", pcb->phase == PPP_PHASE_DEAD); + #if PAP_SUPPORT pcb->settings.refuse_pap = !(authtype & PPPAUTHTYPE_PAP); #endif /* PAP_SUPPORT */ @@ -237,6 +239,8 @@ void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *pas #if MPPE_SUPPORT /* Set MPPE configuration */ void ppp_set_mppe(ppp_pcb *pcb, u8_t flags) { + LWIP_ASSERT("pcb->phase == PPP_PHASE_DEAD", pcb->phase == PPP_PHASE_DEAD); + if (flags == PPP_MPPE_DISABLE) { pcb->settings.require_mppe = 0; return; @@ -268,12 +272,15 @@ void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_p * established before calling this. */ err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb->phase != PPP_PHASE_DEAD) { return ERR_ALREADY; } PPPDEBUG(LOG_DEBUG, ("ppp_connect[%d]: holdoff=%d\n", pcb->netif->num, holdoff)); + magic_randomize(); + if (holdoff == 0) { ppp_do_connect(pcb); return ERR_OK; @@ -294,12 +301,15 @@ err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff) { * established before calling this. */ err_t ppp_listen(ppp_pcb *pcb) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb->phase != PPP_PHASE_DEAD) { return ERR_ALREADY; } PPPDEBUG(LOG_DEBUG, ("ppp_listen[%d]\n", pcb->netif->num)); + magic_randomize(); + if (pcb->link_cb->listen) { new_phase(pcb, PPP_PHASE_INITIALIZE); pcb->link_cb->listen(pcb, pcb->link_ctx_cb); @@ -323,6 +333,8 @@ err_t ppp_listen(ppp_pcb *pcb) { err_t ppp_close(ppp_pcb *pcb, u8_t nocarrier) { + LWIP_ASSERT_CORE_LOCKED(); + pcb->err_code = PPPERR_USER; /* holdoff phase, cancel the reconnection */ @@ -383,6 +395,7 @@ ppp_close(ppp_pcb *pcb, u8_t nocarrier) */ err_t ppp_free(ppp_pcb *pcb) { err_t err; + LWIP_ASSERT_CORE_LOCKED(); if (pcb->phase != PPP_PHASE_DEAD) { return ERR_CONN; } @@ -402,6 +415,7 @@ err_t ppp_free(ppp_pcb *pcb) { err_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg) { + LWIP_ASSERT_CORE_LOCKED(); if (pcb == NULL) { return ERR_VAL; } @@ -456,10 +470,9 @@ static void ppp_do_connect(void *arg) { static err_t ppp_netif_init_cb(struct netif *netif) { netif->name[0] = 'p'; netif->name[1] = 'p'; -#if LWIP_IPV4 - /* FIXME: change that when netif_null_output_ip4() will materialize */ +#if PPP_IPV4_SUPPORT netif->output = ppp_netif_output_ip4; -#endif /* LWIP_IPV4 */ +#endif /* PPP_IPV4_SUPPORT */ #if PPP_IPV6_SUPPORT netif->output_ip6 = ppp_netif_output_ip6; #endif /* PPP_IPV6_SUPPORT */ @@ -471,21 +484,15 @@ static err_t ppp_netif_init_cb(struct netif *netif) { return ERR_OK; } -#if LWIP_IPV4 +#if PPP_IPV4_SUPPORT /* * Send an IPv4 packet on the given connection. */ static err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr) { LWIP_UNUSED_ARG(ipaddr); -#if PPP_IPV4_SUPPORT return ppp_netif_output(netif, pb, PPP_IP); -#else /* PPP_IPV4_SUPPORT */ - LWIP_UNUSED_ARG(netif); - LWIP_UNUSED_ARG(pb); - return ERR_IF; -#endif /* PPP_IPV4_SUPPORT */ } -#endif /* LWIP_IPV4 */ +#endif /* PPP_IPV4_SUPPORT */ #if PPP_IPV6_SUPPORT /* @@ -784,7 +791,7 @@ void ppp_input(ppp_pcb *pcb, struct pbuf *pb) { ppp_dump_packet(pcb, "rcvd", (unsigned char *)pb->payload, pb->len); #endif /* PRINTPKT_SUPPORT */ - pbuf_header(pb, -(s16_t)sizeof(protocol)); + pbuf_remove_header(pb, sizeof(protocol)); LINK_STATS_INC(link.recv); MIB2_STATS_NETIF_INC(pcb->netif, ifinucastpkts); @@ -860,10 +867,10 @@ void ppp_input(ppp_pcb *pcb, struct pbuf *pb) { pl = (u8_t*)pb->payload; if (pl[0] & 0x01) { protocol = pl[0]; - pbuf_header(pb, -(s16_t)1); + pbuf_remove_header(pb, 1); } else { protocol = (pl[0] << 8) | pl[1]; - pbuf_header(pb, -(s16_t)2); + pbuf_remove_header(pb, 2); } } #endif /* CCP_SUPPORT */ @@ -923,7 +930,7 @@ void ppp_input(ppp_pcb *pcb, struct pbuf *pb) { */ for (i = 0; (protp = protocols[i]) != NULL; ++i) { if (protp->protocol == protocol) { - pb = ppp_singlebuf(pb); + pb = pbuf_coalesce(pb, PBUF_RAW); (*protp->input)(pcb, (u8_t*)pb->payload, pb->len); goto out; } @@ -957,7 +964,10 @@ void ppp_input(ppp_pcb *pcb, struct pbuf *pb) { #endif /* PPP_PROTOCOLNAME */ ppp_warn("Unsupported protocol 0x%x received", protocol); #endif /* PPP_DEBUG */ - pbuf_header(pb, (s16_t)sizeof(protocol)); + if (pbuf_add_header(pb, sizeof(protocol))) { + PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping (pbuf_add_header failed)\n", pcb->netif->num)); + goto drop; + } lcp_sprotrej(pcb, (u8_t*)pb->payload, pb->len); } break; @@ -971,32 +981,6 @@ out: pbuf_free(pb); } -/* merge a pbuf chain into one pbuf */ -struct pbuf *ppp_singlebuf(struct pbuf *p) { - struct pbuf *q, *b; - u8_t *pl; - - if(p->tot_len == p->len) { - return p; - } - - q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); - if(!q) { - PPPDEBUG(LOG_ERR, - ("ppp_singlebuf: unable to alloc new buf (%d)\n", p->tot_len)); - return p; /* live dangerously */ - } - - for(b = p, pl = (u8_t*)q->payload; b != NULL; b = b->next) { - MEMCPY(pl, b->payload, b->len); - pl += b->len; - } - - pbuf_free(p); - - return q; -} - /* * Write a pbuf to a ppp link, only used from PPP functions * to send PPP packets. @@ -1127,9 +1111,9 @@ int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) { ip_addr_t ns; LWIP_UNUSED_ARG(pcb); - ip_addr_set_ip4_u32(&ns, ns1); + ip_addr_set_ip4_u32_val(ns, ns1); dns_setserver(0, &ns); - ip_addr_set_ip4_u32(&ns, ns2); + ip_addr_set_ip4_u32_val(ns, ns2); dns_setserver(1, &ns); return 1; } @@ -1144,12 +1128,12 @@ int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) { LWIP_UNUSED_ARG(pcb); nsa = dns_getserver(0); - ip_addr_set_ip4_u32(&nsb, ns1); + ip_addr_set_ip4_u32_val(nsb, ns1); if (ip_addr_cmp(nsa, &nsb)) { dns_setserver(0, IP_ADDR_ANY); } nsa = dns_getserver(1); - ip_addr_set_ip4_u32(&nsb, ns2); + ip_addr_set_ip4_u32_val(nsb, ns2); if (ip_addr_cmp(nsa, &nsb)) { dns_setserver(1, IP_ADDR_ANY); } @@ -1274,8 +1258,8 @@ int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) { LWIP_UNUSED_ARG(our_eui64); LWIP_UNUSED_ARG(his_eui64); - netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6); netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_INVALID); + netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6); return 1; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppapi.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppapi.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppapi.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppapi.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppcrypt.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppcrypt.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppcrypt.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppcrypt.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppoe.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppoe.c similarity index 94% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppoe.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppoe.c index eabfa4d..971b36b 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppoe.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppoe.c @@ -175,8 +175,11 @@ ppp_pcb *pppoe_create(struct netif *pppif, { ppp_pcb *ppp; struct pppoe_softc *sc; +#if !PPPOE_SCNAME_SUPPORT LWIP_UNUSED_ARG(service_name); LWIP_UNUSED_ARG(concentrator_name); +#endif /* !PPPOE_SCNAME_SUPPORT */ + LWIP_ASSERT_CORE_LOCKED(); sc = (struct pppoe_softc *)LWIP_MEMPOOL_ALLOC(PPPOE_IF); if (sc == NULL) { @@ -192,6 +195,10 @@ ppp_pcb *pppoe_create(struct netif *pppif, memset(sc, 0, sizeof(struct pppoe_softc)); sc->pcb = ppp; sc->sc_ethif = ethif; +#if PPPOE_SCNAME_SUPPORT + sc->sc_service_name = service_name; + sc->sc_concentrator_name = concentrator_name; +#endif /* PPPOE_SCNAME_SUPPORT */ /* put the new interface at the head of the list */ sc->next = pppoe_softc_list; pppoe_softc_list = sc; @@ -210,7 +217,7 @@ static err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) { #endif /* MIB2_STATS */ /* skip address & flags */ - pbuf_header(p, -(s16_t)2); + pbuf_remove_header(p, 2); ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM); if(!ph) { @@ -221,7 +228,7 @@ static err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) { return ERR_MEM; } - pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */ + pbuf_remove_header(ph, PPPOE_HEADERLEN); /* hide PPPoE header */ pbuf_cat(ph, p); #if MIB2_STATS tot_len = ph->tot_len; @@ -261,7 +268,7 @@ static err_t pppoe_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short return ERR_MEM; } - pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN); + pbuf_remove_header(pb, PPPOE_HEADERLEN); pl = (u8_t*)pb->payload; PUTSHORT(protocol, pl); @@ -299,15 +306,6 @@ pppoe_destroy(ppp_pcb *ppp, void *ctx) break; } } - -#ifdef PPPOE_TODO - if (sc->sc_concentrator_name) { - mem_free(sc->sc_concentrator_name); - } - if (sc->sc_service_name) { - mem_free(sc->sc_service_name); - } -#endif /* PPPOE_TODO */ LWIP_MEMPOOL_FREE(PPPOE_IF, sc); return ERR_OK; @@ -371,7 +369,7 @@ static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, void pppoe_disc_input(struct netif *netif, struct pbuf *pb) { - u16_t tag, len; + u16_t tag, len, off; u16_t session, plen; struct pppoe_softc *sc; #if PPP_DEBUG @@ -385,7 +383,7 @@ pppoe_disc_input(struct netif *netif, struct pbuf *pb) #endif struct pppoehdr *ph; struct pppoetag pt; - int off, err; + int err; struct eth_hdr *ethhdr; /* don't do anything if there is not a single PPPoE instance */ @@ -394,13 +392,9 @@ pppoe_disc_input(struct netif *netif, struct pbuf *pb) return; } - pb = ppp_singlebuf(pb); + pb = pbuf_coalesce(pb, PBUF_RAW); - if (pb->len < sizeof(*ethhdr)) { - goto done; - } ethhdr = (struct eth_hdr *)pb->payload; - off = sizeof(*ethhdr); ac_cookie = NULL; ac_cookie_len = 0; @@ -409,7 +403,8 @@ pppoe_disc_input(struct netif *netif, struct pbuf *pb) hunique_len = 0; #endif session = 0; - if (pb->len - off < (u16_t)PPPOE_HEADERLEN) { + off = sizeof(struct eth_hdr) + sizeof(struct pppoehdr); + if (pb->len < off) { PPPDEBUG(LOG_DEBUG, ("pppoe: packet too short: %d\n", pb->len)); goto done; } @@ -421,15 +416,18 @@ pppoe_disc_input(struct netif *netif, struct pbuf *pb) } session = lwip_ntohs(ph->session); plen = lwip_ntohs(ph->plen); - off += sizeof(*ph); - if (plen + off > pb->len) { + if (plen > (pb->len - off)) { PPPDEBUG(LOG_DEBUG, ("pppoe: packet content does not fit: data available = %d, packet size = %u\n", pb->len - off, plen)); goto done; } if(pb->tot_len == pb->len) { - pb->tot_len = pb->len = (u16_t)off + plen; /* ignore trailing garbage */ + u16_t framelen = off + plen; + if (framelen < pb->len) { + /* ignore trailing garbage */ + pb->tot_len = pb->len = framelen; + } } tag = 0; len = 0; @@ -604,6 +602,7 @@ breakbreak:; sc->sc_state = PPPOE_STATE_PADR_SENT; if ((err = pppoe_send_padr(sc)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc); break; @@ -659,9 +658,9 @@ pppoe_data_input(struct netif *netif, struct pbuf *pb) #ifdef PPPOE_TERM_UNKNOWN_SESSIONS MEMCPY(shost, ((struct eth_hdr *)pb->payload)->src.addr, sizeof(shost)); #endif - if (pbuf_header(pb, -(s16_t)sizeof(struct eth_hdr)) != 0) { + if (pbuf_remove_header(pb, sizeof(struct eth_hdr)) != 0) { /* bail out */ - PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header failed\n")); + PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_remove_header failed\n")); LINK_STATS_INC(link.lenerr); goto drop; } @@ -692,9 +691,9 @@ pppoe_data_input(struct netif *netif, struct pbuf *pb) plen = lwip_ntohs(ph->plen); - if (pbuf_header(pb, -(s16_t)(PPPOE_HEADERLEN)) != 0) { + if (pbuf_remove_header(pb, PPPOE_HEADERLEN) != 0) { /* bail out */ - PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header PPPOE_HEADERLEN failed\n")); + PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_remove_header PPPOE_HEADERLEN failed\n")); LINK_STATS_INC(link.lenerr); goto drop; } @@ -723,7 +722,7 @@ pppoe_output(struct pppoe_softc *sc, struct pbuf *pb) err_t res; /* make room for Ethernet header - should not fail */ - if (pbuf_header(pb, (s16_t)(sizeof(struct eth_hdr))) != 0) { + if (pbuf_add_header(pb, sizeof(struct eth_hdr)) != 0) { /* bail out */ PPPDEBUG(LOG_ERR, ("pppoe: %c%c%"U16_F": pppoe_output: could not allocate room for Ethernet header\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num)); LINK_STATS_INC(link.lenerr); @@ -755,13 +754,13 @@ pppoe_send_padi(struct pppoe_softc *sc) struct pbuf *pb; u8_t *p; int len; -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT int l1 = 0, l2 = 0; /* XXX: gcc */ -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ /* calculate length of frame (excluding ethernet header + pppoe header) */ len = 2 + 2 + 2 + 2 + sizeof sc; /* service name tag is required, host unique is send too */ -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT if (sc->sc_service_name != NULL) { l1 = (int)strlen(sc->sc_service_name); len += l1; @@ -770,7 +769,7 @@ pppoe_send_padi(struct pppoe_softc *sc) l2 = (int)strlen(sc->sc_concentrator_name); len += 2 + 2 + l2; } -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ LWIP_ASSERT("sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff", sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff); @@ -785,24 +784,24 @@ pppoe_send_padi(struct pppoe_softc *sc) /* fill in pkt */ PPPOE_ADD_HEADER(p, PPPOE_CODE_PADI, 0, (u16_t)len); PPPOE_ADD_16(p, PPPOE_TAG_SNAME); -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT if (sc->sc_service_name != NULL) { PPPOE_ADD_16(p, l1); MEMCPY(p, sc->sc_service_name, l1); p += l1; } else -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ { PPPOE_ADD_16(p, 0); } -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT if (sc->sc_concentrator_name != NULL) { PPPOE_ADD_16(p, PPPOE_TAG_ACNAME); PPPOE_ADD_16(p, l2); MEMCPY(p, sc->sc_concentrator_name, l2); p += l2; } -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); PPPOE_ADD_16(p, sizeof(sc)); MEMCPY(p, &sc, sizeof sc); @@ -851,6 +850,7 @@ pppoe_timeout(void *arg) if ((err = pppoe_send_padi(sc)) != 0) { sc->sc_padi_retried--; PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to transmit PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(retry_wait, pppoe_timeout, sc); break; @@ -863,6 +863,7 @@ pppoe_timeout(void *arg) sc->sc_padr_retried = 0; if ((err = pppoe_send_padi(sc)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), pppoe_timeout, sc); return; @@ -870,6 +871,7 @@ pppoe_timeout(void *arg) if ((err = pppoe_send_padr(sc)) != 0) { sc->sc_padr_retried--; PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc); break; @@ -977,17 +979,17 @@ pppoe_send_padr(struct pppoe_softc *sc) struct pbuf *pb; u8_t *p; size_t len; -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT size_t l1 = 0; /* XXX: gcc */ -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ len = 2 + 2 + 2 + 2 + sizeof(sc); /* service name, host unique */ -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT if (sc->sc_service_name != NULL) { /* service name tag maybe empty */ l1 = strlen(sc->sc_service_name); len += l1; } -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ if (sc->sc_ac_cookie_len > 0) { len += 2 + 2 + sc->sc_ac_cookie_len; /* AC cookie */ } @@ -1001,13 +1003,13 @@ pppoe_send_padr(struct pppoe_softc *sc) p = (u8_t*)pb->payload; PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len); PPPOE_ADD_16(p, PPPOE_TAG_SNAME); -#ifdef PPPOE_TODO +#if PPPOE_SCNAME_SUPPORT if (sc->sc_service_name != NULL) { PPPOE_ADD_16(p, l1); MEMCPY(p, sc->sc_service_name, l1); p += l1; } else -#endif /* PPPOE_TODO */ +#endif /* PPPOE_SCNAME_SUPPORT */ { PPPOE_ADD_16(p, 0); } @@ -1039,7 +1041,12 @@ pppoe_send_padt(struct netif *outgoing_if, u_int session, const u8_t *dest) } LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); - pbuf_header(pb, (s16_t)sizeof(struct eth_hdr)); + if (pbuf_add_header(pb, sizeof(struct eth_hdr))) { + PPPDEBUG(LOG_ERR, ("pppoe: pppoe_send_padt: could not allocate room for PPPoE header\n")); + LINK_STATS_INC(link.lenerr); + pbuf_free(pb); + return ERR_BUF; + } ethhdr = (struct eth_hdr *)pb->payload; ethhdr->type = PP_HTONS(ETHTYPE_PPPOEDISC); MEMCPY(ðhdr->dest.addr, dest, sizeof(ethhdr->dest.addr)); @@ -1133,7 +1140,7 @@ pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb) len = pb->tot_len; /* make room for PPPoE header - should not fail */ - if (pbuf_header(pb, (s16_t)(PPPOE_HEADERLEN)) != 0) { + if (pbuf_add_header(pb, PPPOE_HEADERLEN) != 0) { /* bail out */ PPPDEBUG(LOG_ERR, ("pppoe: %c%c%"U16_F": pppoe_xmit: could not allocate room for PPPoE header\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num)); LINK_STATS_INC(link.lenerr); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppol2tp.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppol2tp.c similarity index 92% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppol2tp.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppol2tp.c index d44471e..4c4557f 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppol2tp.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppol2tp.c @@ -85,7 +85,7 @@ static err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp); static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns); -static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns); +static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr); static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns); static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb); static err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb); @@ -181,7 +181,7 @@ static err_t pppol2tp_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) { return ERR_MEM; } - pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */ + pbuf_remove_header(ph, PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */ pbuf_cat(ph, p); #if MIB2_STATS tot_len = ph->tot_len; @@ -221,7 +221,7 @@ static err_t pppol2tp_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_sh return ERR_MEM; } - pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); + pbuf_remove_header(pb, PPPOL2TP_OUTPUT_DATA_HEADER_LEN); pl = (u8_t*)pb->payload; PUTSHORT(protocol, pl); @@ -434,7 +434,7 @@ static void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const /* printf("HLEN = %d\n", hlen); */ /* skip L2TP header */ - if (pbuf_header(p, -(s16_t)hlen) != 0) { + if (pbuf_remove_header(p, hlen) != 0) { goto free_and_return; } @@ -469,7 +469,7 @@ static void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const if (p->len >= 2) { GETSHORT(hflags, inp); if (hflags == 0xff03) { - pbuf_header(p, -(s16_t)2); + pbuf_remove_header(p, 2); } } /* Dispatch the packet thereby consuming it. */ @@ -493,21 +493,43 @@ static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, str u8_t challenge_id = 0; #endif /* PPPOL2TP_AUTH_SUPPORT */ - l2tp->peer_nr = nr; - l2tp->peer_ns = ns; /* printf("L2TP CTRL INPUT, ns=%d, nr=%d, len=%d\n", ns, nr, p->len); */ + /* Drop unexpected packet */ + if (ns != l2tp->peer_ns) { + PPPDEBUG(LOG_DEBUG, ("pppol2tp: drop unexpected packet: received NS=%d, expected NS=%d\n", ns, l2tp->peer_ns)); + /* + * In order to ensure that all messages are acknowledged properly + * (particularly in the case of a lost ZLB ACK message), receipt + * of duplicate messages MUST be acknowledged. + * + * In this very special case we Ack a packet we previously received. + * Therefore our NS is the NR we just received. And our NR is the + * NS we just received plus one. + */ + if ((s16_t)(ns - l2tp->peer_ns) < 0) { + pppol2tp_send_zlb(l2tp, nr, ns+1); + } + return; + } + + l2tp->peer_nr = nr; + /* Handle the special case of the ICCN acknowledge */ - if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && l2tp->peer_nr > l2tp->our_ns) { + if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && (s16_t)(l2tp->peer_nr - l2tp->our_ns) > 0) { l2tp->phase = PPPOL2TP_STATE_DATA; + sys_untimeout(pppol2tp_timeout, l2tp); + ppp_start(l2tp->ppp); /* notify upper layers */ } /* ZLB packets */ if (p->tot_len == 0) { return; } + /* A ZLB packet does not consume a NS slot thus we don't record the NS value for ZLB packets */ + l2tp->peer_ns = ns+1; - p = ppp_singlebuf(p); + p = pbuf_coalesce(p, PBUF_RAW); inp = (u8_t*)p->payload; /* Decode AVPs */ while (p->len > 0) { @@ -549,7 +571,7 @@ static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, str break; /* Stop Control Connection Notification */ case PPPOL2TP_MESSAGETYPE_STOPCCN: - pppol2tp_send_zlb(l2tp, l2tp->our_ns); /* Ack the StopCCN before we switch to down state */ + pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns); /* Ack the StopCCN before we switch to down state */ if (l2tp->phase < PPPOL2TP_STATE_DATA) { pppol2tp_abort_connect(l2tp); } else if (l2tp->phase == PPPOL2TP_STATE_DATA) { @@ -654,7 +676,7 @@ skipavp: nextavp: /* printf("AVP Found, vendor=%d, attribute=%d, len=%d\n", vendorid, attributetype, avplen); */ /* next AVP */ - if (pbuf_header(p, -(s16_t)(avplen + sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) ) != 0) { + if (pbuf_remove_header(p, avplen + sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) != 0) { return; } } @@ -671,10 +693,12 @@ nextavp: l2tp->our_ns++; if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } l2tp->our_ns++; if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_untimeout(pppol2tp_timeout, l2tp); sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); @@ -684,9 +708,9 @@ nextavp: l2tp->iccn_retried = 0; l2tp->phase = PPPOL2TP_STATE_ICCN_SENT; l2tp->our_ns++; - ppp_start(l2tp->ppp); /* notify upper layers */ if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) { PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_untimeout(pppol2tp_timeout, l2tp); sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); @@ -698,7 +722,7 @@ nextavp: return; send_zlb: - pppol2tp_send_zlb(l2tp, l2tp->our_ns); + pppol2tp_send_zlb(l2tp, l2tp->our_ns+1, l2tp->peer_ns); return; packet_too_short: PPPDEBUG(LOG_DEBUG, ("pppol2tp: packet too short: %d\n", p->len)); @@ -727,6 +751,7 @@ static void pppol2tp_timeout(void *arg) { if ((err = pppol2tp_send_sccrq(l2tp)) != 0) { l2tp->sccrq_retried--; PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCRQ, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(retry_wait, pppol2tp_timeout, l2tp); break; @@ -738,17 +763,19 @@ static void pppol2tp_timeout(void *arg) { return; } PPPDEBUG(LOG_DEBUG, ("pppol2tp: icrq_retried=%d\n", l2tp->icrq_retried)); - if (l2tp->peer_nr <= l2tp->our_ns -1) { /* the SCCCN was not acknowledged */ + if ((s16_t)(l2tp->peer_nr - l2tp->our_ns) < 0) { /* the SCCCN was not acknowledged */ if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) { - l2tp->icrq_retried--; - PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err)); - sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); - break; - } + l2tp->icrq_retried--; + PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send SCCCN, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ + sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); + break; + } } if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) { - l2tp->icrq_retried--; - PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err)); + l2tp->icrq_retried--; + PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICRQ, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); break; @@ -761,8 +788,9 @@ static void pppol2tp_timeout(void *arg) { } PPPDEBUG(LOG_DEBUG, ("pppol2tp: iccn_retried=%d\n", l2tp->iccn_retried)); if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) { - l2tp->iccn_retried--; - PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err)); + l2tp->iccn_retried--; + PPPDEBUG(LOG_DEBUG, ("pppol2tp: failed to send ICCN, error=%d\n", err)); + LWIP_UNUSED_ARG(err); /* if PPPDEBUG is disabled */ } sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp); break; @@ -903,7 +931,7 @@ static err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns) { PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */ PUTSHORT(0, p); /* Session Id */ PUTSHORT(ns, p); /* NS Sequence number - to peer */ - PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */ + PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */ /* AVP - Message type */ PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */ @@ -950,7 +978,7 @@ static err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns) { PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */ PUTSHORT(0, p); /* Session Id */ PUTSHORT(ns, p); /* NS Sequence number - to peer */ - PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */ + PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */ /* AVP - Message type */ PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */ @@ -998,7 +1026,7 @@ static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns) { PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */ PUTSHORT(l2tp->source_session_id, p); /* Session Id */ PUTSHORT(ns, p); /* NS Sequence number - to peer */ - PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */ + PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */ /* AVP - Message type */ PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */ @@ -1022,7 +1050,7 @@ static err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns) { } /* Send a ZLB ACK packet */ -static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns) { +static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns, u16_t nr) { struct pbuf *pb; u8_t *p; u16_t len; @@ -1045,7 +1073,7 @@ static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns) { PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */ PUTSHORT(0, p); /* Session Id */ PUTSHORT(ns, p); /* NS Sequence number - to peer */ - PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */ + PUTSHORT(nr, p); /* NR Sequence number - expected for peer */ return pppol2tp_udp_send(l2tp, pb); } @@ -1074,7 +1102,7 @@ static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns) { PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */ PUTSHORT(0, p); /* Session Id */ PUTSHORT(ns, p); /* NS Sequence number - to peer */ - PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */ + PUTSHORT(l2tp->peer_ns, p); /* NR Sequence number - expected for peer */ /* AVP - Message type */ PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */ @@ -1101,7 +1129,7 @@ static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) { u8_t *p; /* make room for L2TP header - should not fail */ - if (pbuf_header(pb, (s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN) != 0) { + if (pbuf_add_header(pb, PPPOL2TP_OUTPUT_DATA_HEADER_LEN) != 0) { /* bail out */ PPPDEBUG(LOG_ERR, ("pppol2tp: pppol2tp_pcb: could not allocate room for L2TP header\n")); LINK_STATS_INC(link.lenerr); diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppos.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppos.c similarity index 96% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppos.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppos.c index fb48df4..dff0255 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/pppos.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/pppos.c @@ -176,6 +176,7 @@ ppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, { pppos_pcb *pppos; ppp_pcb *ppp; + LWIP_ASSERT_CORE_LOCKED(); pppos = (pppos_pcb *)LWIP_MEMPOOL_ALLOC(PPPOS_PCB); if (pppos == NULL) { @@ -206,7 +207,9 @@ pppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) err_t err; LWIP_UNUSED_ARG(ppp); - /* Grab an output buffer. */ + /* Grab an output buffer. Using PBUF_POOL here for tx is ok since the pbuf + gets freed by 'pppos_output_last' before this function returns and thus + cannot starve rx. */ nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); if (nb == NULL) { PPPDEBUG(LOG_WARNING, ("pppos_write[%d]: alloc fail\n", ppp->netif->num)); @@ -217,6 +220,9 @@ pppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) return ERR_MEM; } + /* Set nb->tot_len to actual payload length */ + nb->tot_len = p->len; + /* If the link has been idle, we'll send a fresh flag character to * flush any noise. */ err = ERR_OK; @@ -252,7 +258,9 @@ pppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol) err_t err; LWIP_UNUSED_ARG(ppp); - /* Grab an output buffer. */ + /* Grab an output buffer. Using PBUF_POOL here for tx is ok since the pbuf + gets freed by 'pppos_output_last' before this function returns and thus + cannot starve rx. */ nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); if (nb == NULL) { PPPDEBUG(LOG_WARNING, ("pppos_netif_output[%d]: alloc fail\n", ppp->netif->num)); @@ -262,6 +270,9 @@ pppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol) return ERR_MEM; } + /* Set nb->tot_len to actual payload length */ + nb->tot_len = pb->tot_len; + /* If the link has been idle, we'll send a fresh flag character to * flush any noise. */ err = ERR_OK; @@ -401,6 +412,8 @@ pppos_destroy(ppp_pcb *ppp, void *ctx) #if !NO_SYS && !PPP_INPROC_IRQ_SAFE /** Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread. + * + * This is one of the only functions that may be called outside of the TCPIP thread! * * @param ppp PPP descriptor index, returned by pppos_create() * @param s received data @@ -429,6 +442,7 @@ pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l) err_t pppos_input_sys(struct pbuf *p, struct netif *inp) { ppp_pcb *ppp = (ppp_pcb*)inp->state; struct pbuf *n; + LWIP_ASSERT_CORE_LOCKED(); for (n = p; n; n = n->next) { pppos_input(ppp, (u8_t*)n->payload, n->len); @@ -468,6 +482,9 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l) u8_t cur_char; u8_t escaped; PPPOS_DECL_PROTECT(lev); +#if !PPP_INPROC_IRQ_SAFE + LWIP_ASSERT_CORE_LOCKED(); +#endif PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l)); while (l-- > 0) { @@ -541,10 +558,10 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l) pppos->in_tail = NULL; #if IP_FORWARD || LWIP_IPV6_FORWARD /* hide the room for Ethernet forwarding header */ - pbuf_header(inp, -(s16_t)(PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN)); + pbuf_remove_header(inp, PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN); #endif /* IP_FORWARD || LWIP_IPV6_FORWARD */ #if PPP_INPROC_IRQ_SAFE - if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != ERR_OK) { + if(tcpip_try_callback(pppos_input_callback, inp) != ERR_OK) { PPPDEBUG(LOG_ERR, ("pppos_input[%d]: tcpip_callback() failed, dropping packet\n", ppp->netif->num)); pbuf_free(inp); LINK_STATS_INC(link.drop); @@ -599,6 +616,7 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l) /* Else assume compressed address and control fields so * fall through to get the protocol... */ + /* Fall through */ case PDCONTROL: /* Process control field. */ /* If we don't get a valid control code, restart. */ if (cur_char == PPP_UI) { @@ -614,7 +632,9 @@ pppos_input(ppp_pcb *ppp, u8_t *s, int l) pppos->in_state = PDSTART; } #endif - case PDPROTOCOL1: /* Process protocol field 1. */ + /* Fall through */ + + case PDPROTOCOL1: /* Process protocol field 1. */ /* If the lower bit is set, this is the end of the protocol * field. */ if (cur_char & 1) { @@ -698,8 +718,8 @@ static void pppos_input_callback(void *arg) { ppp_pcb *ppp; ppp = ((struct pppos_input_header*)pb->payload)->ppp; - if(pbuf_header(pb, -(s16_t)sizeof(struct pppos_input_header))) { - LWIP_ASSERT("pbuf_header failed\n", 0); + if(pbuf_remove_header(pb, sizeof(struct pppos_input_header))) { + LWIP_ASSERT("pbuf_remove_header failed\n", 0); goto drop; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/upap.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/upap.c similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/upap.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/upap.c index d00c2d7..3b2399d 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/upap.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/upap.c @@ -159,9 +159,9 @@ void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password) { /* Save the username and password we're given */ pcb->upap.us_user = user; - pcb->upap.us_userlen = LWIP_MIN(strlen(user), 0xff); + pcb->upap.us_userlen = (u8_t)LWIP_MIN(strlen(user), 0xff); pcb->upap.us_passwd = password; - pcb->upap.us_passwdlen = LWIP_MIN(strlen(password), 0xff); + pcb->upap.us_passwdlen = (u8_t)LWIP_MIN(strlen(password), 0xff); pcb->upap.us_transmits = 0; /* Lower layer up yet? */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/utils.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/utils.c similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/utils.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/utils.c index 008c633..f1366da 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/utils.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/utils.c @@ -58,8 +58,6 @@ #endif #endif /* UNUSED */ -#include /* isdigit() */ - #include "netif/ppp/ppp_impl.h" #include "netif/ppp/fsm.h" @@ -180,7 +178,7 @@ int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args) { width = va_arg(args, int); c = *++fmt; } else { - while (isdigit(c)) { + while (lwip_isdigit(c)) { width = width * 10 + c - '0'; c = *++fmt; } @@ -192,7 +190,7 @@ int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args) { c = *++fmt; } else { prec = 0; - while (isdigit(c)) { + while (lwip_isdigit(c)) { prec = prec * 10 + c - '0'; c = *++fmt; } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/vj.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/vj.c similarity index 95% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/vj.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/vj.c index 168c340..3fecba6 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/ppp/vj.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/ppp/vj.c @@ -202,16 +202,11 @@ vj_compress_tcp(struct vjcompress *comp, struct pbuf **pb) /* TCP stack requires that we don't change the packet payload, therefore we copy * the whole packet before compression. */ - np = pbuf_alloc(PBUF_RAW, np->tot_len, PBUF_POOL); + np = pbuf_clone(PBUF_RAW, PBUF_RAM, *pb); if (!np) { return (TYPE_IP); } - if (pbuf_copy(np, *pb) != ERR_OK) { - pbuf_free(np); - return (TYPE_IP); - } - *pb = np; ip = (struct ip_hdr *)np->payload; @@ -412,18 +407,18 @@ vj_compress_tcp(struct vjcompress *comp, struct pbuf **pb) if (!comp->compressSlot || comp->last_xmit != cs->cs_id) { comp->last_xmit = cs->cs_id; hlen -= deltaS + 4; - if (pbuf_header(np, -(s16_t)hlen)){ + if (pbuf_remove_header(np, hlen)){ /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); + LWIP_ASSERT("pbuf_remove_header failed\n", 0); } cp = (u8_t*)np->payload; *cp++ = (u8_t)(changes | NEW_C); *cp++ = cs->cs_id; } else { hlen -= deltaS + 3; - if (pbuf_header(np, -(s16_t)hlen)) { + if (pbuf_remove_header(np, hlen)) { /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); + LWIP_ASSERT("pbuf_remove_header failed\n", 0); } cp = (u8_t*)np->payload; *cp++ = (u8_t)changes; @@ -471,19 +466,20 @@ vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp) hlen = IPH_HL(ip) << 2; if (IPH_PROTO(ip) >= MAX_SLOTS || hlen + sizeof(struct tcp_hdr) > nb->len - || (hlen += TCPH_HDRLEN(((struct tcp_hdr *)&((char *)ip)[hlen])) << 2) + || (hlen += TCPH_HDRLEN_BYTES((struct tcp_hdr *)&((char *)ip)[hlen])) > nb->len || hlen > MAX_HDR) { PPPDEBUG(LOG_INFO, ("vj_uncompress_uncomp: bad cid=%d, hlen=%d buflen=%d\n", IPH_PROTO(ip), hlen, nb->len)); - comp->flags |= VJF_TOSS; - INCR(vjs_errorin); + vj_uncompress_err(comp); return -1; } cs = &comp->rstate[comp->last_recv = IPH_PROTO(ip)]; comp->flags &=~ VJF_TOSS; IPH_PROTO_SET(ip, IP_PROTO_TCP); - MEMCPY(&cs->cs_ip, ip, hlen); + /* copy from/to bigger buffers checked above instead of cs->cs_ip and ip + just to help static code analysis to see this is correct ;-) */ + MEMCPY(&cs->cs_hdr, nb->payload, hlen); cs->cs_hlen = (u16_t)hlen; INCR(vjs_uncompressedin); return 0; @@ -623,15 +619,14 @@ vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp) IPH_CHKSUM_SET(&cs->cs_ip, (u16_t)(~tmp)); /* Remove the compressed header and prepend the uncompressed header. */ - if (pbuf_header(n0, -(s16_t)vjlen)) { + if (pbuf_remove_header(n0, vjlen)) { /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); + LWIP_ASSERT("pbuf_remove_header failed\n", 0); goto bad; } if(LWIP_MEM_ALIGN(n0->payload) != n0->payload) { - struct pbuf *np, *q; - u8_t *bufptr; + struct pbuf *np; #if IP_FORWARD /* If IP forwarding is enabled we are using a PBUF_LINK packet type so @@ -647,17 +642,13 @@ vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp) goto bad; } - if (pbuf_header(np, -(s16_t)cs->cs_hlen)) { + if (pbuf_remove_header(np, cs->cs_hlen)) { /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); + LWIP_ASSERT("pbuf_remove_header failed\n", 0); goto bad; } - bufptr = (u8_t*)n0->payload; - for(q = np; q != NULL; q = q->next) { - MEMCPY(q->payload, bufptr, q->len); - bufptr += q->len; - } + pbuf_take(np, n0->payload, n0->len); if(n0->next) { pbuf_chain(np, n0->next); @@ -667,7 +658,7 @@ vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp) n0 = np; } - if (pbuf_header(n0, (s16_t)cs->cs_hlen)) { + if (pbuf_add_header(n0, cs->cs_hlen)) { struct pbuf *np; LWIP_ASSERT("vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE", cs->cs_hlen <= PBUF_POOL_BUFSIZE); @@ -687,8 +678,7 @@ vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp) return vjlen; bad: - comp->flags |= VJF_TOSS; - INCR(vjs_errorin); + vj_uncompress_err(comp); return (-1); } diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/slipif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/slipif.c similarity index 85% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/slipif.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/slipif.c index 6eb83c3..9b175dc 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/slipif.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/slipif.c @@ -40,8 +40,8 @@ /** - * @defgroup slipif SLIP netif - * @ingroup addons + * @defgroup slipif SLIP + * @ingroup netifs * * This is an arch independent SLIP netif. The specific serial hooks must be * provided by another file. They are sio_open, sio_read/sio_tryread and sio_send @@ -88,8 +88,8 @@ #endif enum slipif_recv_state { - SLIP_RECV_NORMAL, - SLIP_RECV_ESCAPE + SLIP_RECV_NORMAL, + SLIP_RECV_ESCAPE }; struct slipif_priv { @@ -124,7 +124,7 @@ slipif_output(struct netif *netif, struct pbuf *p) LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); LWIP_ASSERT("p != NULL", (p != NULL)); - LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output(%"U16_F"): sending %"U16_F" bytes\n", (u16_t)netif->num, p->tot_len)); + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output: sending %"U16_F" bytes\n", p->tot_len)); priv = (struct slipif_priv *)netif->state; /* Send pbuf out on the serial I/O device. */ @@ -135,20 +135,20 @@ slipif_output(struct netif *netif, struct pbuf *p) for (i = 0; i < q->len; i++) { c = ((u8_t *)q->payload)[i]; switch (c) { - case SLIP_END: - /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */ - sio_send(SLIP_ESC, priv->sd); - sio_send(SLIP_ESC_END, priv->sd); - break; - case SLIP_ESC: - /* need to escape this byte (0xDB -> 0xDB, 0xDD) */ - sio_send(SLIP_ESC, priv->sd); - sio_send(SLIP_ESC_ESC, priv->sd); - break; - default: - /* normal byte - no need for escaping */ - sio_send(c, priv->sd); - break; + case SLIP_END: + /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */ + sio_send(SLIP_ESC, priv->sd); + sio_send(SLIP_ESC_END, priv->sd); + break; + case SLIP_ESC: + /* need to escape this byte (0xDB -> 0xDB, 0xDD) */ + sio_send(SLIP_ESC, priv->sd); + sio_send(SLIP_ESC_ESC, priv->sd); + break; + default: + /* normal byte - no need for escaping */ + sio_send(c, priv->sd); + break; } } } @@ -203,7 +203,7 @@ slipif_output_v6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr) * return a complete packet, NULL is returned before - used for polling) * @return The IP packet when SLIP_END is received */ -static struct pbuf* +static struct pbuf * slipif_rxbyte(struct netif *netif, u8_t c) { struct slipif_priv *priv; @@ -215,47 +215,47 @@ slipif_rxbyte(struct netif *netif, u8_t c) priv = (struct slipif_priv *)netif->state; switch (priv->state) { - case SLIP_RECV_NORMAL: - switch (c) { - case SLIP_END: - if (priv->recved > 0) { - /* Received whole packet. */ - /* Trim the pbuf to the size of the received packet. */ - pbuf_realloc(priv->q, priv->recved); + case SLIP_RECV_NORMAL: + switch (c) { + case SLIP_END: + if (priv->recved > 0) { + /* Received whole packet. */ + /* Trim the pbuf to the size of the received packet. */ + pbuf_realloc(priv->q, priv->recved); - LINK_STATS_INC(link.recv); + LINK_STATS_INC(link.recv); - LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet (%"U16_F" bytes)\n", priv->recved)); - t = priv->q; - priv->p = priv->q = NULL; - priv->i = priv->recved = 0; - return t; + LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet (%"U16_F" bytes)\n", priv->recved)); + t = priv->q; + priv->p = priv->q = NULL; + priv->i = priv->recved = 0; + return t; + } + return NULL; + case SLIP_ESC: + priv->state = SLIP_RECV_ESCAPE; + return NULL; + default: + break; + } /* end switch (c) */ + break; + case SLIP_RECV_ESCAPE: + /* un-escape END or ESC bytes, leave other bytes + (although that would be a protocol error) */ + switch (c) { + case SLIP_ESC_END: + c = SLIP_END; + break; + case SLIP_ESC_ESC: + c = SLIP_ESC; + break; + default: + break; } - return NULL; - case SLIP_ESC: - priv->state = SLIP_RECV_ESCAPE; - return NULL; - default: - break; - } /* end switch (c) */ - break; - case SLIP_RECV_ESCAPE: - /* un-escape END or ESC bytes, leave other bytes - (although that would be a protocol error) */ - switch (c) { - case SLIP_ESC_END: - c = SLIP_END; - break; - case SLIP_ESC_ESC: - c = SLIP_ESC; + priv->state = SLIP_RECV_NORMAL; break; default: break; - } - priv->state = SLIP_RECV_NORMAL; - break; - default: - break; } /* end switch (priv->state) */ /* byte received, packet not yet completely received */ @@ -290,11 +290,11 @@ slipif_rxbyte(struct netif *netif, u8_t c) priv->i = 0; if (priv->p->next != NULL && priv->p->next->len > 0) { /* p is a chain, on to the next in the chain */ - priv->p = priv->p->next; + priv->p = priv->p->next; } else { /* p is a single pbuf, set it to NULL so next time a new * pbuf is allocated */ - priv->p = NULL; + priv->p = NULL; } } } @@ -342,6 +342,7 @@ slipif_loop_thread(void *nf) #endif /* SLIP_USE_RX_THREAD */ /** + * @ingroup slipif * SLIP netif initialization * * Call the arch specific sio_open and remember @@ -352,9 +353,7 @@ slipif_loop_thread(void *nf) * ERR_MEM if no memory could be allocated, * ERR_IF is serial line couldn't be opened * - * @note netif->num must contain the number of the serial port to open - * (0 by default). If netif->state is != NULL, it is interpreted as an - * u8_t pointer pointing to the serial port number instead of netif->num. + * @note If netif->state is interpreted as an u8_t serial port number. * */ err_t @@ -363,7 +362,12 @@ slipif_init(struct netif *netif) struct slipif_priv *priv; u8_t sio_num; - LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num)); + LWIP_ASSERT("slipif needs an input callback", netif->input != NULL); + + /* netif->state contains serial port number */ + sio_num = LWIP_PTR_NUMERIC_CAST(u8_t, netif->state); + + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)sio_num)); /* Allocate private data */ priv = (struct slipif_priv *)mem_malloc(sizeof(struct slipif_priv)); @@ -381,12 +385,6 @@ slipif_init(struct netif *netif) #endif /* LWIP_IPV6 */ netif->mtu = SLIP_MAX_SIZE; - /* netif->state or netif->num contain the port number */ - if (netif->state != NULL) { - sio_num = *(u8_t*)netif->state; - } else { - sio_num = netif->num; - } /* Try to open the serial port. */ priv->sd = sio_open(sio_num); if (!priv->sd) { @@ -413,12 +411,13 @@ slipif_init(struct netif *netif) #if SLIP_USE_RX_THREAD /* Create a thread to poll the serial line. */ sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif, - SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO); + SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO); #endif /* SLIP_USE_RX_THREAD */ return ERR_OK; } /** + * @ingroup slipif * Polls the serial device and feeds the IP layer with incoming packets. * * @param netif The lwip network interface structure for this slipif @@ -441,6 +440,7 @@ slipif_poll(struct netif *netif) #if SLIP_RX_FROM_ISR /** + * @ingroup slipif * Feeds the IP layer with incoming packets that were receive * * @param netif The lwip network interface structure for this slipif @@ -476,6 +476,7 @@ slipif_process_rxqueue(struct netif *netif) } SYS_ARCH_PROTECT(old_level); } + SYS_ARCH_UNPROTECT(old_level); } /** Like slipif_rxbyte, but queues completed packets. @@ -514,6 +515,7 @@ slipif_rxbyte_enqueue(struct netif *netif, u8_t data) } /** + * @ingroup slipif * Process a received byte, completed packets are put on a queue that is * fed into IP through slipif_process_rxqueue(). * @@ -531,6 +533,7 @@ slipif_received_byte(struct netif *netif, u8_t data) } /** + * @ingroup slipif * Process multiple received byte, completed packets are put on a queue that is * fed into IP through slipif_process_rxqueue(). * diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/wm_ethernet.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/wm_ethernet.c similarity index 100% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/netif/wm_ethernet.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/wm_ethernet.c diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/zepif.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/zepif.c new file mode 100644 index 0000000..de43b99 --- /dev/null +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/netif/zepif.c @@ -0,0 +1,300 @@ +/** + * @file + * + * @defgroup zepif ZEP - ZigBee Encapsulation Protocol + * @ingroup netifs + * A netif implementing the ZigBee Encapsulation Protocol (ZEP). + * This is used to tunnel 6LowPAN over UDP. + * + * Usage (there must be a default netif before!): + * @code{.c} + * netif_add(&zep_netif, NULL, NULL, NULL, NULL, zepif_init, tcpip_6lowpan_input); + * netif_create_ip6_linklocal_address(&zep_netif, 1); + * netif_set_up(&zep_netif); + * netif_set_link_up(&zep_netif); + * @endcode + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "netif/zepif.h" + +#if LWIP_IPV6 && LWIP_UDP + +#include "netif/lowpan6.h" +#include "lwip/udp.h" +#include "lwip/timeouts.h" +#include + +/** Define this to 1 to loop back TX packets for testing */ +#ifndef ZEPIF_LOOPBACK +#define ZEPIF_LOOPBACK 0 +#endif + +#define ZEP_MAX_DATA_LEN 127 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct zep_hdr { + PACK_STRUCT_FLD_8(u8_t prot_id[2]); + PACK_STRUCT_FLD_8(u8_t prot_version); + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t channel_id); + PACK_STRUCT_FIELD(u16_t device_id); + PACK_STRUCT_FLD_8(u8_t crc_mode); + PACK_STRUCT_FLD_8(u8_t unknown_1); + PACK_STRUCT_FIELD(u32_t timestamp[2]); + PACK_STRUCT_FIELD(u32_t seq_num); + PACK_STRUCT_FLD_8(u8_t unknown_2[10]); + PACK_STRUCT_FLD_8(u8_t len); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +struct zepif_state { + struct zepif_init init; + struct udp_pcb *pcb; + u32_t seqno; +}; + +static u8_t zep_lowpan_timer_running; + +/* Helper function that calls the 6LoWPAN timer and reschedules itself */ +static void +zep_lowpan_timer(void *arg) +{ + lowpan6_tmr(); + if (zep_lowpan_timer_running) { + sys_timeout(LOWPAN6_TMR_INTERVAL, zep_lowpan_timer, arg); + } +} + +/* Pass received pbufs into 6LowPAN netif */ +static void +zepif_udp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *addr, u16_t port) +{ + err_t err; + struct netif *netif_lowpan6 = (struct netif *)arg; + struct zep_hdr *zep; + + LWIP_ASSERT("arg != NULL", arg != NULL); + LWIP_ASSERT("pcb != NULL", pcb != NULL); + LWIP_UNUSED_ARG(pcb); /* for LWIP_NOASSERT */ + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + if (p == NULL) { + return; + } + + /* Parse and hide the ZEP header */ + if (p->len < sizeof(struct zep_hdr)) { + /* need the zep_hdr in one piece */ + goto err_return; + } + zep = (struct zep_hdr *)p->payload; + if (zep->prot_id[0] != 'E') { + goto err_return; + } + if (zep->prot_id[1] != 'X') { + goto err_return; + } + if (zep->prot_version != 2) { + /* we only support this version for now */ + goto err_return; + } + if (zep->type != 1) { + goto err_return; + } + if (zep->crc_mode != 1) { + goto err_return; + } + if (zep->len != p->tot_len - sizeof(struct zep_hdr)) { + goto err_return; + } + /* everything seems to be OK, hide the ZEP header */ + if (pbuf_remove_header(p, sizeof(struct zep_hdr))) { + goto err_return; + } + /* TODO Check CRC? */ + /* remove CRC trailer */ + pbuf_realloc(p, p->tot_len - 2); + + /* Call into 6LoWPAN code. */ + err = netif_lowpan6->input(p, netif_lowpan6); + if (err == ERR_OK) { + return; + } +err_return: + pbuf_free(p); +} + +/* Send 6LoWPAN TX packets as UDP broadcast */ +static err_t +zepif_linkoutput(struct netif *netif, struct pbuf *p) +{ + err_t err; + struct pbuf *q; + struct zep_hdr *zep; + struct zepif_state *state; + + LWIP_ASSERT("invalid netif", netif != NULL); + LWIP_ASSERT("invalid pbuf", p != NULL); + + if (p->tot_len > ZEP_MAX_DATA_LEN) { + return ERR_VAL; + } + LWIP_ASSERT("TODO: support chained pbufs", p->next == NULL); + + state = (struct zepif_state *)netif->state; + LWIP_ASSERT("state->pcb != NULL", state->pcb != NULL); + + q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct zep_hdr) + p->tot_len, PBUF_RAM); + if (q == NULL) { + return ERR_MEM; + } + zep = (struct zep_hdr *)q->payload; + memset(zep, 0, sizeof(struct zep_hdr)); + zep->prot_id[0] = 'E'; + zep->prot_id[1] = 'X'; + zep->prot_version = 2; + zep->type = 1; /* Data */ + zep->channel_id = 0; /* whatever */ + zep->device_id = lwip_htons(1); /* whatever */ + zep->crc_mode = 1; + zep->unknown_1 = 0xff; + zep->seq_num = lwip_htonl(state->seqno); + state->seqno++; + zep->len = (u8_t)p->tot_len; + + err = pbuf_copy_partial_pbuf(q, p, p->tot_len, sizeof(struct zep_hdr)); + if (err == ERR_OK) { +#if ZEPIF_LOOPBACK + zepif_udp_recv(netif, state->pcb, pbuf_clone(PBUF_RAW, PBUF_RAM, q), NULL, 0); +#endif + err = udp_sendto(state->pcb, q, state->init.zep_dst_ip_addr, state->init.zep_dst_udp_port); + } + pbuf_free(q); + + return err; +} + +/** + * @ingroup zepif + * Set up a raw 6LowPAN netif and surround it with input- and output + * functions for ZEP + */ +err_t +zepif_init(struct netif *netif) +{ + err_t err; + struct zepif_init *init_state = (struct zepif_init *)netif->state; + struct zepif_state *state = (struct zepif_state *)mem_malloc(sizeof(struct zepif_state)); + + LWIP_ASSERT("zepif needs an input callback", netif->input != NULL); + + if (state == NULL) { + return ERR_MEM; + } + memset(state, 0, sizeof(struct zepif_state)); + if (init_state != NULL) { + memcpy(&state->init, init_state, sizeof(struct zepif_init)); + } + if (state->init.zep_src_udp_port == 0) { + state->init.zep_src_udp_port = ZEPIF_DEFAULT_UDP_PORT; + } + if (state->init.zep_dst_udp_port == 0) { + state->init.zep_dst_udp_port = ZEPIF_DEFAULT_UDP_PORT; + } +#if LWIP_IPV4 + if (state->init.zep_dst_ip_addr == NULL) { + /* With IPv4 enabled, default to broadcasting packets if no address is set */ + state->init.zep_dst_ip_addr = IP_ADDR_BROADCAST; + } +#endif /* LWIP_IPV4 */ + + netif->state = NULL; + + state->pcb = udp_new_ip_type(IPADDR_TYPE_ANY); + if (state->pcb == NULL) { + err = ERR_MEM; + goto err_ret; + } + err = udp_bind(state->pcb, state->init.zep_src_ip_addr, state->init.zep_src_udp_port); + if (err != ERR_OK) { + goto err_ret; + } + if (state->init.zep_netif != NULL) { + udp_bind_netif(state->pcb, state->init.zep_netif); + } + LWIP_ASSERT("udp_bind(lowpan6_broadcast_pcb) failed", err == ERR_OK); + ip_set_option(state->pcb, SOF_BROADCAST); + udp_recv(state->pcb, zepif_udp_recv, netif); + + err = lowpan6_if_init(netif); + LWIP_ASSERT("lowpan6_if_init set a state", netif->state == NULL); + if (err == ERR_OK) { + netif->state = state; + netif->hwaddr_len = 6; + if (init_state != NULL) { + memcpy(netif->hwaddr, init_state->addr, 6); + } else { + u8_t i; + for (i = 0; i < 6; i++) { + netif->hwaddr[i] = i; + } + netif->hwaddr[0] &= 0xfc; + } + netif->linkoutput = zepif_linkoutput; + + if (!zep_lowpan_timer_running) { + sys_timeout(LOWPAN6_TMR_INTERVAL, zep_lowpan_timer, NULL); + zep_lowpan_timer_running = 1; + } + + return ERR_OK; + } + +err_ret: + if (state->pcb != NULL) { + udp_remove(state->pcb); + } + mem_free(state); + return err; +} + +#endif /* LWIP_IPV6 && LWIP_UDP */ diff --git a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/sys_arch.c b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/sys_arch.c similarity index 99% rename from src/W800_SDK_v1.00.10/src/network/lwip2.0.3/sys_arch.c rename to src/W800_SDK_v1.00.10/src/network/lwip2.1.3/sys_arch.c index 0b2f413..9c82bc6 100644 --- a/src/W800_SDK_v1.00.10/src/network/lwip2.0.3/sys_arch.c +++ b/src/W800_SDK_v1.00.10/src/network/lwip2.1.3/sys_arch.c @@ -57,7 +57,7 @@ void sys_init(void) u32_t sys_now(void) { - return tls_os_get_time()*1000/HZ; + return tls_os_get_time()*1000ULL/HZ; } /** From 2bda5c0102dac842e6de408aa51c40f7e488df00 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 19 Feb 2023 16:34:26 +0100 Subject: [PATCH 3/5] Updated all other files to be inline with version 1.00.10 of the SDK --- .../demo/console/wm_demo_console.h | 23 +- .../demo/console/wm_demo_console_task.c | 47 +- src/W800_SDK_v1.00.10/demo/wm_adc_demo.c | 88 ++- .../demo/wm_connect_net_demo.c | 59 ++ src/W800_SDK_v1.00.10/demo/wm_http_demo.c | 6 + src/W800_SDK_v1.00.10/demo/wm_https_demo.c | 2 +- src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c | 516 ++++++++++++--- src/W800_SDK_v1.00.10/demo/wm_scan_demo.c | 297 +++++++++ .../demo/wm_sdio_host_demo.c | 95 ++- .../demo/wm_slave_spi_demo.c | 24 +- src/W800_SDK_v1.00.10/demo/wm_softap_demo.c | 59 +- src/W800_SDK_v1.00.10/demo/wm_uart_demo.c | 2 +- src/W800_SDK_v1.00.10/doc/ChangeLog.txt | 42 ++ src/W800_SDK_v1.00.10/doc/w800_apis.chm | Bin 2868350 -> 2753220 bytes .../include/app/wm_netif2.1.3.h | 437 +++++++++++++ src/W800_SDK_v1.00.10/include/driver/wm_adc.h | 46 +- .../include/driver/wm_efuse.h | 18 +- .../include/driver/wm_internal_flash.h | 2 +- .../include/driver/wm_sdio_host.h | 2 +- .../include/platform/wm_mem.h | 2 +- src/W800_SDK_v1.00.10/include/wifi/wm_wifi.h | 220 ++++++- src/W800_SDK_v1.00.10/include/wm_type_def.h | 5 +- src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld | 2 +- .../platform/common/mem/wm_mem.c | 44 +- .../platform/common/utils/utils.c | 6 +- .../platform/drivers/adc/wm_adc.c | 74 ++- .../platform/drivers/adc/wm_adc_cal.c | 187 ++++++ .../platform/drivers/adc/wm_polyfit.c | 8 +- .../platform/drivers/efuse/wm_efuse.c | 291 ++++++--- .../platform/drivers/gpio/wm_gpio_afsel.c | 16 +- .../drivers/internalflash/wm_internal_fls.c | 73 ++- .../platform/drivers/io/wm_io.c | 14 +- .../platform/drivers/sdio_host/wm_sdio_host.c | 50 +- .../platform/drivers/uart/wm_uart.c | 20 +- .../platform/inc/tls_wireless.h | 1 + src/W800_SDK_v1.00.10/platform/inc/utils.h | 2 + src/W800_SDK_v1.00.10/platform/sys/wm_main.c | 4 +- .../src/app/bleapp/wm_ble_server_wifi_app.c | 10 +- .../src/app/bleapp/wm_ble_uart_if.c | 4 +- .../src/app/dhcpserver/dhcp_server.c | 12 +- .../src/app/factorycmd/factory_atcmd.c | 103 ++- .../src/app/httpclient/HTTPClient.c | 6 +- .../src/app/httpclient/HTTPClientWrapper.c | 7 +- .../src/app/httpclient/HTTPClientWrapper.h | 1 + .../src/app/iperf/iperf_api.c | 8 +- .../libwebsockets-2.1-stable/lws-plat-wm.c | 8 +- .../private-libwebsockets.h | 1 + .../src/app/mDNS/mDNSPosix/mDNSPosix.c | 1 + .../src/app/mbedtls/include/mbedtls/config.h | 5 + src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c | 52 +- .../src/app/oneshotconfig/wm_oneshot_lsd.c | 198 +++--- .../src/app/oneshotconfig/wm_oneshot_lsd.h | 9 +- .../src/app/oneshotconfig/wm_wifi_oneshot.c | 79 ++- src/W800_SDK_v1.00.10/src/app/ping/ping.c | 2 +- src/W800_SDK_v1.00.10/src/app/web/httpd.c | 1 + .../src/app/wm_atcmd/wm_cmdp.c | 3 +- .../src/app/wm_atcmd/wm_cmdp.h | 2 +- .../src/app/wm_atcmd/wm_cmdp_hostif.c | 16 +- .../src/app/wm_atcmd/wm_cmdp_hostif_gcc.h | 3 +- src/W800_SDK_v1.00.10/src/network/Makefile | 6 +- .../src/os/rtos/include/FreeRTOS.h | 2 +- .../src/os/rtos/include/FreeRTOSConfig.h | 3 + .../src/os/rtos/ports/xt804/port.c | 5 - .../src/os/rtos/source/tasks.c | 8 + .../src/os/rtos/wm_osal_rtos.c | 29 +- src/W800_SDK_v1.00.10/tools/w800/conf.mk | 17 +- src/W800_SDK_v1.00.10/tools/w800/inc.mk | 4 +- .../project/CDK_WS/W800_SDK/W800_SDK.cdkproj | 593 ++++++++++-------- .../CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj | 451 +++++++------ src/W800_SDK_v1.00.10/tools/w800/rules.mk | 22 +- 70 files changed, 3422 insertions(+), 1033 deletions(-) create mode 100644 src/W800_SDK_v1.00.10/include/app/wm_netif2.1.3.h create mode 100644 src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc_cal.c diff --git a/src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h index b02a67f..a48322e 100644 --- a/src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h +++ b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console.h @@ -20,6 +20,7 @@ EXTERN FUNC *****************************************************************/ extern int demo_connect_net(void *, ...); +extern int demo_connect_net_with_specific_info(void *, ...); extern int demo_socket_client(void *, ...); extern int demo_socket_server(void *, ...); extern int demo_oneshot(void *, ...); @@ -64,6 +65,8 @@ extern int CreateMCastDemoTask(void *, ...); extern int adc_input_voltage_demo(void *, ...); extern int adc_chip_temperature_demo(void*,...); extern int adc_power_voltage_demo(void *, ...); +extern int adc_input_voltage_cal_demo(void *, ...); +extern int adc_input_voltage_multipoint_cal_demo(void *, ...); extern int sd_card_test(void *, ...); extern int demo_wps_pbc(void *, ...); @@ -78,7 +81,8 @@ extern int tls_i2s_io_init(void *, ...); extern int tls_i2s_demo(void *, ...); extern int i2c_demo(void *, ...); extern int scan_demo(void *, ...); - +extern int scan_format2_demo(void *, ...); +extern int scan_specified_demo(void *, ...); extern int https_demo(void *, ...); extern int mqtt_demo(void *, ...); extern int fatfs_test(void *, ...); @@ -147,8 +151,8 @@ struct demo_console_info_t char *info; }; -#define DEMO_CONSOLE_CMD 1 //±»½âÎö³Écmd -#define DEMO_CONSOLE_SHORT_CMD 2 //CMDµÄÒ»²¿·Ö£¬Ã»ÓнâÎöÍê +#define DEMO_CONSOLE_CMD 1 //è¢«è§£æžæˆcmd +#define DEMO_CONSOLE_SHORT_CMD 2 //CMD的一部分,没有解æžå®Œ #define DEMO_CONSOLE_WRONG_CMD 3 #define DEMO_BUF_SIZE TLS_UART_RX_BUF_SIZE @@ -162,6 +166,7 @@ struct demo_console_info_t console_tbl[] = //To Do When Add New Demo #if DEMO_CONNECT_NET {"t-connect", demo_connect_net, 0, 2, "Test connecting ap;t-connect(\"ssid\",\"pwd\"); For open ap, pwd should be empty"}, + {"t-connect_ss", demo_connect_net_with_specific_info, 0x1C, 5, "Test connecting ap;t-connect_ss(\"ssid\",\"pwd\",timeout,pci_en,scan_mode); For open ap, pwd should be empty"}, {"t-oneshot", demo_oneshot, 0, 0, "Test Oneshot configuration"}, // {"t-socketcfg", demo_socket_config, 0, 0, "Test socket configuration"}, {"t-webcfg", demo_webserver_config, 0, 0, "Test web server configuration"}, @@ -187,6 +192,8 @@ struct demo_console_info_t console_tbl[] = #if DEMO_SCAN {"t-scan", scan_demo, 0x0, 0, "Test wifi scan"}, + {"t-scanf2", scan_format2_demo, 0x0, 0, "Test wifi scan format2"}, + {"t-ss", scan_specified_demo, 0x3c, 6, "Test specified scan t-ss(\"ssid\",\"mac\",chan,scan_type,min_interval,max_interval)"}, #endif /************************************************************************/ @@ -255,6 +262,8 @@ struct demo_console_info_t console_tbl[] = {"t-adctemp", adc_chip_temperature_demo, 0x0, 0, "(ADC)Test chip temperature"}, {"t-adcvolt", adc_input_voltage_demo, 0x1, 1, "(ADC)Test input voltage,0-PA1(chan0), 1-PA4(chan1),8-different"}, {"t-adcpower", adc_power_voltage_demo, 0x0, 0, "(ADC)Sample power supply voltage"}, + {"t-adccal", adc_input_voltage_cal_demo, 0x3, 2, "(ADC)Calibrate input voltage"}, + {"t-adccalmp", adc_input_voltage_multipoint_cal_demo, 0x1F, 5, "(ADC) mulitpoint Calibrate t-adccalmp(chanbitmap,chan1ref,chan2ref,chan3ref,chan4ref),unit:mV"}, #endif #if DEMO_7816 @@ -317,7 +326,7 @@ struct demo_console_info_t console_tbl[] = #endif #if DEMO_MQTT - {"t-mqtt", mqtt_demo, 0x0, 0, "Test mqtt"}, + {"t-mqtt", mqtt_demo, 0x1, 1, "Test mqtt: 0-TCP; 1-TLS; 2-WS; 3-WSS"}, #endif #if DEMO_FATFS @@ -363,11 +372,11 @@ struct demo_console_info_t console_tbl[] = {"t-avoidcopy", avoid_copy_entry, 0x0, 0, "Test Avoid Copy function"}, #endif - //¿ØÖÆÌ¨ÉÏÏÔʾµÄ×îºóÒ»¸öÃüÁÈç¹ûÒªÈÃÃüÁîÏÔʾÔÚ¿ØÖÆÌ¨ÉÏ£¬ÐèÒª·ÅÔÚ¸ÃÐеÄÉÏÃæ + //控制å°ä¸Šæ˜¾ç¤ºçš„æœ€åŽä¸€ä¸ªå‘½ä»¤ï¼Œå¦‚æžœè¦è®©å‘½ä»¤æ˜¾ç¤ºåœ¨æŽ§åˆ¶å°ä¸Šï¼Œéœ€è¦æ”¾åœ¨è¯¥è¡Œçš„ä¸Šé¢ {"demohelp", demo_console_show_help, 0, 0, "Display Help information"}, - //ÏÂÃæµÄÃüÁîÓÃÓÚÄÚ²¿²âÊÔ£¬²»ÏÔʾÔÚ¿ØÖÆÌ¨ÉÏ + //下é¢çš„å‘½ä»¤ç”¨äºŽå†…éƒ¨æµ‹è¯•ï¼Œä¸æ˜¾ç¤ºåœ¨æŽ§åˆ¶å°ä¸Š {"reset", demo_sys_reset, 0, 0, "Reset System"}, - //×îºóÒ»¸öÃüÁ¼ìË÷ÃüÁîʱÅжϽáÊø±êʶ + //最åŽä¸€ä¸ªå‘½ä»¤ï¼Œæ£€ç´¢å‘½ä»¤æ—¶åˆ¤æ–­ç»“æŸæ ‡è¯† {"lastcmd", NULL, 0, 0, "Table Terminal Flag; MUST BE THE LAST ONE"} }; diff --git a/src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c index c394f92..0e1a7ce 100644 --- a/src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c +++ b/src/W800_SDK_v1.00.10/demo/console/wm_demo_console_task.c @@ -223,11 +223,14 @@ int demo_cmd_execute(Demo_Console *sys) } else if (str_r && str_n) { - if (((str_r > str_n) && (str_r > strfirst)) - ||((str_r < str_n) && (str_n > strfirst))) + if (((str_r > str_n) && (str_r > strfirst))) { strfirst[str_n - strfirst] = '\0'; } + else if ((str_r < str_n) && (str_n > strfirst)) + { + strfirst[str_r - strfirst] = '\0'; + } } /*parser()*/ @@ -242,6 +245,11 @@ int demo_cmd_execute(Demo_Console *sys) continue; } } + if(!pparam_begin) + { + printf("\ndemo cmd short\n"); + return DEMO_CONSOLE_SHORT_CMD; + } } else { @@ -261,7 +269,7 @@ int demo_cmd_execute(Demo_Console *sys) if (!pparam_begin && !pparam_end) { /*No Parameter,use default parameter to execute*/ - printf("[CMD]%s", console_tbl[i].cmd); + printf("\n[CMD]%s\n", console_tbl[i].cmd); for (j = 0; j < console_tbl[i].param_cnt; j++) { if (!((console_tbl[i].type >> j) & 0x1)) @@ -363,6 +371,8 @@ int demo_cmd_execute(Demo_Console *sys) } } + printf("\n[CMD]%s\n", console_tbl[i].cmd); + ret = demo_call_fn((int (*)())console_tbl[i].callfn, param, console_tbl[i].param_cnt); if(WM_FAILED == ret) { @@ -375,6 +385,7 @@ int demo_cmd_execute(Demo_Console *sys) } else if (pparam_begin && !pparam_end) { + printf("\ndemo cmd short\n"); return DEMO_CONSOLE_SHORT_CMD; } else @@ -390,6 +401,7 @@ int demo_cmd_execute(Demo_Console *sys) { /*wrong cmd parameter,discard this cmd*/ //demo_console_show_help(NULL); + printf("\nwrong cmd\n"); return DEMO_CONSOLE_WRONG_CMD; } } @@ -407,6 +419,7 @@ void demo_console_task(void *sdata) demo_console_show_help(NULL); demo_console_malloc(); gstConsole.rptr = 0; + gstConsole.rx_data_len = DEMO_CONSOLE_BUF_SIZE; tls_uart_set_baud_rate(TLS_UART_0, 115200); tls_uart_rx_callback_register(TLS_UART_0, demo_console_rx, NULL); @@ -416,22 +429,36 @@ void demo_console_task(void *sdata) switch((u32)msg) { case 1: - ret = tls_uart_read(TLS_UART_0, gstConsole.rx_buf + gstConsole.rptr, gstConsole.rx_data_len); - if(ret <= 0) + while(1) + { + ret = tls_uart_read(TLS_UART_0, gstConsole.rx_buf + gstConsole.rptr, gstConsole.rx_data_len); + if(ret <= 0) + break; + gstConsole.rx_data_len -= ret; + gstConsole.rptr += ret; + if(gstConsole.rx_data_len <= 0) + break; + tls_os_time_delay(20); + } + if(gstConsole.rptr == 0) break; - gstConsole.rx_data_len -= ret; - gstConsole.rptr += ret; ret = demo_cmd_execute(&gstConsole); //parse command and execute if needed - if((DEMO_CONSOLE_CMD == ret) || (DEMO_CONSOLE_WRONG_CMD == ret)) + if(DEMO_CONSOLE_CMD == ret) { /*modify*/ - memset(gstConsole.rx_buf, 0, DEMO_CONSOLE_BUF_SIZE); /*After command finished transfering, clear buffer*/ - gstConsole.rptr = 0; + //printf("Demo cmd is finished\r\n"); + } + else if(DEMO_CONSOLE_WRONG_CMD == ret) + { + //printf("Demo cmd is wrong\r\n"); } else if(DEMO_CONSOLE_SHORT_CMD == ret) { //param not passed all, do nothing. + //printf("Demo cmd is short\r\n"); } + memset(gstConsole.rx_buf, 0, DEMO_CONSOLE_BUF_SIZE); /*After command finished transfering, clear buffer*/ + gstConsole.rptr = 0; if(gstConsole.MsgNum) gstConsole.MsgNum --; diff --git a/src/W800_SDK_v1.00.10/demo/wm_adc_demo.c b/src/W800_SDK_v1.00.10/demo/wm_adc_demo.c index 0896a0e..c98f26b 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_adc_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_adc_demo.c @@ -17,12 +17,89 @@ #if DEMO_ADC +#define TMAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] +#define TMACSTR "%02x:%02x:%02x:%02x:%02x:%02x" +int adc_input_voltage_cal_demo(u8 chan, signed short refvoltage) +{ + int ret =0; + u8 mac[6]; + + tls_get_mac_addr(mac); + printf("Mac["TMACSTR"],Cch[%d], Refvol[%d] ", TMAC2STR(mac), chan, refvoltage); + + ret = adc_offset_calibration(chan, refvoltage); + if (ret == 0) + { + printf("Calok "); + } + else + { + printf("Calerr \r\n"); + return 0; + } + + int voltage =0; + int i =0 ; + for (i = 0; i < 4; i++) + { + if (i != chan) + { + wm_adc_config(i); + voltage = adc_get_inputVolt(i); + printf("Mch[%d]-%d(mV) ", i, voltage); + } + } + printf("\r\n"); + + return 0; +} + +int adc_input_voltage_multipoint_cal_demo(int chanused,int chan0ref, int chan1ref, int chan2ref, int chan3ref) +{ + int ret =0; + u8 mac[6]; + int refvol[4] = {chan0ref, chan1ref, chan2ref, chan3ref}; + + tls_get_mac_addr(mac); + printf("Mac["TMACSTR"],", TMAC2STR(mac)); + for (int i = 0; i < 4; i++) + { + if (chanused&(1<dhcp_enable = TRUE; + tls_param_set(TLS_PARAM_ID_IP, ip_param, FALSE); + tls_mem_free(ip_param); + } + + tls_netif_add_status_event(con_net_status_changed_event); + /*configure if sta can connect open/wep AP*/ + tls_wifi_cfg_connect_pci(pci_en); + /*configure the timeout that module connect AP during scanning*/ + tls_wifi_cfg_connect_timeout(timeout); + /*configure if the module immediately connect AP after scan specific AP*/ + tls_wifi_cfg_connect_scan_mode(scan_mode); + tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd)); + printf("\nplease wait connect net......\n"); + + return WM_SUCCESS; +} + #endif diff --git a/src/W800_SDK_v1.00.10/demo/wm_http_demo.c b/src/W800_SDK_v1.00.10/demo/wm_http_demo.c index 3ce4576..503ae21 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_http_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_http_demo.c @@ -32,6 +32,12 @@ u32 http_snd_req(HTTPParameters ClientParams, HTTP_VERB verb, char *pSndData, u8 nRetCode = HTTP_CLIENT_ERROR_INVALID_HANDLE; break; } + /* + if((nRetCode = HTTPClientAddRequestHeaders(pHTTP,"media type", "application/json", 1))!= HTTP_CLIENT_SUCCESS) + { + break; + } + */ // Set the Verb nRetCode = HTTPClientSetVerb(pHTTP, verb); if(nRetCode != HTTP_CLIENT_SUCCESS) diff --git a/src/W800_SDK_v1.00.10/demo/wm_https_demo.c b/src/W800_SDK_v1.00.10/demo/wm_https_demo.c index 6d7ef42..97b7937 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_https_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_https_demo.c @@ -20,7 +20,7 @@ #include "wm_sockets.h" #include "lwip/inet.h" -#include "wm_sockets2.0.3.h" +#include "wm_sockets.h" #include "HTTPClientWrapper.h" #if DEMO_HTTPS diff --git a/src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c b/src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c index a58de8e..69bce31 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_mqtt_demo.c @@ -12,6 +12,7 @@ * Date : 2019-3-24 *****************************************************************************/ #include +#include "list.h" #include "wm_include.h" #include "wm_netif.h" #include "wm_demo.h" @@ -19,14 +20,17 @@ #include "lwip/netif.h" #include "wm_sockets.h" #include "lwip/inet.h" -#include "wm_sockets2.0.3.h" +#include "wm_sockets.h" #include "libemqtt.h" +#include "private-libwebsockets.h" +#include "libwebsockets.h" +#include "HTTPClient.h" #if DEMO_MQTT #define MQTT_DEMO_TASK_PRIO 39 -#define MQTT_DEMO_TASK_SIZE 512 -#define MQTT_DEMO_QUEUE_SIZE 4 +#define MQTT_DEMO_TASK_SIZE 2048 +#define MQTT_DEMO_QUEUE_SIZE 16 #define MQTT_DEMO_RECV_BUF_LEN_MAX 1024 @@ -36,26 +40,56 @@ #define MQTT_DEMO_READ_TIMEOUT (-1000) -#define MQTT_DEMO_READ_TIME_SEC 1 +#define MQTT_DEMO_READ_TIME_SEC 5 #define MQTT_DEMO_READ_TIME_US 0 #define MQTT_DEMO_CLIENT_ID "wm_mqtt_client" -#define MQTT_DEMO_TX_PUB_TOPIC "winnermicro/mqtt_tx_demo" -#define MQTT_DEMO_RX_PUB_TOPIC "winnermicro/mqtt_rx_demo" +#define MQTT_DEMO_TX_PUB_TOPIC "topic_tx" +#define MQTT_DEMO_RX_PUB_TOPIC "topic_rx" -#define MQTT_DEMO_SERVER_ADDR "mqtt.yichen.link" -#define MQTT_DEMO_SERVER_PORT 3883 +#define MQTT_DEMO_SERVER_ADDR "192.168.1.101" +#define MQTT_DEMO_SERVER_PORT_TCP 1883 +#define MQTT_DEMO_SERVER_PORT_TLS 8883 +#define MQTT_DEMO_SERVER_PORT_WS 8080 +#define MQTT_DEMO_SERVER_PORT_WSS 8081 + +typedef enum _conn_type +{ + MQTT_CONN_TYPE_TCP = 0, + MQTT_CONN_TYPE_TLS, + MQTT_CONN_TYPE_WS, + MQTT_CONN_TYPE_WSS, +}mqtt_conn_type; + +typedef struct _mqtt_demo_context +{ + mqtt_conn_type conn_type; + int mqtt_demo_socket_id; + tls_ssl_t *ssl; + struct lws* ws_context; + struct dl_list ws_tx_list; + struct dl_list ws_rx_list; + uint16_t server_port; + int (*connect)(struct _mqtt_demo_context *ctx, const struct sockaddr *name, socklen_t namelen,char *hostname); + int (*close_mqtt)(struct _mqtt_demo_context *ctx); + int (*send_packet)(int socket_info, const void *buf, unsigned int count); + int (*read_packet)(struct _mqtt_demo_context *ctx, uint8_t *buf, int buf_len, int sec, int us); + int mqtt_demo_mqtt_keepalive; + tls_os_timer_t *mqtt_demo_heartbeat_timer; + mqtt_broker_handle_t mqtt_demo_mqtt_broker; + uint8_t mqtt_demo_packet_buffer[MQTT_DEMO_RECV_BUF_LEN_MAX]; +}mqtt_demo_context_t; static bool mqtt_demo_inited = FALSE; static OS_STK mqtt_demo_task_stk[MQTT_DEMO_TASK_SIZE]; static tls_os_queue_t *mqtt_demo_task_queue = NULL; -static tls_os_timer_t *mqtt_demo_heartbeat_timer = NULL; +/*static tls_os_timer_t *mqtt_demo_heartbeat_timer = NULL; static int mqtt_demo_socket_id; static int mqtt_demo_mqtt_keepalive = 300; static mqtt_broker_handle_t mqtt_demo_mqtt_broker; -static uint8_t mqtt_demo_packet_buffer[MQTT_DEMO_RECV_BUF_LEN_MAX]; +static uint8_t mqtt_demo_packet_buffer[MQTT_DEMO_RECV_BUF_LEN_MAX];*/ extern struct netif *tls_get_netif(void); extern int wm_printf(const char *fmt, ...); @@ -83,24 +117,283 @@ static void mqtt_demo_net_status(u8 status) static void mqtt_demo_heart_timer(void *ptmr, void *parg) { - tls_os_queue_send(mqtt_demo_task_queue, (void *)MQTT_DEMO_CMD_HEART, 0); + tls_os_status_t os_status = tls_os_queue_send(mqtt_demo_task_queue, (void *)MQTT_DEMO_CMD_HEART, 0); + wm_printf("==> heart timer %d\n", os_status); } -static int mqtt_demo_close_socket(mqtt_broker_handle_t *broker) +typedef struct _ws_packet { - int fd = broker->socketid; + struct dl_list list; + char *buf; + int buf_len; +}ws_packet; +static int lwsCallbackNotify(struct lws *wsi,enum lws_callback_reasons reason,void *user, void *in, size_t len) +{ + mqtt_demo_context_t *ctx = (mqtt_demo_context_t *)user; + u32 cpu_sr; + ws_packet *packet = NULL; + //wm_printf("%s: enter ctx 0x%x, reason %d\n", __func__, ctx, reason); + switch (reason) + { + case LWS_CALLBACK_CLIENT_ESTABLISHED: + wm_printf("CLIENT_ESTABLISHED\n"); + //now_state = HANDLE_SESSION; + break; + + case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: + wm_printf("CLIENT_CONNECTION_ERROR\n"); + //now_state = EXIT_SESSION; + break; + + case LWS_CALLBACK_CLOSED: + wm_printf("CLOSED\n"); + //now_state = EXIT_SESSION; + break; + + case LWS_CALLBACK_CLIENT_RECEIVE: + //((char *)in)[len] = '\0'; + wm_printf("lws receive len %d\n", len); + do + { + packet = (ws_packet *)tls_mem_alloc(sizeof(ws_packet)); + if(packet == NULL) + { + wm_printf("%s: malloc packet error\n", __func__); + break; + } + dl_list_init(&packet->list); + packet->buf = tls_mem_alloc(len); + if(packet->buf == NULL) + { + tls_mem_free(packet); + wm_printf("%s: malloc packet buffer error\n", __func__); + break; + } + memset(packet->buf, 0, len); + memcpy(packet->buf, in, len); + packet->buf_len = len; + cpu_sr = tls_os_set_critical(); + dl_list_add_tail(&ctx->ws_rx_list, &packet->list); + tls_os_release_critical(cpu_sr); + //wm_printf("recv packets count %d\n", dl_list_len(&ctx->ws_rx_list)); + }while(0); + break; + + case LWS_CALLBACK_CLIENT_WRITEABLE: + //wm_printf("lws writeable list count %d\n", dl_list_len(&ctx->ws_tx_list)); + packet = dl_list_first(&ctx->ws_tx_list, ws_packet, list); + //wm_printf("dl_list_first packet 0x%x\n", packet); + if(packet != NULL) + { + wm_printf("lws_write "); + int n = lws_write( wsi, (unsigned char *)packet->buf + LWS_SEND_BUFFER_PRE_PADDING, packet->buf_len, LWS_WRITE_BINARY ); + wm_printf("ret %d\n", n); + if( n <= 0 ) + { + wm_printf("send error %d\r\n", n); + } + cpu_sr = tls_os_set_critical(); + dl_list_del(&packet->list); + tls_os_release_critical(cpu_sr); + tls_mem_free(packet->buf); + tls_mem_free(packet); + } + break; + + default: + break; + } + + return 0; +} + +static struct lws_protocols protocols[] = { + { + "mqtt", + lwsCallbackNotify, + 0, + 2048, + 0, + NULL + }, + { NULL, NULL, 0, 0, 0, NULL } /* end */ +}; +#define LWS_SERVER_PATH "/" + +static int mqtt_ws_connect(mqtt_demo_context_t *ctx, const struct sockaddr *name, socklen_t namelen,char *hostname) +{ + struct lws_client_connect_info connInfo; + struct lws_context_creation_info info; + struct lws_context *lwscontext = NULL; + + memset(&info, 0, sizeof(info) ); + info.port = CONTEXT_PORT_NO_LISTEN; + if(ctx->server_port == MQTT_DEMO_SERVER_PORT_WSS) + { + info.options |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; + } + protocols[0].user = ctx; + protocols[0].per_session_data_size = sizeof(mqtt_demo_context_t *); + wm_printf("protocols[0].user 0x%x\n", protocols[0].user); + info.protocols = protocols; + info.max_http_header_data=512; + info.max_http_header_pool=4; + + lwscontext = lws_create_context(&info); + memset(&connInfo, 0 , sizeof(connInfo) ); + connInfo.context = lwscontext; + connInfo.address = MQTT_DEMO_SERVER_ADDR; + connInfo.port = ctx->server_port; + connInfo.ssl_connection = ctx->server_port == MQTT_DEMO_SERVER_PORT_WSS ? 1 : 0; + connInfo.path = LWS_SERVER_PATH; + connInfo.host = MQTT_DEMO_SERVER_ADDR; + connInfo.userdata = ctx; + connInfo.protocol = protocols[0].name; + connInfo.ietf_version_or_minus_one=13; + connInfo.origin = MQTT_DEMO_SERVER_ADDR; + ctx->ws_context = lws_client_connect_via_info( &connInfo ); + if(ctx->ws_context == NULL ) + { + lws_context_destroy(lwscontext); + ctx->ws_context->context = NULL; + return -1; + } + return 0; +} +static int mqtt_ws_close_socket(mqtt_demo_context_t *ctx) +{ + wm_printf("EXIT_SESSION ctx 0x%x\n", ctx); + if(ctx->ws_context != NULL ) + { + if( ctx->ws_context->context != NULL ) { + lws_context_destroy(ctx->ws_context->context); + ctx->ws_context->context = NULL; + } + lws_free(ctx->ws_context); + ctx->ws_context = NULL; + } + return 0; +} +static int mqtt_ws_send_packet(int socket_info, const void *buf, unsigned int count) +{ + mqtt_demo_context_t *ctx = (mqtt_demo_context_t *)socket_info; + u32 cpu_sr; + ws_packet *packet = (ws_packet *)tls_mem_alloc(sizeof(ws_packet)); + + //wm_printf("%s: enter ctx 0x%x\n", __func__, ctx); + if(packet == NULL) + { + wm_printf("%s: malloc packet error\n", __func__); + return -1; + } + dl_list_init(&packet->list); + packet->buf = tls_mem_alloc(count + LWS_SEND_BUFFER_PRE_PADDING + 4); + if(packet->buf == NULL) + { + tls_mem_free(packet); + wm_printf("%s: malloc packet buffer error\n", __func__); + return -1; + } + memset(packet->buf, 0, count + LWS_SEND_BUFFER_PRE_PADDING + 4); + memcpy(packet->buf + LWS_SEND_BUFFER_PRE_PADDING, buf, count); + packet->buf_len = count; + cpu_sr = tls_os_set_critical(); + dl_list_add_tail(&ctx->ws_tx_list, &packet->list); + tls_os_release_critical(cpu_sr); + //wm_printf("send packets count %d\n", dl_list_len(&ctx->ws_tx_list)); + lws_callback_on_writable(ctx->ws_context); + return count; +} +static int mqtt_ws_read_packet(mqtt_demo_context_t *ctx, uint8_t *buf, int buf_len, int sec, int us) +{ + u32 cpu_sr; + ws_packet *packet = NULL; + int start_tick = tls_os_get_time(); + volatile int now_tick; + int timeout = (sec*1000 + us/1000) * HZ / 1000; + //wm_printf("%s: enter ctx 0x%x, timeout %d, start_tick %d\n", __func__, ctx, timeout, start_tick); + + do + { + lws_service(ctx->ws_context->context, 250); + lws_callback_on_writable(ctx->ws_context); + packet = dl_list_first(&ctx->ws_rx_list, ws_packet, list); + //wm_printf("%s dl_list_first packet 0x%x\n", __func__, packet); + if(packet != NULL) + { + if(buf_len > packet->buf_len) + { + buf_len = packet->buf_len; + } + memcpy(buf, packet->buf, buf_len); + cpu_sr = tls_os_set_critical(); + dl_list_del(&packet->list); + tls_os_release_critical(cpu_sr); + tls_mem_free(packet->buf); + tls_mem_free(packet); + return buf_len; + } + tls_os_time_delay(10); + now_tick = tls_os_get_time(); + //wm_printf("%s tick now %d | %d < %d\n", __func__, now_tick, (now_tick - start_tick), timeout); + }while((now_tick - start_tick) < timeout); + //wm_printf("%s return timeout\n", __func__); + return MQTT_DEMO_READ_TIMEOUT; +} + +static int mqtt_tls_connect(mqtt_demo_context_t *ctx, const struct sockaddr *name, socklen_t namelen,char *hostname) +{ + return HTTPWrapperSSLConnect(&ctx->ssl, ctx->mqtt_demo_socket_id, name, namelen, hostname); +} +static int mqtt_tls_close_socket(mqtt_demo_context_t *ctx) +{ + return HTTPWrapperSSLClose(ctx->ssl, ctx->mqtt_demo_socket_id); +} +static int mqtt_tls_send_packet(int socket_info, const void *buf, unsigned int count) +{ + mqtt_demo_context_t *ctx = (mqtt_demo_context_t *)socket_info; + return HTTPWrapperSSLSend(ctx->ssl, ctx->mqtt_demo_socket_id, (char *)buf, count, 0); +} +static int mqtt_tls_read_packet(mqtt_demo_context_t *ctx, uint8_t *buf, int buf_len, int sec, int us) +{ + int ret = HTTPWrapperSSLRecv(ctx->ssl, ctx->mqtt_demo_socket_id, (char *)buf, buf_len, 0); + if (ret <= 0) + { + if (SOCKET_SSL_MORE_DATA == ret) + { + ret = buf_len; + } + else if(MBEDTLS_ERR_SSL_TIMEOUT == ret) + { + ret = MQTT_DEMO_READ_TIMEOUT; + } + else + { + wm_printf("tls recv %d closed\r\n", ret); + } + } + return ret; +} + +static int mqtt_tcp_connect(mqtt_demo_context_t *ctx, const struct sockaddr *name, socklen_t namelen,char *hostname) +{ + return connect(ctx->mqtt_demo_socket_id, name, namelen); +} +static int mqtt_tcp_close_socket(mqtt_demo_context_t *ctx) +{ + int fd = ctx->mqtt_demo_socket_id; return closesocket(fd); } - -static int mqtt_demo_send_packet(int socket_info, const void *buf, unsigned int count) +static int mqtt_tcp_send_packet(int socket_info, const void *buf, unsigned int count) { - int fd = socket_info; - return send(fd, buf, count, 0); + mqtt_demo_context_t *ctx = (mqtt_demo_context_t *)socket_info; + return send(ctx->mqtt_demo_socket_id, buf, count, 0); } - -static int mqtt_demo_read_packet(int sec, int us) +static int mqtt_tcp_read_packet(mqtt_demo_context_t *ctx, uint8_t *buf, int buf_len, int sec, int us) { int ret = 0; + int bytes_rcvd; + int fd = ctx->mqtt_demo_socket_id; if ((sec >= 0) || (us >= 0)) { @@ -109,14 +402,14 @@ static int mqtt_demo_read_packet(int sec, int us) // Initialize the file descriptor set FD_ZERO (&readfds); - FD_SET (mqtt_demo_socket_id, &readfds); + FD_SET (fd, &readfds); // Initialize the timeout data structure tmv.tv_sec = sec; tmv.tv_usec = us; // select returns 0 if timeout, 1 if input available, -1 if error - ret = select(mqtt_demo_socket_id + 1, &readfds, NULL, NULL, &tmv); + ret = select(fd + 1, &readfds, NULL, NULL, &tmv); if(ret < 0) return -2; else if(ret == 0) @@ -124,14 +417,24 @@ static int mqtt_demo_read_packet(int sec, int us) } - int total_bytes = 0, bytes_rcvd, packet_length; - memset(mqtt_demo_packet_buffer, 0, sizeof(mqtt_demo_packet_buffer)); - - if((bytes_rcvd = recv(mqtt_demo_socket_id, (mqtt_demo_packet_buffer + total_bytes), MQTT_DEMO_RECV_BUF_LEN_MAX, 0)) <= 0) + if((bytes_rcvd = recv(fd, buf, buf_len, 0)) <= 0) { //printf("%d, %d\r\n", bytes_rcvd, mqtt_demo_socket_id); return -1; } + return bytes_rcvd; +} + +static int mqtt_demo_recv_parse(mqtt_demo_context_t *ctx, int sec, int us) +{ + int total_bytes = 0, bytes_rcvd, packet_length; + memset(ctx->mqtt_demo_packet_buffer, 0, sizeof(ctx->mqtt_demo_packet_buffer)); + + bytes_rcvd = ctx->read_packet(ctx, (ctx->mqtt_demo_packet_buffer + total_bytes), MQTT_DEMO_RECV_BUF_LEN_MAX, sec, us); + if(bytes_rcvd <= 0) + { + return bytes_rcvd; + } //printf("recv [len=%d] : %s\n", bytes_rcvd, mqtt_demo_packet_buffer); total_bytes += bytes_rcvd; // Keep tally of total bytes if (total_bytes < 2) @@ -139,8 +442,8 @@ static int mqtt_demo_read_packet(int sec, int us) // now we have the full fixed header in mqtt_demo_packet_buffer // parse it for remaining length and number of bytes - uint16_t rem_len = mqtt_parse_rem_len(mqtt_demo_packet_buffer); - uint8_t rem_len_bytes = mqtt_num_rem_len_bytes(mqtt_demo_packet_buffer); + uint16_t rem_len = mqtt_parse_rem_len(ctx->mqtt_demo_packet_buffer); + uint8_t rem_len_bytes = mqtt_num_rem_len_bytes(ctx->mqtt_demo_packet_buffer); //packet_length = mqtt_demo_packet_buffer[1] + 2; // Remaining length + fixed header length // total packet length = remaining length + byte 1 of fixed header + remaning length part of fixed header @@ -148,7 +451,7 @@ static int mqtt_demo_read_packet(int sec, int us) while(total_bytes < packet_length) // Reading the packet { - if((bytes_rcvd = recv(mqtt_demo_socket_id, (mqtt_demo_packet_buffer + total_bytes), MQTT_DEMO_RECV_BUF_LEN_MAX, 0)) <= 0) + if((bytes_rcvd = ctx->read_packet(ctx, (ctx->mqtt_demo_packet_buffer + total_bytes), MQTT_DEMO_RECV_BUF_LEN_MAX, sec, us)) <= 0) return -1; total_bytes += bytes_rcvd; // Keep tally of total bytes } @@ -156,19 +459,19 @@ static int mqtt_demo_read_packet(int sec, int us) return packet_length; } -static int mqtt_demo_init_socket(mqtt_broker_handle_t *broker, const char *hostname, short port, int keepalive) +static int mqtt_demo_init_socket(mqtt_demo_context_t *ctx, const char *hostname, short port, int keepalive) { int flag = 1; struct hostent *hp; // Create the socket - if((mqtt_demo_socket_id = socket(PF_INET, SOCK_STREAM, 0)) < 0) + if((ctx->mqtt_demo_socket_id = socket(PF_INET, SOCK_STREAM, 0)) < 0) return -1; // Disable Nagle Algorithm - if (setsockopt(mqtt_demo_socket_id, IPPROTO_TCP, 0x01, (char *)&flag, sizeof(flag)) < 0) + if (setsockopt(ctx->mqtt_demo_socket_id, IPPROTO_TCP, 0x01, (char *)&flag, sizeof(flag)) < 0) { - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -2; } @@ -176,7 +479,7 @@ static int mqtt_demo_init_socket(mqtt_broker_handle_t *broker, const char *hostn hp = gethostbyname(hostname); if (hp == NULL ) { - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -2; } @@ -187,30 +490,31 @@ static int mqtt_demo_init_socket(mqtt_broker_handle_t *broker, const char *hostn memcpy(&(socket_address.sin_addr), hp->h_addr, hp->h_length); // Connect the socket - if((connect(mqtt_demo_socket_id, (struct sockaddr *)&socket_address, sizeof(socket_address))) < 0) + if((ctx->connect(ctx, (struct sockaddr *)&socket_address, sizeof(socket_address), NULL)) < 0) { - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -1; } // MQTT stuffs - mqtt_set_alive(broker, mqtt_demo_mqtt_keepalive); - broker->socketid = mqtt_demo_socket_id; - broker->mqttsend = mqtt_demo_send_packet; + mqtt_set_alive(&ctx->mqtt_demo_mqtt_broker, ctx->mqtt_demo_mqtt_keepalive); + ctx->mqtt_demo_mqtt_broker.socketid = (int)ctx; + ctx->mqtt_demo_mqtt_broker.mqttsend = ctx->send_packet; //wm_printf("socket id = %d\n", mqtt_demo_socket_id); return 0; } -static int mqtt_demo_init(void) +static int mqtt_demo_init(mqtt_demo_context_t *ctx) { int packet_length, ret = 0; uint16_t msg_id, msg_id_rcv; wm_printf("step1: init mqtt lib.\r\n"); - mqtt_init(&mqtt_demo_mqtt_broker, MQTT_DEMO_CLIENT_ID); + mqtt_init(&ctx->mqtt_demo_mqtt_broker, MQTT_DEMO_CLIENT_ID); + mqtt_init_auth(&ctx->mqtt_demo_mqtt_broker, "admin", "password"); wm_printf("step2: establishing TCP connection.\r\n"); - ret = mqtt_demo_init_socket(&mqtt_demo_mqtt_broker, MQTT_DEMO_SERVER_ADDR, MQTT_DEMO_SERVER_PORT, mqtt_demo_mqtt_keepalive); + ret = mqtt_demo_init_socket(ctx, MQTT_DEMO_SERVER_ADDR, ctx->server_port, ctx->mqtt_demo_mqtt_keepalive); if(ret) { wm_printf("init_socket ret=%d\n", ret); @@ -218,96 +522,117 @@ static int mqtt_demo_init(void) } wm_printf("step3: establishing mqtt connection.\r\n"); - ret = mqtt_connect(&mqtt_demo_mqtt_broker); + ret = mqtt_connect(&ctx->mqtt_demo_mqtt_broker); if(ret) { wm_printf("mqtt_connect ret=%d\n", ret); return -5; } - packet_length = mqtt_demo_read_packet(MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US); + packet_length = mqtt_demo_recv_parse(ctx, MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US); if(packet_length < 0) { wm_printf("Error(%d) on read packet!\n", packet_length); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -1; } - if(MQTTParseMessageType(mqtt_demo_packet_buffer) != MQTT_MSG_CONNACK) + if(MQTTParseMessageType(ctx->mqtt_demo_packet_buffer) != MQTT_MSG_CONNACK) { wm_printf("CONNACK expected!\n"); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -2; } - if(mqtt_demo_packet_buffer[3] != 0x00) + if(ctx->mqtt_demo_packet_buffer[3] != 0x00) { wm_printf("CONNACK failed!\n"); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -2; } wm_printf("step4: subscribe mqtt\r\n"); - mqtt_subscribe(&mqtt_demo_mqtt_broker, MQTT_DEMO_TX_PUB_TOPIC, &msg_id); + mqtt_subscribe(&ctx->mqtt_demo_mqtt_broker, MQTT_DEMO_TX_PUB_TOPIC, &msg_id); - packet_length = mqtt_demo_read_packet(MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US); + packet_length = mqtt_demo_recv_parse(ctx, MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US); if(packet_length < 0) { wm_printf("Error(%d) on read packet!\n", packet_length); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -1; } - if(MQTTParseMessageType(mqtt_demo_packet_buffer) != MQTT_MSG_SUBACK) + if(MQTTParseMessageType(ctx->mqtt_demo_packet_buffer) != MQTT_MSG_SUBACK) { wm_printf("SUBACK expected!\n"); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -2; } - msg_id_rcv = mqtt_parse_msg_id(mqtt_demo_packet_buffer); + msg_id_rcv = mqtt_parse_msg_id(ctx->mqtt_demo_packet_buffer); if(msg_id != msg_id_rcv) { wm_printf("%d message id was expected, but %d message id was found!\n", msg_id, msg_id_rcv); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + ctx->close_mqtt(ctx); return -3; } +#if 0 + wm_printf("step4+: unsubscribe mqtt\r\n"); + mqtt_unsubscribe(&ctx->mqtt_demo_mqtt_broker, MQTT_DEMO_TX_PUB_TOPIC, &msg_id); - wm_printf("step5: start the Heart-beat preservation timer\r\n"); - ret = tls_os_timer_create(&mqtt_demo_heartbeat_timer, + packet_length = mqtt_demo_recv_parse(ctx, MQTT_DEMO_READ_TIME_SEC, MQTT_DEMO_READ_TIME_US); + if(packet_length < 0) + { + wm_printf("Error(%d) on read packet!\n", packet_length); + ctx->close_mqtt(ctx); + return -1; + } + + if(MQTTParseMessageType(ctx->mqtt_demo_packet_buffer) != MQTT_MSG_UNSUBACK) + { + wm_printf("UNSUBACK expected!\n"); + ctx->close_mqtt(ctx); + return -2; + } +#endif + wm_printf("step5: start the Heart-beat preservation timer "); + ret = tls_os_timer_create(&ctx->mqtt_demo_heartbeat_timer, mqtt_demo_heart_timer, NULL, (10 * HZ), TRUE, NULL); if (TLS_OS_SUCCESS == ret) - tls_os_timer_start(mqtt_demo_heartbeat_timer); + { + tls_os_timer_start(ctx->mqtt_demo_heartbeat_timer); + } + wm_printf("%s\r\n" , TLS_OS_SUCCESS == ret ? "ok" : "error"); /* step6: push mqtt subscription (when a subscription message is received) */ return 0; } -static int mqtt_demo_loop(void) +static int mqtt_demo_loop(mqtt_demo_context_t *ctx) { int packet_length = 0; int counter = 0; counter++; - packet_length = mqtt_demo_read_packet(0, 1); + packet_length = mqtt_demo_recv_parse(ctx, 1, 1); if(packet_length > 0) { //wm_printf("recvd Packet Header: 0x%x...\n", mqtt_demo_packet_buffer[0]); - if (MQTTParseMessageType(mqtt_demo_packet_buffer) == MQTT_MSG_PUBLISH) + if (MQTTParseMessageType(ctx->mqtt_demo_packet_buffer) == MQTT_MSG_PUBLISH) { uint8_t topic[100], *msg; uint16_t len; - len = mqtt_parse_pub_topic(mqtt_demo_packet_buffer, topic); + len = mqtt_parse_pub_topic(ctx->mqtt_demo_packet_buffer, topic); topic[len] = '\0'; // for printf - len = mqtt_parse_publish_msg(mqtt_demo_packet_buffer, &msg); + len = mqtt_parse_publish_msg(ctx->mqtt_demo_packet_buffer, &msg); msg[len] = '\0'; // for printf wm_printf("recvd: %s >>> %s\n", topic, msg); - mqtt_publish(&mqtt_demo_mqtt_broker, (const char *)MQTT_DEMO_RX_PUB_TOPIC, (const char *)msg, len, 0); + mqtt_publish(&ctx->mqtt_demo_mqtt_broker, (const char *)MQTT_DEMO_RX_PUB_TOPIC, (const char *)msg, len, 0); wm_printf("pushed: %s <<< %s\n", MQTT_DEMO_RX_PUB_TOPIC, msg); } @@ -320,8 +645,8 @@ static int mqtt_demo_loop(void) else if(packet_length == -1) { wm_printf("mqtt error:(%d), stop mqtt demo!\n", packet_length); - tls_os_timer_stop(mqtt_demo_heartbeat_timer); - mqtt_demo_close_socket(&mqtt_demo_mqtt_broker); + tls_os_timer_stop(ctx->mqtt_demo_heartbeat_timer); + ctx->close_mqtt(ctx); } return 0; @@ -332,7 +657,48 @@ static void mqtt_demo_task(void *p) int ret; void *msg; struct tls_ethif *ether_if = tls_netif_get_ethif(); + mqtt_demo_context_t *ctx = tls_mem_alloc(sizeof(mqtt_demo_context_t)); + if(ctx == NULL) + { + wm_printf("MQTT Demo context malloc Error!\n"); + return; + } + memset(ctx, 0, sizeof(mqtt_demo_context_t)); + ctx->conn_type = (mqtt_conn_type)p; + wm_printf("conn_type %u ctx 0x%x mqtt_demo_socket_id 0x%x\n", ctx->conn_type, ctx, (int)&ctx->mqtt_demo_socket_id); + switch(ctx->conn_type) + { + case MQTT_CONN_TYPE_TCP: + ctx->connect = mqtt_tcp_connect; + ctx->close_mqtt = mqtt_tcp_close_socket; + ctx->send_packet = mqtt_tcp_send_packet; + ctx->read_packet = mqtt_tcp_read_packet; + ctx->server_port = MQTT_DEMO_SERVER_PORT_TCP; + break; + case MQTT_CONN_TYPE_TLS: + ctx->connect = mqtt_tls_connect; + ctx->close_mqtt = mqtt_tls_close_socket; + ctx->send_packet = mqtt_tls_send_packet; + ctx->read_packet = mqtt_tls_read_packet; + ctx->server_port = MQTT_DEMO_SERVER_PORT_TLS; + break; + case MQTT_CONN_TYPE_WS: + case MQTT_CONN_TYPE_WSS: + ctx->connect = mqtt_ws_connect; + ctx->close_mqtt = mqtt_ws_close_socket; + ctx->send_packet = mqtt_ws_send_packet; + ctx->read_packet = mqtt_ws_read_packet; + ctx->server_port = MQTT_CONN_TYPE_WS == ctx->conn_type ? MQTT_DEMO_SERVER_PORT_WS : MQTT_DEMO_SERVER_PORT_WSS; + break; + default: + wm_printf("conn_type %u is not supported error!\n"); + return; + } + ctx->mqtt_demo_socket_id = -1; + ctx->mqtt_demo_mqtt_keepalive = 300; + dl_list_init(&ctx->ws_tx_list); + dl_list_init(&ctx->ws_rx_list); if (ether_if->status) { wm_printf("sta ip: %v\n", ether_if->ip_addr.addr); @@ -349,7 +715,7 @@ static void mqtt_demo_task(void *p) case MQTT_DEMO_CMD_START: do { - ret = mqtt_demo_init(); + ret = mqtt_demo_init(ctx); if (ret) break; tls_os_queue_send(mqtt_demo_task_queue, (void *)MQTT_DEMO_CMD_LOOP, 0); @@ -358,10 +724,10 @@ static void mqtt_demo_task(void *p) break; case MQTT_DEMO_CMD_HEART: wm_printf("send heart ping\r\n"); - mqtt_ping(&mqtt_demo_mqtt_broker); + mqtt_ping(&ctx->mqtt_demo_mqtt_broker); break; case MQTT_DEMO_CMD_LOOP: - mqtt_demo_loop(); + mqtt_demo_loop(ctx); break; default: break; @@ -372,16 +738,16 @@ static void mqtt_demo_task(void *p) //mqtt demo -//²âÊÔ·þÎñÆ÷:mqtt.yichen.link:3883 -//·þÎñÆ÷¶ËÓÃÓÚ·¢Ë͵Ķ©ÔÄÖ÷ÌâΪ:winnermicro/mqtt_tx_demo -//·þÎñÆ÷¶ËÓÃÓÚ½ÓÊյĶ©ÔÄÖ÷ÌâΪ:winnermicro/mqtt_rx_demo -//¹¤×÷Á÷³Ì: ½ÓÊÕµ½winnermicro/mqtt_tx_demoÍÆË͵ÄÏûÏ¢ºó´òÓ¡ÔÚÆÁÄ»ÉÏ£¬²¢ÔÙ´ÎÍÆË͵½winnermicro/mqtt_rx_demo -int mqtt_demo(void) +//测试æœåС噍:mqtt.yichen.link:3883 +//æœåŠ¡å™¨ç«¯ç”¨äºŽå‘é€çš„订阅主题为:winnermicro/mqtt_tx_demo +//æœåŠ¡å™¨ç«¯ç”¨äºŽæŽ¥æ”¶çš„è®¢é˜…ä¸»é¢˜ä¸º:winnermicro/mqtt_rx_demo +//工作æµç¨‹: 接收到winnermicro/mqtt_tx_demo推é€çš„æ¶ˆæ¯åŽæ‰“å°åœ¨å±å¹•ä¸Šï¼Œå¹¶å†æ¬¡æŽ¨é€åˆ°winnermicro/mqtt_rx_demo +int mqtt_demo(int type) { if (!mqtt_demo_inited) { tls_os_task_create(NULL, NULL, mqtt_demo_task, - NULL, (void *)mqtt_demo_task_stk, /* task's stack start address */ + (void *)type, (void *)mqtt_demo_task_stk, /* task's stack start address */ MQTT_DEMO_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */ MQTT_DEMO_TASK_PRIO, 0); diff --git a/src/W800_SDK_v1.00.10/demo/wm_scan_demo.c b/src/W800_SDK_v1.00.10/demo/wm_scan_demo.c index c115d2e..563c6bc 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_scan_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_scan_demo.c @@ -152,6 +152,286 @@ end: tls_mem_free(buf1); } } + +static void wifi_scan_format2_handler(void) +{ + char *buf = NULL; + char *buf1 = NULL; + u32 buflen; + int i, j; + int err; + u8 ssid[33]; + struct tls_scan_bss_format2_t *wsr; + struct tls_bss_info_format2_t *bss_info; + + buflen = 2000; + buf = tls_mem_alloc(buflen); + if (!buf) + { + goto end; + } + + buf1 = tls_mem_alloc(300); + if(!buf1) + { + goto end; + } + memset(buf1, 0, 300); + + err = tls_wifi_get_scan_rslt_format2((u8 *)buf, buflen); + if (err) + { + goto end; + } + + wsr = (struct tls_scan_bss_format2_t *)buf; + bss_info = (struct tls_bss_info_format2_t *)(buf + 8); + + printf("\n"); + + for(i = 0; i < wsr->count; i++) + { + j = sprintf(buf1, "(%d,", bss_info->ecn); + memcpy(ssid, bss_info->ssid, bss_info->ssid_len); + ssid[bss_info->ssid_len] = '\0'; + + j += sprintf(buf1 + j, "%s", ssid); + + j += sprintf(buf1 + j, ",%d, ", (signed char)bss_info->rssi); + + j += sprintf(buf1 + j, "\"%02x:%02x:%02x:%02x:%02x:%02x\", ", bss_info->bssid[0], bss_info->bssid[1], + bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]); + + j += sprintf(buf1 + j, "%d, ", bss_info->channel); + + j += sprintf(buf1 + j, "%d, ", bss_info->group_cipher); + + j += sprintf(buf1 + j, "%d, ", bss_info->pairwise_cipher); + + j += sprintf(buf1 + j, "%d, ", bss_info->bgn); + + j += sprintf(buf1 + j, "%d,", bss_info->wps_support); + + j += sprintf(buf1 + j, "%d,", bss_info->freq_offset); + + j += sprintf(buf1 + j, "%d)", bss_info->freqcal_val); + + + printf("%s\n", buf1); + + bss_info ++; + } + +end: + if(buf) + { + tls_mem_free(buf); + } + if(buf1) + { + tls_mem_free(buf1); + } +} + + +struct specified_scan_info +{ + u8 specified_ssid[33]; + u16 specified_ssid_len; + u8 specified_bssid[18]; + u8 specified_chan; + u8 specified_mask; +}; + +struct specified_scan_info specifiedinfo; + +static void wifi_scan_format2_filter_handler(void) +{ + char *buf = NULL; + char *buf1 = NULL; + u32 buflen; + int i, j; + int err; + u8 ssid[33]; + u8 bssid[18]; + struct tls_scan_bss_format2_t *wsr; + struct tls_bss_info_format2_t *bss_info; + u8 bitmask = 0; + + buflen = 2000; + buf = tls_mem_alloc(buflen); + if (!buf) + { + goto end; + } + + buf1 = tls_mem_alloc(300); + if(!buf1) + { + goto end; + } + memset(buf1, 0, 300); + + err = tls_wifi_get_scan_rslt_format2((u8 *)buf, buflen); + if (err) + { + goto end; + } + + wsr = (struct tls_scan_bss_format2_t *)buf; + bss_info = (struct tls_bss_info_format2_t *)(buf + 8); + + printf("\n"); + bitmask = specifiedinfo.specified_mask; + for(i = 0; i < wsr->count; i++) + { + j = sprintf(buf1, "(%d,", bss_info->ecn); + if (bitmask&0x1) + { + if((specifiedinfo.specified_ssid_len != bss_info->ssid_len) + || memcmp(bss_info->ssid,specifiedinfo.specified_ssid,bss_info->ssid_len)) + { + bss_info++; + continue; + } + } + memcpy(ssid, bss_info->ssid, bss_info->ssid_len); + ssid[bss_info->ssid_len] = '\0'; + + j += sprintf(buf1 + j, "%s", ssid); + + j += sprintf(buf1 + j, ",%d,", (signed char)bss_info->rssi); + + if (bitmask&0x2) + { + sprintf((char *)bssid, "%02x:%02x:%02x:%02x:%02x:%02x", bss_info->bssid[0], bss_info->bssid[1], + bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]); + if (strcmp((const char *)bssid, (const char *)specifiedinfo.specified_bssid)) + { + bss_info++; + continue; + } + } + j += sprintf(buf1 + j, "\"%02x:%02x:%02x:%02x:%02x:%02x\",", bss_info->bssid[0], bss_info->bssid[1], + bss_info->bssid[2], bss_info->bssid[3], bss_info->bssid[4], bss_info->bssid[5]); + + if (bitmask&0x4) + { + if (bss_info->channel != specifiedinfo.specified_chan) + { + bss_info++; + continue; + } + } + j += sprintf(buf1 + j, "%d,", bss_info->channel); + + j += sprintf(buf1 + j, "%d,", bss_info->freq_offset); + + j += sprintf(buf1 + j, "%d,", bss_info->freqcal_val); + + j += sprintf(buf1 + j, "%d,", bss_info->pairwise_cipher); + + j += sprintf(buf1 + j, "%d,", bss_info->group_cipher); + + j += sprintf(buf1 + j, "%d,", bss_info->bgn); + + j += sprintf(buf1 + j, "%d)", bss_info->wps_support); + + + + + printf("%s\n", buf1); + + bss_info ++; + } + +end: + if(buf) + { + tls_mem_free(buf); + } + if(buf1) + { + tls_mem_free(buf1); + } +} + +int user_scan_specified(u8 *ssid, u8 *mac, u8 chan, u8 scan_type, u32 min_interval, u32 max_interval) +{ + struct tls_wifi_scan_param_t wscan_param; + + memset(&specifiedinfo, 0, sizeof(specifiedinfo)); + specifiedinfo.specified_mask = 0; + if (strlen((const char *)ssid) && (strlen((const char *)ssid) < 33)) + { + memset(specifiedinfo.specified_ssid, 0, 33); + strcpy((char *)specifiedinfo.specified_ssid, (char *)ssid); + specifiedinfo.specified_ssid_len = strlen((const char *)ssid); + specifiedinfo.specified_mask = 1; + } + else + { + specifiedinfo.specified_ssid[0] = '\0'; + specifiedinfo.specified_ssid_len = 0; + specifiedinfo.specified_mask &= ~1; + } + + if (strlen((const char *)mac) == 17) + { + memset(specifiedinfo.specified_bssid, 0, 17); + strcpy((char *)specifiedinfo.specified_bssid, (char *)mac); + specifiedinfo.specified_mask |= 2; + } + else + { + specifiedinfo.specified_bssid[0] = '\0'; + specifiedinfo.specified_mask &= ~2; + } + + if (scan_type) + { + wscan_param.scan_type = 1; + } + else + { + wscan_param.scan_type = 0; + } + if (chan == 0) + { + specifiedinfo.specified_chan = 0; + wscan_param.scan_chanlist = 0x1FFF; + specifiedinfo.specified_mask &= ~4; + } + else + { + specifiedinfo.specified_chan = chan; + specifiedinfo.specified_mask |=4; + wscan_param.scan_chanlist = 1<<(chan-1); + } + + if (min_interval == 0) + { + wscan_param.scan_chinterval = 120; + wscan_param.scan_times = 1; + } + else + { + wscan_param.scan_chinterval = min_interval; + if (max_interval >= min_interval) + { + wscan_param.scan_times = (max_interval + min_interval/2)/min_interval; + } + else + { + wscan_param.scan_times = 1; + } + } + + tls_wifi_scan_by_param(&wscan_param); + + return 0; +} + /*Scan demo*/ int scan_demo(void) { @@ -160,5 +440,22 @@ int scan_demo(void) return WM_SUCCESS; } +int scan_format2_demo(void) +{ + + tls_wifi_scan_result_cb_register(wifi_scan_format2_handler); + tls_wifi_scan(); + return WM_SUCCESS; +} + +/*specified Scan demo*/ +int scan_specified_demo(u8 *ssid, u8 *mac, u32 chan, u32 scan_type, u32 min_interval, u32 max_interval) +{ + tls_wifi_scan_result_cb_register(wifi_scan_format2_filter_handler); + user_scan_specified(ssid, mac, chan, scan_type, min_interval, max_interval); + return WM_SUCCESS; +} + + #endif diff --git a/src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c b/src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c index 1a686c5..bb7e2c3 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_sdio_host_demo.c @@ -10,6 +10,7 @@ #include "wm_cpu.h" #include "random.h" #include "wm_gpio_afsel.h" +#include "utils.h" #if DEMO_SDIO_HOST extern int wm_sd_card_set_blocklen(uint32_t blocklen); @@ -30,6 +31,7 @@ static int sdh_card_wr_sb(uint32_t rca, uint8_t bus_width, const uint32_t tsize) int i = 0; char* buf = NULL; char* bufR = NULL; + uint32_t sd_addr = 0; buf = tls_mem_alloc(512); if(buf == NULL) @@ -48,7 +50,8 @@ static int sdh_card_wr_sb(uint32_t rca, uint8_t bus_width, const uint32_t tsize) for(i=0; i<(tsize/512); i++) { - ret = wm_sd_card_block_write(rca, i, buf); + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; + ret = wm_sd_card_block_write(rca, sd_addr, buf); if(ret) goto end; } @@ -57,11 +60,15 @@ static int sdh_card_wr_sb(uint32_t rca, uint8_t bus_width, const uint32_t tsize) goto end; for(i=0; i<(tsize/512); i++) { - ret = wm_sd_card_block_read(rca, i, bufR); + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; + ret = wm_sd_card_block_read(rca, sd_addr, bufR); if(ret) goto end; if(memcmp(buf, bufR, 512)) { + printf("i=%d\n", i); + dumpBuffer("buf", buf, 512); + dumpBuffer("bufR", bufR, 512); ret = -2; goto end; } @@ -80,6 +87,76 @@ end: TEST_DEBUG("ret %d\n", ret); return ret; } +#if 0 +static int sdh_card_wr_sb_fullchip(uint32_t rca, uint8_t bus_width, const uint32_t tsize) +{ + int ret = -1; + int i = 0; + char* buf = NULL; + char* bufR = NULL; + uint32_t sd_addr = 0; + + buf = tls_mem_alloc(768); + if(buf == NULL) + goto end; + bufR = tls_mem_alloc(512); + if(bufR == NULL) + goto end; + for(i = 0; i < 768; i++) + { + buf[i] = i & 0xFF; + } + TEST_DEBUG("bus width %s\n", bus_width == 0 ? "1bit" : "4bits"); + ret = wm_sd_card_set_bus_width(rca, bus_width); + if(ret) + goto end; + ret = wm_sd_card_set_blocklen(0x200); //512 + if(ret) + goto end; +#if 1 + for(i=(SDCardInfo.CardCapacity-tsize)/512; i<(SDCardInfo.CardCapacity/512); i++) + { + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; + ret = wm_sd_card_block_write(rca, sd_addr, &buf[(i%256)/4*4]); + if(ret) + goto end; + } +#endif + ret = wm_sd_card_query_status(rca, NULL); + if(ret) + goto end; + for(i=(SDCardInfo.CardCapacity-tsize)/512; i<(SDCardInfo.CardCapacity/512); i++) + { + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; + ret = wm_sd_card_block_read(rca, sd_addr, bufR); + if(ret) + { + goto end; + } + printf("i=%d\n", i); + if(memcmp(&buf[(i%256)/4*4], bufR, 512)) + { + dumpBuffer("buf", &buf[(i%256)/4*4], 512); + dumpBuffer("bufR", bufR, 512); + ret = -2; + goto end; + } + } + + ret = 0; +end: + if(buf) + { + tls_mem_free(buf); + } + if(bufR) + { + tls_mem_free(bufR); + } + TEST_DEBUG("ret %d\n", ret); + return ret; +} +#endif /* multi blocks write & read by dma * bus_width: 0:1bit; 2:4bits @@ -92,6 +169,7 @@ static int sdh_card_wr_mbs_dma_4M_test(uint32_t rca, uint8_t bus_width, uint32_t char* bufR = NULL; const uint32_t tsize = 4*1024;//*1024; int buflen = 512*block_cnt; + uint32_t sd_addr = 0; buf = tls_mem_alloc(buflen); if(buf == NULL) @@ -113,7 +191,8 @@ static int sdh_card_wr_mbs_dma_4M_test(uint32_t rca, uint8_t bus_width, uint32_t //(sd_addr)---->start from address 0(block 0 too) for(i=0; i<(tsize/512); i+=block_cnt) { - ret = wm_sd_card_blocks_write(rca, i, buf, buflen); + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; + ret = wm_sd_card_blocks_write(rca, sd_addr, buf, buflen); if(ret) goto end; } @@ -123,8 +202,9 @@ static int sdh_card_wr_mbs_dma_4M_test(uint32_t rca, uint8_t bus_width, uint32_t for(i=0; i<(tsize/512); i+=block_cnt) { + sd_addr = SDCardInfo.CSDVer == 1 ? (i * 512) : i; memset(bufR, 0, buflen); - ret = wm_sd_card_blocks_read(rca, i, bufR, buflen); + ret = wm_sd_card_blocks_read(rca, sd_addr, bufR, buflen); if(ret) goto end; if(memcmp(buf, bufR, buflen)) @@ -168,6 +248,11 @@ int sd_card_test(void) wm_sdio_host_config(0); ret += sdh_card_init(&rca); printf("\nsdh_card_init, ret = %d\n", ret); +#if 0 + ret += sdh_card_wr_sb_fullchip(rca, 0, 1024*1024); + printf("\nW & R 0, ret = %d\n", ret); + wr_delay(10000); +#else ret += sdh_card_wr_sb(rca, 0, 1024); printf("\nW & R 1, ret = %d\n", ret); wr_delay(10000); @@ -180,7 +265,7 @@ int sd_card_test(void) ret += sdh_card_wr_mbs_dma_4M_test(rca, 2, 6); printf("W & R 4, ret = %d\n", ret); wr_delay(10000); - +#endif if( ret ==0 ) { printf("\nsd card write read OK, ret = %d\n", ret); } diff --git a/src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c b/src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c index 81995c2..edbfc4c 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_slave_spi_demo.c @@ -103,8 +103,19 @@ static s16 HspiRxCmdCb(char *buf) static void HspiInit(int type) { - - wm_hspi_gpio_config(0); + if(type == HSPI_INTERFACE_SPI) + { + wm_hspi_gpio_config(0); + } + else if (type == HSPI_INTERFACE_SDIO) + { + wm_sdio_slave_config(0); + } + else + { + printf("do not support interface\n"); + return; + } tls_slave_spi_init(); tls_set_high_speed_interface_type(type); @@ -119,16 +130,17 @@ int slave_spi_demo(int type) if(type == 0) { type = HSPI_INTERFACE_SPI; + printf("\r\ntype:%s\r\n", "HSPI_SLAVE"); + HspiInit(type); } else { type = HSPI_INTERFACE_SDIO; + printf("\r\ntype:%s\r\n", "SDIO_SLAVE"); + HspiInit(type); } - printf("\r\ntype:%d\r\n", type); - HspiInit(type); - - return WM_SUCCESS; + return WM_SUCCESS; } diff --git a/src/W800_SDK_v1.00.10/demo/wm_softap_demo.c b/src/W800_SDK_v1.00.10/demo/wm_softap_demo.c index 0efb348..bc1657b 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_softap_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_softap_demo.c @@ -20,6 +20,20 @@ 2)Add sta list monitor task*/ static tls_os_timer_t *sta_monitor_tim = NULL; static u32 totalstanum = 0; +/*mac that not allowed to join soft ap, you can change it.*/ +unsigned char blackmac[6] = {0x44,0xc3,0x46,0x41,0x71,0x1f}; + +static u32 delblackstatimeout = 60; +static u32 delcnt = 0; + +static u32 addrefusecnt = 0; +static u32 addrefusecnttimeout = 60; + +#define ADD_BLACK_STATE 0 +#define DEL_BLACK_STATE 1 +static u32 blackstate = DEL_BLACK_STATE; + + static void demo_monitor_stalist_tim(void *ptmr, void *parg) { u8 *stabuf = NULL; @@ -28,16 +42,55 @@ static void demo_monitor_stalist_tim(void *ptmr, void *parg) stabuf = tls_mem_alloc(1024); if (stabuf) { + stanum = 0; + memset(stabuf, 0, 1024); tls_wifi_get_authed_sta_info(&stanum, stabuf, 1024); if (totalstanum != stanum) { - wm_printf("sta mac:\n"); + wm_printf("white sta mac:\n"); for (i = 0; i < stanum ; i++) { wm_printf("%M\n", &stabuf[i * 6]); } } totalstanum = stanum; + stanum = 0; + memset(stabuf, 0, 1024); + tls_wifi_softap_get_blackinfo(&stanum, stabuf, 1024); + wm_printf("black sta mac:\n"); + for (i = 0; i < stanum ; i++) + { + wm_printf("%M\n", &stabuf[i * 6]); + } + + switch (blackstate) + { + case DEL_BLACK_STATE: /*delete sta's for black list*/ + delcnt++; + if (delcnt > delblackstatimeout) + { + for (i = 0; i < stanum ; i++) + { + tls_wifi_softap_del_blacksta(&stabuf[i*6]); + } + delcnt = 0; + blackstate = ADD_BLACK_STATE; + } + break; + case ADD_BLACK_STATE: /*add station into black list*/ + addrefusecnt ++; + if (addrefusecnt > addrefusecnttimeout) + { + tls_wifi_softap_add_blacksta(blackmac); + tls_wifi_softap_del_station(blackmac); + addrefusecnt = 0; + blackstate = DEL_BLACK_STATE; + } + break; + default: + break; + } + tls_mem_free(stabuf); stabuf = NULL; } @@ -51,6 +104,7 @@ int demo_create_softap(u8 *ssid, u8 *key, int chan, int encrypt, int format) u8 ssid_set = 0; u8 wireless_protocol = 0; + u8 ssid_len = 0; if (!ssid) { @@ -109,6 +163,9 @@ int demo_create_softap(u8 *ssid, u8 *key, int chan, int encrypt, int format) ipinfo->netmask[3] = 0; MEMCPY(ipinfo->dnsname, "local.wm", sizeof("local.wm")); + blackstate = DEL_BLACK_STATE; + tls_wifi_softap_add_blacksta(blackmac); + ret = tls_wifi_softap_create(apinfo, ipinfo); wm_printf("\n ap create %s ! \n", (ret == WM_SUCCESS) ? "Successfully" : "Error"); diff --git a/src/W800_SDK_v1.00.10/demo/wm_uart_demo.c b/src/W800_SDK_v1.00.10/demo/wm_uart_demo.c index d6782db..5f851b6 100644 --- a/src/W800_SDK_v1.00.10/demo/wm_uart_demo.c +++ b/src/W800_SDK_v1.00.10/demo/wm_uart_demo.c @@ -169,7 +169,7 @@ int uart_demo(int bandrate, int parity, int stopbits) demo_uart_task, (void *) demo_uart, (void *) demo_uart_task_stk, /** ä»»åŠ¡æ ˆçš„èµ·å§‹åœ°å€ */ - DEMO_UART_TAST_STK_SIZE, /** ä»»åŠ¡æ ˆçš„å¤§å° */ + DEMO_UART_TAST_STK_SIZE*4, /** ä»»åŠ¡æ ˆçš„å¤§å° */ DEMO_UART_TASK_PRIO, 0); } if (-1 == bandrate) diff --git a/src/W800_SDK_v1.00.10/doc/ChangeLog.txt b/src/W800_SDK_v1.00.10/doc/ChangeLog.txt index 658843a..caeaee0 100644 --- a/src/W800_SDK_v1.00.10/doc/ChangeLog.txt +++ b/src/W800_SDK_v1.00.10/doc/ChangeLog.txt @@ -1,6 +1,48 @@ ========================================================== | CHANGELOG: WinnerMicro Software Development Kit | ========================================================== +W800 SDK v1.00.10 | 2022/12/29 +========================== +1. Çý¶¯¸üР+ 1£©Ìṩģ×éADCУ׼¹¦ÄÜ½Ó¿Ú + 2£©ÐÞ¸´PSRAM IO¸´Óò»ÍêÕûÎÊÌâ + 3£©FlashÇý¶¯Ð޸IJ»ÔÙÿ´Î¶¼Ð´×´Ì¬¼Ä´æÆ÷ + 4£©Ôö¼ÓRF²ÎÊý±¸·Ý»úÖÆ + 5£©Ð޸ĶÔÓÚSD 1.0¿¨µÄÖ§³Ö + +2. ¸üÐÂsecboot£¬Ö§³ÖÇàÌÙFlashµÄQIOģʽÇл»£»ÓÅ»¯Ã¿´ÎÆô¶¯¹ý³Ì¶¼²Ù×÷flash״̬¼Ä´æÆ÷À´ÇÐQIOģʽµÄ²Ù×÷ + +3. Éý¼¶LWIP°æ±¾ÖÁV2.1.3°æ±¾ +4. ÓÅ»¯Ò»¼üÅäÍø¹¦ÄÜ +5. demoÐ޸ģº + 1£©HSPIºÍSDIOµÄ´ÓÉ豸µÄDEMO¸üУ¬Í¨¹ý²ÎÊýÇø·ÖHSPIºÍSDIOµÄ³õʼ»¯ + 2£©ÐÞ¸ÄdemoµÄ¿ØÖÆÌ¨µÄ½ÓÊÕ´¦Àí£¬½â¾ö½ÓÊÕÃüÁî×Ö²»×ãºóÎÞ·¨Ê¹ÓÿØÖÆÌ¨µÄÎÊÌâ + 3£©Ôö¼ÓеÄÁªÍødemo + 4£©Ôö¼ÓеÄɨÃèdemo + 5£©Ôö¼ÓsoftapµÄºÚÃûµ¥¹¦ÄÜdemo +6. ÐÞ¸´Ð¾Æ¬Sleepģʽ¹¦ºÄ²¨¶¯ÎÊÌ⣬ÐÞ¸ÄGPIOĬÈÏÅäÖÃΪÊäÈëÉÏÀ­£»¿Í»§Ê¹ÓÃʱ°´ÕÕIO¸´ÓÃÅäÖã¬Ê¹ÓÃÖ¸¶¨µÄÉÏÏÂÀ­¹¦ÄÜ +7. RTOSÎÊÌâÐÞ¸´ + 1£©ÐÞ¸´rtosÊÊÅ亯ÊýûÓÐÅжÏÖ¸ÕëÊÇ·ñΪ¿ÕµÄ²Ù×÷ + 2£©ÐÞ¸´RTOSÈÎÎñ´´½¨Ê±¾ä±ú¸³Öµ´¦Àí +8. ÐÞ¸´Òòµ÷ÕûtickÖµ²¢½øÐÐʱ¼ä¼ÆËã¶øµ¼ÖµĿÉÄܳý0²Ù×÷ + +9. Wi-Fi¿â¸üÐÂÄÚÈÝ£º + 1£©Ôö¼ÓWLANÊý×ÖÔöÒæ¿Éµ÷½Ó¿Ú + 2£©Ôö¼ÓÁ¬½ÓɨÃè²»µ½ÈȵãµÄʱ¼ä¿É¿ØµÄAPI + 3£©Ôö¼Ó¿ÉÅäÖÃÊÇ·ñ¿ÉÁ¬½Óopen/wepÍøÂçµÄAPI + 4£©Ôö¼ÓÊÇ·ñɨÃèµ½Á¢¼´Á¬½ÓAPµÄAPI + 5£©Ö§³ÖAPµÄºÚÃûµ¥¹¦ÄÜ + 6£©ÐÞ¸´APSTAģʽÏÂijЩÊÖ»úÁ¬½Ó²»ÉϵÄÎÊÌ⣨ÒòÐŵÀ±ä¸üʱÐűêÖ¡ÄÚ²¿·ÖÐŵÀÏà¹ØÐÅϢδ¸üУ© + +10. ±àÒëÏà¹Ø + 1£©ÐÞ¸´Ä³Ð©³¡¾°ÏµıàÒ뱨´íÎÊÌ⣨ÀýÈ磺ÄÚ´æµ÷ÊÔ´ò¿ª£¬mbedtlsÄ£¿é±àÒ뱨´íµÄÎÊÌ⣩ + 2£©Ð޸ıàÒ빤¾ßÁ´£¬Ö§³ÖCPP´úÂëµÄ±àÒë + 3£©ÒòΪÉý¼¶ÁËLWIPºÍMQTT£¬CDKµÄ±àÒ빤³Ì±ä¸ü£¬½¨ÒéʹÓÃÐµĹ¤³Ì£¬°Ñ֮ǰ¸Ä¶¯ºÏ¹ýÀ´£» + Èç¹ûȷʵҪʹÓÃ֮ǰµÄ¹¤³Ì£¬ÐèÒª°ÑÏà¹ØÎļþ¼ÓÈ룬±àÒëǰҪÇåÀíһϱàÒ빤³ÌϵĹý³ÌÖÐÎļþ£¨.mk,.bat,.txt£¬LSTºÍOBJ£© + 4£©Èç¹ûÓû§´ò¿ª½Ï¶àdemo¡¢»òÕß½øÐÐÄÚ´æµ÷ÊÔ£¬»òÕß´ò¿ªwm_debug.hµ÷ÊÔ¹¦ÄÜ£¬¶øÇÒҪʹÓþ­µäÀ¶ÑÀµÄCDK¹¤³Ì±àÒë + »òÕßʹÓÃmake±àÒ룬ÐèÒª¶ÔÁ´½ÓÎļþÀïµÄI-SRAM½øÐе÷Õû£¨Î»ÖᢴóС£©ÓÉ´Ë´øÀ´Ò»ÏµÁеĵ÷Õû£¨±àÒë¹Ì¼þ´æ·ÅµÄλÖÃÒ²Òªµ÷Õû£© + 5£©ÇåÀí±àÒë¸æ¾¯ + W800 SDK v1.00.08 | 2022/07/26 ========================== ********* diff --git a/src/W800_SDK_v1.00.10/doc/w800_apis.chm b/src/W800_SDK_v1.00.10/doc/w800_apis.chm index 068b7f8b3269ae17fa6e3c16d5cf1099ed77234e..b8de054f92f312c2fd1abd881dadd14bc42521ed 100644 GIT binary patch literal 2753220 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�$QQ=??x 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

Q1t&d(+eo=*bpbQ+HF)+Wo<4#`J0mXl({a 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�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%0A&C(LVVVJ&ApkQd0AK`T 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�rPac2o>w9l~=-tX<(!aKT-(SD%|NAXp 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%0AO7Nfn`|CLs z!d{^}*=K~PbDN5^g!Wzn|EVQF)SH4+gx~L*`SO3o0VMov!HL3R`ch{GlLc?Y+;siV zho0vBR!?)3>#0FHCv7U;{pF1fF--g{h?UB>X600`QE36S^K3$=v|Rn~x- zMqSPDdx8`H{5L-ZZ3x=k2B!(}kx^(DPfpFJt;!eqPH6yyEkIBJ&6VLh1O?`A&t5I9 z4n3UCT#W%3M6PS_nNP>dy?f)%r%-hPrQ^KUPzr*G@^wFDJu%(K){odwn9$b7vd?@# zGH<&pa<7R7)2$@jK>`A4rG!koy^j?YuHWEaaBBgawd0#F z>4E*FWDR`sq}=*JKMV^)I08WHOayYht>yoNEi9t4M5%cOB97F`0d zQcV*+`pC~l;i$@EoOhnUDe?FsByuz*zuAuS9?LlC0N|7T3dUu-e-+Cvr9=WCJuLGt zotY#Rxda|4$xWYMNBH?I9P+9HF-@R36;_(npLETt9}gVrvC6?P2nYj0i<*7q`zE-~ z0tJ29AR6-oU-qwGnfKc`a;MmP zTGVSmmA+js3L>Zkm4fPTXC&J(ZjcTEoATycB7JvH;MJm0wCL5zmko8BvNJq0^2|ll|<46#92P*Q?vpLPeWFX5A+Z2b86X!x>_7%!p96Zjw0xJ}twg;!{46oN z0tHQ~Pc$u=ZDggbO78NYQ;uORnc6DA-=qjLG7H$&hM8#u|K$!Vl`m(=GJ=8N0hr8y zsRCh2Hkr_<-tqEA5XJ%q)|>$GDk1ehrEij4nFvMzgGGA<^Sett+4Y0kWsLL^_;t09%g95jfay-5%`ltH-6 z6P3FFs5q%!tdvlHQDx((yMX5{(EYDGuRWfvI!G5IZ_4^h$r65=i~trZ}(E=8dT)F(l|U?VGc#Gy3yUT|%TJ;6mzk2tf{LAUL%m6k=mNm$Xvf8GH^Eh5k0I zUBcsI1{*xIku(_&O^e_%oQKBX4QKPHolucIs{!HS4-EfK18^UOTZAv1adCAKEzC6Mcg*L^zp%_glt+B+^)LcO=~Z=o!Ckwo;pdng z6#OM%nQK+p5W0_gT0GxN<8&CF)9ira1qcG9Vs8=-trVpJ{!cpX)_AF+>uc#M3vd^I zRJKcIS%7biRzU(Fj7$CBl5cRnlJEyyxD-TCAtkwsxI$yS3HJYT1TVm)q$;e_F6|v1 za)|-u^p*nun(@y~;_N=hj~5B{R&kpJ1ep>&jjAGlxgE_t@9q_;Q2Dwn zZ^fNgeaftxa3gjI&CkJ3tI6skCp-C0WeD+=)2Z$eXf@J0q{Ct3CsNKuTdXM)v7I}W zoQQoTFDdL$Ayvb!wU}EB2eu&|?+%4Zd`1lLd7n2}suZMf%XEkPhUE5Z zcrKim%O}-G7F{*Z2HMR1UHl z8aPsx>>x%;6m?TZN~*&I0ut-nj?%$_3FcDbB44Kv8lT5T zosEW($nWnNU&$tUUH$MVa5e`rFgK_QzeBeczp00*h;Fx8EpaFA>75 z`!_*A3*>D1*3Kuq0T``;SOqTN$Q^pVne>Ace(H1ri;5`C8L&Hy^y`uQ>U_(l zUaxzfW%jT6ENK(1cHBuP=@09*8R&fomQu?5k4tC#^pRz=uh?=fp3P9YKJqMo!X^|nRX|Qkm&Cub zhd$qoZ_9;Ru!l5x1Gc1~(;B_Ti~h6?1t*l_U{GhJE7@t8M^QQY_xBA_wYP7vM zHxi2KWRIR=vQOMQz2^Af|HriyCJ?vrTvwQ?A)tI7z>g@AT1M)Y^$eUUkf^%jZKoOc ztXH3l=&U+U(vHpv#%e?2w{Gx&K0OelUCSZg0-FNQgQDle{ z;s_W6&IyhpG+Q816Qxmy>WJ$~OTuM|V^Jf^na@(n(K*!Lt%V7Uq_&XezCl=M&q?Md zJQW(kR+X(B8zu;qY5r;FX&$UcK9#4KXYB4l1wGb&Ck2CXi;2Lqv+kaq&nDfl^s1FT zTo1kHUT`0`wJ+!Rem&jFJm!<=g@AAo9uBx?;oIP0N#Lhblf%HD1%sU9Wdjxwv6T?RG3!*G-4u#G?#MrKQ;@#;9Xo!l zphqmK;o;qOB8L4Xy0(ol!9g2{e1i?I8EVP~k;0mysxyi^kgcA5$L^nO=n;!5jT_IV z*lPuA9*IEkc){jWYZA7S=lZuf;o1A_YMDJhZIoT8aP%OU2LdwxVGuX&UKo-fJXh^# zFqj7eIxNbwMj^tn0NEfA+QATg*{nsVWgAcc=d-`Z2>Kk{4+}`3Fk43hX3}rl2)7m# z0M2LO+qXJy{YSRHz{Gpou6=^F38K)p7XcQrC}n_7W7mbTQ@Lv+?hhEdUKjvMi;~o4 z1tf&yc5-|)s6F6+_jrHZ#k>yuV|NkSc4GJ`Ae{>m`cBMG)k_-J05A{`0ssI2GelG~ z000jKrmVrBBPRQHy}R7q)GfCaP+R2KB$;<_2ywQhH~J(6Ewi?j#2%gf!m)^6L@TQ`KclO&J;0tpft1R6~O49wnN|7W59te@FY zbUX~Hcc$y6M&nINed@kMjK7bg8!!E@sgB=_M%U!w<6%rvQL2Bx%hWfGT@pST)2p9N zuQ?k{L3u2!jk*~sX%oa!Dx=I)xJKC7WxS~t%VfQsgzZwgiSoF(ocLNCzB`xF-lxS< z>co4qVM)p{DU6!Ov!o}M2n#@uhTi-0k0Nuy3{7^T_a0A9_-o=~ziHQ#D)>v|YsE3P z>+=~w;*a7N$Q4+z{L@)l1gpEh=2wuO!~13T58ev9$Dcm#^6|u%tTr5m76)B44rCyo zZ)d?9Zbou}1&z{BYX!A~LnW*52Rk-98@Tl8cqh2-?HJNdb%(i;pBK(hs_BZ!5o;h) z&HXMJDWFGe=;o1EqiWQ;O}Lh`4wqebNadUPy7P@Lnmt~kAIwpm(zC( zEhSO$T!YmnhD@9AQo4e3z&XgSfMXxxxBwVgWz*|pbuB>4y%4WuAK3|8ntSE$4|EBn ztqRH#b$xv+yIffO_SR{ZhoR29`T8r+ZHp7GXLJy=uXuNUI2*xe;|fNSUH^zMT-)g; zc+dSeUMtmeDoa#ZWwzLm)KV#&#=0&Kc4U`{c4-Q6b;2z>`iAE+_fDhRpV-Z^OFU$i z!=%jn$x-sEOD2#(W=7RcZWfzoR;x7<>VenjNsHfwg%+aO`g=nUI7nE3_M*L2nbX-H zkxa3Ki>I9^nc*_$YVAp=&(bWa<#VmtGkJZPyQbYL9`sMZL7#i<6<^b5aBbI{m{%Ei zo3hMeiV~PTCSBq z{)4;bR3k41A3+H+hIgvJaV|h2Nk5^m2bpH$TkKZSAjg2@c_2*-6RvW1W$rc}FGgj? zKaY+YT~Un76X~Kqy_#0YC@@}j^y_8gxVElO2pr-1uD-waWa#pDm$OP=RO`HlY>fCh zSkDW(n}7pczZV&t2|=X=ISd0TZFU@e`Lp{NM_#`{c_7er;rRDeXUprkK6|4@=BfkO z`~&FOv51_wi`-WS(b_=(*zdK`;zs0GJXcDLTvb4!vQf>~#$9@+sjCbyYc}-lyH~6R zvd={Z8e6BR%j_)jZZi%z*eZ2!i5r`5H364-1dz1~V(FQGU1Ph6s8(BiN-8uyLl9QM!bUo1I%g&OWoJRraYfdI0?rUbWYdB_wRU?{zUFx6b zg33zlWXG`U51p)7` z(;w}lZ?nw{k(PTX*O4VV0t)S~_P-ScohN|#(`9zRTtojRoI`{+(Ay6LAldy$2$cU~ ztEcjBUso}c!x1N3&q!n6(tNXHfLRGJ%)3r(d|6$001_{Pwko(2P~3GCNb7}aDryE8 z{MV=gHDqtX*6f!4V7?B@!y8Jcq7lMcXvwNot|nOfmp@l_Uz(ki;pcdfbnLR*(`+lv z^Ae_7h8Z=cywS(m!ZcPiBektnvok+?bPld=GaL7MHFD$YFPjn*FK5`_-HBFbs_e8u z963?{meos>)0vcjoV86l%+k!s%ExMv*3xVLmV^3pZM~JBjRVKBr21L6PhNltrp(aF zk;Li!){2vaD3NYr78bawXiAflFf(N9&Lmu1)ZveeQ~l~5)kY$_D*R?%xfd`E^ z3Fp@mxDq8gTaj;F6YR8V(9bNbEsF57Gs(shLd6i~4shJStHWo+X0 zp)ISz=!rhtT$rEImOeD{*Ns1EKpU@oYQCjAd`H`<#u+fhz3@h_*EkMF%ANt?>}f!0 zw@^3hwh}scCEG7;FK_K6ZZMg$8CV93txVRfx(9aBy|HLiYyAk)7+`yQd3SZUWZsDk zZ+v%M15SU|55J_x0RgolKVpsQ-pgIeDQ3N2jImN&L_&tOIG`y|=?_^_m(}t>5eruP zsN?@lPws9QV?T~g$nkaDwh7!wZtZ@r9bTRM@5OMoI5*N4Aa6d%gyhGqo=^|MFSfLA zwYS!F3@{=c1pj1Yt_+O*jl53|t6K*=2b_FviS~|M+{LHUu@|iL(}{#mXw2o3#gv4P zrLdBaEA9EGl4x?YqTB@*0n(w0-9v$>VQn;`95V|zO(9<155z%mgSd~>250fbiv zj*08q>~1KvItrxk>w4L{R~xZq6M+dx#C>MpZ*xOb9WBQaE$#wGn+ z|3*3s7T060Fe0cU(oGLSJP%(QX+hO2TPcb2E*?{%kyvWnHWe#*r4}O*RFZfqJL8Td zuLDm}5s(sbBzGUR5J1HiQ#1Z-%)Jq`i(1WeX5Q+Y=EUR#H)aA|tAGvLmCYerqWjTYA`yF3=@ug^pydW$`6Rq^ zwQaQ*rBR$;NKEyGn+gQbR1e&OltJhCwJ_qJUdy#H7y=8A@@3t?W|0t%^w6Kn>9Ce! zmhRW_fJwbDpT2bo*RwUd?adn!LM2J37K>-joA`lRYRzvK)`a}MHMHJ9j-_q!T24G(N<uG9wI1I)+5zGe!WqPo@9rQ01Ke9lC|I2Bi@(G$LM6foU%!X!Wq(-<(i!d44TYT zhGdS^wF=VEFK0(!2;}S}RC!=^;q2wubk-kL<-+=}LnF$KNB%yu*e73K%~sYD^wjAU zNc^t+q5PSXS@g>}(G65ng_%oDwG5aX7*lJn3HATAseeKO3aFydx!i9sPER?)@wuq{ z7R{z<^Zh=<O;;zG^mE^9-d`aDRkIr+Bx|K=-cBXP>sgON&> z_Q1KTkvE^c>P1cL#3y5jo=_Im>*l6w*X>E|#EqA-z_J)%@@iioXz1yCw&Q<#|um>alrwqmc9nZ@5uYfLJ9)b$XfdEaio!s2RA@Q*65G2SdJ>d4W z+221BNjsM2485g%uGlx!^kgEEL^%0FN}+%N0rcMjZk6u(u1C3se$-qD$KTeE*2KVd zKc&YX4nMzj5{aRzf<17b-E+cUOTf$Q(!lNx=A4EB8yOFrc`7I#k(b9u+?;{z*^%|O z<(x8^UVTNSwh3w9fX`jid7A^y%Z@wwT%j+)-rAst9SCod@9+I@+kO&k3Qgz}Z8%8h z4HK)TD)am}+2EdEu>ES|DYW*{nHCX=!jsg_F zPe1$}aq1`{CsaL>oWvU$99hq2y~yPxm=g&GXCr%oxpz?Kz3!*87^L{J7#Z^aO75^R z@pezBYQ%Iljn2xwG4k4S3_P`I6=yP#XA^sWFzXjSt%idpT6mM{8=gMwxQ_Mg-$?pV z`VcEVXO-X#7d({D#Tw9`ILLEN+0Pkt2@ps?o}PIy5)0xI^S!hsRH%8`gL}4h+PdjT zCRDBulfLRI2J`(*;?`~-#PwTxVW;yV=WooP<~G9s#s2v3tZK43;r{YgzxRQS zbVQ}Cv2^z#Csg+SFp7#xEbP;kVTU;=|2NrM`;(bFe;3?Q|Gz6De6l#;f5rPIV4orS zT{i*576V}i+qtf7fBvpesk=l1Nt>S+m_)SeDxh=3RKqYo+f)&A@*yfzF?8s~i}n2U7C=HYVWuc({-ym1+13kBw{K&?u6Yf z_w0o`Ce291wRzkL;yP{QTs_aL#sfeOI}rRk1#0kt$UZ=Fhmj_4|MIfsIUGDy3+hh>MvP@Th_4*XSRo7`0jr*=AS_Jp_)x4ZdZkV6avdpq6x^UVU#v1h;l6G$vz z(Y|V!DP4O`LX=xf)C6i_b&31DVS%$N#pjm@+uT9zqVj*SGn#GWmcUHXx4G z_3Dz4kQ~K8NI&Jk&S4sZfOt|Mi^mY)8NOvcRlc(pLPya}#)k4v-bTEb6@tKmN;yy- z(nTC*C;cFwa@V>Np)C2Gi}`!>Zx|nw^JFlE6Aa1H-GegZZ40B3zVB$U?oJufy=t6- z!Zq4jrCbfw*1}&SG;Dw6liEtlHoG|2)jCMEuPn)%6i}2dtc%>7j)vhH$~KK&`y${M zhrIQ!1;To(q5wLNa4fLG+kc`MBx6W|r53MpeOI}Krk`dCoQT~pbM@3=3W`L8~ z2GdJUa@_^lwT<_iRzIiOUppa9gpoHDB>OT*E#n zQ$Q22za@|}OD0EtOekWPj9rPu5X>L*4SghT4?{3WCSMa|^wJri1RV)dvI4aEsaA-$-21kyjwP2rb1BYtFLK zoX+*!#n69Akhc}r+@?7Cn}0ZdU3~rITJ%)~Fob>a(YQY?GD;G>I4c3k{c*F={n}<@ zVu6XPEhrte*NazE&Y0ZpUZGV9Fi03g5L2#RiWcD5b&1yI&iVv|wMDy@2nbW*^koc; z9t`cnU3p=@|0?4*Z+TW0Vi_V5I_ee@CV!r?2GWLhwd%jv$ZJq@(T499`Zw!!T`Om9(u-<%|Nn# zGX3ejzLnfzHai1Ozl67w%;>NlU|7%nxdaJbN{;|Soq%2-y{rV1{DiGQ;&t+Hpn?!6 zEY@jy0?f_JTLU+F9s%~%lmlT$ixSg8Y2C0xC#x4r(e z-wmdQg+91k5Q@8fSi|BS;uF^ho0HN|g!U5{1DxjAbX1;lron}Ol z8jd#M?#$De(6}MMbgD>S!PUqe3#}-g2!skk4oTJNANE`BS?$s?Ip(`7NIuVa2x){6 zLJDvM@TtNfi*`5h5I{dR(izOe7X94&*INYAhlTib%t8BH4z@mC@m2e5HrCr$W-a{`dV!IvsqQk2C~^hBLk4t zTQW!IcsD`x`TaEHxMjILAL0XQL}8VeoR09in$zvPeXT4h-0 zDv+(zGY8NTLDz8J3eA8pc|ry+L;C@Y&%HJhub_y@x$D@Hplmm&&L7}S#4d6|F( zkqtQ?X=a=WgMErtW#T|a3^|N0fo7rX2bKz=eq zl4S0i)q!M!b?B0 z`!H{ge9NwYa-X4lpdfd%o$#_S!2W0MT>{-K)I)YFT#{fAHJ1z7?NM%)p#wT5 zTrcQiQEms-ANhJRQ43l1)B%VKxu*bXNTG;YHeJswH3LH7=;ds)+;?W^|(fpb!uP0000pH%2l50DlE?Ehdqw zq)$oj?(V*RRuqY}#9(v9$X3=u(;FzwVVSX|ji;^q?>hbfATk41G=P8r2LZy)|KG5n z%SvBnONig_*VLSv19pO00&J|kJ6-m!-EdZ(1kmi}KF>zkw%xDYmRk15*DqF<#_(IW ztfa;k9{kc0HdXiwA8=S%<{{yY4_;fWBL=?kP^T0C7$N`?DT6Aj0#JWI%!$+In$vb&=iQqLpB?tGmJsHo{lDv9Tj3x8) zcP1AXb+_Mm0g?&af7)RWtR@t(4uqExi2fEQJs|llBny9zSobzcPMnX}J^d{$$4S3R zi!h}uCR@^U5M%gUe(N>5zU*DXzOw&MYL;^TfY}5ry`M60@;X&$lvj~ z3;&o*%)I57`6N@t$loT*x!x<^xJV?iN{AVknB{KC;(vHHSgvGOS?g?E8vyb-m1x1k zq4;jh&T3OtK$OHuMNs-V3OS}Ryf~ig9~rE@R%OZp)j6XNUpXAOw~|?;#b(~^7L?mZ z(SQ=7qAZ6pTE0jplLQuts3lfZ6*rRoi!UE6F zifP|hxSV%afSl4axESxH=xQ*bibR7t&uv`GaxX*P!K!5TYNVqR>p~ie`F=hVSykL0 zHC74pCMe7zed^9zmOd*^&6-tQTCJiPM0EjWrF;hdEA?f-s*W5-VPk!t-zEo9mxU(P z4k#Y69PL*7D1G64HcPy6so^JhWBo0-55N@_n*PqNT&6+Dzro0D2dv-YK!5!#Y`q#* zE4%(?iE<{1trW2x1&6t5x)$@;qhX0+(Ggl_EGAOhL1yS$dO0}|JcdO01GRhPc zsJ9)mb*s92v8Bh%m3pRxuM?|uK8JdXr@b8Zq<3GObY>%Y-b+%sD?H%+dCWn_&#ZLk z+?p#oO|1as-FmCf=Tjqo1c6A~5%gO}c{YD4SFf@Jq-}>%Z{9a6>sg%>TD=3+$NOH# zZUj<7CWz3es$!KXHRf)ur{li7F(!I- zWH>K$>n<`Oq>>~hiyu_aJ}dnuc%<&0tyVnp>0Xz4#JxLReO@Wq9FCH;=vqz2+G)fO z)1T{qOV`sYz3dC07YsAFErH=tJtDP+s4-Q z*WfY2S`LFNHXIT#I6@;w+l;t0{`MHIke@%aLE$_59Al(s2@<|WtmUVAxD@8VQ|)*b z&xpbhfZP6Sf5#!LpZi@2 zOwQEFS4y)RvE_ktV1!9qe#@D66W`D+>_j2psZ>(23TlLjnm(wk5-?0+4nV>#@qOiw zA8~Dft%$-9fWL5skvW=Wu0guX70fyTx)aMToJ^3nOCU2YLD$@3?#KDjnC&f^+yco~ ziQy&j=PY!7mjYCkjdPgIo2XK?DvJb4;~TLjf;q5=T`e2s%)W`(qPv!83*#}ZYz*}J zE%K%!RF#NcV%u(jLh!pCkna$QS(*69TZ&YcYmjwGl%YV0@Dyl8Dg{cY4r6d)Z0beR zz8q?1PUUhd{Q6f|+rlkS*~BWb+daiWq~pb0QBc!^2DX`nEQ%ivmy<0a~Uks&63v6u-!ZoCnD%(CqkkHrm_zi*p?8(KgdiAelMqbV;@ zYh?^2 ze2rMnldk2S{j3TU(_%RXbF^>R*A7_nVk;`Fl;qhcpeXn%3JWNqw$OvzHR8=2^2B02 zzT)ePe0KQmpD-RMp#%l3>jKqauDm6Cm&_@OLO1ng-d9vzeWKr`>-!uIZrE< z-z8MxcHcxaK1;NROU;y>;n3K(Y?d?nChd(Qt#0{yJ3d&Vle5t-snq*``qPJ|f zGdMage)awXPv~E-tYoV0-%Q3SM)d%M*98FuC<-V9q3wza=w(<&DA zd5f=rr!(=-_*~ZnpvxJ;rghyQ(nCZz)u^vPDtbwHc)(Ppn4|zI0VVc7^2879yA)7x z)Jj>aMN@FRxu`RlkwY}~wl?v?-c=ta4j#r!j&yzH*nEk(UD=7P3j)v=1OHN8t3>oy z8ixNC4hGNZOgWpYbNSTQsjp3_Siw>0WUm$gzkRKqx>Z#en}P?1O6iO3ANt+z9O0N!`8Gc{=sC=@V=6d8VuG%)?%1 z(#u;omwE38mv&!f9jYm})zvlJbcpq^*Kae;yDyWQ8Yep*`nOuC2K(}Zw=4#xe*6m^ zVf~AMmhIc`qkfG2HD;cpNP=@OIqRiuWcyB!n(GnZHKb#w#)t$S5nxb?L!d0+I=son zoB#ING(F%w)1e)!je*V3*}+V1%~Ei_uy*P5)&VKyA?tI)ok&^Sb%5vBlj~#oyMB!( z0mlR=lw^L@Y#r3Ea9{eKF{^8bw8TqA%E-}AS~=XjHLb{BYWoSOMO z-{hy>3qQOhQ58dzO_1TG{qy$=Qe%tf{)XRfy zJjTJ0um-{N{+rA?${Pod>tJ?o4X6qm6$_vWDotP<-#6JMye8y|^`D0uSBn`vxa{yx z+Lgr1*E^jznTh>c{J%IDDylhVP zSf0Bn;oX6wiH=rW^KScX?(<0WSEk>;96zRiK;(K6=RH6CMDz5YnED1nu75T0nKNJ2epcf6t>< zhvRTWmb?A@K6k)mHt?HN|Bnjh{0{I2AUi_ruzK8zZqF3~*qN(C8-VHat#r2~tI3x&4R0k61M`5nFbJp~YqZPi4e?bpTd zL91rmJ1>t^E*h=>{QJOR-_Kr_nWt0U)FR&nEo`f%WcK9Rk^D1Ped#L>%>2OXuADoa zG94RWo(?-RTae;!67>1A=)t7)le$ouosMq#pP0htG#@vh#ERuulhdF{;odyd8O=!M zmScB3Lzo*++668Ud~dqKedP2X@Ybi^&);hbF9aaxG^#+_@I)ZIFI8RC;gf*&IIe~M zhIrL5aW5uw>-zH_NFHT2*H_SFoAwA>2}RiQi`3>j&#CUifp|5-iF9#@XvheDl zy6jbkQ%k;*Jh7q(Jzfr;eZd1;^5Jy>Bnw}AWogA4Uge<7i5@4SQrhrKKwwP+zyDsG zi4YnOObATP>j0wtg2TpfTPy->Exs61ykhDOF9nn^uSf2O_L+51x(f=g_B`$$UO4OL z-wy-hl@*W%h!vWmzc0V>3W zQ-go*GPVA-W%XglQ|B_{bHe6O=6@77xw4nagh~NSf8?>1O5p!&X?Er7sz4Qqt=dtI z=VfDx4YD(eN20qaRE8xBNfJ_g_fj|9>N}P^QmJns9|O^cO_TphMrb7Yw4?r(QFugZ zuI3~IC483xlXz~oD1y>E*EMI5BZei`L`NYUo*nBQ9i8DQ&IC$Qu}C>33adk#Js*|$ zp7kM|8uWQsi$`wOx70eUWFt2aF#!VIoqmiqZpdgoV4UBFR8fa9BMA?PiAxSNr;rjF z6?s?`Og4Cy;)lL;w2zWHP&A1Z$lP;u&K%iw+u?Gfst4r|!E4hIs)PVVKzOF^m~qL_ zOd>!U74eL8ch5JDMq`2ii9Yiou3JDxI{G5` zab~pdGF3mKH36d<^@6mEwANPJ0y*eLaDDC(%6w555xZKpMi1bTvl6~-=X-H@+1zr7 zxNeOlAR-V%DxwHHZT^|+96D=dp|g2_lrKj#V~=kSS%*?!8g@Tyc(gQd4SAyBL8*Wt!gALLrPFV znspP@sP5`N{7XQL+&Yndyug&Hm?ki>BTRU9CpFDbb6A)cW&{wfPGP^Hzfucx76CB? zAFU&jIPb2WFFq1Uc;Pv6C2}(3RS@PC1OyP+5x4~OcT`$c)_FpiVL(=u5cqYW?Ol`H zDbizk1UHYb5|O81i*Pxw%IqF`fEA=WAZi0uJ5KpQiG1a?5S$w6Q>zxevz^7w7rFZJ zKnPG;S1pWgU;mSdG|9+U%UX{VP*7Ae6-0kV1r(erroH}l`zlOAo}}As(gdolD;80w zuj`?&K4bQ{+*fm|j})LN6%Pf{(lJ(2nUwY!-xx$d1!6^P`t45FC4uOM5l6kE{1icW zNnrb#KPulqVHHfNKY)^zP`5SboUGQpdsP3xp+cc&Sd(0DY$ZD!W>7b%;uT9QJRpG2 zjt4>6wbd#jJT;PkX{+_lWzQiQ_G42hw^_#z9phshFcCOnSqmnx44&B_X4~g*gn#WRTx9v zujQ9fc!r|dE^3j%+GYb++whdifmC{d0&c6>1RpJl^YcqiiR3>!>^qlyYr=vZo{U61 z#UUoJqQ~KE)u+%x(8|1Bh9b4=&YQGoz^c?lcnRgC2SgoZn(j_0w`A|Xd*ro|2phLX`8Oq<^jpEH0IVyy)W|4->#sAXO*Uy<7SYQ?~(y9#b8d`IE?338@)g-wN2qM%mT@d&Yr|y`;pg?T{0F6raL-&4m9z-S>?#W%mSj0&K}8j?-6@O z70#RuN&-zi2vPNI*4r&$=78G7cYC_EwA!iLU0~**%4v7^QV;5Q+&MBUb8jjpg3|7~ zx{L8LlH7buWr^^#yRWHx;{$#iS(Ui}iJF>3TlTO1eR(`)5kyw*K#tPrzyG0;$1)ZN zq?C62H48~;{5i6faXT=dwEfZ#`k4+OLNX5vck-P;-%e})hA~NzwUniHOdLhVNU-5TCrO!x+oWv1hr>*b7GDA7y;(DOs8dsKY&k{d{e( zNNT^b2*7v>|Kxop-oHOU`kj}!|CzY?yk2nVeoeFXjMkll05YRiOEc8^?Xe*FRTwuSkge=F<5_5i1UCq0@^Eec8Khk` z3#9|LxM_(m1uD&P`viW;**=zWLuE?z4bnQHVR^ zP)MGT_Sv;AJVt%&O}*r`cVK&@Nz9c5%*EMI&sMYM1Uyd<%{mt68{gQ zMEv1(3STwv!XWxPL|))`zvw%E0J}(#>@GFK3C;CQrUvk|JUnlPD0Q3+2#x{pcZ? zs{&Q)Dr!UDy&OnmVXW`>%3UzMSD)yH@Hm>PWPoX+9^_RI^ZJWk=x}Z~rOI_6>1vfc z89$V@>FBIu&7}{T0O^cdzV~U5zfX@rz_Sk<%teXXNAG?%*MMY#kfQHQU`;x)|8-iN zh9H1$Ke(;;XR0W|>#l%2Xhm+|Sr8Bc00#gwLsc{Y0B?1E>J9J&8Zk-vr1Rc-?@Z&i zETFcsq}Uch+BD40`Lt}^R=c@3wu=S#-*Ef^fQ-yk)c_m=7)eOyKfV&kvf^I11n@~n z8pZ(*B!EPVc24@$HqUvvZLYbzb!~OF?)EIr(KGLRYe%(dd*J~qs|w>5Z+xT+WoFZj zuiaIZEj8Uel2IKk>G5T=trc_vCz!+n2moM;07RzXuB-~E0t&6iDb%0wC5(h;G+muPLg=;nhR#&{jAr8j$ z&bPh@)=|omMY#^bog(>T^0890DPg8MG4Xc&4l)^W@K3&We*RhVzWsIV_U-gZ^WAjb zT&>wvPh&3KI8!?&l(llnvOF8{ZzJvYtn~CHIx`*#7v!}Le=-(EPM=xs)wDDz><+(f z_5dL|5dNs|Mujovo9?=lzKo*j0P4fD%-S>cn_2@Ep#24h#Io-#G1HJg@VjROOG3#R zAa24Gam_iXnHqz7fBpsl%xJ((D+4(Afo_Sy>mUHeAgbO;PU+>H!3W<_N&ymiFgxKR zrwmX*;SWx33u6ONIFwTXF^#n`&OC>gWvDgdF!*iI-viZ6IKTN|sR@7z1UWd)dh(O+ zJW8gp01y0NhJ-VQ-z;Vr{!3OaFZNw_*?nDwEwir-CI@hxf}zg_+m1a!*H(iok_bTN zidz_e!aA8X2m7Mcx!ebzDy10)L^sw-1vz8cJSv>ta1zs5Z)|n}sySF;>&tMLSY#$M zri(QKAWlKh*KhG_AK05fsT0nsbLL<##_`woinj*PyY@E+aPz5EvS$De3hDch0DOv2 zq^u3&gOYj>9zg;BPWI8qgTjpr*m6@CB(57dpAHpNeY4DKTgGpQ{xd+|gbK;l2J=Bf z!ZSM96zSfcFRxp6%5|P?=e4wOx`ziDn0kr0wsQ=o^Z;=U5l7N5g6jmv?D!vNYoAOTYGA;y$w&d9A`s#1^9m5Bfj zIT-1&F_!j=4ISo8A&f;Qn83ozy}<(pq7ByZ7ypR%YfekyBvgMk;kUmPqXNpVCiKVE z5`Qw@+Qh%?ztrvPV7aE5U*bL z0b}Ry6xoY<>PX3g1j1``0Yp5R_Cvo0sGD$TO>JioKTNxV+#mpHO@_{}uR8dWo&ZLg zVA8OjxqBkqOn{0LRQwco^ZEJ^@&N%xG5CK(AdAC5P6EmSxq%Znq#99+5-Z7$-!ZK@ zA(^=D~WN4Q(mbff}2Yncg}P~ zt=79|WY06MFC>>Cc$2nL{$HyuUmmme+qrX|&#i@AL!1cLgI(Td4pL3uGZ#;pJM<9? zR00H1^Z;Q=7jG9T16P=7@zC!xFxiAqA+a{JwksMsc}r`#n^reH_q#?%C$^;Mw~1W< zt%odL z|Dx|8jSUive$-A`nv}Ot!MFA=&oNZr@u1(svrBVz-@1b?+xJBIngbhKG zuHxd>-rnxi*^oQ z>ozU}C^fQ)P52x{rMoM_j!HzpDOqZTkvC-r_~608iZh)8$Qv^wN!9y#=nGc4JyT~b zeR^j48vi1P`|ivNVlW?sXvv_ni2~b38Io`fV~OViHm3m2=jR=4?PlD&xnoJE_~BTnD{&qpeA zWwo?0G!FxnJT~0AQ>eUi1z8Ib0M+70Cv|DO?D;L7&)45EWpwEQ6qRWJhMHhS?wbyimj1d_d(xvgn}GuY zAgu$FuJTM?=jLDx0}uuii$3s|sC0K;cmCgWVHn5tkU{g)X{}w{O?`kcaoT z{r*=FnO``O4|QXAt> z_E=ap&u{<1-j*~(zi{Mlot{N;k^7SUs{^;% z?%w{?qW6rMMO3G2X9~Allw01v&hOwN6cx7i_7tC=*Pf+s zdoqZ%H&nElrYit@K22)J7=b+tWLtsZNdimq$Ptc!~aU zOK&5SqR~EUlg~)D=(&9@y$c;3eRam3P|WP#^%|Wx5g+ghK%f zE-zEEWftlNV7?4RJT%lS;3d8$$gFNTzMOCa7dp;JdH~T05i1z!&U%}8@t1I=>$l5Q z?9Kph6E!m?^moQ^6ndYJU_YGld)Rm`%C#EJ|&z0HgRe z?)ng;eMUP_I4JQiUQ!M?eo}oTb#P*c6_i)gHyLxazf!xvw}-GfSrQ;k55Sm{MVxK) z(3n|pAN8R|CPj9k>l^E!GGlFDZ|>pbpg;h($_Q2hC~?DRCTJRrY1->g;nAG9?*cC@ z+(!YHdog}T68`Ux+-7743fX|)$Uic z#0Mygj3A8)cbp1(ABYpM>xx}7L1)b8FX9Ot7s3CnO=A4xFMi%=1(n&`z5h|=A3gzd zMsRiZr{;{|;^dSOYTdf6Q@2Pvi`Q;|&h| z*5)=w_3v|=aAU)JFL*J|v`qTw_Wk^YC~Z z^xfo~$rQ;Nd88Fq2(~W8ZyQ;JGr!#h72RxDb$?{teddX302|b$-H0Ar)b8_y7|up0 zTmW_fP*DJyPlI~!7=dzJzwqCiy>346DvVT4>sjF@*rVNuijuwcOdo2FT&>0Qozu_3 zh_Zm8NxZH8qhbHPv*eUeRY?|=Hc5TA4%x7qu(X%t^niqtEFyEl_hkMyo4Jt!3P#Db zA}PZY{1iJm$K=xsFd8MS2zr^r&M6^G=`7%ClvgT|HM7{1kVWJX074aK)CYHY3Pq~l zX^WeSSVsIh&LX6DMsPlrsK2L+tTFJ`S*``D^FGgwYw9I`bU%&P^xhFE_zOBqdv;&- z+k6)@&^hO5praSU7xd1eG=MA)2wUCh+HI~Z>F_tgPmC}MpgkFUFi`Wa_k7zaqAg;K zPz=E74w^LS4ZDkKo~J*7n7|ny9Mib?Xl@5FTTpeR`A)MZ(~}DLr#yC?)O2ZcS7*#H zqY04s2eb!mx>MO6@(YsejN!I&JolC*9(jvO5yUc8075Et#&F)VrpLXQoxyKrSye-GJ$1HoNFjMMTk(W2SO)_)COO5XrQ^O+ zfA)3svO?dQ{`FQKb7hjbw_ac|He-D6e$zutdzR*| zO`(IOk-4(ZP3jomLrJzF98!CIrM>|{FBi*)ynz}`l6r_YVpPXHndG;BU z_d@}=PwtQyub%>kfuOgYo!IUuQB5Bd-{iL{jd^rMsT~)rylD0 z|0Ta&?+@wa2g6T(e1g0Th(Y09L!c!|&eW4hTDi3D>HM&M?r4$$7%RbJcOQD8Wdl`B zIBMx@`U_mY6r{`!0l&(vz@1D}oN9r_lmwK|GS%Gx)2D<0#o1HVl{kJkK5Kr_sYm*@ z1?ji@r0^DdQED%MMga(OIs_foi(q3fwAY%8@tR)K(!3b{lLMS~lKsh9j%lev0-lN{ zQz&5|E>ek;hRPHtAsH$i=o@8st#W@$utTwt)OnND`O5WlU*)cGKj@1;`npmzpUzv{ z1d9Qp-2Hu#Q9s+23KhJTe(T$BBa?ii6Pm_H27gt%$HVc5b5llbqwv1-|98WCZH(GN ze#+DRdJOguRoT&mDbhs=LR2S9N6-u^%d(;ln-1iI{&jG+lasj=e%3X+@*xjtxEta1 zlH~Tv)2fsjN+s`8e(-oa-c~fWYkq(CZQ6sCB1zp)`}fGZI#p>5<(?5X&Na*NX^IjV zPQ8v{DY&v&l}b!eR_w5>O?Fa61TU3lT8fXvm{b*vYn6lNj*-TJimw_L1}l8;y!cB_ z)2(fEEi7K<;-}x;(D_|el+x{pNSi0sn7RCX&9%7dAMmQJUye3DH$K|AL^}?k_J@op zeHa`rhEldA66M&U`41OOPWmwK5~D-Xx1eb}-wh(z{%lK@H~OA!cpz{V!B1Bc~!82=T-IIuIOsVzF2syKDG+QSiTrySL#KH`+E+t zos8VnehiU8s|{ zJ}&tS{ZxS;6FQ6WF;?Z`IS*G1P^BP_@^5Ri*A|o-wa=+09Ro-y4-7&INCyw~7|1;H zfsRo+zk!ByPh48L4Kw88ip4=hupm@;vOfC_ac!eO&twxXZ^pzb?@qRks9KT8&^Zfaj?Ig z%gZIE+b<1n&i~E#)+cYBS>{I_$oX%bk`-^|xT!4V?T@z#bN}BVEQAC$l<_YKbg{TP zXI0Zmf?7}Z%NDlFNWJ{6x&7K&QH6Eb`I&3hTSNS^Moep0Q`jBHVfdPz5+tjIL^?UL z*%z`7G3ugFc|>(s)ElozR+x1rC!>(oOZn*PsggY&wQyph5)P#LG z)@x3MtJ*_NwoODbwq-jEyLGAOJSypX(pcCYB|A`u5R3(Vf!#;s|k4awtC)4s@HN7QfG1<`a92v3+SnXp>w1F+d^)nA8m1^GFCD|!s zT~?#l(JLFP7;GqINJOja8s80X=ej>f%6)RTxjy=3!6#Ndkv8999LKC%0*;vLf zYwWUR2vwA$1ZP7EvaPAH@{YZqCZrEfxg} z4QFq_1?!4Z)ufwIs?=xTLBupWEmjW72Es@|!)cnU44|qi)5C(RHMyQIAGnToS}Ha` ztz~yZ;*(GsH3{$ZNp>Uh;vKUDLaY(p!;k-9F_nu&Nsz-TLP*k>l|(7fG%|#m^6?ZG zNAhtFv`j3UqqnVC z_P}RZ#AzFE6#9`+%Y>~YnU=<1t3}CGW6^XfaO2&H6hnR>Uze#)Q;YhjpySq57PRZ? zFgKI7S?1q5?B3lLO<4JjJXWfB_QdM1M)Mz)%FF+98x2Ow>`xnsBKzPj9l~BSwxMGo z;nXUMOf$q*qDpiCUW-?!SjsaHl3UCgh zTRVaH^EpS6o}iOB-#;}q3A3m*fVEJwoGy4P&!>vXLto)FGJ;SmmF@WW6zGsyRbNw9 zW$H48QU5DcrM&11YYv~{5+%PxQvSUR;UH*%jQkvQeu}c_$(bf`RYdloOqlP%PS$qV zk58-&7lx%#3@MvI<#9yhN}fc(EhS?`2tbn+uTGgjSLZg;;^TJ7?f<(Q*Q!>K!lXts zE|Ha)n_T~*RyvuAg$<{2X`-1W4^i?a`nnw%^<1pz+n4n6c8q${Pex?phSH|GKSq#6 zi9SaF1EC&0k19qZK8(9o1v}3?)vZb;EhUSJ5}xLc?S#@GW%N?tFp9~@P^s|`h8l+$ zgNl#Ux}lcxxQYb@b+6n14X>rsP0`8e-Q}Sw^X8RS)k-g?Z+^8LG86f1(XQ{ZQF1&N z$d&jt5&KGGn=}zpR-)`zE#Dm&G^=xAbe8IhIrGm)&&n?v+W4BDI_jNK$9WQ4aT`3x zu?AsjwQdbHc{Fc zf+$a`tApoE8^N+VRVhlsTvB11tsJFo-3z;PG6n{Au#tk6MXWp=D9nE>p_|9oZU$XR zN)d|h$6(nr^eA3zd|ov!oY(CKkLdD#bQ4;7_6=RU&GUQ)nM$yX^Y~Q?Vje8AtAB+j z#*`_$v9d9`wO@mF$?q0c1rELUi!-olBfU3OxMaJ>5fB+Dmq!6B{rA5*BA?X=@BgT+ z^0gXn248Enho`c!W>KI~X>YnDJJ7SIX}pTG`pYED8xD0Ag(fECxKq|An#I zM?X3^P_uT8wfw7wMj+K9j>*AjlIL_=ocZ>;77eLTcqy}`X-x!4b!9}bLsimuNDM{6{(0;=N5*`4VE$6}5HX zT5EQ}KJlqRsUipS!NK`N_lUJTc3GFVqq zURR~&C=%MSf_L76-7@w~6xGdz*7EK0%5$ah;OZUo6!PrCZc`+HX+5_z-wA%&u|z}J zga0E7dNJ)bs~Q#vi|MRzAoZ+?D`CZ-NhAarY#T&06rpmhq_D_Gl}g|df+8Fdiu6ji z$GmP#3|3;6*4Eajcg~*O^Lu!WckEd{C-v=*MVqmrJ}qYsb)g7U9*3Z1ii>N;Bqbx7 z5&SPMNsGHu&SSG0zArj+Wm|4L`&xU3-#WzSq~PXd)+BB>cVpiukE%B`Ke;JK2$fdKK;@R~^mPlxiOT^|)1UoyM;m`hJyD`~>emAMVy z{_!DW3%U~S$eV%xv?3^?AGJOK>6B+^e+R!~+TPheyZo5C4xhBhpKR8ZB~upQ6P^ZA z&mvqK$rpS0V6WH0)n%tzlx<6K&IdNCKMbn65%ELq>-g%gTGM+SM25%3{2D%<;zr^& zOFKEFHR7L~)S7YzIv9m0m0`k}L^=f(%`!B^c$9sextZ0V=wtJD-R@`gO@3mb_FiW; zwT!0NzCLw-ntuDmYDQ%qB)r9mZskc*@=}WU6Biql6Eq_dp@OPIWvD1|?0w@vz~43t z|CcwfzOk$H5f^vm$yH0OBv82g)aaO2jI%KCsV#CRT4D@s&E5yjU}j}HmFv11O_xze zD`8=3lm{h+T@lCbY@V*bP(*CWwukY~#3$Uzaj|*7kojSdwZh2uGhjJ=ejjpg_r0PG zUmls||H7o20-M!KO=gsi&Gs#9Ih>T=EbM5SRag{HOis6V8_gb?T*Uu52#1!I!E~aCL1#afE5tLE5%bXz$&9!IDh0P8rF0!*-Jg$QyN)Qw|yjR8l$00dTyw z9rsV z9)_{|o>5RUGZrd6AIJOWxEwy;1T>;|ZXQW=Iw6o(Dm)q_To=rs@m=Kc`oL;N#V|?{ zWwlok*m1AUCqDZA1)h_UaiidW0f@NM7q@XEx#N^y*|{~P$E&SrU}5$tNSkIhb+V88pqh*DZ*SW%#4S2i`I zFj%5wOt6Ir7^p!b;+D5WL~27R%ZQ9}(s?4;TCka#<)@_vE#L2xUgm{iub&5lyu7g9 z)RJ_q%eHo{?qX4I4a|Eowc>>FU)Kx`9m7U{hwoTCj?U`izdY6|_G`t%;I>D)a=!fG zZ^GXXUcL%m9KfzqSAav8bn9_DahzyL`H<~G7GWa>Q?Qs{ntcPC@k@t}5PCNoL9mj7 z?n{ya6z-ACqU~!qlzeRzo||~9OcZP!rw`=lq%#=uboOrR2BBrP*+gh)ye224vFI`8R8tLD|aXLnNb1DHEnE5)F7%Pk~_Lj!-b zb8L_Ev^>?4O5l0dIN?R41pzh)q_^KmwIxG!0}@TG;M83*zQ4a|n^pK9M-GR2iDq7r z1DFT)(&Y{C;o$5#O5VG-WO0AyNl{`E3Cz(rNq}jrVpH29GLpyp)Fv2e%hXm}&KsW0 zC}P_rI|gL1%PK>5sdB!vWRfKASJMZ4^(cG-)e5g(7H|XYZjt(x?b3tPlK;{kqKp5P z6J#7<_PR8;-4`2Kkt+y#PdG*~PoPa`Ni+s~uy?WJmQ zDmwK6?_If7%EYjJIh^X6$^&G=GFeioDH4jUDSKkUsic}xOEbbzRtXn4Z$?5FAMY67 zK=-*dPyhs@bg){YKORiY3SamN`{H>^>@+lJj?lB7k|)eRe%nrLDPc^URV>s_H;&;n zp`eh$vY&#}5YWU@R8O_0+Z+hIB@O}@n9tn^oXmV6>&!>w?ic`ih9Jc$+T)@dW6LOz zm~DiI5E9EK*->C&CCDodQnC+?Tvf$QUHl$@+Oc0Jfw-1iXi->_E5_^?P-;!tT5VqlE%AlCYH}hlkGzcI(J1=#h6gM#~Q*qja zTqjkT8Y%$8$~QsyAD#;WkM#V%|DLc5=Jal7@#ohC_bmQwUp!#}7?q41qgQng7C#?d1 z)&7!oS*<8&d|^gy<;y4KC1+0cX*l6tW$THq`z9V74)7#y8~z?t%NLea8req|?kydy zB!Xtsn%DhO8?H>w4vm1s*etM1USaL?7$iINaaMV4VJheuxVqN@w(12VHd4fGhJdL6 zgQk{m)H%D1mD`AOP$+&FZBVxVO@z5F>^1S;+Es_vuX8;h3(2dp0&>84$q79qJK40d z$t6E^A_^0RlmPPv0Vv7`w=dZr@upxA`Sfg?(XzuEwOZD$M+IieB1wCtzm>8yZ7`9M zgm4u941{Hs*-9WHX@k4(>vt2brPyEnO@5$oLW15CmGOj+e(>J#u^p`9ptHrH4{!hW zVkS596^xetD^B?PwW^@93kcP8k-ACvG&HTEJz8y zqtb2&mr9jr%K{k_fh;CpG%n%0mdrfg35i;jlCbk6N73lX98_$UT_CBwV~?f#Ore;5 zVj67bxOuB2)X6A@hr77F7b}F=CE|J}AeL&yLtlr#P3uV`$g+$w)E%S9o)LGgmu%f* zs8}M7P-cSO=uT0~q=ugwd4i#9hnyH}7Y#qz@;bH~Vz9$ctgfsv(lrQwr}#;MgP0hO zYGeXoW+<|00r#Lcy|gT%XYJtD)4KM#){m?!&Uf67^Vt3?{ufk=ZEkB{tNY1hlwP#! ziS<+Z>b1QA@Em>SkUx2}q7}RRv0r($I!J*XqE%Ig!FxZY;I|*KNgfLTO5d;%rW>&RuLy}#Z|6l-9K&-#B<=~IzXJ?Xm_p;pe zR$(6~Zy1Bhsm~tk-mxSi`m4Xz;~C{abxrwdYp8uKED#@^_1S@RDn!6iI$a)^O|R7N zY~>(dq@C_`$~ultzT8ebt6T_nliu&Vros0f{bH-XOTFLxxR3Hjq5I;IFN=7%b9ch0 zi^H6T=%Z-n3B8@D^>}SM86{Y8C$`#gNF`rp@SVt5r7aPL((y7r>D;nNU>$=cC_(ln zx0?ODx7MsvU9~;3RJs2Ou`pSE;yV1V%x!Ha9FP@gZ|6joi(l=!_|X9JmSS-$m`9U z_P!jZ_FU1$seMd<$<}Hn!qeg`DCVcDc@_QOoxLJKF-ZbT?TV->kSb>+~GvE%u!CfTY=;Iz}rta`N9pgIgB#R`t36-z$83MSDI`u%uhJ z?~*4^sW;>_mZ$YZFZ^$(VMP8M~X6!s_)>V>MJ)sdp${BI=*RgjRlIIqep(AQ`QQpMJ^B+-Uyk%+R zZ^6N4Fhg4f)K}{@fww+$*f3r49Z+50b&*#$dQeV{#lC{el>{i}jQZXde&YkRv`#GZ zleQ>-WyfO(v00SckO}#3bs&G*A_rit?wTKe!<}T+k9Mk~Ig?qwGG>St28RF6MxMq) ztEH5YF0f`!lRC*;fDUc%jf`v8D|&^!ZRJ47T(B99Lt-C`rm8B$NT;=NfmUz>>A2q1 zK5#p9sJED+lcxNuqZdfw4&`Ttb$%-2^K}KOvZ_#--c6!v?rWO$%j-S3zYcd*x~g73u;^5FB=6s`-6sN`WGdN}{E7F5g@9P&P*xov~ zcbp%)SjD2Zhq#O%tQ1nByd6pMlW5m%VKKs}l6r?< z)G-c58RX4PI@htACoo;5x_Jv9w}1QFZ!n-ED4#l z6IQT_?CPVrlWE_yqR2(X1qUzLM*6mC&rR_qL5?tNUn%%aBGRIiid-QVd{Le1@i@>*B_W2w^XG@5sN;=Yf>Q># zgxhB;;XYrgpWbt8YO~~bT5_)?cCgC%ShekSYsnq%Yy({THAUvMMVp+AS*n#FU@lo) zPI&Aynw~hMSu1&BDyHfczTzT`!EqY%t6ySVaP={VQ%>OYo=rlN`RDchF7=iX)6W;3PhK^uKxP) z|8>yBy|54h?GXS1+naOFMzvAq0H_sX`#^z^UJ50V%mG+mndRM;tRg1i^ zw7Yzp=nB41!=wd!M9^<|+fvh9^@sk>UhuiWY%{5&7ZM!cwco;>osMx`<+R*C+~lbn zL|BJg32I*3C~tT%t$79eSe0g!5vEO`-EwHAl-9wa*4fB;4p`0E(727cpfB}z+tIN( zl1N7!Z)i~5z)p2(+_g*_Hp9EcXO+*HM%om!iRxz!Mc*qxlT3s)J+HFn*puZ(_QBBG z|M9&yAG5L{Usk)dsorMm6^j**S938~i%mHpyJvKk#GvvSl-5^)2_r%S!wp_YZ-Pc) z`->>W98bJ6K1*7T%!+1|IWWI9DcYu*@$8K%iE^H|%czlt1a0Qsrm#`M;OO9N%Vn>r zrMl2mLyJsfv^?_*cRzJyTHnQ4w|YlUe(;QeH|IrUEjKB{&XAMe9H}^f63x`)a2x4% z@!%pAgk{g7u)^bJi;e529satuuWRx)km;0w-H%Pb@IMat03cT7ohizsWNNfOrrJo! z+}&^0(Z5ZpBELVbYgks0mj+gL{{Xt1P9V%GkbbA!wzPTeSHRBBa9Owd$N+S99oX+?C#!TGm6nnde(p|niq_M!Tcr<24vm0FlgKFb!-%uqhKf5|G7XB8)7|BtAW*16&kWmc77hQ zzsCRKd{FUyrC;1B>mJF4F4;Hf*+=-31tu0YQcpdrsOx(4jVCa&mf;9wAQN+s)WEv)%0-ckeqBOXoC)%K9Lm^Du&RNlQ{$G`Fb{yKU}Z`C0$o9&)#k466$BQJEdMhuNx6r>&CV_XGL zLG6|wq%V11`5vZnTp?wv56&L8TwkHQ1M>_V(A00^EVB zavPDePwetrYrVOukCHc8Cco$hFj56~NvG}*cFze~C>hH{qQ?WGi9R7d8U3>eMvy09 zf=T{G7_BrtaP)ar47SYiio@>(g7G{*rk-znB5k-HU()c19j9TeBkO9n6pvCvkctT* z7)kPMzC*6hH%@-ZE<&G!(2y%$%D_U@w;=s9d z5AX9=4yxgf9HzBtMxj33Xpe-`g*Gr`L9Nt3%1#47b34n9VMSbHjQ47W7G5%l>6}MX z6)@3?b*KmT@Y*K>7UhM7&z~@>qBmBx0}i;faXj1_O$viG9ki6SGX$U#$goLURuszR zF%dIKy|V$7u3t$8avkj#+~4@Qu6n%S{dQ&j;A~+T|C>^vwuwkvVM@~n$9)b6Wd>yA zU}ITjm#m=U{KE1LRY`q&eCgi|tuS*>o!vdpYfGI0Z7;RHr^oeTy#!jp3glh!D92p~ zAT&pe5qaM3G*UI>QF!0JlzgMJz9>qwa^KrMI}+YoM2@>XL1-{7G=fOVh_)y}xgG^z zrLhQN0m4cWCmaH7`f>EbIsLJ0d9q)-b~5GSd!%CqaY9=E#(9&azyxGx$`lz`+ESDn zWDJpQ*fw0x%e!$v2(&SonnNu!cFqL{4xWEJL9G(Px`5Bnj(I(V?aY-8J%d3jo1n7jZI->~-PdmF^q`$Ou2%Z(#Ne(*=TIM-*8iM( zF-F$1}f|R$|xZzo?f*>MHb3Ki8(-+>*t! zM*h9ZB3^*er`=>+PTngXoezrH0mCN)&>#?IOwcX^@Mw*z5T&9L%giPoOvyt^FFzW?f$HE$R?WP`KJxn!kCh!FcnV1CXvuo)4&Mk2^xmInt68J@3Kl+nz(}! z?@RBKc2Y;ZbABE)h7rr#@W~i~N^Tpe7L7xTUOu@PGCGsB4TH{J>n)1W#c}6o{%X#0_(~4i zURGJLp@pUqc9Hplo0HIY6DD|Ci54L}}HEkJV_A4e`56x!O5eqX}AYw`8 z2xtjXN@jG7g0wd^nyjFE+naGz{%+p|?m)vRwg+Zgak;L(Z$zD2@y6>Z0-r4Dlywq7 zXqY%jC5FMUS%ip)AUhC0K${KBo1m_`?Rh7dfuW32Bh50#7}!&r9tgh8(*{%lvmq%i zh;d{M`@*$?lXYCU`-PzViEeL+X>YmYvfkl&4tg_wC*`)c4?=;wS?JGvL-&$dm}8eG z_6GAkr}U4}&|(bv0A?08+0Z2+Z)!mlC9T9@fNA=HEvI(D{!1dIpsA=ml&Td6v?JyV zgeEPq= z$j*MfpNg>r(U!4oYpE*)*0V=_P#vTYo#ra&SPfhDG?Hj_@Smvv_a zAzCjZ*##}gX5JkT2ZI^{OS$qbG@tZu|)^~x0<9dN!DjNG`iNt$@ zZ!#X6oJ#Tqgd+fg=5&SAu8v0fzRI(msD;>S@BY#K+x%-?3%c3Q?&yEufg<$L{+v~> zK+tK@@3--L81$>VsLKN%-rhB9t$hMPD)N0WPb(Nd@7ljxDFga)|54XC{+gz1obAsZ ziT_8_TgmAtUmXw4pU#R+qrrd^Pe|^wj{!oD05QA_DO@ezof2UDc=aRmoMnn`x_q zV%cJ!UA0Jm|1L|`hiQEY>MwRV$4bJ|dsKJs#L2&D;)i$wNL$mtPDUax+XFnJF3Y{= zfcYB;uM5ES^wg+&h}sVxKMuotO)(PwPM5c=3dbh(6|azsQd3tdp#waH_jC&PE1&ZG zcmlp~_}z56jmBcXzhNWt85q-@k|&=47+B*l z_P|fxT*Ke;jY4b#A^bO!`&LnC_xMBqvA=`ls(01;7m@I3_^2f`3iFB_R0Y z_UgZ@!hJaPupqK;qY(?woN{sjJS+Mdqfe$!nzr9upmoS;54^aaQXkz7X@9FKb1=%M z_h?|Zu;f@6c@10;^*P7~U-IO9_w8lne`P;P#gxAIPg+Im_VP~tcs+qC$KbxMt~c0q zR<8nP)pL311mnMOy|cDdo}K&TX{KCr56oZnJn?-vFtAJ!@^b(EYo@q!a8V6)g-57; zU`xy(#AZ&(%e9u6wls8v;S6Zy3%jFaM?#VA6Me=&cxe=P=3{}r>1E!ga18e4hn>Vw2c8HwzRY%@^U^qf1qJ%#pTkxe1BamrVU6!I7SgY z>BHh+cI}uJS~4+F#+p91yn&6Y6$1pYGvTQ$l!c+JiG;9$870O_S%UEk%9=k^vlOrD z({+kFuER5`L+B{S+4={2*-vR!Su&YFIIQ_Pp6U*YxMv1!=kU;OW^VQdcCFiV65d0!fY}9zO?-)@Ufco2_?FIgY6E~qi{{VHrdoazTsE&fZ!`~ZBF!-*Z4-Ux7 z5`&Fk`}2c(L;(OITi8h>us4=9D_JZp9PCL5K}lRsj$GlteTjH4n$WgC5P!ouRm|4b zq``v)l2wNM5|FPNG$3mbloC!nNmokB>(96#TEX3WylSNeP}P$bz616W>p53&G97{R ze#fLrh;0FRi+KORk)@ZMc7+MUt51Yl1CwW(G#tG z_$!fGD5wM^k)T5%B_Ln0q&dO}%c;WP6SGLVQIIS*9K|GTGA$6XP=Q$k3G1og`M)5C z93~Eltl-pftmHw9Mv7)erqoqVH85L{R6^}CL3%1$%wIJ;&vc7zn44Qfvr$ zX+VGs9Lz<0p@JQuC8J}rVmWNup!KO&V)7CYu8>TUB!Ps0Ig;BnXk`kA7DQ~>JSMI4 zHIpc^ncAIYJxK3vCCuzoB_{7M2!D5TiixujTu77I5!fp@nF)YA8L*kP_KqbaNhZS1 z$A?s(gaTaz<41|Z?Ndb<5s*X{JcEsZO5Z0XA}a(_78)AK8yFat(Z7~C&^ih_+j@z- zT@G6oXH1J$m-c`W#$jqGy=q&ee&$mB>Mod~w{rAE;-%7Phj!~sYKQdt_= zg+?G4NN!>y1=Ye+McumG?<$tNZ=@N75CKSJNHN|B;qROY3pkVguTkGFC?8wp7BZ@W#!)-L>+EoPz(y!PbX;@mE{$e-Twx1M>f#W@!vPK=_=7e@)P7|2DV*@UUtiDSA0nzIVXa zg^4^DtEAkcYzs99TTCBSp3JuuR5Uk2T@`C;Luz3Yv&!2ZsQmrtj{es%qtZ=dxy|y= zqPWdAHMC{TAEk7A(8a4*-19KBC-JO>Jx6d<%Q$rH4-;NpYW^0h+}3xXuQ`L@aC|4X z=!2?^KZqCG{7QLI_ydvJ{0d9x{R@qY>gx0~_`nRl#f2kpQ`h^ziNkpE@IBR+xe!vo zxWJ?v?ST`L?8@H#_&_|BJ`0F4!IO*pqTaX(Y_#BLiB#nmA6?@ZbNkF)$T*(LZ3u)4 z;?`+v;uU43muL4&$ZLHb>NlEK1(7g`WG57l$6g(Yy78Vw;1Bio0uZ9L-XGXV!3g}5 zJie2J`@zmL<)uh!v_CGZ)&?3*pZ_fXjASe^68MHTWcIc2iSv*Z=Rh4dSLk_nG6L4` zUY~dWfu-H>zVZ#9$sYgWtI8oNnOjh?_eld$K;nJ>(2w|{BFhI)nfFA!aTUMW!WkiQ zQLfan&xy!!q7e&ldT!>`@w0zdefbW70sUiJ*(ohNFz$%T+I`cld4umNgr#5|sUTwF zchGK4mMiP75EaE;r4^<7rthkaCPct@y8Rtq7hk(>6vXm>%Jc%2Z|$aFhg|)!9~s*b z#=XBt3Be$$nafb~_eKJfzCy^Nf$aeoBNc5|hEFEA+vV9GkoV8o;om$iaX7v2W`ptC zuW2cWach3k6!C+q76+GRHI7&HI+~(-{4ud$T^`~SZLgsTD*m~Qre?D94BSive*XVG z{rP*~I4k6-@c9$>NxbiO8udPt0E7?_0ssd9LnKf&003WhZ|Xb1Qm)~2P`<73sPr4J6IMVn3c8>px{-}H3w(AMYaoxubqKsHDT007J! z)yx6hJsiEax3*Tw9wn@bhVb*=Ad~_!J=N0_SB_N$!1m-tXd{(1J8Pk#^zVtX__Jf z2r42BjzLy2M2Rqx4C!J?JVFaHB_pvFjck31h_-_bQgr0IH;v-9#=)cI5Quhv84zZ3 z411}FMQJt>k2kGW=355W4tLIUNUb2k9`QnpMAhEWP&s#}xCr)tkP&m{bpaKac>R*c zYrh>$9H8p|X{kvwZ37slhXCtsayBBR$N}H-9+)r*J@B*bDK$*n^c$F^6vLk z)Yzs^dU@Suak_wG{c;GocpG107vh|8gjmOiF-Hh%wun>8=+hLn8PVy{-YYZh^;Yrp zPz#SfisW6%omqU1{T2oa+UL~zWo`0awOnS(U%c6h2nS+Hgz20gbGt5W-Qt{B4b{3Q zk?if=oKvo-74|{32z1;kUjDAKETAlvv?o*p>RGC5^+KBY)$F=vg`p8$CmZ|>SUu__1wpwVIMOZUWEN@Vs^EZ!4ZF`OJB>Mz*384 zwr$OUogj5pQ&|`;6>n^7;iH9FQa4o1K=>cL4p)UHI-1WW&B-UjW}jdSHwdMV|VFCZCQ$0fKR?E261%PXon;(t9NjO{&kf+8=`YcYA!OxGmsaA9%AUu&)|(1fkKk+VSYO z9lBeYYd7D>gdBTabz26w-FTLD!OMSrR?~+J$1l?bKi|-QD_yzzmNm6YaHlP`m8^r- zA*P)`!lq#F*Vagsr&-h2GUTiKuB;voiBxF$RABr+gi5V``!(g<(|M1#TbpP9jgUpy zY~5IQJCz?q9%UFq@_!L>U0A25w9Y#(Td)nJ!ntY1+pN-ysq|s;(SO^f1FI{vYZC(E zzo+$BuCm#i4rR`AD8oT|F_5HXB`Jy+ur{LhPLsnFFh&JLAtATX8e`meVq~~&EabJa zn(d2Hrc5w*p$^&#UCN;d>140?qR!Px-Ij_rE{sf3IX*Qk zUZCS9o2H(9oSAQoI~K3Puc1p8`sHr36Uj0VaWzm4LRldwWkQjL9qQv4AQVr6-w>7j zqHZ)Fxqu%R%y%qhr;zR|;D(NLx?qUy<#2MITLeb5e?)DNuGK>Bz{Wx(BugWdC`wJD z@f;XOP;mq;;4P4-yjLqa_yL`z_WGGAEEonkc1H2AHi~)~XKGf*u4F$N((oEtWOmKE zDc$Gwa=SU7*Ei?udKzo!uj3+a-JHlJbRptj;gzxouUz-fDPdES+T~IT;r>cf|835o?064qg^!{;yo1Ctu zws4rGd9F+Hn<7JN;QqCio#?A%k$40EAp!!)l3t2u8JhK9t?$j^1s{B>oB#(IPN1L* z4`Ea&EJXLSL9d%(lPdE=o5aVqtSa}UYMZH2!pL$Nk((VTg#jWB5({cH z7LOppJ&S%PZYmd)jph^3;aD#3~+3+yWf zFc|a__@fy4Me=PQy)&(QlUuypj=~)^9O;-=65~1+{X8`(|FVs884mexJwWe3{@zm^ z#L1omA!#e|jQ}3qs^{}>)Aetr{K?1mtoDA@to1ve$5CNf2f&Aqflv#SN-x$=cSkEIyn}=a6$ptG?0t^el0s?I2 zJ6;dlrV`$W%@KjL!#aiT^Rg3Ka+~|$nJ3X|arC^`1Hg$ENDQ+ncjAfST%=^Aq?F`P zkQ!I`A%-Z8h2xkgm_ibP5nOaEl5K_2DZdh7BgBqALb3~ni7$pY793=GP5iro2%Fm` zh!D5OQ=~Zh%#w3Nj7-RA$V9uTi*Ox$^U7RoJIRSJ*EVaHH-UH>EZZ4WU2e&MuMrb? z5f1_!@&6~|lijjLNy{YwplAnW=_UF}l$3J=!%_PbLX)G|NJflQ#3Xwz1Z=Y?G^EiH zW;Yq-!4%JtCc`)OLi|6HTbkMIf67&sZ0^-4a$gI;QjP%3T{3XgZvB^97g~65zAaB7Q8Ke!My6X3LVkeGSLr1_iDjJpT_uM7$ z`ljWzoJg&fJ=beZbJ>qO->EO+(LWw#!pqYa?*mPP5R_1LY?YFa1=Z1$NG`PUUXNCR ztII+e(*M%4e^vHR{WGjTm{~=BX>L_X-Q2Z?$ZI5(whmG=9R^l;s%0nbyd1f>hi3=3 zEJ|0Hauvgm+#GbMi#Px?;ah=JrgX){mV8t%<7y$$7-hM>YT1bqm+0>>N?t99U8-h+ zKC;pLyZ9B@j6L^uN!MDl6Z{Cv@9*rj`0v>Sa2ui*lzd0Qrq-ZR^rXv5$2KI93Ko^a z(G&6GUbn)c~E#e}LcTqZ_Oa`ipC4|pMy>&ilD#cuiN z9MZciZAyJa@qRT`(UUEUk2zT}82zw@ww)A$A7+GC#@%qP?J=FR!;I;lAw zy^}Kn&7eSdGc$y*U^vbJBEa#GAe7Ps>5_xprr@$~hfip>$LUVN9`LofiAWwD6#jHg z{D=wl>bsjjHRDUB3++ecb;HW1`A!cK0ieHg0U`kqPU*ymDO$i^P3Oj8&R1N(0EG?} zP*kfqkX9ne3&3;rP`lH@aj*I;R4-)bLqiMzIE%+y&ztd~KTaLRiwCic0z;BsvvU+{ zTjF^b5I#Wy1#fx)Nm8CMWvI`cGFPjuh0Xf!R}FZa?6MezdMYb=k3tcnd~X0S@z7gU z&Y-A*-2OPqD0l!Iw|CgIoLSa3hSIP*=t?Ps+cT@p|pqU~GrR9#uTfs3U;GpeV}jNuw_ zVA#IjM}o5&G>ZxT3NwO%hmpv>dPj!Ww0&#F>@8wg{RN9HORPKGb;ab^Hktc`rz>Aa zASv{)(xU2z4vG!ZIa`Ih27|o>e3Z_&6v$8j^*P@}YyT*+tz7_v z1Pl;+$(Pw98X_FlK?25idH}srngs*B)dFh>koajPSa+&q5(%dU!g16zhxL5@CDcia zr28f|B-oQl%`X-SdO=Hp`9#`BgXWI7EuqJaixt+2ItaW#jW4>V}Y5HE10bvK?3)B1&DW1H;siX3s z*o1E5&f$?GE72)Fu-h;!(*Qc&&yn#sI?d2y8H^Uwxx}`dg-BVXI&Z2YR(zBgUcF-6 zNosuAlu7mHJ+Tn;B#ps_o)rg|l#F4{;DcjlXb#$j#+)6;SAz&M8JW2=T4%Y_*2Kn= ze5>$EDaM=yomJf}aqt|8i%}985k}DhNVi++a2(Mt@je0wmt_(>dsvAN_+7%t&!Pe` zPNt_wA&?8)X=p;|BN@q5kAcUrwgSxIPXc+IOJYS5D)G!%V*pNr#wn7HkChBNVFf{A zFXPq`gn5Hkd780Q$FY8a>c}$pD3B>zGS@H^!2rMzNCRu(6D7t2#D*jXX7VZy3y`xI zG4)c)q}YUGV|&ga5RbWgq;J`@CB&%0eV%N|yOpp+1qmEkB!FCbvo5T6{Iv-r1yU%e zF?0H!Z-|x%6^0zlE|aU9jIQGF#K$7;0tRD9l!XLeikwn6o57@rtdn=eq+9f)NKedh z99^5*&7`{tcIl4J^(p}ztb%o8Bu(JSD2@q|v6xM&teN9Na%^o|OuK2EF9vdZrukzB zFC{CmM>Z$v0rCaTFv?)RJmPmEml&+Tx)E zeS7iNK2~s?q)=4+n2%mi@y9>f*4v*d?&SbYH&;i&p`Q?751ia#bFMf_x$pyA29!v- z+%O4HxpboH$2?`XDqqZ-CPMWabi%DtXlxVt7#vb6g&^Y}cvbyp-awFY#t!)%jqEdv zWu42PYiDJJS6Ql?QDvQ7q^!ya{Z7lO8tsNCep?L695+D%3psri#*%;{W{LtGQ&Pr> z?*|E^7>w{hOfCf*dt26h^4E%%|EJNr&1m!fx?i=N#X^~E+@1HvXTX~|xA;Sa! zQZAF_T?BA~84SbT8^v!44HpJ(96lFI$_k6dP9Y~c2M7r>Z*SVVQvOu&2m7l>8{N%w zXy-e^>^&Zxs}rH5F7c*MnJhZJih2!88pVey;7yVLqTwS+g`o^5cxi6W`%vC@j0?~B z3L{UuhkVpDuCmRmQdR7CURLR9d?Axdg|W{9o-70vo({0WVqAv}#h61tv`7agxH;5$ zM8jJ+6IQpEZQUn-s%SHPo!j;lh~bHLTzJj(%T7+>?k8rl5+6D4=H65mE-K({c-QDb z9`lU;SueByWkGT^+_FxV;xqGK(Dtfjyz5_Y(vq0;z_0;W#cRFu;Jx#vi^`ICef2n> z{_7Eh;$o~i*JA}KVmDk5lyhb!C50)Xw|8ybFMq0-TYkDR8vtjxjbDFnYh&3M3x#qt z;zL1@qv>>a>g!{h6+W9+WvsSOCmVv!!kJ9dVZ@9lpvxG8?B@<}vP%NJ;E`lhpXKDVL(DG>*jSfH(-*F{A;kA`Ib>_|Cl)@;5L{%OTJnV=Qkk+Pc~Pp|7t4 z@{NHi>*eLZuo_wPuOo7a9aMSRuxT1_5mWi?Fk)_u>s5J82p`YJ3bJe$QrJu?W5N9x zIG)=8jY%!N$=DI5{LEMDntQ`Q@_wz_ViMM(Cwe3F2 z^B_@0o+ox}9tAxB&uM~GG=A8*;94F@s~cvmBB!3D(uWm{eEchLrmG606T^&|VtZJx z3-dCmI4qt&NC;NT1=`QS%Ed=h;(+B*0d zYEdQNUuzH$w582Q@mDk_!RUAibvT%&+3n8U0XM4vGuw@8VM{n`h$i;i>5H1yeJS%i zHGQmp+!OZ6T&wMYnA$fl$$qQUqMA;2vT3vy>W47f2lp+yoALy`dzFOaB3grdtyT?u zDL>VIV7#~H9CIYbYfG^Z=wmG@y;Y?-x#QOH;$BCWYqa~s>yrw3ePm|>z$lv2W^^IP z#`M^<;Q3> z#TJ(@{L@2ZQ+SEZYh&9~xZMmXzEbO=drQ zuT%dw(u(8Hquiy*`_vnwcK_ zCC3@pU5)UR`90Ek`P_a87_6u@Xorqgk&x(xPv8cyjypyxz=>{NH>6pZ8?Rhi`T@-_5HE?4lM&I(K}Z)oZe&8_{7Eh zwKe%PF9!gnXw93OD*TX^PZT?NK zm8jh_K{cLevT2Nne4?NrLfA)R(bP>DCOw0oO?jQa%2b2w8M0|~zu|muzIvU*Z>b7i z83%vBiqHI?kgUV-Q-Q|nhn0EFv+Dw_m&mY@(#0pId#TNdm^>nR#{pPc)VNjGzPK~B zIy_zmRe3i)t8je;%4sWvQhN)hRTaFEg&r9d z00oWz`ao0^6kvb?3Q#}+4LSNisu@Esru;3R^Fo6fC>Br%yIWDg27ns`Sis&a7`r~^ z|Ji(pz@du=(z6Hv6$I`mn_2AOP$O$T1x)%5fP}6R<-imGDhRe3H_{H?QNczZp%CWo z2>P-I#P2<`U%Nv?8|_&u?Zc#|u?iH*@6cG(U;!+HpwZu641EFqZ~CDM!|-{`&{D(a zQzYs7gU$O^Bx+?h9?D!8r;8a{_HgI9b4^LOa`>e*h|&*59fq-;`^^3+-`?F&%7}0q zLdm-gs%05!dS;>8#PXuIFn$p60Z^7oA1Ww3@6e6B7!09Wzw-Jo*?FmU|Ejh1`7*}* zt76MKS3MQ_b3uqK#Yj(${7=b$-~8>%TR%Vc+E>+np|)TBhi-V^8Fp{Zg{VcHro(cM z^mHyf9>IAVSKe7aV#8eMl*{Nr;l|%X-LRz(;p|Vd%dSyYQCZ7@^K1C|rLFlxp1#Gt za4nY2H(SgTA?F*y#yX)m=(gL*&ZzTda236cqheSyJ^sjb5A@2>hiG~wx@ZD@SBH$1+4^~ejC{Xkws(78sL zZ^+7~gFs=*7UzceEj*(YF3B9imp2mX+lElscinCU^OZ0#Ts&H zcQ+3!%moy2%Zc5QSk-~$1vwaAtbAq>^f3ILzs#+$>y5KL!~P)Eyue^U0ZGflr*yuk zh+UHjjkLI}t4;FF(^2;pWSye+5C|d(7FhrykqEzr+u+Ts>gKz%Bj30&%CoI_)mFdy z7sVfjN6*hk(aqCJXL=W+&j?R!kN^@efs0MIbl0%@8JeUMj~DU zKa|T&!XtrJk;sYN4@7fhev!bdh`F+!X3iNis_K2|*NSN)L=FU%rC0@I&AR_clGz?W zJd|yBBrD7eT#lK;5e$vIOb3zTsM~Gg)Dr@rB9jV$788@~gqD#TE$%vnQQv2C6|~iL zpBb|MX(x*LBZ2_Q?$BpC=HEmd> zRY8B}=0B5KMzV>QnYeeDmac>PO4GyUTdd6lC%^V2hd%8|@voFNShjKjyvP8Sqx1sD zwo);MC3*yqM3!zjJ$BdX{@Rt<*2qAsBU~bd0!v%NC z?=Ie_JaE|G1gme6v>_9tCH)qFFapT{rnof&&Ma4o4rG8}f=SCmyLX+JEYHfwCKlkW zU?54LNs?eRgvlezI+aSP_I-iazh|%pud=4U1P~^fjYDo;k6Df+@yCILNG9X^xg?dPgF^ z3xKQy05JK|eGg_+{7=(Az3j4|p7!?7 zLH;)~Q8We*>sN5o8$f^e1e^g#$uUH>HA3ldYL>DGYGoSaal8iv8`9fFa}G1TR+L2$ zE2@zfl1}&1AvZW|Bj{U5KGcT|NyzwG#btG_?^_phTr|Mm7$ zdVh+aNbDrlBAguOIr8u7Atd8zU!L?P&oP2Fa4Dmp1^3H#Ow&K7?FDzb;yFEgVlxY# zH3l36g0(f$%DM7t*zF%~XZNzDt-FhlyAbRg4QX~D<`X_m8N@XG>2p4i{F#?^kHYBB zpWFA+(ro3`zlqioi%-!RBrlcC#@0otlT4+iYeD`mGbVfDHp(Sm7@H<3xeh!rV+tL`aK$I7$o(XhX= z^&G~de#PH>cR0apitd|qp$-1)(>3irEn?0F8L{M-TsDo4%^*WB{iHrQV0@`wXO%JJ zp2yNoV}8F7kTH=Ik4?p{N#G8ZxPvjKmH^xt6g#sFqy0E-R)5)l3nMgmxR zn%b1M&vLZFfq(vRrTHAGt!tBw90S(9x-iR$YP;G=m(Znlw6`y`TYL6w47S7a^0pzx zf6L{qCB)R_B9A^o22_;1JW_F+k~~0(0Dz1E&CGxSgBf?Xb#2+Y zuWq_`ChKeM$+opS>9VbCBg@OyZEN+|Kk^$H0V03^jT4hPCKwvqMEK|nAQ(Ure+_<- zf#K+m%7Wb~C(+eDiZp zKpT;}qO;J~UOkR)wz{ko$JXY)Lj_Qz>s@lzLnl+N9+L*C!p{++#(@@D; zsi#)#KF}&5A2#=myQ8;Qw)`@v!QL8!uk$_Nk5wIL40+yKRPGtx*rIJuq6h+uZhJ>J zK~}yoZ5SVRx;-wY+%iGf6U2Bo9CUZav~Kw7?PJ@y+y{x4ak>y(E_de|?QXG-Ub=Dx zgypXNXM&M-o^1U4?=b&-p%8Fe>~jZg(y z_mBvq;@{lz=Fj`r(6nD^Is^j&7!Fy(?dJ%l*qu#Dc{@dS0vggaUmx|>H}b(KT+svt z_c~Q@Thd=X(^#`P-E~LPZKL=%$6%L4{R&`?C+&Mou1I5BE3QYZs$qb8 zermJ{)}4gm!K;7Ep*F(_$Q>Uz9`U7Cq$WhEAlnGrL+xwDwc%}QW9*BR+Ciy*k8tp>Y-4>@BMojZGkc+;r*y~m_&2i56?pQPs#NKGv19XyZ=;A;}gT}$Fb#d%#M_M82RqzG&NufR`FFW^L z^}Cwa+^f4hbO zm9BWOjT^VTZx4@GOx3izT^Q*k3qUz61!b!T1`?p7oqCqUO0qx^i;f~f6eZIv@3Z%Ky<=a_8Dd5~cjfdg)RIqO&NxA;eIDp5IA(wZRWUOrk+cQkS-Q&*79=p9(1{0C;5(5`eH< zX11EiN;U|P5e{=?G0XKmLZH3*|02Jyn*23DfiO%-9g)J!F>Jze3C^2MCry z#P3zBs=Xzu=QFAbQ<<+J#Z$`l(4n4xWC7xrsT1`)f5@I;}RqrjS zm-X+DyumktgliZEDKHQKJ?)m7#80p=y$)2tl3YcSgyKL-j>l3TY;e?Z1T?Bvxn7!Z zs}q%;_g3T)O#}c*T?u9Zx_Vh4hzq2#3`j)r^B`j)qa+?UmR&A0DqMbl4Z1yfmINEhsGNjiPXr4#F1c=LC_%8})mI=_~LtPu$NHFBU0QF*eddd6!xnIMiYhgt&Ac-K& zi#QnD0-m}LxL@p1VALWBKqZS5$eIYJ->F(Frr*T_B-jb<}au608XHC7O6T zDyEsW;+?Ub2A3F7M(so=NKGFzj@j#RNt(Fs;+(db`?M~bbIF7lo`6{jNy19GigIU0 zPOL{)y!HlOi)-SzX;8qK>9(9#B%MXh$95y0^deV|Bk*0e5{#TaK1xa=##va?+|;0# z1$MF==hR4GF}z9IY-8-)nG`h(8xr}_B%f>|BC`zNq_IXzdd)(%E(>J6J)stD?DtP+ zjW>P7U+%3of4de3Fy>JauL`vT&NC&oHbXfY@m|Ph#E2aB!jgy{SLVvRlICPBA0=go zVZQwHxVcCw$hrBP%Omby726=1 z7Driqhq<3NSDK&i!c&#>uYG?(K~4p%j_0l$7XV5_eSE^Y^ZpJ+SD&nMeTSQi9_O@o zRaupoJCi?_DZakRj|#=sdMKW*C2z#dmci6G-(E9)Y+i^NsLAo(R_4qti_w-S>TYjX z(m&Q0+N%!NGAgM_=d$K@wq0!rSwpY(f=_#nV(V*5AH1fQQ1pu;TnRy4LW2mc>aV%Q zZQ;7YJwG;RE7py<)JDn!zf3!^7M%rk&lDAb^eAP$AsV00lGaKtlr*z9*Ktw8Q0!~> z^xU;^5UFcnsuY3f#ofl%j4i9Vq@8g6|A7{{<@a*@OQ>5Jd@Sj&)(SC1l2J1Q;P&dP z6K}V4;@J`EuD%3?6>I#YYN7EpP#E=(AJjrLy+4og%U1HGuGzrzjLlqX0feLa;S9J(r-*j&?j>>MI>Tkg3a*FhcYZQk@@T`?*q`5VK}{Ijop-vr5peXDOK9pwLC zPqa{$?JXN%@faGlhzI%ll+H=d3xUW#L9)I59|heHyXgbfCa;z1FH4Xnom^kn{lP~p zF6*$4uP#Ftv+*&$!DUyiMjvo^aDeN}(F5eyGVRY5y4xZ-R^<(}HZ9y~L9-`x&?+Rt z6JFRGEb|(%NPd}4*J?4j{ldcjxC1-}Mf{<#?;9@U1iR&LgY+M}u38>_JCzsZvbkcv z%^rmqL-3Cea*kQt%Z&%j3uTa*hm8GByKVo=?#uE6bl)DY2ebp@D$cQAo&0~UfW~+60LQ{k(A8Mn*}MBt4|8pvBWpGDI-+MbtIOxdBB^y03ufa^}|@E1# zUUU>_*0+W8|KrBWTa;tF0z@1uXk_nqy=TWJ_0X?UVR9>Kp6TmiJ?`N*SZw1<>%Wp+ z@hZ)lJ7xL5JkC}~ja9^o2Ne%c7POcWt0qAzhCBzc!XpDWCKN4#nvgOAs5&@$^8oNDOKJklbWttMc7{qtGkP?hhtAg_00Th@K%hnG34~9=(Zp zYbQ^3k9k5HCUe%ADCfM(Ic-SgX>S(mw4P|gLT)Ml$>w%^4cj2weeiI12|hw|dVFzm zGcGq{!|ID(T<2RdH5=V(4*&nc36oDwa)wHEha;5FbFyk6jQ?asl$|>qqi+RJb0Xo% z&qRya#%?+7ZTxw(+1#1A@vW~RQ9vL80r6|44GJ(S0L04xFtxyB_r(3XY9)D!se0PW zN-au9*&F~Q3-S(|#E%^BP&lJ;f&{`qyjj{NLg7>Aj^ZdOg3%!qO39MG+tE(AF+2l- z&f2+yiYjTNI(c(~ugn)7p3l{Ftw8Ys1;S;W7AOX(zdA2r?{LBQJ?T|KVt@ev2D$nX zwava}zs$lb1ied&#d{F-)THx5&g}JUj>bR0aUz7$gG` zuhs&HZ!%v?!eMxMO_e#jm)7Uz2o%#7L4UQ!^GLYbVu}_q{HZUNfys%9p$UVSFa~`6 zaWTAN^7UH-rrcf68d22!)Yi2@Qktqr3f5cB;d+2YlK+xGZ}Td#BH~Y8W=W3a8&kJk zQySbe>SEQDsc1mJhKrh#+Z_^0A-VrSga+O6Lj6yWYv)mL9!zl=2KN>eTcLbk(x&Xzh= zl-T|cb-6F}BFVE4y&w>`Jx1%h1~s@(OPkfoO$k`CmoUR`A1lgfY(IhuFAyI<0I?2e z*wXGmQUM9e^by{=1gyRJyb%wSD~18svKfS|@5D;LL{NYd? zfhC+$+Fy-Qf+qE@v3~3Te`7Yx87UdUtCwmNM}7!5N<#U`O=$m;rEAzxuup+<5NxRd za8JSAM!WT5wg>>dW@D)kS?$%XK5`JTQW^H^i1Z~sBVc)c=zh&KHPd0v?gP{sG%+Ri?ESM5OUt7d`Z2=*GbO8c8j|u8Lx_jt6hm3mgWt8tZNce;?!`Rne z3Tm{p^O*7CX|auX_eeBroN?J0N64G6tf^V-e;PU0Os^3*ir&N%r_PCABXJbIi6;_* z6F>HeE!MshCw7A^Kfj44mX!O|;v~nTxvgUJt|3_y4B5%Vk*n_ z^g2ApI~NlL+3uQZ=8doZD**2mnTqN~5;;nbLa@**H~D#|aK&6wjz&RqbsO zxuiLj16#%b97%A_5tRobnyNTC422477;BtSM~udntIRn2Fbpe;MMoZMDZtTX2d-d$ zV;I3#t(Vx6Z85gzH|mAnqGV%@9viMvYMzDcwoqZ0gKsDG;MkZ%Rae|7X2Ld^HlBNSg zQuGcB4M|dO2oc81w8b|cMbX8Dl`(#3cgL^240oZgZ2}1dV_6cZj1;6~1jww*fC-e& z#dGORG&HU!>wiq3#7B{BOBF^4BLNW*#SFyzFvU5@+5ya#{#^z3D+d{#AJzj-axMCi zCK~*WkUDRjF!d4vhHp7wp7H~>oE$$Q15Z2TMmRzf^!iF@5gMZUBVx!UiEtp6f+ArW zo^YthuP@+5}Ly18*B@&@C{h6%h zmB>}n{ySMb?CeL8TZ*`qj)lS>0*aClE^@J&zBvg7W1}!3g{>mf5b`(-lMiCVAVkE9 zku$PhiM(u2{%Zawx6j;QA;tv>`lw43gipa#BpgVORPs!;(jZch;lvQKQ4V63J$FL! zBSMXA$B;XQF%JPw$#oGPHNw+`RTBU*CS#dGWFs*U42PqFL>!0F#8DhPO3d;j89dQ| zzj>}$(c~zgx6t<%-%oWn+xvODmjrwnR#=m5=wHY2< zB;SZvHygU(;}{X(_V z!5^#;&XPQjWCiX!iC5SL)No+UR5&tyotyBF9oI>o=?8vwX{wxr@WByCbGE=-b?JuH z)9yNQ_RNm#pY*=~EedU4>s}XsxP1iKu7^6mP#HwlPnMLpQosx?%H)W1Nq3{ zK76D7tL?;vKzg@2<99w7{N=D!3&!4vhewTyA{~n(=QxAG^|?Yf1Hqnda)Qw17PhEM zMnO2!mBlMIK!Il`aM=g&Bn+hk&rSfr2`4z<1Tas}ZVW_Fws>X$8hZN9Y_57EoAUNZ zoU+RJ`qhu4wf1T`H-FW@zq8MQ^Fy3Xxl&I^$vo}*Bsf1r9V}|$=4a9C+1r7SJ;?Rt zrz`zGGkQytzDhTKZZn^5PL6IYkU_v8>7$)KGisBe?$NHRpA4h-%&IN*n$m`3(*1d} zc~>RK#QO8Z*Pj}j-}Kb`6X%ha^x?PgAys+3k$)fr8+nUJez)>m}FxQy1-%&L8iuJ)>EW}6PrE|k@v zGH{@9y8C(2YLlwWH1qLI9VI<`PW?Bgx84c2E}w8ScXhORR5rQ(iDhMLpLal1J5*C@ z-ak8R7ISgEmZle<9X5+RcjWJ7Z|F0lWsE&xQhtbU%jG1EW~Qn5&*#Frx*1PQN8R_& z^oPlaTVVXcla-gB83jY-nWJ67JsM!InMyKhzo8m$zZ+OG!m1uIC(9T zmQR20BxfuQW2`j2%-J~-(%*6ScknDbZZiyqu{yDb_}i{_mSZv-P20j!Pe|4yTf5=P zA*YWy?n->_2Y<62FJoskG0d#^!^`=HE|MKyuho2NN#WyZRcxQ{ts)LZ*^IwzpZ zt@*QMF>^dwnqR5rFpPbOItS{pvl@f^Xuq!&=Zu|a2D;J~pE4WiSmt6EMIEH?sZojV zt7&a{vs>Po-Fud1rJiNvY0W~in1Zl}z!T-OArLMYBzy!Wn{#8wg$lc1NH{?oYv`Gy zXOA|O%LZ1E|dq@WQ3;h*vHQ0V>Fe5>%AkFSZ0S6sM!2zp2|E;kI zkPtvCBZxg1fUV2)-n$UmdzjB5G*}32osTMQTv`Z2Gb3!0pr@+ zz5a}hV`hp$9`_Oh)TY9Kjuzu%czFyb zCXX4KhptELJVY**Z?3S!loXS)d=%+W0GBoheaBD|IUt5nu|XgswM+>T!lDed2~V86 zb&B*T04xiz06cB=W5qC#EG@Z12(PQu(oPb!&CfqIPYCM_0C3(jN!EG)1>$TP<4 zu3PpZr4NQ>c-bK;h>Sx5GD@6~cAVp>Sj364o?*sAK$pJ|rlf(zd_-&e_@a@oh>U$5A^Th?0=h{Xo#ncsf)U1-L)}C|IBa zz@Y*Fzz`4v0000pMKvS<0B>bKm0kgfM~bk$5VpPc-X2H8V2MEol1BqEAGIX6f3QJ& zG)cN~CVxNi-+<8>0Gg42D=+{lJ^dnsTx2~ha*bk7BVvUMeB+3zYikn|tqpG-j!>%< zH0v&tZ4hd$oqH%CTVikf;i9c;IXNX+SZ_Jy;3Gh_KczqRN$e;2rtR~4CReDbSM_-MM|Hd1bDa(Tvz3Cn_1!jI2_*t( zC((|06Xm7JDy!<9L3zDyabWAEt6ZIZI`{%T%G9&>D$%idb>D1kXxg81+R?5@Sa5&> z1B0RkHB3xVwewKd%nGM^nlM;sehh9# zyM=2JQ_5x6j8IK898A`v@XVM18jA?30e7Hx$iLMs>#*#rU{*@2g=x0eqt%QKpad_2nY}Zo`2&kjR+a22tXBUf-o4(q*CJtypgKaxQW(jmIOq+KxwyoO0qoyx;nN) z*l0T=_h>D-2=G8_3%Sxc?`cMXnigjhpc4cEu$CbW1!xylojRS z6T!ON(|9$aZTryg=M!$afBxg@@jqWDV=b}EJDo(AOVw2F6zQoQt2tP%+s`-ZtB*Eh zEYJ}Je5I0L>C7Up79WkAzsGGriIQZ8LU9_^661tOZ39DNF3EiI+p!A1|3_xb2Mi)A z0hL~%%e7#YUOUZac3xeqCN~;?nBUF|E-O|ax__ni>(saycChr~nO^)^IBvsTuJD?)@tJd8G&2~J+H7W2f659%`Kw4qC!U@fiTl4&CoNFHbVTx%qEIEz~ zGdE68q%$=TSvZy{8?y%UQD%ygW&F%>;2W!__L}+04)$vLr?|~)8m=_HXB4}(ZM3`p zo2gm>6H2v7nbWbkRhnuOF1mz;8Y_AJCKjC$x>GCaYTpzRVIvwNK|4x*W{p=9yn-BG zriRYa=Mb{{wo6%G#5CK_tqk|8lS3^L(nR9T@_&s=2TtASK6qgTa+70Hgcy&eXvSo$ z6nUFg+xq)NH4(=~-ddx~x2+Q4Y4<70lyuUv-jYN@0T~ue|&d z3eQD8f3j##*VM9_PWQbJY>B{j+@L-Ulh@T`js_o&MXPw-|#ny=Q!;`gmR3d01Tg;4bPEmu3^L1uFt6=|$Gt*QrT&3kO6Iq|O zyLZJ0wDy)3*8;i^wc#xKEWd~iMlRe`PgS&-x41VzTv@l;%PcLZ3*2~@3?);U%g*Oh zRppSXTM+A$0*fR}@xIR~2aN8{uCH_uKL|>e+-Gt4K)c@->=MO|Afq5RzDO?=n?o|% z9y$Ac7OVEeMQP-F8ONT>%8}ja7ZW?>)Wh}2t_YbW1F@Qr%q%r~i`phMk26ztt;E~1 z<92AePYrOA`H3M#*s3Ki-nV}BWHRM4>S%BY44AEQ%xfx>4M=*rR)cp{mKKl~Zy&J>|1J38$i$*d{yM5-z*3u2*MNqemz z2SM1#;1(9&qs$bg>t4OtmzP_kMt$-n^jd;lCD5UHsat=OE6D z&;vp?cG&cP7tn5aQm>}>#5K@YR#AU6USa z0zE+FhUp)r+_BGNZDwxMCKah}>P91~z7~HY6;_{o4i{mGn@^Y}68Gt0#DXbzJF)#vC!vni9%XTMy5VN43G~pt??+c!@hFcltx6caVMm z@v{|VcQyWxbJe%@XxfiEb>_lX#)?k}b8oj7FAtLU<7`%lmxKFg&y5b07o`q=#n^pI z6Ip%MLF{|KQ<7S?3`Ofs=qF^^*9=}-8zcM@X*Qralh0{fzb!8EQd(e@h~_VUefpB+ zX*=e7BhDZEUNtYkA?AxbZD!00ZNe2Pk5^o|`PNIyV zmVaKS6}KC=A6+Hml#8m;fc2PCt7yaB$vu1M31v-EC#CxHq^`-j2Iy>6piKa zRuqNL!zV_gZ`)GtNYdWTkU0y)-y}P$D>W%*29MbMIbIZse2j{MuOH5-DBYz+;q%W0 z`m~Y%!5sD3{WBc2EcQ11Rv!GU!|3OH^i}6zuhN!6aJ6ky;b0|P3reHgl1vVKH-Bbq zMkc)~MLo+`_?w-t*}1uCactzv_G4wWc$4JcKP+M2_p|ludJ!@y4@KE%k&SXmrZS6W z8}guJLyLkzLQCYxeB+<6-Oxp{#cXEJoL(&Bh??{^GXmR-M%;XC3rllf={ zq-^5jEp6loF=jU)@!|-h1Nou{5x zK;uHIrtq*h9vF^cKxHA7_KnB#Xc9P*0NxtKl_h+qTjB4HKtLKHY3*f>L*bW>h(H`6 zaaUnS1|Sazm&IjoU4EP8E(pZrCGZVbX}$CqaPe_Z5Wcy_9^m*&3#)@oT}@wgrA6sg zHxhN!-?9WU6zia~FcsFue_P_9`hkI{1dBSctG8;)vSfc36QB~V?fOct+FP=q`*DR2 zDsmKYX68=6ww}KGTbl4TxUWk)VOjthRJ99MHI#HX)Zwpl9{axH$F1k+A8P(oPvl9U z5_i~C)>zYZIpSWSnskZkNkEZQg3lYK=T+D)u{}BBQIsG6jsi%VOX>Wz^fDZ>ZeD!) zZoP==P~d2^RH?szy|YMt%qe?0{;g&-4i>U58M5iqX*2B>{1}u94!PXw2)^*V|K4wI zgp}QiDj$|eZpl|)%ZjYB5t&`r?%argQW?&_F2KR(Zb^{6l?=pqYqPT1_R^gBIUY&L zaBq)gyh1$@=ZFARzkGmz3|(?MSF1>fIF~r<-(h%rl;Nn}g(r<)%X1c6Hg;!Ca$}1Q zh{q!w5N=ODDafG&ICGJg4B%#DCgPeRoDm?uC;xb+GPAx#{+(hVBPSV-!i&|5(p>Dx zun&4WUR}+$XaZIe0H=Rm?2A1{Wf&0NNrj)NPjZTY1ehePA}L;6iAY0>4M{lVzW2p9 z@wpZt&XPD>|GsN+ia?$vdC>Yr+2o(pzbH#F?Z3FQJa3CfiG5RKk)>zdw;!A&(a_r_vD+@`=uma@~ zl9l1(&*u2c_bIkgB4QZk1c502)|798RTv&(83 zawV95vqJ&A(*Z^+A%XVndDRDg_hV;!egu7p2q^^+@dSuLM|m`5*k(hYD7<=`o$<`0 ziL9~nrzi`}6Yy^q^Kjg-z$~Ha>_X;6bOiGmJ+{BgpFVr<5#`oQRFhNj$-jAy1_FH= z1TjYo5ZeI)P4pW6qs(!^G=^QU6|r`5sdCPyXvwMSf`FoHR3t}1fB4^!oYrd}{I$fD zl-|PCgO}__Ghr%?0Z1bQNbP_FrVL?hs3f@$dr49696=GK&}M<9#XkK*`Q$WDmM0A(Fe>DuzvZ`F17;Wm)$S{15i47NF+8*9j2I9nCLVU32c zzgJ#XmkzCQlOTE(Yi=VF2r-Afu(o<2(aj}fIxzqlQy|u+(e164Grvw|NsDRu5jy*+ zZi#({NJHe)=f7OI%8=jMW8;nJ&X${QESG)e`^MGw2(KVXtk=ttq~vB8T~EwtZp0Z7+m|UKc?%XEqK> z?_8fJXC1c;kGH05exk(N`hvROG^+jjNq0lz6>f*|o-=z98LIN8RNCRW@@DBhn|3#m zL|HZ?-aT)AH<3h1Bt#OYlO501&wF^!dgM)Z5zI>SQEBO&s~te&PYimcb!|T%?4vhG zKR+|(R z>|6ZF8Y%pKnuAHpX$dOkTt~o3A`Epz2?DcGsF_!O6VzhQ#A;vKbj^BmKDt`2vG%Ci z6VJWt0xVRBfN7rQ>*Ar(dDaFii>_|7H9>-rY(NmPj!+W>Iw+!qdo+;L9<`~O1s(e; zF%i`D>8WKLbPP>J!ReO(CHp*#uqoDJn9U8f)b~(~EWV0q)b+G-pVbHn{MPt#rN9BF z;m@octD=jdc~Y8l3qbMZO!EjbEA3UOx8@_3)7+jrFq?dDhNMXDWmGOjBef(1$rj|( zOaM#57$}4r0FREtzW6x#Jd3NezZ}M&Ku!#Qj!|^%HQ{gJPf$gs;>McJv44(nbbR6m zAr=mQj*fJE;xivl;g#JWvKKGN1 zQp*4Af9fjPv}fNdkFBSuuevG4Ky@)FKQ?ufHBk5sb5~`~rN-ii)@dC&Y?({zrV9M~ z=Z>j4cYdHUTeqH5O%E8d

#b%zuvpGlYSIg|Z=2FiPG3-%NroJknnWu8 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%0AokGzQMl_ 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

~ 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 ?#T@)Y9MDhZHO?K}koZ-L^GWe9hxR=s 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 z zMa04uX^~MA%WXMbWE*7*Z+CXZBIAh2& zpsGYUJ{@@`OvR1hGV`_2bBjTfHKaMzm#nwKUEkNbBy)KybLJgT-Gy%>x^%3b8Xx_z zyd2}pFm5LcUQZ|YfbroDdP_q?z448glibvclf2VReU682T<+msD7WzaZT+A2p2iWm zrnlYK)%W4b?$}$0OT*NDddDC0fp3s#ldu1%xa*SOpU%^~ksn-q%ZG1ox%UoO=H-ri zR+;JtA+mba;IPTIDxjX-9p)XO*t&#~ZZ|^h^9w zh-l|e!Cw+$J4s#&N*B0+vF#*iGlV5o^(LG5KSCmf zOVqDnpOHcH(L)};tv1teqRCCXc+{WEqg$>fy?>G%PKv81-*d`xL)_*2Ne)t_=zxa2 zKVVYe56=DZlm4D9$mT~Wa5gxHz8ll61)RO_>d5`mh_>G){+g&;z!Ih}y+yIFDtQBuO}OiH`5e6zJ}D zAa4dcSO!2_6J=fBW)R%dgWhPRVsblI)DqL7E%d-fHe4Ghb7%*RYf5+aFUAUXEQU=SL{8VKdD zL@pzkgo@M;3DC@+=vZ$+8x#iKn@!YhdMq0=RF&q3jZT$w zB&57R&DQ6MRJ1e$0(ukLz%T&*nw82VfF9*Wn-#;TcmfC~nsufj=>-XdOH<%APJ%(e zen2DL2BiWBV1l7&1wAn}fV~hX96sYw!nh*H5dA+;DS&z_M>k6etOcO3CzXAZouGZa z$I-sUxOh=>hkR1^k@Yk`v*^Uhj#V3EK}(4YVgP7>+lAdNSZga8^^$OaebDo5dT9s> zF{&U<(^Mo<^(sReKYstVzQBM8TyN4_U;{)a7Z})Gm1u+8LeT=}0+lZTpEa@qE^>JR z8NKGwhAMxzAT6u|pwbW%vsfS6^jJ6e#}6fqNDJ!#Xf(vd ztWnTtgJR)jpe%?$Kk`7r$y1$lb1!EFRfr=jhohbEty z5n86bsEITC|JpaRq%l16+YV1>^Z z5;fHIHZ+4_09G5}vwg_yzNP=z8fXAw*1fEDM!_=16E)cUM=B&WOSNMh9=XW9T@8Q? z5bZtNf&l#{+G1E*In*>%MlX_CWGE8Ujs!kd%b+QAstOn5{bYp4{$7d^Cnd0BUAgDg zv^n;W(3|{ow3uLfOvc|C+|u%PyZQNNesse*!Ygx)Hm>vDeYQJW%_1{Y)8A)XAYNg) zF_S?~2ysb_B!x;;1h-fQ1c7=hPpp3KZOWR6Tgk4E{oWE*n693~zGGXOT`jx|+X1Py zpP!!dH37{^p7d->_hSJm4~DQ96G_!iMF>bK#9hIoL6S6cLnJCz^}MF^9kN1Vf4iDT z9VVV3T>p|NCOWtOF~wz{&)%IRL?yvTD)$08NTk^?F%ml@Gt$VFF5F`nTR_Pm{zc?sDM zsCd<%>sW)ETR-267Q#x+lzcy}(PMxiv4Fop+qbSIT`rK71CE)aU|4BIxsI z;#y#{QbjK(b13%L)VxbarJ=R}f4?sm=L7T}^Y?uj+R_o;Bfv|dm6dWtYtiKZzEJaM z%1|5aOG69g&xxPVXO!x5yGqgi$Z>{!DheA-{hWRDy}jx+wdln5IlQ)~&mjIy=~VHT zIs<{dMDr?Pm~7z!$pTe~X2;qAEIH*^x)pcvlnvGp`oxN

2@=)S6l#WK$E|ufz@3I z(LTJU^iDETVt?9-D*L{^&cj_pXIIsdyh|RWN^+t5V@S3r0(x(}-to5fnz8`?dX42w zTHun$=Zs2mUX*2T|KU5UBaj2X-uy& z5AYaH7jcAr=oez19J>d+3)*8&{IHF)?UwZ+rVwd{A_9Ywombqz(Y4hSIHAc}ihb*B zHTAvPoNdRudXIL8@$kf-ZQ1-6WF*zpo%U7&neF%8LYoXK^9+;t=9J{hH;%@ZJf0e% zfM23#F?MrVYE9@-WUIyg`V~B@W2V-viAxV^lv_SOxbB{$%U!VWr)b2c63v{;Tc*ks z$=N6a7GLLQLHOHjn{5he=TgaFihY%Js@j3xrQK58?2k!%JB~!e&~=VHpsOM`_ut3h z;u>D^jU?CxYG&tekh#HVp~Xr9<`vMdLIKI6(JU1S&gR*au`l!ESJLWL_A2f&OCvq~ z@dJxu=(S7-e#lYBI+uxtYyKt;{aIu?qzo+TQ1l4Ejv`@Pj?3c!Gu-sN!f%lC)@~eR zD{NY|K8w!7Bmp#=&I($tCzW{j)GJ@3>k?ZYJ7rdEcRBj~EWI(UzL<{2SHovztE$)3 zICHLcM#BC2cUx3?IrSu~{3h;4A$35X_Wd2s`#Y|ays6C^G!tp7U4Wf@*q9+VfGDR- ziDDi~5P?KUO;8ycR#*FCD;g3dSJhcoxXb!mzrV}(EJ`m%fS-oK!ta-vf_`|(v{O(| zajiv%hn0W0<2=1ipp0h*8iJt>W~#6UuO}ym#h0so7BvX|`mY(u57-&)+0zPHKA5W# z$)R88$a9dvUmyrE_~WGmpEPAX`;zt))>Zm7`g*>~<2kF{t1E|F;H;Z^SoZrU{(F01 z#oO@%*Gs$m2Du&HgZA0eOjsuIbg(r-G%H&Og3nf5r)KU1PAP zb)C%--#A+so=HAiSuVGJ%`u(`qi2U-Xx1XBasU+MCe*`n&40=4j{W^=lT>r+7}1Aa;0sFhvdp%oHOIw~Ud*Deol_ZAu`h$4zt)qoly{W0K9U(mV$=Mk-WlCc z4jxkWD7O!B-OcEi+mX}3B+JEYIrd+;9Wv~kZ~elLRy3~Dj}TQ(MC5*!msB@H#?sL| zL=v?U59Dm%P6I=7zGQyJWeBo=?S8 zjwFS#n3U5Ah0LV!UUmrRk@8u&tePU{z<4A$D^NwP7j)H|`jPTk>>uCHOQx)F`jOT! zEQ`})V@2jtFj68eizlDUFcOg>{MS0PCr?M_(b$(e8n4(Y=;D|4qT5lcwt4&P(ZRor zK_bQ@D5_u)q$t4JeNBC@=S1l1CzE7{^uL@xKZDQ(&P+-7Bqb8oTOcPRh>-v!4-_#i zz+M_uO1SE4M16D^+6Z1V{qIPQEevAfBe8cf|tO53)_vMo=26 z-*UNR8jg6mDuR%#sRCW&Mno<^;E>K#D+c9L=b%?-OWHHyfg3kzM$<`k8)G^p;&spg zf#^%aHY4GyWjwZ&rY2AX5<|z)ol-JtGC#`-W-164YQtMh z6sZS?5#m49`jXbw zOxGCt-((q2%Su@pQz|s9M7F@^Lu6t^Nf9V}InF>p=LBPrD5E8Dl+AO}Wced%6IlX| zBpC_tmNp--rfYj5-;K5KH#@%MGOep`ZH;4@C2Nk3*N`F{gk%V1nwB*@f?~}kZV9M? zY-CPpS@E17YpTw}BbUEb>=uAWts@LOFvgZ@Sx2rz;_pzS*;RDXS{8T*5l}Uac8jk4 zGL50O?WX24|CuQ8r6`~spY>yD*=5mi>x|Kj)S2yWVg;`sLEkTa?^A5952V=MMcBIK z+)Vvhdh=~fBVdw7Eb0cFASDFhuOktsc^tm24^~E0lTnyjBbG&c|E>gFid=CZLFj}8 z0FnuRb8Z?FD}qtRns0y9_0<{f)A|O07BCK*friw7M^@@gqiHVS`HXb5p`)2gNXALN zs>+&&Ags?4453W~D^V2(lA_Y8Rl9iHeP$?(Puc{6VmV?!wfksR1qsS=P?N~zN0Ou< zpJb7b8}u*3KZJ@!Ll#TO5rwv6K@e132+cAJB@hK#gtlU(KKGC8t^cvP##W%)Tud|Gu7dM>f+ zl8o~JY2qdl99&Oo4d~YdLjoTp(hy}7XA}2gRi#}{(nAOg285@&rsMJCu@{FdEI5o4 zb)t1Oqm#^|v<98)F}nFur_#<`8mj6t{Bs;0P$E!OqzIrB=(10q+Pm!UczcLKS#kma z`inmt$4nScFV2T1QdMebJr$SsC$+FZjrjn|^VIM*Myp;a{# zukb^cHX|E9+O&=hZI5(3^FbTCA%8}m5+4nNiQt>DlNL+mO49mAS{UD?L<*q!d4;5_ zB0}Yhkwf)BiuQ<>u^Z?a1Fg|7dR*08&}xW58b4q1DnFQCgy@VOFUm%Yx;eD9uXTch zY_`U0*fH{_Q91r^Cur&F%KgBF?;E#E7hgZqKqKUBXywEpm5ep|D@!0|BPK1=xdi78 zvRV{di9{gFMT-4_Kq+tDD^~_VS|Hi+aUHHXVVz8-ay-LBvO3=J&WzO`F2Ng{LwLEf z7WQ_eo7V^0ZDiD$`D~DAGkB<4s`2)hsHF0t$TIVqZB_ry5+Md%R;83U@fq-yQs=^ei$-{s?mH=0R zW;x%?Yi0&PE!vZi(8j;&eHIp=6VGy0^^EP7@ zgdjf)(v4lvK8k%Q}YG*VVVGxnP|J2#5*0`>1{ySp_!l{75)c}y1b#71?ok>CP6%auo5c3ClZ~Ui9@^#L zggc#Gh3_U0II(04bcrQtG-x<$K68Xm`_dX2=qVtqu4HJ%(}cy5nAlK)v7WBa7jSYU zzDX@tuPG*=z-l09hr@o3i{Fycu_)I=txx@*r2MRk$w)e1#-OIzM0g5;98%AsNTU`6 zMlGvyfvrgqUJ9r;HY*2m+|H2P9h=9d*Stk|H3lN2;n5lw)m z9cg&}4@}?I*qXlHb@;?xFK(8vNKPl94>U0hhqr;(}CF6i_G~ zQILprADN4W`WL`JJv4)T20?rrdWs!BA1@y^!)Dyt^FDsQGs5qFw#72htJm zi}evSKVcr22&y`!KUy>NxvRh&7#luYMU=w?pSnY6hg1KyKXV_Q6~mpEvgCW;rv5aj}b_{SWS^I%g>LN^Td=-=W%pX9;sm&pLN`J}@EsFYoM_M0sK+D46*? zt>eez?_9q>3%^r1HYN)5{VV8ed2@Wl7W+Kjd}>?D$JUca`!8b}0Jv#xiTF$a*Vpn*$P!Yj-w?t?-d8~m> zl4KY_FBBfaa&KrpIw6PAwB2+kCz!P;EPVp!K$C4g$0lx-1adAEzT2zklFQL!k9goc z!%HPa&mx=@vw~wORtNwE`~FzET&RRb%!Xp`HXb6mzRSjqf}DNQXtIT`aA#aiI|iv#`^>TZ+m2T z<+oHH%n)6;<^FPO1+!^CoC#g3#O?kh0Y_BIc*9w2$uIkGi~_iiyKN zEO*ns+g(?(wPI10#8s#w9cbb=7O7G_bkQzQXavrbI_`pYo)b|n8~li-?<~iJ?1w0a zTlf>4y3uXi9`)QtJqhLe{E?pJC9^AbCqQ~Ass@UJ|0ZHVDC`BQD^`F~&XoWCpwS6~ z@s*hI{$y{rZcQ0Nht+0A9{28%r%N)qiFJ0wB$8<8Hv^+demXbW%5nbrZ8+TS$ZP)P zgZ*EScl<$@_a>tN=sK$pCXxM9nc~%T;!JADb1eL^H&e#09+1QnO=&<6Q%$3a0@7H3 zMw6hbx-{Q1X3B=F41)bRbkdTZd15e#wFYhU+j#|wSzNS9W17gN1VHw<~JW)8iASqG2C3g=LtF< zkrw5L-*zaZ`BXFhCVirR?{{L)dT+^Yi;@;xjhJnENzQzQx;RM{fj%xuhnAELUq{(D zLFr#c=aH_SmvYlEJm363c72)L-Tv?g!#D3iz{5W$|MQQ8|8`V<<7aDI6{f<=v_ego zrms({P}*=qk1C%`aGtPL_XTA1{WI0AYyIhN9NA9yVRLRsuuJhYwLZp`~H_LkY5`=-ZW{7+HMVze!E(G!@?U$v`xS!uZRbQWf};)NE)g{IfCI+ zg-;R({|~0~h$PdnDMWaogh-_lGF|kHQ4b$**sRWbRJA{o?_X9f`+(VBM{B*X$3(Dm zSlX++__2E%2Rq)C5&WvP4jZhqm+aiOOPs)Q*?}(WaSH}*2N5PuT!u0YBtk5uwG9?B24c zSO7SIQ+uh0t{j?`;BZbrL`*4*gqR}Uy}>hhMT&}sMF+8ICpzV>~0DP@CqsB#62M8GdEcPH+a|VQ~)^w=LAS)0+0*FJ1c)D zd}JLqjMVfQ1tjvhk}nN@_?MsqK4B;fzz!(0F$a{Mu|(uEbj@HM5J^$Y64e&T$#ewy zFBU58@_@UtT4#*pjQylppF5AOg$BPLO&->66R}pX{L;_C%D}3G+}WzI%Z1M32U+69 zE3sd&G_E@-%rXmt>>Z5#gvsk?L1#jrzm*|Kh`@misIxbqrN>9cEia`M6;Zg^4e(ak z0A$^<*w2{Lenzae^clMl2 ziYi?HFU&e5rnA-ug}wC!j^<o zb|?8UyDWUE)cK$-ggue`ml<&P>wAHrjJX=+3q*w}0Mba3IcibXEegbvswAPqDvdtm zFBbdR#+u!&e~O1msdYLde}(fMv$u8dq+%t~XGtC@7=o&L#tc%DZkIu9V9k%8kgHhu zZS9`yZC6mU;;v)Hy`6-OmB!L*=RuNe5C^XPsqjhf1NQ5D%Z&`?373B!_X5?-bX%T@gNl_Pg3v)osrGXa@QOnHd$UbxdHr*Ar z|BeNYqRlqI8v{q6Dbbd&mmw}uFD0T#e0mSpORFus?~RaQoxr1^wehxJ{>-h$o$C*` z{bJFHeLKeC{Cd9b*kCUQLGix$iNXU$3`*V^gM>;&(^Uo&lV6w>LdBvVVZ&K=068Bl zRcRgYuqqOf=iziq7tzOJd zyg0bPg8(P2e?1L`!>&unsrc=9>l=3|zyizFk`x*m9w|$R3xc9vfXir$jHpg~ z8A`vGWC5k*z-d7F0J%9-Xlpnyef+#k`X5@->g5Vex};x<6_gUqD9gwg5xB&o8i{pe z{G^W6@1$bTcWhD?h3G?Af2N&5;K|EC52;87acnITl7bNIB@_$Y-2s)hV)onT)1@U_ zwj}5pqB8U51<|P>81y|#Gfce{nBI2F$DdNeK?Nno^u5SYLshy;ODJfGjQ+_E31m$?%3y$0I_P+=72Rb+44L4rcOMD|#Sc zFVJUp95b-t29_&E5k#9q+BiHUtF7bMDcwfl4nIfR8Ioq$kthn2&|7R{cH{Jjak6zk zSqQgAk}~aFUi2Ks^IKS%!yyuloTm?rQ^+irG)q^M2QKF58ex^KjGeqYbtrWVwpIR8 z6_5#4W|+=wLW9kW&6b%In*izod{j}{`woW+k!1T!t!A{wrKD0H|KZl z!P@(RtzGWc>aH1O-n(F0OKtYo+nSkccaQOWVy?CAq{aGl4@?)yi23IFG}5qTsaU^; z_gOgLR4M?eySp3d@)GcEX9e%8TR$V`wU32mMqfK7Bjo$Gjg57E+F6Opb}y@e*1gtQ z`5jC9tvwQdou?^hm>b*{_?^F4yVW3RWJ}P!p?vJDyLIHhJaGPBq6Q5QD;W|;;c@f% z-re7?9%n$Z->nDD-ht}lo9@Aa6PfD3{(>irU?X4E3Y*-c+I~9E`Gp|q@yERW2bl#3 zw~c!ig(@Q^>5e}CaidXH%Y@m7y|8#|s_eJASF^*0K67p(uSS1MMZuqbG z^Nu_?pw6@WTN1*;wLZM{vXu8)+!{fPP`6Z{o!YjtS;*$tFA^K_fb_hj z1%4n&l0ak3y>ADBfO#g6ENi}+Kl_oyKf=i%KP-K=zXyC~?h)QcbdJH-MVarIeku

w8KlCT5eNg?WleMFf3>+&yy2eXu6M^bv!?TLXYB!~tHNH1qV(Z1_)jI3v%J6hJ&lU|RYS@y^CR_A2-Xv_PguXjJ;UajT%(a9eC$wAsB>SWk{(oe7QSiZ53_Y%ea>TI2#*w z7f*e7z_~&y{%3r<9&c%11J{(a&kX8+Zom`Ho%_&ot!>10=rKiwf()uj#ZnZ7uFWba z*gU=re2p{y_ueaQ&NTK>a^v~vXbA?UM`|H00 zW=c#SwXws)>#y#*!^CH|xc}F6%AwXW^`-8sFS`0=cb%_cKkMmEZKlPj#0k~c9j6ii z!iGidsmwbiGv}r6sQ0JH>sp~d-hq%mySc59`}z7kZ87csJw4;tj|vsu)m6T7x>&(9 zL@;W?n;(#Ez|n+hS2`b3nCY?ly??S1ge{DZ)5ExO9l6T~66tZMrZ)_HiM4Zd@KY~J zZ=iCy5s_L_sZY!eb&`p^wQERE7YP5{%;Z&O=ttET$mVaT%0yXXm+lPN)tO%s-bQzk zUn|Le3W4F`d&~mPz@T#D7+5vP3LbAoX6<1xP}ag<7$jj?j(4LUfYAK4A2ucOMGbwy zpB~!Pc+Btp_l9JD@cR4M;XgNg?uUNzXBYIeZ}>A8hN)aOkI&}|-XP)LZU1eOKeyTS z=vFQ~V&Z{oZNAke><|3P^ivE+IVW{TDUu62kCsCG!l`XrnN*kMX7b{>-TuD$N8g@i zL7{hR=%h@>1%n-SI&Wb%(VzB&z7Caz!_l{+Tg-nRmu{K!-)}|*IUmZuZ!M0EXUPfu ziqyB|W2Gw?bi=cJy$?I9`{*&1Hivm{I(P02@)z4LZDNhC@yG|tvO?zZ!0g8Owg=6; z#b!&kqVv!aiD|RXyNhKn$C?vtyZUte`-FvB(FO?$HP%1h_MfgttL+Hp7RlH8*=SGx z_=0 zmd9()vsHPmt+cGFv8}gxv8vjt@V5qWe@{1O!j?ii9`gULPZ4kfdv8-dm2S5^s;4P! zhd)ZU+74#?`$W>_zKhZ=^N}`bnBVoEc`j97d#b-t^~B8M)~gB}a{$0+(C*L6KaWAD zVcOFLu?RPosS}D#u}3jx_ToBEHZ@nvvv{(vvUxY{eH-91SydwL9@dikN^h{T*dGBp z9Ax7in!gyBXa#cb=-%{@Klf9aG3U?p5u3v=qm%ic6Uf1Ew^>#`ZP)$1 zeN|?4A8qKGLm-bf7M3*0d(mu41gV(-P#|*#%v6@EHA>kKlX?PiK8_p3!&`oD8A5ur zw6ItypVkQ!W17X>u=qf%p$h4zspx3y8_&OZA4iR1ZM}AjhJUmfF?&fmUMQNB=B6Y; zm$QzFu|w~ZrISD^xlPAEu`k9(@b`Ea%~08+*@-a&e9qJ3&S|hN)?Q`0gjBmjWmL)S zIsS@$uPjv-8`jooNWV72wvQARF;uTyxY9DE${bPe4-uoi9;0os-1H+sv5$a5dmB*d zqs@iUj;d3SooJl%9&(Z?Js_7mN+1AN<3dk83sv@s{W&a(wySP?vFw_yMDUy8xkJwL zq3ZLZ(n%H2ks?hr`H-@TIg!fz{fZ|$a{L_os`R%lDZknb;~D_YNvAWtFqA5hs>dO< zq}=GrfZ}tN>^;VfPVWLbQ>NfuRpnp}+q$My5xv1C=UyeLuK-Q?x(G*mSUo_|MN=bB7nC2Fi$&VX5 zxT;2lY0VC0PF{1OtK^qs&)AVQv>A+wnPTRm^?Xr(!Z7?)0n*BWDMSG(t$WG~S>0&c z47otukE7(VYs|)I+A6Rd3AIF+b2;d#J}rYGSE@{^=fIPU=CP-|N=6(@#=fn2umbJc z>+9%j3i6BQGwR;b%$PF|S(s*#Hrks(^vKCr$Q-JpEdxdt5S#FJq1YvOdut7f73n>% z8m*9pc8Bzkp25W4T3 z;4S~_b!ck>fF88ouzypu1W_3lAQ3YL6XO>T$5NMtu%<>qmskHC%(0K)Jym!&Az;FW zISR_27|II8vgZL{EKzhuDT=M#y%#MSAeA|~jD2YS+sYdo7Yl)z2Aea41D2f1vSug= z5kRgY#8aq>E*40DfvUkwqGuqZj=*DI);v%~eLxd5GYkrrIHMBLDyt-m3`rF&EKV-g zQT0pX8mlFVB(zu-_T_mr`ov5k8q;Se2`o6F6}lLcAizn`t`QQ>_DT_gx1uQI7cC;4 zIiin!L@%0DQDbt3lfYD`qM#~4EbHW%AZDTgTwwI6!A*;Zl+nj>?0@EXY@meKJmouH z$Nhay;N3eO+|TU_>5yBa{bR)(tRRqy^aLVM2xwWsUlufZd18cFlTg#t!cB$p4ddaX zR)j`%;O@O$U2V#Ct-9*vYsXdE=U5K%1=;i2BDZE`6G2lbV8&i#UDF<#5I`hq>Zw8> zCPRHW^NbT)RasSM7@uhHp}dV5)u9@tb4g7ceU{MZ(%+G?AOVm>s7&z;cqc<$g1}4S zouTK6VaS)`C;pK0c7kBsUy;1T4uamgUhC; zfQUwzsFGlw(#6Cu=%Rh0o(zLh=A7qPhyNqTLrLcW{C^d(+pRrrJbcpcf;)ZovguOO zg+-r*b_VHwJFvPF4bRz<)mLpFR@wIaJJ9;uF&M$>+Nyt{WRT#K>EEKq4f)+HC4Ju zQbVrrVD)5yU6UAds4LN!`cRb$43c6viyVzcNb&aol+MAC{hX8mW1>O;$^v}qURzosz4<@>j7!HfF(Dzh6D!kg@2w~4(1szSRF@#u>;7XC%!&w1)#SwDpK&{&ns`FCL)d@ zqF3X)C3GNyA(6$YD$0#}fB;Ad*(K@q4t>lbO?R*)2oq8#@A3Z%j|z(2K&l#RjXeEM z%t=eq)8~;l5F>ua6Z$2eRM9eBiWs=wS*L+g7(+@!STHcbq|H^SO?R*~2op@mBfLBE zQOP|Z7>&An1=Y~@S+sqAdE+r1atxBb;^`vkiLB~U%?|(|AVNXa&~y(0SXHUWtLHnq z@}>z`T7=(r<$1xQBx;x#htUdEw}}E>G<-wDB4$^PjL^3ak?!t9g2cTdxvU_UR2TG& zfbdDdt0JkOcQwRJ6tL9fM7_@IW{}E#9j<@J(eH|m21zvLMNaTV+R5pc=iRr{E0M<# z=qr;hl&y}ys!{})(|)giYllSWRal5$)-(rusq}xeb2qT*VN$7$faWtZbzj2 zwkbausp95Pg$H|f_Ff| z{&bpZDvQZa?bx61-b!pl978{^AT^+RR7E|{Q#5o*QC1aTC~$NiiDqE!#uWrO4VLE590y;aAdmGO^Nt(9`N?C5^OXkU z;=kR3h6?`KNF(;fqyLB>&;xX|p7rtz#2&o=zuN)kJ5_r_=%zpOb-?YG1F$sBP&i&~ zQSo4ZD(pSJk%8k|T`0BH$<38;&1~P^I&ML@ao<)!_Vu6hcL+{iwH-Y0 z{I)+&#oisDwSkE}@YV8Hy+iBa>n*@P+_X(0<|gAF3kW*S}bwY6owrC ze;#$2I4z~dVRpw;BP$Pjd|uFLBq`=EJEk$*e`d|Vf?Mg(o&v_z9I6(8=`6?*>rK_h zw22j~uWp_y#vaq((-hZ_-+2@Ju7SP&HggT<*Faf)mYD*Ot;H@&n_{Kc-=@!-LW@tS zK>qx`x+=_VfI3=c7qcM$iv^B)dXVdHq;;t`mS}!+-iv8vy4zqXx;JsNAc>0w>r{#g z+HOOB|2RiwL8a2G##B*(td>m80Z7(jYK3>H6WHmYSGb;WXU*N$zG^>k-n|WxsnvI5 zy;4t4G#X90xy!QB)NXF?zS6YAEjz7CJFGgz@o-DW>Xf`?(k>eu?Ml*~pkE+utbEa1 znLfdNLwwAakR}E~Xe}h6p}V5+l}|pl^ZuSrL;W45-#aG3Q=q@6>5xo^VLA@ef0#PW znL82vc{-i@U*jGdcI1ekJ2z)FzCV2a zpRY9i+)EJx&P^vU_AfA+{14$vgeUxT8Q9)$YvpCDaoYrMN;lmu=(?p_aR(K|>Ft?~ zHxoZqa0fnZNzN_eOYLpEx5T>Hc29WkwzwP3*zMs_bOY|OS|A&Yz4~tF9hBC(+mHNk zt8E(CA;xFxxXs&k&Q}Ww^M0a`TRB^dmGA#bI@B#@TRC2y$_c}#xA34(aziou!cX!Z zOdu^CuFG&Edw=Ym-Ais2A?O>eUP52<|5lLW6`(o)v_0S+^N#Shv_OU#xJE(WqU1~a z-?!}K^?#C6@pGLiOZ39=*|zdW%kTP)>J&_MR;!3oLDfJt|8Ky<<)UN#WDLR*1nJU% zB&Xwj*q8mw+r-PDEw_kI?Gcm~kLM~zqRC0u;Bh@Q6BTaCQlFuwDiP#| z6h8n-Br1i(O*IprbMzeh4}Jnh1qP&h`@E9PDj@oJDDPAcYX4yyA>(tY-(PSdH4Hl&3Z!qoOxwY0}f7 z_Y9py;&p7p^YfG&_;b0GT?N8LXrxpiU6d+LRFlvwV^NXGUPy^DxS}a&o5V8d>CkJ2 z9;;VX&DWK914UaF^fY!SJd;lWyB7#IF@lXNdm4*9u%=9tvYMZW{~iCazx?Za-7ED7 zpEg&^i7*r^5vICEs^>ry3b`nfC8+5lB7>|hE&1h`Job-#<$o@OA+N0%a~8GdL{|mL z*F!Q@xFSq2$d?Lf6)|1#MGdo5E0ssU6G(!Y1003W9 zTq%tKE&>(o_b=M*Xr*K(nVFIYQb|}$fS>z^n6{NRvW>s1=HCE9+wM?k(-J{(67aK=My7 z|M_IM6hGg3uhetnIheu)9~wkn&zLO~Ht3eJGPbYJ-S}d=|`m6`x?5?Z`z zW;MjJy?3U|Udf+*z(Wh||Jqh*Mz1wxkIFiYds`{Kc&tcjXlb259&vLsOr%rK#%bX6f^F zDs)tElh7eg$g6Dn$`9J`nqry8@HDKf_?}85;SiwJpIEoyM{h$*LQ{N^K@JrJ86Xg+ zOVzwbIQuIi`;P^|C{7Tp2#^u*)yf8F_$QTZ*q8tD-2c_}%+l1#smueyO+to0TBI;! zg&0yWfWST{-Sh5!(IbH6_1&ZX;dd=f)(U@a%U+7VnS^!iqrVsH2x{#pn4SH$O7_xm zwD)kQE-oV)r||#%d-a%~)fLpw!Kp%r{Y==nJh?O*fn?@RRia5UxwLu_6yb4FR*#~A zhJU`@U#H7T626**4QGZzl(e?xcx)OTjl@E0rdlB0PDLfoA^-|Mw05)f^>fxb{9Pop zZqEQF3~#5XvQ~YEV( zQ}{nGK2N~8=;K0x_DnbOisL+TE4-X|tW8!17;iA_u14QCzTo^t{D_w+^_lam8vbVz zdAGEw_aeqXoXSvd4p|S&ysb>J`TGvqqW^|_SExU zzKpaQ69+c@Xzl3dciB+FOq0dnZvaIITyh0sXv4SE!2%qthx~!>aejp#RXZiW#=a(@ z@Oi;EdnM9%K@f0GhA?vZa-E;>wruR+uP=!1KKypN>|G@EE6@7vdlM%$k_{dNl$_(` z{Hi{UZ=J^XITcS0E4w4^+VIf-Xf-qJGIVh2P_&4fH5B0m{AgC0s-I2?aQ9!^xEo;x zXD%0wH`jhd%oOU=Qsw0fI=?toXd0hM+gI#0gZaDizDS=y3@N8BHQJ}iZEH zQ}~1OAm4&vnS=)UQwZv_TY6zL-YmK|OSkcila%1d%F{pmOLXt>_v4#?@oR$3ZA?FY z48$8Zk;HO#5~(P?SL}M_Ksc=Lz97cG@FQ2JE<1p$gbMGOzkQLEtRUIziOic#nA$*i zUn{~-KD^4=&*~qsD}{P`y?rhXPYa=AdnRh#F9aFm`aYTb2vef4UAi9Tv>RM|W8o?m z0kr%R|2DVsbN2Oga4JwjPLrwOg$Ya(XB&MAmY}B$xP)Sv<)M2^m6)Pj3P1C9mO57l zKSP_Xsn^TEOhUx^;L00LNQismlyA`5Stl#JYkKnZ6@IGS;sAwTe>^mE8vB$Q>xQj& z2{r07<_+?s7_kjeY1orXxG0}|b)gyGdU{tCf>!*9NGYHUciGUxJd?EUF7mrKZNq0T z2x0OMAw9l_Lyk|O9JW>$hzWA0j>W;wht%|I?$Rg4RvN-G6*Y^V;D+u?zcTf;7-lf5Ap?W#6A>$>;GGI z=fHdHAkIlByq|{*9p#8~@KkE^aMcTBU*Eqy5^L8GDRD$K6n@I3HTRI2ouW$x3@N=X-C<-r76@RVA5i!a@>Ax9kLCqsGYJFh;{Z>8 zXvJ$=H=XxzmMrLfyHN7VupWH}lu+SEJWWmgjvbd~*Vdzpp@N~peI{z+TL-aB16E{spC`80znuMrBgjDI;*z4` z4nKJH9fTbYGYRAFZ)2Pez_R7N!|QEp3H(xPq%e;ACWbMH8VQ2ZQXo4@sEDR zGaaVpRs??XpOL-@8-QHT>~&-wlYdU^Z&uUAY(h=v$6xhM;Qb!^%Fdtb_Uv^vu76`s z)!NucKmR?7Uyn}cx&EZLr%XA=IERuuA&{&Ijva??Hi zAYk9UD09Rq6n?>~p+=#>3^!&Tr3Jv+4?wP84q+e{6JK5`kVnN^IHvwk_$8`$N5R6O zH=#HHMB^Wor)c8%c!O)mEs=_(%GX0Fzc9rGL=hi;D*B;to6rx2x_NvTr}l`PecY>D zZRIk)ho5g7KTG3;GlpLxdWRIO9GVkK18_Kwwbz)zeNE-0V*G$SOY@h6jnFmjPPj8@ zOPufU`Ncpv!l^>b0B)kWchB{T#PRYWdj1-^%a2I=ei*z|R)$j9h>I!wm7VPM*}F-o zP@WWKk>YhPX#nE5IqA6X-HHuo@^+7Ht9-vdIlI5indqG+y+X$xtE+Wm(>a^#^Y!mC zO!0!CrEO!Xaa;>Wi8xPX^SGslv*P^-Q&$77l=z55CHxDzh=1Fq+3H-L8cfRU&)E-z z=BA0x1j2Xp+F673!3n*-UVTUGFX8?C|L61L-kO34`b^Khl2~?6H}MU}nJtCK+B^Kx z8Zf!*`}oJ?&hj{Q5%ZsK{bEK5KTuWY6nbQ)0J=E8$lIWku9YoMg*AT9Eg%S*{ z<=lI*dy6c7MBowtt?Vp7kH80p%ez2K-RrN2)5F2h-I|1{sjvF;O-O zAKnN_PH}%pxQbDJT5kR>_0}l3gZ@ zbaw&oMju4waYo z#vgvkCkB!`CV%hP9&Y;-3AIp3Zo%B(n05K(3!)X5!=QLX2@k(Ax`AYu+30-$^d&jK zIO?8}0xU|%8-*s!vWlI54*U{UCyC&a$)*V6U7U;G24Q{BS&%cnw$d@ynFN+eBCC!_ ztA0cwA4~>WkmWJb*h?+weIWS^TY&dUPB#ce5JWoT1; zpr^niDwpv7k756fIYe-I;+TwrHOz$;KwY^R=VA{c zAR9sea+l~V;YYtAwKDAt-T-j#WoxWNQ5-P~q-D~(2tiee3qoD+Bfyu*1NPT!W9dwK zhpd-~R4&dK(Cj8BSIQ}MZQ_TPR`4U~mq#l->-9Uop4h)|E5r$E%_7$$HAqvD6r`0E zlnJ#dU?>X$4=9Afk62ZIH@>J3-~3MnmyjHPXCb`(`VnGCO9i9Ac=x546|K{5Gl2(Y{HWYEF#VcKLC8)I;HA>aiDLMg@H{enjsxztWs+;fCFA>9M>3FU~uX{a#63s zFF1df&SE=TCW+(*ULlh>CuMElcUK5@G#&^!0uoM^d1AQ@Z9S7Liw_hOzT-HDyq z3sA2h7hbAZVM@iX$y8qvS4#L0ubqF!qy6!9Op$#Eb0OAA%7Mnsj2;RAB00g9+Bl)k zAYUTtga`4C`i&=j;&+)Wf{N%^7#6OFRI6a`uSU6m-hv~)k)fwnW2ZA<6Du@M%+FWG;K|4Z9% znJA7su4T$+v6xITa&W30z-4nd0#6G@H?y7{odx`TX0JlG@l+eV8oo{|zaKyAD_{Ee zPar)Y{nCfe{ZXfwrj8O7YE_z#y z7kM<_BYAbc6neyVgAnR}@)FFTqAk z5zLVVOOqz%P`!A_sV}7bh`J?oK+yp@;P*Uy3`2}bQ({58WItX>x>!!I#}s)8fNuq= z0zcy94+50ZedbkgH{irbWf_cMJ&7_2-E}~TghMx;+XST`SqP2cm(e|-rS2Ch{ZYS7 z_DCLAqxa*HR5BTgqb(E8x@+22tj~cZW_Sa_kE2^a&D=NAA6`wjV_XafOjzfz${ida z!t%YvNxVXE!DH7wUzp3w+IWBTez#VjJR}+^gMz<+8XdI9tZoax#Mue|@FOeh1Ir9?eA>2z zbpTD8JiD`>-hX%H67IbmDoDj? z2fSA!-OaD$Jx_1ISKkrU`I{fBt+5;!5gWRkjos^^!u6TH3SxhLHDZ5zbv-{9)KXuS?L@K0 z;k0*a;aOCq1re+poe=V6nujR$H8FvNAMmQ!1$X;YUvo^KeGcwy}t1@y2GH2 z4WTSnp;Rn%A5RqJ_?~Z$_l};|Z8Ozk9PwnFLLi1{wT22!dScC|>4>+9mt}SEEQMlHBuoFu9v%M&u$(7k)&m5}|mD65D;U1h9v`HW*8^L3B(tnqZ*>u5lwEYmqSO(~KAVZmTw;c#9(2 zeX;~}4~6?|<3;o>7{~zlQVoT8*7Q<-Bqs><+(r?@?@9f)sIc88OA&fTQ82_4?W1kU zim63JVED?gN8s;mUHB2_N)iEbZur$kb;>fpAko_Xt;ks-#2NaA+Do{K7~ARx$hWC{ z*M7vS62W+spy69P(1Iv$`z7^I-kM*U7#G?rIC7y{X%*Mwi*>ZdRkHFWsN z4*j6zo}IIQK)cP!kYUEfki53g|2c`MSggi~k|q4X!4g1n@c2+jeabqBj*J@~*7&!NR*3#W^@UDWpDRAN0{+#3bWsQX!9?m|bWW z2qCX7na?pXQX6#9T|e=b;P0d-aO(+t3kg2aWQgJg*E^!h%$Cd)hCJlNtmCB;N+S^* z91?ve`~g=G=|xQ+zOn@IXvxKp#wLKnkR2nbDU{;k5=tUT*Xiq$fG_cN!X9vc5ar5$ zqp1(s2)#5CF(RCsI{A3QX=3?VSs;F7!4-0oT&VAe`X&5?Ra!*FX=Rm;LK~Iq{sqV9Y9o`hlO+&2{zk zbMZ4JSBb;DPDUUBWL`bu$xY>*8lPc)LuA>EvBN zD+ExK%qtaGTWK$A1mXt7tqRA)ND04K)eKFXz6X(YnKX_um7-iP43-HvmB&)ZePu~0 zv6t+v?})5E{Ghw5^QJz7CPcV5yAD>{&1OUP@u9Go{LE>C^i3JH>l&l7&Is&$&L zuFLFMN12zLBK-Dji&%nHLSLVHU3smLW5@~|l+t+4g06L>VfC3b3pDk5G@q1%u`>Vk z<74~Uc=DH&Tm`8aWG#^Nj{7+nsp6}N4GYs^hlF3;>R%k=Zd3KTFL7g76EGKWiUni{ z$>gQ7hM zt7^MGhBhpZnMd->R3vJwM@R+WnxT!>uOQ6fFDQ<&Si8&FIlpAZlO00aOtMnok50AFQ3 z)n$Q7$Bx`4nfvaIndSTdQ5BAW_l1MiMqDaxULW8BKXA@Vl6|#*|D)3b03$PJMF0Q| zaBd|gd%wmUYjaODO@F%66|eX<5`w1}$+ET8JJZppf)Y%7ylGq8_r4SX?Dl@%0c`j8 z_6ECKK0aVdeJ=t>%IBA<{^6?}90GR@! zA%MHSD|_#|yMJ@5?e}}j=hv2#nJ|jp-Ob(Z#*o`wnS0w7uestz#>raD6@X-j_=x}z z2mv2rl!UJ*S%8QUK0^G+c-#|VPpwH+fd*lgx|Y5Tu5E?EH-V_e2D_eX;MXto=2+op z9i;7t)P7Z);rm;y8%=LE@D|B%)ODeVy17Tt9o*q{T~T8uqKGgY%q}X{s75;?BTT$) z>X4a4eMo@vCXcOQZQZML+PQCXqJ|Y2*00gld{pN12PbKouf^#S6-| zeW5@!mED)!Q&z=r3TWJI?YAtt%UOzs?)b|I4m}r*+CwXwM*Y3;VCh;S&6aj`=cK%9 z!7lliq}&jNmJPYUwr^cO$$lvD|9)2K zGiNYuXEETh!QW@6!?u~i799lcj(qGZ6;Z!m^73rmkGreBa^~`NzuIA2TzS9Cb|DM~ z1Op0HGF%gCCXrXyz*R7gI8_EUen;tlLm#el%6I>-U|uUU z5<9hvD{4bprY|=l9IK-*{4>K;jpiedpSI4N1=667Yc8S1(!fb!x$qLSWG%zz`NB)^ z)Y#@Q>evQ%a~@f6E4ypzQ^nGmt@V_}U5V6rUWCOLmW)|XMq|Rik+K=ak$iy`0kT*d zusVeu?nlFo0v0Bh6!=lN=ilE?@etunD8;RV_yvJk!-BQ!ZtbRae@(ul)&ob*PCB!; zP_VFa+`KAZPWo;t7iPZ5RkDQ`x{|s@K2box84QSb#f;uwE?{!`)$a;l$C^8Ymmxs% zGL!iTyk;_~ZcQ#-D*jE`vam*$MUe9aLjbOCR;i0}Hyn);5Im2U+ppX6!GUYxFjH_` z<;qMD;a9dKLy~nJu37HRaAjS|+1J(p+*QR>d<&{yAGqcq!kZ9=D2~&9w$%N*n~O%7 zD2T8|6usD53C+EeRhV$h5~x{Bp|S(zn$-y?YbldclJ`$I*91W5IiFMeO^V`BQAGgDb0g)**mBn+pw02}Pq;Xr$RF8Q z@ZlGdrau+Gj)C+C|DrDB6lLH0-l;YU=w;@JS{GYQpB09DL-dw1>c*fwzf9qSt0zKV8gfJmnq9P}%bG1w0A%dH! zz5neNeC5nx?9W{dE2Y~+BikqOxU|CPwqFGA1BF>%{k(jc=^|&!7Gmh7__)j>=ZJLx zxE2z^^iKIw4S^XuHEQ1g!l5GmA-nH5qZt?Ln(RZ}>}}TnB$7K%@>9KVrCifHoq}80 ze#_FrR#|8(p##5Gl!cv}cw_Du{%Z`MrePm)(1p4xL zO-XhjHdWNFNuW-kL_QPcR9^P!W6HM>iD z=efm0B=)T1Bj@KAJx?vBu!F8yQLam>NtCo%$&8g&n>l&w?i+l_b&-!DtfQ1X&kjmqFTE8YG2&9)JyEq`_|2- z+O@;5e5C*MZzeBFO;WBwD;X=DL~WmQoyH)CVGfF{U)B>f zX>TJ+PX$Tp7c(!&B^X23tZ&DtYq0BSWca7m5EQvPw#AORDtX$!%8Zc`4dSd=14Yv{ z4L+1paFnt1#=8aRI-eer6fX)?)`P%KDyF*anO%3hX|#%?-REC6d$Af?*((*ldzNgV zKlvpE^xoNXRyHu^Ihr8SER9MsL6I;gGl7U-VzH-^=Zylrx1M-+x4`H9NOA zZs9z2fx{PdNv4wb^OdJ`g{1Rum$-_XJOl(IWLh!tVjYm6Ib-M~v7&(N_bQN8Z;-Xm zWqYd|pFFM^^buJv&A6+T*&~_-k_ZtgW!k3tPG$T&?cB=br4FxvN9|FvKto(Hv&j zwOdewg#j4~W11b&7$jM*7qI4KzPuOJzdA*e+iA6~>v%Tywb=t-Xzi5iysb)tm1h@O zoKq<23>AaIRO`b_k9JnOJ=P1av&`%v#vuLZat<)sVq-9MaWsW{x{P7*Q z4{8dz=Q{d$+jH8Qe(%y2@vo@mdYC}wiv@Poxuq!Q=j#@X#|59XR%IVWQl6fYq%R6o z*z42jt9$3ZbQ2_cy!@Tl5@SlOCV0RCbh<#|+->QVBwyvggv?b_WmU!Jj5s;R9!PR8 z3hThd;8b8%N*OHl`dk<7c_%hap|pX&N(D3Xa?x`_tWJt+R@E>jX}Sc3My!fGq2stL zBN$@R45$jHXC&Q=f;`qo;_RBIu~^~hi=iEU?(J?yM+dUc-hb=ARO?aAm;<3ivnXjy z0Mug&*cPN4gs`rfS}h_TejJ|)k~KF~^%=X}-mP0ZMXkp#^5yTglCEU6bzDy{#tO~k z%86Bverp*1B>n6Yn7k)T#oOqSIoTy7> zBHdx@$7|G_L53#z$8$w=(ChY}w%PSDIYmd@{k0bl5-n-79w2X({jjh)-P$g{j zgL`9s>?LK|Cg0*O0+MiFjg7D1Fn8r}K5=2a{I>tUvZDI7embMQdM}&Z?U#H*UUWWn zT{qJ792Y8EqGr#$Ym3*SIeIQ;y=Swld5)B8(}88Xx~q$2Exe^Rp-G9 zFgF%UynCC5F2gtt`2tQi{p^soI$<@mQ!~8YV!b7j$lKu6U!&jJ#kQW#oA|dX$sOxe zbuvwgS{F zt@S=D8NNway!m@C?eCXvt%U^7n+~G6=MH1U%`UBTCx_JQ{IR)px8zNv!jk14H4jy& zVt0O-^*&CV>vi}rw)8bijNL}{Qw_(Ui=(ZORCb2nw_ zU+wL1xiUW$Cl;o#tgy2=isiMohzYn}3h?9QEqIjslJJA}k4rF2w?p_3*&ep1=L4~rzEwlX@T}ut4~<8r?kGx8;1McC+>&OC;e(4%aD4e|IqlE zjt3Rj>pA{-cgvh=-*I?8^R(Xy@psPW_0QzHnIJvTzyHY2vBh%ijBqF5@5y;C9V_&2 zylKO4-qU*moDj^}AH}ug^rd!epn;O_ml*rj4c*=KTZd$4X_eJ0py>8n!n{b0rx+d0 z!__S?@b%P39ne%0Y?-Ri?#HBDzb`csD{ZA~D)?l`po$TXDF zj>=n8l2g8yKVCN;lV_v;s2?VO$9Wl-d%kwhc8zZMoi>`T3ob?HpbJ}TGn|L7#o3c4 z%NoG5Ea|DKXf-n@9drCbPw6%83tJ2RCo`MNZ-?c4(3OrB8DaN~B5h~4div}QUk&ix z=f-3$T?=G>J18{vRxhESGDPUZd?^`m4$1%lz7Bnsg!PT3%%8QvRAk3#&h;hsEw~H& zdYyE_1)H{Ok5uxA_EdlOJhO1b`0+>oAK%xV5_D&xj=26lJ-zQVu*F@wm*0x>nF^3= zcT2CrxleW3;2Rg%{de!8GNVtAdGw`?-@WoH8IzH{Yg)pepI7b0F}NW+NSX1A*4wAK zthUjPVs;DOy3C)JE%STsuJs}8licZ1D>+O$c^HfrS5kNLkgx*f1NDFN=x=|$r2J-$ zKe`(|X-zjfyf9hiCpIa?%X6ht}>_<_9C?OmVlabK+|wqI}b=*7QlU)&Mm#_&<; zYCG>t#3lCdg%#WWugnwQ3* zSx|oSVo6L#sf`H#evG}pt?Mgc4QKwB@&F4%vJxCs3~d1IA_@#+U&$X__wru*dKlFA ze=|E&|H6#nGxIGSn%^62)Q(PG_&hf!vH2RwMKGLA%kQ}pA7?pI7ll^`4^QPvcseU6 zgio9a*7tNRLbK0&{(p(iyi=Fo+MLg=a6Uf?i3n4pfO@`ZDt=5)9nUIJS{86l(acd4 zH#%ZvTRCc!&VVx!T>wNene{!XL-wJXMLe1(YhDo_j%e}p=Ii%5C?R~m9>1}$;8*P{ z#ebu$e>wt)ZW4lNw7)4MJYqfLL#%cFzHUFueL;s~v}^y=V*Xi+&PYTi2KAJ?vQ{qM z^XX8zJu>_(#%$CbzZ}K?>9T&O%Mr?Pa~ld9{&$b|u&mG+pGJ5k3d*oh8Fsm@T+tT{ zCtbVhr_aB5xs2(Xh$Ab1IYa^}77H_TXw&4H<@k1!zP(K|;As(|>*}Xn2hc5AiC^tr z^#S4UC@QpryDx-QQxo9q>edf*y`zRX6Du2+PkwFbt+>gVnl8$N#%7H2dAO#rCNo(N?N<#1o%#Dn?Fc zJJ}vj^m13)a%eSpb3Rn#=AERf7}*3bTe2YKqh34{T#Pb`M^-kY%slB>9{NigIZA$u zf^T`ew9)@v1blrxwfxK-gPtz&(;s8`>gm^+WB;=S@(|8AO2NPdB;xUXe}TVEDtT|PoBr%4sb1_<@zJ+pm&<%IEh(u8nCJc9 zf#{b`R$l%G^6K69^Y5$Q3)r1NU9DZKhR_P1y>vP{#(!pc$*50z*Vhs>>E6|A%m7{K zg;=$W8$R`~@D$(244UR0)BVpm$KU-a9(9#_`R!lU8Q!Yhotq@Wh(%AK-X=Bj%WBYn z$eqf|gLBAlNmJP7Q+=oJPxGjx#J;!>KX}}|UwJGqbGvDx4N}ki*8diI5ypy@c2k`72TX&Sm-P!K00Uo5o>-!J7Md2+D$YG1U5SN zdk8d7w8A7=i&3c_nN)fbCMb1#WM3!~Y4MR`qIaENJqyD=vTO+B*GCq&F@PWpSnr@^)`D7S+@i7Pk)Bjm=9;h&8BHvVBEueQkTLA@dC%ziLJf zh&hgukwszGoP1b6@9wAW`JA|C?{~7*$G^e~k^Ywqb%*aZv*^_KohbgpeU%)BHpA%L z^XEnE+AzShvUgvDcltsEX&qP*C@*XI# z)OqB6$R-TbbwBbKqO9=L>fDL^GrIkqLeczsrvMtNb!qU>;kumj*`Hg~o_x|j#HYkHA4P3#rAX1}SA+O`bnUnfN63*&0~Y2=q&}ohq%(YcM6Z1`a0cY^5OyM+@@vn$pnaK z+6ay~2RT{@n4uh_q)y z!;G3$5i15R<2hBjm|r$$M|Iv`f4?${fO%o?baY0>$Ka}1R$QQ5&I||UdPG1}*p=&; zX|}vaUsnxH;nmeo*_K)dvNzdpzf#}o^ZpWAx>je)JW;A^oOUJwNGkvYG!xbXl3|)a zr4>_&an4Q4CU)=V%DrmQdlVbOLy?4I zSkW*rWWkQoKxl_vN@N8p)G%h{iUCZ@gy=6&Bf8Juz|3zQzCjqD~2hHmLL=* zv+4~p_Ldz36N?6b9p|nb*P(Q*sJuKaa?zh*#Zz6Td{o%jQ)JbEEJD0%n93*}3I)t& zRjH0$Rsce@3{FN^(fVGw0W`Aa#>Zwx(PO_7V;v4|W@1Un+gMv$2L z*l9SwYcunRYytbk17S|crzl}r0n{`W0d;9ySIDtd8VrIk%h#BYSreo5W&eC*r&(P! zIzph3@iD@m(WZPcS8`0@s#qBdL4i!2Fu+8ZGnxAzn;u0v^EPa=62K5CD&zGwV zPh6mFU(k>6p(p>ttGCQC{Lu-Uwsj+k8mxp<0X3CjgfJZu3;{wW%=0j58PW!QC#I*VQpH%EHYxBtZz+mNjAVof7EC83iA~EDR8hOthsR#M+yeO<=D=eI0~<@6B9bkf#|DZqU3#bopp7Swf`$2RyMlNo^|OsRy&5% z=~EyQYo+>#Wk9QoGS|5H=U;7iN2soytma@tv}klb`#+R!@;)WP-75^<^Ai<_Fh@~% znrD0c;(u&FrCa>Qlxym8DmOafC8HBItzvXkHiBq`6U-ii8Rd*mCvEjcUmtEy&Smw` zj3g8tSQA$FsTZ^p5HvX@%v2Q!C0&yhrc^1!2{W-W=Eo*S(a#s!I*FllU7lwN!)tJm z1%bGA6<8Ussyw&TavMfuK+x-5onLJnMU-D{6W-9>R_In_V(d)&INIQx5CWjD6*EMx zOcWB!XK$K5wm6C?;BG&WP;_3Fb(F~l$lR#y4FF&fpki7=_(U|-<9ZyXvo`sSJ`)ts zZe)>hbe}nyq8EntT5-aeV8&Gln0&0a&@4=Rk~`n%V~(SP2K81J2}T!|dm<(_g~9?V z#?{xX0=;-(=rD|FAhyXDKV##(`6oD2bGOw<=sU7~b9Fiylu;SVm4wj%C1%HK1*YoM zX9RgO$S7uyEsmlJIJgK%D7vrBHAP{VTwIk_k<=N=aM#A5Y3m&K1So_|Cv0{ceH)Z> zxL9P4?l9+a{DznyGez7Jno%)1#j5ToivxIY_;qr1Y6*vKM;)iYZChITe^(5Qn`sGfXXuK1frSB0Cp_oM(tEKCo%zLQ`XEM8yrP@ zPlpamR*&_~@`v7y&gpVWYj-ZG0yKn7*j*yfNW=n~crL7s(>I^k$SC^vm{{-7EZ>rC zbe}y+E2D_2Trsjxg^_?xwwZR0bL22tXe_hGHk#2tV)($jc>&S3(G_dO`hyD7DVGaF zTq1A-0AhVyJu`%7O4Q7ctv93p57!qorIJu|;GS=)#)T6L8>^gSD9bJxEGlCPMw}%X z*nC~GxnrZF=oTUV@ClW7Em=n7ay-i0qTtgh7sN!_Rm=%iWpGWw2!t}RXeLmT77JC> ziRwBd1Vm|M*{aKgbxOlCja4iV)WJwK;?4>3>5&U3(Hpu8n1%l$)V28~Hk&$v3Co$0 zz9X4j1XbiT#G;oKMOsZktwSgzz);fW#>5jqC8?lH1)!#lP$OSmRmf*)nwG@fh?{*(v z?{@0Oz4JXk2A7~*8u7>JRq z3>vw)0!jE!3lX&MV>)*KH@hEh1X7n4q2ABF{DJvDz>1_ae;nOOz7grGHqvJ)Vo8Lh znLq|-t|l_$HiiPMV9P2y2G=vcpe?E0(%lZlf242Q;&_yW9JBTzANagdd-voDR0uRK^0zX-tSci&Sf={!6zybQM=Y zYA=?_xJo+F|MpLluJ!xAe>&0nKg1oTjDs?%jKm-7-U@uw{al z0Y8o`mVZ^2?rpbs<)EC48UH=Ue*i{i28c)i&Y%Ej`SwYLCdfW-)21<6k}Lf1Td6MJ zrdARK-(6Bz3IcAnVTQqL;eMac(k1QtrF1~T-aFGnw^JSfO{A_+wijDWlx z;LZRLCsKEJo@rD09y@lAu62I`Kj|wk8JvWMdpi-}-eh3r z9zsCf#|gqZE(SM~An&TTxS_aLN!?u3NzfvcYZDzxxbXWjuWq+_ zn&*-+5qB#4pXxu=egd}%@4mFMpm6r#qxO~67H;-%ynJ=H1~=D_v%JSF#NR(x-CjFn z-CNGAC7+JJmG6CF;bo21v5m-=hn2l#-MYV#dp*YO{PA&xf$C(xY{PD?&STx9`d97# z)z|>KmB-&fRpTC<%chNtS3_p~n9g5$KgN#_Oz$6{BtdbYacB~tAgEZ;A_KZ~9X?2FGyBzjdy1yoZ!5qBYgS}(_>vqJpL8p9bqwd(ZNnRcgWPj$4&Zvzh8r2 zINRGN#d4pDEyg~*=xN0IF&pEZ{ox<&BOhQ>z=zpaXg}Z5{noCNPUQD_dH%egn-q;{ zPBrL{%@>yB;r~+m)_6tY?5erWqxcu?LOQ2=%1QS18*RM!fBC;WKDiORz~f-2#ByGd zbmC5-p_GZhfyc2$S!R%6kjBTzifwDrtWXP{+ z?DVt_x)x+pG#fXRF9SEzslIis8DQ#HS@^f?r@m`9t7kNy?&Q%7F~kP2ZV~iNsljs& zM|@oFrEf9#KKYqn#4NY~o$+0H-fj`6?qa~u&*FCDeyctfA-IkQ?(^ELw$Pqn5l_F2 zlbuhq=fzRk)F3PV(=S(i`BI*Zy~#)lKOeb^l>gYo9bAvYk2T-iM=o8$bA7(})@SPf zd2_@5c?2)`dDLodgCgz1ozY8SE!?LyPMt@oi6qW>_q=bGi*GMC*Y0S0Ap!oy3D@n; zATh|3o^Imu)G0;1@2TMO^Kf%)X7V_`QI~s@o6Yuk+hUx6c5o>Q7wDJmJ4NP$kna(cVFo`lrV;)STKU2eLVS_Y(24*CjpZl>>j9hUo z|ENx*dA*p%XtY?pIBC9q_8Q~98vmH$ZROo!`Nz>AvHodhW&XqgPI*bt0B3)sFG-?M&-VrUI zrdr<5_i@wzc6G7geRdu`@r|q4pG?akYctpWEnRaROdB_rFoK#`$NS zxPJ?$hSN6;;C$Wlao4WD+2cm#f!1EG4HO9ol@X*hz$F#lbnegdFu7TSG)*`Z zKAw7iZ>MU;*!kz5MgxxgtDHd{_oCmpu-l5_4Gd^Y9m@N0-($O3v*^a!{wvPtxAlK8 z($J9A{WjIL_e`Ask3)RaFR-x3+_2$t;Fkw3VSBb1!12h=^7YVS9|G?dGCO z@%r0rC|qmp-MJxn?2|9;FZR-D^JdLIndwEZ-g?gP3YOR-#P8~Cw!W*fw?`D?R{i`u z(zOi@d$(2W>f>yxb;maGXWBJX-F9vr!=3I{%~ubrZSsw4I!$Z-c8#ErZRCxgi{=k7 zE}pdKpw%2^qwtk=_kI1bbo@eCZRFAvPiF_p*a??|wU& zb2?{bCkxhh`6KjJV#cdsg~e_7=|A)zLf>{K(S+g)X||c#b^^;s&hrh6{GAPkl`boN z@A#Cci&kOJwl}2TZl2grTh1EYJQb|*t9XICo~etuwc1_~_xGe85a!x@aFUMvhLtLQ z*wEiNf3R|#k;DxBfO=$hkf*07D7An5)pcL`K-m~AeC+%T2RFs|SJbE7UZi7=#&qt# zE3G?q>27RmBXcgcJ7i0|z|1`QA>Yu`wY#^P4^^JKOVLyICOFD$ag`o!`P zzmfOo^(RXAaxbRz%df?i6n(#a-1Dlpu_H2{Z{h52!39D~SI?(pZ;&|icA+G|`nlM!LI^XW!qNqQ81@VH< z_P~>lIn!Rbk3(@!9Cv-ZSlLIrUbi548Gpe9(aKPEUpbZX-twIi)??-tXwEM72^)8V z!mhUpH*u8dI~wz`{@hm=L}>TI;<)w)wPgEY{_5Krr~CVTM;9Oe>%<36CtEYh%e+EJoO9H_@pZxNneD@Nji!AwK>xiB ze^0t!JEG9dO+v?3o^T0Zr6HcVmgR7!lSZI__Efl7C*d^?H$ImF9ldw25=}borGV9E ztdnPXiZ;aSI;ahEqmKIfb8p%s$h2v{@jJ;F4{5vM-sh(7xrc#oy5j%XbL1m&8GB=U zaZAs7?R$>VPoHz$<(Pvhm7>M+!Ugz47oyj2w2>+`9Ft_F5@m|!;X_x5qAWnzgK{bm)ye z?Wj)T2e|7`8K750O`nECBaCJ zFNs?Qhyytc174~qufB`^s*&v*V6$wyVS2nkU&B40HPN z-1rQ)e|XwE--q+wH4G1Zc?$JYxX6((OQ${?MYyM)K$)@-7HKjJ2JdwBqzbyEMs|Kh8&xc1 z>052;**rTayVclQuj&M+5GDg@kP2t5y(IICuPB18lStn#{f6O<)2&F%xVY<&_uJF` zZ0pBLf1?v}!hNe5N*|kh&0dG>*L^JGsRi1pZC*d*L&f^tRn^VU)hAt7HkKggXWLlP zi9l-{$(IRA_qP78OrPtB*V;RUChzDY+xBgbI#cWD?;62|Ft)hopCb5Yy!~133gzDjoTeZm9r@Ky|;k+kU`P7xxeSP1EC}dT8$-fNQj( z!&$%9cMj7SOz1ecIoaHezTO&m&sGH?cI zUjO$NXq>aP`eM*95A*D6N-R?VCI z^Uo_LZMaTacXj*R;h!7Dc`l}|Z`Jg04nduh_f6+M``qcD)EhY^8$-p3Rjw2A$CUq< zjNBB=AUJpHC&JE)_tHMya`6u{J8YITUEyF}Yeel|O*0z)Olhj>T$Eno<&$VbZGZcK zdstgbf7qY-vER}CZ#lY49sHlHoVB$BzJIAf@do|VXpWSe(7H>IZEcQ>DWIDD{$;M6+Y;iuP0?#a|uxO^${N?_gV zCnr;I%U}8AS>aRnIsKo4DE|N`Zt7p;{&Dzuc2#>CewKN%mR}6>a<|hqFz^fQXAGaY zE>oYoUxBAwC%Ju7G{b$L(l6X|%$w~|LCjw2W*&}ecpVhk!N}g+J~B@7eY(6S%y+!RPZBo?^g?Uqa1-xMviZ0dnO_@evLM zhdLr&zzOQ2wI$x(SID8j2v8p-nl5zBd91rvZ3zl53vmd(<_ zK#qSxBYq0zPzK|=1Oh~)&}^RQ0A@HSbW%tG@fMeGvfyFUv$7hXrOP;@zflpt1^H11 zF5QV^^U5RGuBb&iVXiEBFfhTdnyC=}Pgq&-9YD*rX!Qc)&R3OrHTV^3|n_~UM{s}k>4XBk}m9;?}{{%w>?YhFbflU?*C^5>wwD{t-$XS7K;*GDI8>%2Y zpOCZQvSVA=%2^2Lh@;;qh~Qs&16-0f#Hp^ZCaBU0t1Yaqn~2o~clP>jYBU&5M$=GSQYOa=az^0D`b zgM!WgDvO=CU^9SFk(`R8LYaV~(WUuA{0LLwna)| z_`M8!Ebk-fw;MGGr{@v=EBJ@ydwZ5n+R{&!KHv^<+cPoyWXK>eEp!G@HO6VGS{#?k z-~>@s=r7<$#jltHM+X5QalYye{5GU;79bSZv91}Tcpe(&gN@Tlr!p@=k1$`s1B#y2 zuvFmg~UNlP$iw3+i{3_ZNp!lt9c5SX2|3$O$2hsNy zG`hg&$E{LCP2&>hnWY?JlE#ZE6j)ag{?!ofPiT4Yb}eT#7Y-uMyZW|#oo2Yg0P#69 z5xM{hW|HR09_hv_*wBXv@O$G`pa(YxXfQaR{fmSK7Zf&F$czXRseo-FMCDd(it3$Z zE7}PW4}Ldydnlfdfk_AjE>0$hIlt`Lb`K(B<5)Zv5F|mT5Cg%FC~tg8I7>GaBF+Z( zW4ey5gryN00GTxvNW^s(NE}@`lBy9(D)<1S&}{1#5$9EXV6t(h%ms9MGitH~GnLyL zI;BMLn?nReBg9wmhvE{TRm<0~oY7wyi#QgowTZ0++(8y%nLrpzB)8jc01@7ts2dD{ z@FVzD>(Om(6QmEAL!2pycyLnA!pwe{D4vI~;s)~sbsf=XE8D8IL}g*bgCEzPuw!f2t*M9xQFU^-!xUl#QaL4L1A{1ArxW7JO6gTY zNk;q#eibuhYi(#vLoBpM!p=7zB{^@>%a|^V;|Ik~B8t*8D3q`Wc#vB_c4wsTO zu~J}`>lh|7S7EE*fAK79`t>uqvx4G$Yc3}?07&xh7}A4s51bAG2Bfbm;t9o-q303$ zIrzcy?`G=)I3LW5p!TKMNu?G88DiQk2wk)BfG`o_x<-I#KSI6*q}RNv5J3jwCxIPU z5)z~^F%MLtF030jC8u3Wz(gOR+=4lpoTG$!-t9r2mD-UZm#!L^406fPn@kTJhNwrOC zF)@eIm z{0Pw&U4T$tl3~#UHfn-l25~!o!1K?Zs82!5n;?Kcb;v98U%BAmw9aP^_ay3P+U0beh;EbMJ;(x0xc{O;RSUIBDDzRX2p_i8&Z{*}S$GBn7 z75WQ)I4zy$7QKi9o^$%s>%tPusR9gRxKdW95dcuv95i~&f094KUImiC*S4Qe^Yjt> zNol0NMqTiQ^_1p?n zaaQ0F7Pz4-!cex{Jp^Y|kMLE&gBNt!qM=A)p7?5Kp0z+a0-?=Yw<4DPu#HSXe9vbr zl@ooLtFTw_ThoYT?*8BSR${4jjJ~d`M=U)+Ld;+PG&kzP%~w`d*~Rkd_z~$UE$!wl zdkc>(89Y_Wyd>Rl*hvzJjl%@GVj^r%0Cqe{RNUY#>1G+OY7zsGTAbeAIs=CIL_z|Nj z`zVcFRRVyr5LJ0Ps-o=Ki6K#<0Ybu+(v?s;kT_Z6B;X$kQu+`O0ssR5GgM?m003WQ z=hQ(!aL@#*dzEg!&ZWyR%gYp#?eb;j-N<18+xP4C<8ZZ+X(S|7|1Rmj0Kzi^L^J?a zU;tzc_9O)X0qk`(CVoc##LqzJK^JWRLTHG{mWy`5gX4BvFNDOtH^;_kmA!oeq_yo` zF3ZVyyd$Y?GQB=TSvEHgZz8dd$Gc)=a^q*O9v^$jG9dcUMD?D^(C-LXsbm9>Kr=FYL|*D_8sS zIbK^ZslaT)b*5JT_OjCa3;rU!{6IJ^({L#Bd3{BxjmQmA>JRRixF zi!k#VoH^W5cU**z2fyB=ycE$XAm_+fGi?kK(F|e;8eq>BftvjwgkT^AfN%#xgRGBG zkHH2D9A;gt{yg73jVsmtO!(=b@dnEkXyEh7zl1*r2OdNxCpx^!mS@Vg?@f_TRb=YPvwXAJ?~=VnXcC90aoC;IG$yiW(5Uhx6wQ5Kwb`<+MRdkeuVrD zIb5?C>gMFBnMzOJGM&79@fo@5{#+K3)YT)@Nd;aB$YPsXutrn5riM^*VH{H#o$lfP z!7tYHmST+rk}m*ipTkcgehxN1xf};Iox&17-%P%+u~r>K6l1xFL5-#vVRvxv6Q>BOaE4s;D_uk< zd>+<2ei43zeGF3|+B?1^3J=*-E!OtIxGiPK4l=L8v#2EhJ@pkhx{Qgiu6U=0bJuzq zC&4>%LdJt%cghAc6joWhH&_xki`X#OnpLS41Ie=tvpTGo=>SBuQehI!n8Xe5ehIV> zLCx?ouCOF-7x7@QfQ=0#7hwRfU?bQKjAvRc*!D(8ky#qv{1R**97(h3N~VdC(>B?; zl`k4I3=EiY9j*&0YR;{{sSTpQV~MIuXSTfKC44>j&pvBAn`neg1%tJ^Dm6cI=z40S zBW)LI%u#lDq1lkN5o$g7&LfW;MU=Ak5s7h3v!k=rCRTB#oRtvWkPNFF*9Zh%k8u6L zVr1{iBr@hb<)GItZ1sk98WR8}dE;MS=`;N3_Mto}>6+pvJ>W5<-d_$B#2 z9r)?=G*|dV&wBU31iUz0OksojnFaWH1Y)=VZQ!%At+=yxF2Olqv66hpOGtn4WHQfV z!NZfs(nBx#gBPH4g^Z^1L12D{C(2VzgVTRzZK{lBc}NQ+eHILk`}I)G_}g_k%>>KH zWpU2nPvMEufIOg&pJ-qz@JeShy1*1FSZdI0qTNFN>L|u*IDxs?6>%dZW$=yYpTstg zfIeSxizte#Ua5={lkJqC7fnfasu8JvUDN1_@`zD{^ zDpG7KMdMx40U5Ju?*bwrKSD7E63o7KPCkIP$jC)3<>lKW6Em#3J3vit9)Q87>YmgW z==6v#73%_Bk8t(DLiG3Gve+Xr7}At4?L`K4Bo}#O9piVR@?W$BVIne+;Gx`Xqvtfd z_$B2$@#0}5!OOL+5gP`3qaJlI)>w<#E~1rLCzQ;r3FG@MiUGqrUqa7=Tm~4~cNp?C zM$5$XL4Tix!6DBUL8;jwLsP_b-0W{!++(bIx$g z;;jSRl~^h-66IyOA0g|55UBKz^AWpD|HX@b#>yBa*VFXAgLYCKn(+0B+uf?!v-qCyz$Yvz!>mVELC{4($(j&HM&10UxD zc@bH8gOmlcyjuZm5?o~q3;ivlcTQeg;etJFg`b1pq@UInjl7f(?L}y%sR?UgjUfqc zvg*MgHXutGqOFUP@1EZvKSEIk8^&q(U#prNen`w__OXRA| z(oP5=;72*i1_a#JA&Sz@0ifSmCYoc*sRn4}T|Ro`cjQhvJFGxYyAX2lK#sLS9=F_y zK~`J=kP^|UVDl=R->)m2jzbHTLDyvMJY{0Mp( zbD?B%;mNbw4F12NgwAT|PsTnr)D%GhRrn}b5o{@fpWDX|=-wT6m*hzKRNC&~7 zkEBf9w1qRRH`VX$xE;4U`-~e5t{a?@WL`RFpHhzULwQmT8LRYo3g%FQYfRR$@c1wv}^Dq$9St)UC6+6tDD=U{lh@lT(OSkyxNBG zZdY5RE82U_CM^hw8T{``VSUI~+GNAMd5Cmr8+HsN%(|I6LJy~Q4<}l-)%Fj=@2LZI z5vDTuh3bQu_i7;m>fSbow$7$o3A&)Fh4xO>+XGccGwkBFO=swugc=Nfd%wp)SLQ&s z=NgEfuDxxccb7b$$f)JjM&7vNfTgt?TRYjg(u!~g!H-aveGLfV)`v8duRnzf-X%UC zm!@nTXO%0oTr!U#`?`gcgWtZEMppSGDLeudlS&&u3JW@e>c*S4-Gj}A>N4wNPMxpI zk>1|jxZPOucbPYPaf+@)yzu-kM;Xj8Y+O-U73pAKnRWsLc#HL?-7?BJwwQ}XYoUXi z>n7ziMDmEMp_PLl<|rc-8v`qecX!iOTmiOJwT))RtlMTiawB~01chizj(%-({oV7f z4cmjibCkdfhn2;Rxvfn(ZNd9M>pY)NzuPeqh!`GY9x3~H(8l&E2zNnak8tO~_lvrY zYlo9oVSg!;agfWX$f=Tdw3D`hZcL7|aQv!?PW;=OQ)L8QkI?qPFPUx%9OSW9hcqI} zy87yfLUdL1@*Wruh>qVTvRIs3CBfd=EdD-^O^8E*<9Q1m2EROCX6R;`D_9l(Z2}GWf^FiTbv0B_6*?2CM}@n|)*|)E>hq)|RG5 z6H4_ql~kEDq%NbyscUAAeqKTw!S8jH^$Z)u7vH9^yaRf;osCoJlsL1S!yMOCnX$I0 zx?|oNh4J*{M<~kR<2)rXU}Bj{YkSk*UIb5H#k(6R@K{q5jDY{F&w_`xmx;Gq?sy|K z{0O2RYwerM)l(!eHfm_e)AdiQCtg{$%RAn3g%58}h$&v&?|Y=J{4O;d9InCaeTnbx zd2?}7{#VGAf43VpDW*O`Q&;<*+Ce|dSQo|>OI!#c8T?6g>f+!GZs9&?>7lc@->-T@ zn_#n$IB41V+xG=`uOmnd!8&Haf{2w#u$KIm@FN^$ykrAoZ#Vjgn_zGY{M7dF{xc=K zyyp$(3fsDFf0r!C=5*wZccJCrG57b=Ovm#bVBC>Pp(fkiX55FH1dfCl?YL0Yi|t@p zg!{a6htOuVMnf`tdSBti;CCJ6Bm|qz6YFnxYH}uS7W{24?*3FX=q)YXZU)kJ+jV?$ z0eeXDi3{P)gCE!^{7bQ}1Q4AM9y0UdE5VYO&i0=2w9-jW1_}?@YwQ_;v_Y@;zY8b_ zLfCNhg&~KLt%oRS*rS+UYCDS$iEY;P+aW740s1oY8kqCa{C11;SX4Iy4 zoGN0smlX|Gbc5I7_H1{^Z!#^47z#C8~eITn>K3o=Dnn(V2gZ-2Md z^{?%>z;@LUl5MjmNGT)fa6!S3f#+wDmyf0IX-6y!04b?_@R0T?u5MoW#I9b-aoCEt z;?l}(A!Hy#K5t->^5oK-?&?N>_MW`>(^_ zg04sC#^41x#mi8ai*$Ljk?4M}nD)9NdW;V7k=$pxUXblyE#nQooo>js>^ZRgZKd`j zeuQxh1}ZE5`bKDKg!Ey&5gD{`t*_*E+GTSiy|zw=w=L=TRVU5&rWeVUyjeGg{0Q9` zSj++TvAIM<-dvGWvRRgQ!}N&V;ASnkG(27KauUqV1x!eA^^jM2Mq&s$=oi zQWnpm+=n%NcOl{61Jr1J6Ho5AnL>5}t?FmCcWPGkYqEx#aO<&)mJJ(qeW{PIzrhBm zDEtsbb?1z4!h7Fn4rrL!eKqBw4raFk0FFNAeCi_ZAr6Bdq<_x~=l!?+XSl{pj>EMe zfc75Z6?Yv5BO%CatkBJk0rz)ep;u_b z4CV<>1}kt^(8w5PqM)>b37LJ}!Y0A*Ji`9K9=_DJPDFO^m=r4{v{fUhHwHnT5lB=p zr9>&-gh&m3 zZ2C9tB86^e{OMgeZS^RpcZQ9X71BWg0ArALDJ4N2+CX^$)`7cF#*Z%S9Q@fdck_t4 zbz;bU^So_z~$hrn9LW^%!(?8VTZOeIcF2LI@+q zw2_Z+qdaUpLB`Y-jVwE9;GKp8!QW~8s=bcB}%9)aP&;(T`>yCEeNy3^2LbdFA;wj~ZxH{W$a zQUQ>45iUIV;iSBFAI@^GL&o`pnrUS%LlYN2!@-eS37lgx<{;vHcOQEom5{YAaZ6*) z$*T0!klb_!gld`=SoAorsX4P3Q`IHDFw0SVk}l#yx_pr84r}# z&x`n6_+3Xh4nZ38i_v_E9^!)D6y$yrE3sNE~R) zE#E^kMQNnQQwCCjN{~?=gN>h>6BK=F6Ezie5jrvWkDG5Nra_;~A2Wkg(C$Sgr8Dqc z^ig}ks;YHLND6mau|x(q=`~nxl`v5(^Tg5DFfYN6ZHzA|)fdA#bCpoR2-8$wiNy;8 zI>>dJ5j;XYN@)EyqKE^iq$Od0gCBZ)(ad2bO=N?W!E;kpS_ceRQXt}5AQ_B7*6O;% z5CJ%-GM#-Bf9BtX#)FGF@6P$L5}4j5lJ0H_{|3*{=A&6Lh;VV}S2O@#Cd$FBr3c0( zp@M@Sll?{}-PRCkHU8)j77C=XNg7+15`Z)eMLH*)9wXv*g5fgynxFcSQ_z}uDx z(T3L<-GIjlmXo4G(r(yQmwLYo2nQG9Hj#(?vGAVYa8p4rOGE?5K!=js-q0E%FeGe2 zA{@TlH~sHI!@(=6xbVYEf1xo4;Mytn720X|ySy}lHl(029*Qp<@MiU}I*d1hrg>fj-A^_^u6Zlm5#t5bQ+ctxpBY~ygL`-3;ouPbUP22$JzOF; z>0Gv6gU`s!j>iDOmF*D#%9uM~aPUq`8|aw_W733bWGS4?H`O68B*RD>VUL3!tKO`LeA+4B^_WV?q1~M;M79Jlq(;Ck`Rb()Lq| zusTgPm~o`nkd9-4(7Y%Jh6>kxbcg&dM;Lk_oID6fl#lI02iR->^pxY8GmSaGk`2VH zMCb09B|wc3vbI742S4&1Z9-kR1vfL9{tO?#O={`OPXyLb2eBkvrkf?ci% zLOQd$OQg(j)FZq@sFZhxu`I=t?vYGZ23iEFB;(=tmtB&S&IDeBY;piYv4M%zcp_{| zJxgOh?{C0V01mG|E=Mi9CSH`DQ;y^)@O=Rg4#SPUk zoIsyuRCR*g7BIU(YC=&&wt@K(D50$~4{@|(tC1(_dl8ES_~f~DYYEhRK=o#n!kP!9 zULslnC=oX9S!WfS;hj9UlKC;kZhFW};l z_;LCZe02T^t2EBrckc)0EU_@vgg85PPlNs!cKv6yl>k-av-!O7MJ`}pfg>0aIDrL2 zn8E@;#nR@KgLP$e^i<@CMxD?55hL;Ca|I~dpGIQ5Yq ziT;1T=i`qYvmPz}X9CY1KG;5Ql=|!sF!r6OX_0AmrU;p=SaMxD27_b$Nh7VehG=HxpDpzkBAALdR=S9 zUIVb+e{)Tinci(S3A`=h%2*VjPqclI?=tBkVE+A!O`JIb5k5+D@X`5<-vqsWw}JH>$jtsu-JMp_!m;*|A3e z`rt8jTHG6%bZH?Icwu=Y%LnEi)!j~%(T%(v23g2!kmBQ)YI&g2TzNUSCw^Wj))Pq_ z5cM&8$n`;+lgNB0vGoSiKUuyWyNmq?L^r&3l{KW*W-G2fFv+eHk{yPvo?Jk&PqMTNi8x8|m}4*hP@;@JG)7K0a89LYcE z)4^=9%glvSLoZ0%wxt;m)E_`%|{?$WNCGn)tMr$x`Prt9Vcm6D(&4B;0(}nLpv+%HnLl`kR zOXS6wHkUJ0TAW)Jl4jCl*_vL3`Hypx5+?#xFPk4B=Ce-+r$41Gy7d=@3#F>gFpsRJ z=Iz+$Li$ui@XqBr#NSROjdJ|)EyI&YA!?_CZ|xI*mCuwE`W2*o{@Y1|{=>h4Y3c0r z<=gnr;mMIpHe2cMC+>__I*d-;o?Zs^g?>AK9r|ZcTCbo7=CU0$^AGfTk`$XJpYdH; zoByT0eu?tVKeGnKyPt~I@m%vn`PgH{W@9BCL%PU3$A*b!9AKCC641)wTQ>zHBBFMJ zti4!ixWe$3xFq6`{Sq6DN)9Rda^dPAChXW4(z@7chpGLf4rJITeibK)7pTNbJ^jC6 zm1;?RB6bJq+L||)5B5GX1Hu2$7{Tls>(hu2PH3IMIN1g>LJMXqDI)zMlFq zRhOw}t-Lo9|LA;e=&0=U)r;X=d{LP4wO@(`$9`pg)b+Bz#mA$U!)DZ>`xTUQS?Cmt z0g`A26#L;0(5m#h0@!{!H^UdXk7Am%02NuB_Z_0xd|Ug9AWzJ&Die2!_H{vU^kb;pO?wd5!sqV(H}6a)8L|;D1F8LV#!h|X1}=pZF?wp z6~9rdq`=UnS**7}$!umbvBq&}d&K3PLb&bkA9&F_bA(@M;%2Q@*~ELfmXwtbjCxJ& zX3BWZFI?FAh!oFHHG_xwvH4^KdEqHjo*`$w^`E~&{x^Wj7zm3=%f0}N(%2Ph2_l;xqU=N7na;8=yC0e^)0W1jtg|=2jqyR-G;XcRu7u4-5igHYMXpnMIrq<#gQHCR(uE7iyHzPo)Oq%c zEK{FM2UZPviAGToA99qMKE-}XhJCbBl3cw4TyHNN6xN7=``_PdB>K*w=UBNxRptHa z6%=jgj!vYgZ7%vRnM_)VIY>F8$iC*6PFwhvqL$B#3>~%j4&p(Gqt;bcy-6N^g=``a z9mhS%vzAkq{N zPn?advLL=?R_wOFiR9kD=PbG z$NcBWFONi;(>|<>D#z<|tL6J?U5b8oR1JC*=LqZjGR&fcWy2AB;Lh_4%6}K37xRe5zNx8L(L{;hzXuek3iZHWhk%P@N44Y-rWlGb5f8U`YydT%G z<xdueBlgi- z&RPo%$_9B4UAKNqDSc9SNv~NEpRL!4N-!m{9ZU4vHOY?kgo9Q>G^Tk8bpe#;1=0?H zFlE&mx(?wzfgf>QnP0D65}SXL?u-^2xF-O>5D)?Y2LLleR5btqZ*?!~-~b}fH$;0M zclU|A6}V!{$8d@qvD!um`xGp@w;kS*#8Bg5BDeGq<~bx>6e?jQxI+3H%x`2?z-A96zy&^Xk}t=ylHAXYAHL_0EOe+as5D{~cc4H}6~2uA3>- ze81~Key1m0TNUq~xrxroDZf;Ahw2hYlSetrrC7hZ!L{VA`9l7Gs6At}e;7YFAgNDP1itPvZ7xE2H) zO!1|{MPM)=n%L*<9f8@R=86NKz=N;li4xv_bB~Anj4%N|J5Q>DJXGr+xz83}3^w5C zDZY1S(-nRqlPkl6HSt$)%gTMg_ZxtqUvuco{%8hk?& zI+2cVbcils{g@a=j7HSnX1ZC2N*t_T;OcPUl0U@|!oD2*;D%3P!^T(mPnLD%e1!41 zF~gIvf7hrMGJjovr@L!>@_ev-Wo`@$uy{H?AgAat7p3|-k*b?6v#NkH1Ch&>GZf5t zGYzk=Rw+^t@BJsdNF>rFcMA|$gEa(w2>r6kH{K&ApXFgA_uuN0ak zH&j4XU3zk^S`uQ`ayT9MLSmaYcX!^tealSVH#jCVvCZZ6Naauw(f~(`78*bk9idOw zQy=XTkayOS)bY8qfW$X%=9($1;8H$|>2MiaP8!hMR*OMiCFG3ZP>LYJ_bG*_3QMgD z^2+Gxwk1F^WJ{mHhRSYp*#waw%M&Nh-@V;k?ruHq(wyYMrA_Q}%_6u_N)>^e#DI}U zC${VvI+!{ijB-mg_O(kwmRsTMDcpHy28nCltGmD3EpJ)p+%VAGHk%m3NJQHCVk{XS z0Eb{4`jDlgapYg&YnOzqx0VJE+*v@Pn>W3G^Ol%=ZfH$tV4D&SX@CMWICB|-h79#B z7e0LRnAF;9NG{V!UBB~DmMK_wtBH&AR^M~EdvPssx#vm~815D!lWIVkP%NEKLhQKJ z1O#~pnEYqJgwEUPkXzXj@i1x}_`6Hh{98%q!z?@W|yX+)gwj|;-OW>S4 z21qpeGM?qa8YY_CW)lM09YVP&t&IqDpEptphvBf6WWFYqYnOzS$CfBx5{+L5pF1rw>Bm;vdxsJ+j3}?oCDQ>6&M7a2BM4ue;mtC(zQ!MzGdg_$=ITW%R)T$x>+wQ z;ybWkZ$7~Zl{GA4K3P+c{Pa9`ayep$73bBU~_21s{a55z!;EMUd^fb?6L z$`kawao>46hG!axoX^)_bbtr;!@*znnx`E}<;DBv=yhbSmaJEdfo2ZBoBb}cI*uOH z30s^2YLYGP_fxu?2D7qTOXym*OG0OGmo8m~Te#l$&rc2g0iWt-G=%_5*t^aIRS@Z2y)3no(> z3p;?~z*O3+$a0oRsY#ir6GTy8FVoy4X4jjMxT}Qas#y;et0g%yePbOioPO-;*g@BgL5oMk=bzH%bKIqCGX6hr%*)>&mS%mSb312av)Lve$n0{DF z(-eWE3HE;augyYgw@jwxm*P)Em1j%uFT;{F&B$DqVgG6t4~?g4fL&55T7$BB)D1d|F#GQ-YAr68=veHCoAsNUTd5f#%c8W6%_2%&iz{oIbnih@OKXIu zcAeJ5{^BUATu7L1Usjp6oVbJJxwh z)AZKC*5}`?0a

avtS;vUbF8ZA32B-B`;0`(aT_lyG)t5xS^m7xrKex-~&lfyL=g zPK{$}xwTM&=)t0UtvuV`pU9d-E+QP z5I4<=8Oabfv5DUAZ&KEhU#3h17DP8XK#pVGjNM|%-;MnasG1~!uLdSjEXk7P%i3Po9W!Zi<$;>+ZR=k(HUTbfytfu4Xd7W*^%4(b1a@3B(ya=t*Pr z7Em(tU52u;TM}=6W(+JObidJrqsLoH6Pnm&rS|d|`Gn|%1eV2Y0F1KOzLlF&aaOij zNC0aIv2ZZ3OFheooIJKfKy{Z*;Cu!C&9pY}2L4tyW@3du3qSU*@00U3UcU3+S&11B z%XZwK%_1CCPL&<3rYUxbCCu4LL+qdOEfMuxX z|3%}T6Dtw_B^?rXIX69cG%I7IMP;ccUD4aNp$}TI`?dmoL%wA-!t(5b$Ms3n92y5T z0cUjdKJ2(ot44`rwe=XNPS7>>E*)ZQ5V^CaynrEHxMj^pLoW3TN@D)ffBXFkd5;au znz2&r^TVAPKZh(!W48=CWbWadV;X)ELrY|UQHvLJ0fw*Y7wdS`6~E-1KulwfXr zRl$&kY&PA98X{jy7g$X%gfzCMALkg?y_#+!cSP|xbwt5kB2-Y#NOTO~)+j~Ek?1L} zqtiy}q92sK%l4VB^Am3wLZ+5g8Memgqs+bQ-xq{ms+Td+X`_6v`F75kKEe1Arwg(0 z-fQC?N-F5=nnm`yy_6<#-qqCr;^2+dOI0wdY9c3U3p?0qkYU&of0vxi-;vdm1YPHDOYzaDF&tLLx<(|)hS>S|2wnba1i2P$^Ml_t3(6Kd(mqGI{u_y&h z%AKhaRs~65QFd68T5Zy?TLP#OQ%xaWR14m$5<@z_n-|`+Gm+)Agn6o2K2#MLx~}EL z%$XQMiXNSMFI6?f*A_^>1SEaUs=V$PHi$aakx?UpR7;#^_B*_4GqW|`7a|m7mBt7n z&mhX7Jv?`=PB%H=U{r%Oj9JC)Q)^fs1GzWuHJ8;#`1ez`^i*-{E|5JkN@t5OdN%-g{MyU6bMD#^ ze2b^!n(^eJFf zogqGNrH_q>5>)Zg!ZXpZ!ncp9PuXfx__pJxjD#}y2>%#Byqy!#Js=E{j-`Mw0tLYu zntj$!$XeT*Pc?c5DXCAqHL`>VsbOXD3L;>~!oy7r03V^#mgE$?4gU7G&-)2GYf_Vv zYAqVA>`LLl;n-KJFB&f8V36hj=Xixd1Ku=*ySjb4X+;@*g%jz)cas{CVAC}GRX7U7 zipLrCeaN|9D3n^41b69T4)Rol;7K;5EyMv_*A;v?MbTw*f@whmR4^2WYmS3zx(` zYqO?8?KVF*o8VGt9;8y_*6laTY&g@AZ+Un&xQr4E@Hq8ar`)h|R`pfNEDg8)qe-n^@XCAEEnt4~jA;EvvP*<101F{taI zN|3RSIcI>^eH=;@H6V|8tPzk*kTm=HBd~RWmmid^?s$o#jM*|mh9M=C5W& zHO~8wy0}Asv2v8*3qK9g>71*5q0Io92}o2q*8Vf9MBibcP()Z1Lx2PRK;+0%NkGGX zrV--T_MhV&?i>xVK_->VU2q6ASOXRK2p`xi7gs}IHb#`MJc>@w&I!AZ{%#ly4L47t zSx+eK?t>SPa*U%x9;P4qvpQldFyZJyq{v$o04#Da$RW(DSBHV^d-m03(W^-+NXxI3 zyF)H82oI5v6ovs@aLacwOi}mR;tZhc^L|49+Bd`+KO?>{0+oHt-vCMq^XmJ`3dVPd zY+2(w-kHapCN49}k}ztgDy~#%q-V z5-~pYg#*19jG+j;ECey&&cFtK)(Ou_{h#Z(8#SpCNz00agyHNJyr+XFZ7rk3nnV z{=4mtOE9cn8{ge7Z@X`|fa{CHVdQOu!=?VH zT;X7G=R@@@^^(~ZCXUnr0-{Dq1-dBFPh>?(1Nc^wfyZF>rYAfq^^>>{O2{LZoqP z`hFJ`1VX|Slz{YuLt9E`p25x_u+J>Q;cGtwOb-5?i>Lr7 zuzf+dGy%qYRtSr9`x~pOH^4;#CBx7!QFTJ22)v5D^k|`->gSKJzE6 zRqRpx;c|Q)g|?3TS=XPYhLYe0GBXw#a}befN1g zoNkFKp$MpZfXI|yTJZ6b!q7y=993QM`D>6dG%PE|nO z5xN;hw4YZKW~=#htlF4ZbHvk(uhk)eSX0DCxDG2m!ho>34}We)8v{f~DEVC@1T^+8 z@_gAiD+IJ%iO6;3Rxr7b9Ed!29?Ovsl+ZH<9a1sR8X;J(A46X7L$ca#^-N!;nGeP_ zj8<7ZQh>+21C`^*=azyh3X^FH4AxL8sBw9I!nWE2AJ^s`gF_=>nQ zK9~-CpnOFJ5ZPxxAyuhLe8AYj_+7oXn!vm&l(6OtN)5(x4kRCU2&Ysvf_hd6$7}n? z#Tmz{HHCCP2FyhqD5<475946~S1uR}A>dsnTy^?utz6GfMxd_cYmk7zFoF>+QA4gyOX~cRASGSvGm#Hn0ABXT5!1-L7OmFUB6NE2WF; zh)|#a7qG+vQV)fwn;%voAG05zrJeZuFS`D57Pxd)!ao)Qf+QKjS(3NPmzjQyojD_T z)PNr!)e&wL`&`}YTxV91lNy8*q*9Kv~c)~upUeAfeU#`tFjxhG&4OZNxZ9sF~)u$o0P7e-p)3mj6z-1ck@+T z#eEjCE_cu=2pk}Z@;Kf+EW*XwJ_`0&?NHxS8yFrI%gGdJkS={7Gav|n0zPI8G2;D?Ja#yaLJpfJxcBYu4NrSXyih)JM#70~ClkJ`N0`A0aB z*9A;R`csW)9<|F(*GWNM0URL&lnIX-iB-%8fR=Znv+-w7;jjCM|1^;UIXCxO-}nJ4 zOnvzt&TxiO``R0RqHByMH`R;%K=B_TAE!$@I2R~Z@z4GfyHLGL1C=h z{gqLx{DZ4}?!^_I(v!K{)1Pv=hgkdJcIWq|e={^G{Q3W)5zUr|l_zeGW%v)r1>+f; zyxs|fp^W)eak-2AxGQ@-Db4A)Q{UtTn@kxT-x%~8Vpzt{0w1@n2?#4=m>FTi;Kz7Oq zV8rrK6o8%!131713OByexJ4A*d)x91pY&-V)-PE#^E;3S@Kt4=BpB>K)p zYTjQ7!*Ce_=h->nFKEpiN8!DS+h1-!Fg_kAi{Y}(`^z7{AHOr)N^Oc4@)&*#a`qE` zKk-%XB;;Stg}IL=4~=1+8^5>9@UP!_Tiy&$U>(GZ^40h}`Ym}^y!`K?P{Ct%Za&HY zD5zjSa3p>~31wD>ASe-i;_fyV`*tm;5f1HX~q?df`T+{%b$ zcsT%}lUarG0-(xZfRSH4Z~`3=aa**2ic=m(<{Rs8VdJa5Wpsrw%Y29<2Ll;^9zrZ& zzzZl!A=?$SmS8@X-`^+yW*F@`!TRDREYi^-C%WxGB7C-JyF~jSv;NU-1liXgjZd(< zvvZx@dG~1G#lrjnZa0s+2+DpL<^5F=>g9BOnu5=FT+5%XK^n8l(uaHQL*3<)52?rc*g2O1bRi$*&Fj=57f)RD4{~?a6I4R% z=@*^3GxF1CMB|A*p@Q{3aek;ngBc=1W9C<(bcCicM1U%|)t^5~cf`ius#v|y%O~Bd z;ErORTIG&V9u(GE`5ZmM7e60nnKC5wPk%5Z*Vx@$za@P0*Y-g8zUPv@6h46!#I~N| z4J@+JO$8EKsb^Q=Ps#6pbGyl(UhR|a%2A%;$KOeh^=>P(`u~2eJ%r-+rhI&}aVkR) zuQ%T(>7VQ5j{D4(i4<=_S2^H9w#sW)-EV6X;RNN%R}bMyaM`ehcIu75IVPlVNJ06D5b5CZ@J05V2IGXMa8b)U+&fa2i{Y&R^ww|TcS zjFKaX1A~wWlGglHEcbRvceWcX?PRoB%=_;;{s15|14T0ca0dofji{gBCWxv~4Ku(^ z_y`0E(Nv3%#1mV&7A{pKvW+fovf0*Gcb;7R<<=%H+sD#tCv#NE7By}tlCE{d&$+SN zjEZw+no2BD9EyP$&;g&~ibM>)0YDKYN&pA}0L=*86&(S6_wDa>*UY-UmE-xdS#D{D z5@j*BT}XYQr~yH?0G3+GTnmxBBHIQABoa;wBq9KK6pTk7Kpwy#5@S4U2gaxma`71K z6XGVMR*h(_$x5ziL*o&3AT9CZS~4UtmdB%7&kJ$8-qb6S(I$t4Jb0RC-Q(#Q4%xf7 z846EA^Aat7T~vNu^cLQ#i@WN-#%Wa%eO{#wU14a2Y05xRV49Xf0anP!w93h@aT!oE zHepwUAIdfKO3WeUcA{m991!`ljpC83%rU-GW^fE2rrX=UD_>W45>~eX{5tC{v3kO? z4pJkap-%g5v!XK(zH?syYHJW8O{EU-xGqV&`M~8fOn!cQ_$SjVF}F6@YJiIYGr2vr z)-5y7s@7Wg0W|wok~h*N^R(M85b{X%J6rnRp^+QiJlEab(&(pSZgaQFqXRA_f(`~x z0z5TIr#ffE(&$Kz{XGj4Rg(jdJS*A+F0 zbO(2RH7%P6#dnst1i=^jEaorQIZNOBqTUx_Uwk~5^AYci{fFnr4PNz4cJGl1-_i2x ztGH|ZrK~q7CtdA_9zvefuVZ{-dB6BE|2Evpku%wMT)H?SE~0dTw?Y1Lqxhe_jGTqA zTE}~gyF6YgG$*Xw@r^8>79;vwcz7QhiR2r-htuWNWmR&wren^ok@f=#COrG_01>D0 z&U!~sLT|8~y=EN4wJ*mcmSer<$QR>0Uul#{niGvBg4I{ouWSap@!p(bXLlpI3!AoH zU^*?A$(in3Dej~WFI;rg`;GA8gFLfjk+;0H6LTd7QtF@uI6|4PSy;EQnM1oaHv#~5fMo@|C7&D!+ zCJ|#ngdqS&axTbM#fe52svywZQsDSUt$FUBeLywjj!COzf#24bh~10;L^OG)=j%w? z<6_c5dAoflbDS;S@oql!-fl;b*;w9Yi6Q2qoSsT>;5<>)ewI?z2(agN+er_h=YY4z zpH5z^ew9|GVQT|vF)ghV0aPV~YT1^F;4dv*kXP*#OOhMqv9-kgN-VgNW6=dhQX_IA z^Km8HiEH3gI@V$kt!BK2BPHD4S=bQ?=yP(@)Thyqnb)?8K`O(?(w0-V&b%IH(H3%6lq zDgho%RN)Zs?H~#CD9x^1-u7>|rykSvN#G`p^n4 z+K}f>-m`Nolt-M?VqGK|K>C%aSa!A%lc7SO%+H96NI@-0Q3do0-JbrFhIhBY?a+bE z=4)rBr#gd|B!F2iHu!^c`(6!>va*wsK<2s6k?}wgyC|sv-N_OqjIqK5jupU{)uuxR zsQ`5YFoNF`wN}V{iim>Tq)`h~mW{ty0@db{MzNwL6qL0(^$BE}gMZvsH13&+2Eb+t z>R~K2Rny76h)#D_AJ|}s&?*&Dhlqvw`WgjoGaKPWC+g5NQHAFOGR*OHbu@Juo!M1S zpts!l$L32qBJ38H$W@BD2pNh+&Jx)#%sJDRF2~=RLOLc<_vBk zInhl%$EU17s5zVmZ%r0iSqI$=Cl#%ko}AoHYl&cVV)pk>bFHCKG}pan7@gRlA7~fA z$%$s0rCsP_4p!7Ib}a|H@s8at>=VkP9V4uI%8}~KN!jFVRHs_zDlknFksnLDAl9Nk zM{7EBAU(GuPROwF9F5CYWUc3JWbbp!(to*8QEdrOcOy_hC9Akj&7>`VDonPDd;PVd83PI4d#qPy+SkGMKqIqM)Q$ zBISInYNQLuVT6C(*Ps|hv#MOH0oOU0T;A$HpQBwbBWsul9KbT1)jqq0q*hrbfm?H^ zE`QuFf7=Kk*{DL7I{0T)ciy`B{)-SCDnw@yARrhdk@A_k3zIo#91eXrV3(uzr(YxE zgqJxU?Eo{WWTq<*9y`t-d{bu!S4J=&Jwx@}QWX259N*8{p&1y$5}Rd=M4~KN zhk#O0Z)dHmpT0x8fU*fkvrX9}l*{#0&Zeai%H{r>(n%^Q0k^UYWU$Mu!o`?kUGt|A z6-|@tQ&Fup9o2HDgBQ{*Vc?tkBb+9Zc}}3moL5gG@B(?|ct^e?x_F;Ng#fgws9=VS zX)@{>R>~4pt~pu*#v>*%gNH&PeTK1Y9TPeoPc-!D1nY7`hXi!v2)LH$`o`}8H?c(7 zL}@Bel~W0Z9a&nakbP|32U@{>j$Z zxMs;W;s+AlW^rCfFZUk=!pp6GUh$c}$Xy{-#LBEuGT;Pi8U>i=V5%BTj1yVJAKIcw zpA1oR&ZG6_W#<}f0yVHN*VJQv;gTB^_F&oWYxG@m{u|`v27B3Iqkv671PK#El?SE> zfst^#>N+42uc+lOY*CPlPWYD}>vsY@LU;5(LPOfOwRa~rd7wy|jJ3>QuVv#LKq}@V zU?SK&Wk{vzQ?Ltq#S6D-D&P&2M?oZX8>B2AAg`WNPs*iK5^0Se?<&hJIgi{7D-@Wr zYm}LU8ArPmD7ikBW@S~V0-%OevagOVq^ZM)ZuLy2zMp`9E*tJUqX{VI)>5Mn-R}&V zloK3j%yEV65Mhl3h>KCgBM4^8KurUX?MS3T`ZDa9p_2Mzv@DSlNP9Vg&8&^@efVhWCJxav5l>GE56!qm1~fvQuwZxmh z3VNZhBSZX@tLbbQsCpApFe`_xBi=KLB*7TPU#&Z{G)Zm$IhpT7*{QjECDo2$gkS7Z zfv~?M8+U`!fm@YL2)T@L#Or9aD%TV@>ug|2y3uLr(dlY$kR=MN#3Q4?5yV6lQ>K!H z$X)a(Q|!W3G%9Gmt-FwH46eM4iF4rQ&Qq1ofsP|`MrX7pF&|-;=|c-gVdsJ@D`l`% z!XEKo6;vhqdh9}+4dAf3k_PQ?Lqktf@7eE!u1b}z?~l~Ky@4`Gp2-f%FWt>^J4#sV zo!;K_+unwuArF7ohX&{l_4Z4PCcDa*F)sIA+Z~&sQCM+qq7ioRp99|L%4IiUI>}FpmU~HP>B@93Y zQJ#sW><=smVu)+1Oax%AiWx;^O$N>f286jXm{--(*I*YXkp`X|lRw#RK@yXFJ)~`n zUu%kP_pZrrE*P8$wFOh?$Gr{7cZX9Q#f@L)ST*a;8KhHYIoynGbH9+aCkz&765C>_ zGMW0x2f{q_EBEtXu$d-Pg|^YteJVc>1ar#En)WTtwx?{^wCzaCw?%qe*j-D;8_)M= z%@5^^|JwZcv{T2skZH_qB{$-Fsd5RpUa}XimLic|FVCME_ageMx2>?+xZ@`0RzmRF zlzP9*Pkgo8I=#jSGPT4s{1S`lwX!W*9sXi_6eP2+6IXzFVcI5DUiiJ)v^#9Hul|j- z)Som)>9QqhNgef;hLN7sERP9+cC)0`(xp=S^2!=5jZ@w4!FU+lnvy?lv9zfG(>cGu zeFJz^R`q9xd+P)A|0J**U9>MF98_plpxX*p2L$k!N2 zHNxmwfjY}ndW|isq4tqMe`L;%#)b)Y)e0@Ms^AwKc2;8$b z!1gHGoY5}Rl&(s$myb$MPp%(}OAEqpa`&Vzrci!g&xdFE2P$f`lb%3P0LgKbN%GP$F#ldhZbh8~N&Za$)Z;)hASIka+4a^Mv2QZ5DOCS+ZWsx7{Ec zzN30*d~G9$pZ+I{eYgp={)^|8-xWA@cnxbSK!6Q)EM=6CGX?4}p`8*R zB3d4AdwJpVz4h~ z!iy1aE(8Y5&C2G}uD| z9=2MS*3k5?deZYac{jlyj*%;LMMf9easV9!&T=z+xu_>I9=BJyfBryi5&GBb&rf%! ziM9^)>%=zW8-8o@>GR{hI**Uw=??muYyaUG&0)>f&%fCB)Yomocs6jD>W57v_sReE z@bHyKB{!FpqO3`fO=vmB;pc6yMSAr6Mc^$j&*ZxWE$EsWKU~*+f`21RBg<%P!JqB1 z@4gT53S)X2x7+Z<6n@@D-*lS%RTtv_c21az?@06#*Z3gu>N^#Hf?Au$9~n3`V`HIf4?7Uar(ZTOXbsp;N&->hy9a? z(Cl`%S>iUT$8tM3`dzdANodmhPxG}#UYhj$560QAdAA`#Q=LEhhR!C0VVjToh8RBm zM&#&B9DG;h_J+{~%A}j5Rfj1jISIi`z09!bqTKLwTIqa40}HC?a)0joGolBqlDApn zHbZFXtUliuwl&Gy)Neb5Cdpd68oM{FOxay|+cjc)pZSfn=T_I@_w%$cZ@Bjhb^hj0 zgXdej|DoHq0ZJLFFk`}uR85J>giWE2rime!g?3G}u>10@(H-A31M-j6qru*3#|KfT zwA0b1!K$iPgHKn(OXM^Br6A`F1D}9!OOfh2;gvn4f)Tcqb12P9t6Y|L!f8)tAGK4m zu)Pl*F0yCsrk`-59QuUqSc8@gEI}C5F`8s&*@ap5LSJfN(-H?+cwPq%muIcj)9k?& zHC=e&fuC?)OI5NZf`Dup5ehJ6N!4bnSj(!J3xqWmruRX^rPZrZ(zNON)Fy566u63} zPuWhAOijRrdUauCmM}rIBPwGQRhbz4yyIDp{Oj(*P!3iRl zmSg#4XzEp2xI{C^!t_3MxNUk*HG4QXg?MT)M5**F+sLY+^+Y=tANEoRQUamZ<Yysb5kZ zN*tjO5CZ@N05d~WH2?r#R5~cY0T+lMWuL4&^X;8zlcES0jW$In-73uhzx;#c#v~U` zV%jvStMA|7^ZCC05&lOo%gK_^-8Ax!pB8u5LWbZEoXn611|~_%z{g>~*>{V~*@~oV0+g>^9vd z$&Q=CM<=RGqJU;(fB*ny0BB|a?i;MTb~at@+M6W)_qfrKtkERTIlJ0TWjQuGCw6yT zX`2wD7y^v4NAMEk3k3)OYwJJ@^o!v5?-7pw@3JFh7k=BdCqN56_uT7ON%3txIJCE1 z_X%mA;0g=hX!5N#u+fmn8s{g^M@i2nO*>DiM% zNcRSke;K?3M>~|#-*7TmIPL2-Rc|i?*Uq8+h|J%SekXx%A7HW?f5Dd=nj8$vg_k&& z*Grs=+&5nK!0q_KeX#cNaBki^ug=YL<8^sm-DvKA2p`!B3Gn$i<% zM^aIO(9(5RyuilOzm_64ro{SK*)CLJEvKN(jV9MkXx?DAZpEGE)pzIaxFYV5l*Dks z^y%73VuJv?XEH4DwRXfYJwAX1KV$&OS~x&+ce}TWyCPB(!}roUSTb7wH=!RRBFRQy z5d)!Zi_i@(3K)^$D9hdKjgL|oCK{d)>&5sIHVD!`!akq?Dkv$2LkeRh*K08VAJ^fx zu040;->>g`H{H!r)CQBD7`vF0SRzXzG^GYAxbZXnW7;s*GD$vD8*6a@C)nZ3yX>vf z+Cj)9o@wpZNk}%S;3#iY(SAAz;Lo3uhFFQ#q5)E}!vuuL(w;@_CWL-xNQ2Mq8;)bH z9UO5zrm7W_-;4cNSq=xj#hdr-om(S~+b~Z&`xC2@3w*1vGH~iSMv@GPps{I_HIxA4 zCV*^qxSK22ozlQ~^OdKpUBs(bMK5eboRUK^q-_NfDrL?{ky(oec=r?qi>4HY3#KR5 z&g%G2?)ix?iXInz_o=+Yx)?Sqo`qp_J*2-$ARw!yEeVLA2$wP$pq<69rD00} zVpzn}i!I&^Zx&Bs(gkE1Qs);?9}62fibD`ExWKR<8cqE;jN>VLt$4rAWs&a3U2%2Z z+}&NZZxu4i6Bt#RzcQjuM&(Gx42+bS&~72FR>NhM23*gG11Y5O+%mP3d0NWzOe3!u zYRZhe$nI~^xrZq)p>Ja{0R&^pS~x%scX9KJxc(4HEIlK3FXFUvsf%eG0kI-EXqoI? zipN~P&3|>jxW+y1=6UDcyIkF=@2L@8m7hF=O>y>Xc-a~)pIZt; zZ1n4i&&_y@iMBRz!f}8R=H9zEZX4Hu+Du?PFcPGs%JaKo2P zOe8H$(knd69ay7Q=RbYr`)`0QN9}lFAwlX-3kjC`<(gN3m|1| z`NHCvyGd+3IZ022kJJV;r>C{V9#J*ERYlK7ZkyK=D+iD(`auJ zGfz>l8STR$XjIDI*&tN(valcCQq)c3s!wSlvHgnxMV|i56DbV*G_&U&#k{SUk9%7V0!DIbV$_M66%SnHaEa*hZhnGnD zYYi`0pWyvodh9a|07*6jD-)W*dgZ&A#Y-;rK#}C@f{6A^wNorZ@PB}Wr(YsY7AT+a zOv}Q1U+TiHKKh^wM!(dCv_q-PUfLRzggadA*c=3LP)Xk+ zh41SEe0rSEch(-!NAsm$BZo3##%L5KtM{jLChA2bL2}*ls=cSb!12_!$^De)LVadO zaQo-RF6x0xYz0&+Swltr7;zMTtr1EIB-Gi5AAu)*d6t3D=l z-Xm=F5?B?YjmmXxDwU5eRg|IA8}!6&zl%mc@*>498tClu=yA?McJbPEmU?|LfKQpL zU*~(SBknPqQKQHi!k(844g3^nloRqMke6pEi>aAWh;dri5s-?sOhb4lhBb6fYCw&1 z$Er^1+|mPuj(3 zJa%_|JCvN+v_NK7g{e;1$_$XI-cRObD(JNklCry^?iE$1fO)3k(>Qi2_#Ro&>H>X^(Cunc&ub{ zxt1U>C`!y3I`zzm+8(WwbI(%EEoRnHf|qCjsBUt&LGYjXJr<`UrvTQ5g&X$X=yqKy^RHG@9|&{jxksQq*r!$b+SveK z)bDT2zSGuX^u<%Mj}AK>RNtjrt~DHmC0E52{Xy`*3LAy{q35n^b$^L_CqlBj>*c-Y z&2@L*{TNGw;(7gWw5)Z~+O7749<|3R$7gPdX!+OF%no5^g?)p)YY6N(TvB?Fy^|B& z6jxe2t>(CI4%b}UV?)N!bRUfpJw)$C75J2lSv*4=U_L@j(6|vyr}K~!FrfBR`FyzzQ|>4$(E5z z0hySMT^9D#{;d-WN5SHDrC-(1qfj!pZn8@#+TALda$V5hUKx*T1X9pO;{si86G{)u zA1wtkm5P9DC2Rgb)+#8s)E+L`ypq#>N8P!EK#yEr_2}b_vzHy?PYinF>kpBR>ciBe zP_L8}K~bHkhXND0D5ax^xv8?|z+X%wsuX5UR(y0uK*lw1A`(Gmzd%lVggtx^G<)@B zqP01#!V*~zT(wSL(2cL7D@!6EsOL^f513hAZ3o0=86b3) z2nf9|%UW@8ETT{g3BVUXgXrQs2G7%Ny>*qoY1!11s$(JbpdNE1h`1aqsJkW|1``0t zS!ZgoplQK0curNY8ZiaPAupxI`?@p`0ohVTvptG|9!!`7wNmjsZ*09g`Qj+mL=YQa z4})pDHE9BVpq|KHJgZ{d)$3xRvk4Y+2geRI08(gKaaFYG@&r2L)O9pB&Wy?ui~U$# zmU@Q!^DmlUAGMB%?wH74ITz62*MdbGQs9pQR-x7G)pH6?cBLY!CD5~=Q)RPlPioER za*Yyeh--*hEM@z%oATsi(Qqp`ljEAYDWdgkIUh&LvK5g{2{}?r)gfrspi|1dEJSd{ zEDBUBsf}=9!9on*D(_qoYn~i9z~D~>EG%k{^#vN0R7ko7{zqglh z?mM9MHrKJTdB^O6W<_GvhUqux=p_e4yG$~9aFQ||eX0tXywLkdOzz`LG4WaoVpQD8 zxyzQCLeZp5jNjFNHd8z%s$3hyZ8+%mGqap?ryTWS^o%~LiAcl*lb6K34UvIR&E96P zg{qpfVM(m6j~N8@6TDRt6C2j5Sb0I6S@v?g7FlB_ue~;6Geu0Y$e18UlVjX=vM2W5 zL*FVqXlDM8bdQflB*rXtiqTCTv3tH;j;3cS%fG9~tebQNi098#nHlA|(Mbbg4t<@j zlIw>0hHMJG+5o^-=`A-UKT_*GcP&fI;c6Tl)dtiT$&oV9a@Gz_&v%v?stGO(%Eo;@ zdrknPetOQJ4vx_9)lqy14FKabtVQQSQP z&#g*m;+26MDeK!H4bJ-4!OC@-Of0od@Jm&DE}=9Su4X-4$I;McmFJ(;Q+U@!9!>2ozta%xH-@4tMA_L-9|lk4M}(R7Vf-Q zJRIpYyS>lfyEkveT^A}X9^%Cafnnd&kqk6!PAl2;K1w!j3)UV=+JdreUS2E{c>Ac> ztinJuMV{+(>#}vrmG7?xcwS=7>hn_g9=`K&xl=9u*FT`R87y}8v{v+WlY@aikwj0}pJ^A=kvVFaslUruv>NK^Y=cHqR-+|& zm7mIHwYZ9U`5Noe>L2$ceFq@FQIEq<&!>#i=XG~qWl|l7j^}yx6;7){%pasg5Petv zdTE39tX)WCT(|PoS3?CyoRskagn$0N*q#iDy(1@O@=pgQ{(4{hzF!X)yWV>f)al8# zlVAD1$l|N{Uc6y+@K|QlSyuGbohwdk)F|bx>qiJUDEKv9f2+IG{K?8-uUJtKF>D-|hR-DLA;WyI67&bFeeE?;rCYT~nu3k^+*!Sjl_ z&g-!@!)1AIs6+PMTrRVBoWt2)NUR6s7ZBzfjxK$yKVbTuc}+ zk(us84K7Q4_L2geIr7Mn$iUy<=EpG+>a;|v4qtJ*V#FlAXnaN5j0Vtu<;MC+25qes zIQD8Hi0$d2AX@=HiSzVZlT+zDeNbf`rcFCU?(tlH*Q2S@PYGwHB@}48;^VFO+8RaT z&1{t>z3A4kXrB#>Z4a!$vZ{`mcLKtI*!k1+9}Oi-iy}AUE1%!GeqRhF|4*&7Ijtly zgPfCqx{#)s$oYP48|e;h1o9LLmA=WKU}Y0^SA!Zg-k?8g+_{ADo+DjCOau(Q`F zx#{}=VSd!>nT@fiN7T)t;tS7Lcg=r7&TM5E$D!S{qN)yGakyH9!jGh4hAwTrp-byJbaG-M->NtBreUXh>VN z&a)Y2=m5srxIhkXb-L{UkG|7|f@>jcPmp?W*$XILeX*f~#!g}74j)IeHZ#d+)5$69 zo%e^tg^5(-w@J$3;Yns7{6BJq3$&1^pW)wj{{5U~inw(tjbj7 z<>ulbVfgnK&OVR^CZ-De@FVtQ{>-_!ZK8LhiaXSK`ZveAmWDkr3!?BoZ;9 zf+2*{g5(Oe$epd@6so=x5KpN00QLJ-{MhiebxZh%Po9wO7AvocKWXLuAonS*vO4>U ziaOB6sdalZ(F+lTTZSH1x?}^fr4&mNmn{*Sjjw8I`4(LPLKt;DNvHlnEO9te-4lBC zw+?EOWj8L-xmHxwC8ADj`>z8=5tsleAz>#Z%DGEvAgrYV&%(4EY8^dL(OrNGN9M?? zfh0fhluS*J%v2+O1*D;hQ?%|Y!f50;WVXy{B{c@ggi1z+g0zqIcj=BmC?GXnjlLu3 zyuPnw^SSnGUqSm{`2)3o@Biih6Y*1@9*pI}dfk!J%aPRP+T`}Z?^5L;eb_HPKjhc5 zC)`@&FR)z5xtd8cGUFj)mK+&RDId#XJeMU?b^D6tRTGy0(J2_RLS;szKVFu@1|y4e z0@Urc{q~(8gy1N#yumv!{IJnYRqcx!vO^5OglKRaOBfKEri2(_tZs5#{BJ@tKVyJa2Z869)w8^Lnv6@Grit@O^ z3*L#6qfYG{U>6{TQOSVEC*E_8vG$62bWVD= zegeNspaapZb$<~$p+rZHPS6WPOD?x@s+(SjP6aY(#sopcMkS++#6xAJ45B0~8(bK^ z(}lKEA?<|COTfFV?}c&c`L;7>^HPl!unhLjFS;wh*7DLvVp9z5q+>B$OZj#IE)@G_ zyVuYZVO_g0X_4B|G5Gff(TAPy(NuZM$2{lVAq!vc&RP7)gFDZP-nz`isk(i9+ZM!3 zMUFNW+9X1L13{y*%=NTHO5NtZO~2F#71#;jZB}iix3&OZz1G-(#-|Wl4Ub&X{rO19 zz#aHlLXDPA)%&7!Y!EjD?i{Ip+gj{0(9MV&OI#A0G3;nI+i84D-U|r-QTm@Rz`k1h zuC(}9jjwUxX%=1Fj{ie(Y7l=;5%22C`sb%3E&tz+La_6#XsY{HoUPl;u_Q)micu-y zSX|O&S};ZR4jxer%fy418jw_7fa*m#GODQLi=@s^a%wFlJx}=SQ$DD0Nlm9i-6*OX zk+m5hhfrYrLl_u2l69Zr5GPzXRbj80wYR6X@3I%yFNi1i_0-u`6xDevPH)s=g@6NX zeBrp@5G>M2X(0p>N;Qtv?WM$3k7nOYIsW(Z`V=?$(K~X|PlLXR&V^AsQiGiXY-3K? zCXI2d`*EN)_n&MQxYTXkaaA9t8b)uQtXrS*qFRp8aNRcHhJ3NKkO{*i^%!Pw446Hk zRji|14U4F9w5d`*%>snJ>t1(VwE2<$|9O%7^~6`N66%kN6)gb5zJCDU*ce@{XsT;P zo!ISEJ!qwXO0Ix9ubm+Wngo?>r3>J>ZU0QV;}p8=f^iYvVpLDDXOqiJK7Zcq!M$_xyaHS0q?) z=Uq`%=dU=?tZ@87>#kP5sd=IRAHzUtEZ!imZRl$#3tvFHnj0+t2KbNFHPyw2Mtk__ zesvJ;aX~0ud-#Ak92CgLiHS}2Xr z98eBP-`O7VA~UB`$Fv267;foIz`Kk;4-OXp+6nl`_}N1|-}fUSvlz6-F74sDa$5^% z>bB@GQ>~n;(^ouc5Jg~RH&QL>j>T70SJNurfXW+%A!oZSH=zXxZP*t1Jg40W|6Nho z&0_#J-s#18ynT1FBl3!D=3@Y3GzFQ!TZ&{5NQ}@M?JWm=2vepCEegN-qNLz9Rw!{5 z{goh=jaWw2P*^qs2D|04BccBCBEWg~RCSjb6!40&I^xu+YG0dj?~{aA2#&a zN?q|e=|}wDjTetG9S~@-e{nSn3$TRSPdg6}T7_TQSo3RCbxDd-4g1Cpw>YK_5Z2}p zhd|PjOa#zFF~O*pO<}S-0HKGw)=i%x2Wwx=i&3p^DHxKmD2cSx|L^ZfoBrWH?>KHz z+9gwU`ieS@vPf=_D;SDF7$=3(2U|#wL{JE!M>^Oe-2aK{bsiiWXYPVLy6yLfp1&^M z9QJy1EGwt#-4zIE8rUyvO@PF)BeqDP+94Wa$Qan8Jvwov5H@fOuS*681OJW>Lwed` z$O&?J3Y=&RP!L7D_C5Pf!uG)Lc)g<1F12y0!(QTO{+krJWeTZ`=$F7lnRL#kf6V)9 zH*#WI2lWXEaMX{!HlO*Uf>Q^0k-==*nsD^IrK+B^Y!+|SN88u;Lc%)K?!5mCTx-O` z+X_cPSjM&pIi&#O5*R6B#>Q=-2vpFhw;SK#DO98?4K`(mq^G+q#rW`?u5AQ>;8gRn z^Eb0=D5sOGovQ6c`Pndm2}jaOkrYRPz$00zfD|)0wFNrVl};GnEIVtB6-@D7t+826f|TQJ}&V#8Y=U*>{J&Z`(Z0z_3lqM{}Lz*tAzmTr{)oi$&1$G zQ0*6X+^MB9*Xq^zR+QDPD^6P98!XdB>LyaX_9ISe6)TP4d!?wEzR)F9oC>BwB3_1aVI;*h>l zoD{$73Q+8HdS>_>?TH5=^x*UKD6%`QoT}Pa&2F900S^bv=i`f;;ues~o|F`Njims9 z5D)|a1OPKc1SJ3fPgGv4J%Z*=BrP_focl@4nOepWDUl_ErGxNyM~@hD;93Gu)NSw7 z`u8AsGyp^+09FS8+y{qnk+toUg%LpLe-79Q4?q$oTu(5`+V=G@C1tnu^CBaeR(rjN z=BnF!udQvnK9kn=cdxfq@9cf+ur+mhJg!1+I!=77$Zd8!IIO1X+i`Soxb1eD=&D4b zY>f!ufC&Hq85uj8D}dbv*R>^GO}qWJZU2@fAlaCeLb`i7v2`#@q8ptmP^p20rZI^y zQ~4oDQ23fezz`!ENMrboHc<1&_EYjF*cF|1^IbAySKYq1VbAMu`-&#)&)L|%RYtbG z=IXp&T9QZb?`QRm-qqV0-&`+y6Jn|Z_UeClu{k^L?CPt#Iqc!MU$LD6G;eP$rYE{l zy1cu;fseMk$Jn=h)xB9By|!Z6;tJT`ln{moIw{Tj6rzTfXpxX-)8)o)FA znc+M8v(9zc=zEh)dR?Z@Wt1`F_$%cf>&Tli@KwbR)=^qo%=>MM)a&(_AQF0>bmylRA^#@`#- zV)Oi2*gp45>{xjvq9UjHoiT0om69Irg~t$zx55O;m{d-|2?+k-$9<`T3x~S1ZMGgy zARG)RmFwnXdvvXPm)AdY*c9zXLH$BQ!8B_}w0XXl>fW)4gTCcmyTWYJyVEwrgZHhb z%dAXyG5dxaPuJm%8cToYo4bkJ*WHhmM2#g_FPvNgfwoKwYTRL32aQ=GMkjp=loTG( z@uvun0}6~};YaTJe3~OBt7p#4jpTMCp~BE*u#I?kySf!4GX3K|uC;t`KCS*Pc3lfK zmLR-vIthstQ}?$x=Y%+tWMMJ#Wao_bQKw<5zphV3WE}_~x(#cQEa)oK5sD6`)NS03 z7$D9tffwHKLaKoRE}5P3{J0KwwW`6Xv)#G2 z->3C?`)s+%y?M=L1@tgVbt=MOg8|_T5_m9o8Vfv{gid7P&yyMO#95te`%+Z)({;9fSCT|+| zkcT)+1YTv88hMYP1Q&R^=%^S+xH-O>`f5iYe-}@aN0ma2B`7bPN&-D{I1MHkej=ubGiV*s zUFkv*n-uvo!=f+jevcc*+(QLoE_Bm(XG_R0MmP%QJ*Q0|PQwXgDeq zk1E{V;K*B~npAO?4qh5wg35^i*2|2ol75%?!&Ag#nf7zK>{KPs5C#nd$XuY`(@alQ zclS3k7U^@ESyFh#&?(wio`4R61bt6DatV}^GVH;~lp|-!ip=2g@MBJu{*#{}nPG3g zmS1o8yyO<-<-C|4H2G=~*Zg5DkhZUm)d%Jz1Okqq%MUt@RAoEi+m7`&rzSUF~@L+?0;2nVa)$EBzv}sR`5`F` zb2H0vJZy`gc8rw~bU^s>a36{ zkcffK2L|h_5U>OR=`pRUd)!J}_iURs{dkp)USyPbf}J%hBTt?mrmKRFc1yoEI-0}G(r&%eL(39nxPU;&^5szqA2Y6 zRurOkfkxIvm)$`PS4OF+)Df^lnY@s34I}877>c@)27$T_+uAG(hOZXCEeJ*uZ;$oy z7!*Rp+EeGZAt2ItErUOcJtmu=4BUcqQ!Jq41Or{U^f^PTteR+VSL81tG6E+AkNyvtlw_Pc&?P zAvbS?^~Zzh2)6K)e+82EV)Do6oE)N2wVoIN>^1u~=t`FLeo=gMGZuW*RDXO#+2~^B zA2THfYTUzerzg^9*&lA=5>@(m#^Qwff+2tXXImF%1L@X^tYXVHB9{Y>!%8(#?Np<3 zyadZBQ-1WydIaeJTjidj00l1??bsD}cYP&2%$qY++3r!apT!*!CWGVv!jF%X0nqN0 zm8VJ?3Wl?&5U6`#ud&zKm;GA}X=7_2thS@;)%B6q<9W2wdhRc%iB4j2U-vR|X!X?7 zOnIR4x|)4{>*1>gHIG?DofO3`NKePsq3F;Xivg{2kDL*Qs@yxLyH2)}=Zq+S)io|U z3`-iPk1()A%qNOqw0d9wx4Z4y_hRBulri?)EAs>;d&70|SNkif^A(ukLol8xYT#Q| zYjCDkC%#vl4Mu`Lq7s#!7yxN6D*7u;#S25JBrC4l-(nt~HA~}9cJZhLW}sL5L?q<} zz{;q4sIkQWeRhSVSC$`5N_AFcb%S!bqZM&YmrdN|<#SBZS zCQtsTuY3 zlnuIxF#sb;XKf>2#MPQlL!w>V<8JC+9fkS*Xy@)t&>57P`wqs6>C{CF-wNSQlDd4AuSTh=|bwcj6=#80t z!Tosy4(I^7Mlp`pK7O%p;N2B1`xm6S=k{6I|3 zica+!7yx~vTW4cgUt`x}>qj0M;gnelMUMgw27$B(Y%tAxdF1%D?106^;pXCf^vUj;r87{!d9z6y=+W1EMbDDf87{}8a@8Nc<7Z=yZe0%FI?QN$yjkC=2=3* zNC1$D@ek7ha0XJQcL|RGr5B3c5~>8s9vCA0@qB7-boeuVoc-f}r{)u!2%wPMMOsL1 zy0`!L2FtVk2gxs%x@SQD^wbA++&>QS>dTi8lMltsaCyEKEf5EjO2u6q!%U4s$jy0 z4S<+UpDOAny^(lk^^YhP533#2N(hl*zj}18IXB19q%Op%!x?>q3seBKlVaWF#qIVv z(zf+k-F1jhD+Tmce&3x#=)dM#?=GLe%Fe^igqfdvOsK5Vz;}7RNJmmcR`#?SdaS;0N_1eKmu)`~8vakk-qw`o8#AtU z*U5SJhmfq7mmmU|gfTlJ_*j*wT!mS-D4b1;dIAlAqDzrj{;AOjr@|rPFGN2yYj>Zk zJUC2|#m4)2t%l-v6lCg~{*S|v0iU(JPqejC6i;-f3afMp4g4xuF6d21<`NBn6-mwc z_ig92%v0`;YCW{N@2=p1i&Uv!!$i;~_qN@I+(}|#Pi&DH zzf5_3yw7+bAJD!%T>h(?@2GqjSJKa7vNY+)nX^9zR*tf(JAj#8_ynD7YCi=g%KvG$9l*Y z?rN`41ds7JSc-aI6sM~Aw0)8Z1(^bw>K0Nvi?qRNNRw{8>PPfDh14PH&!Qg+NDmK7 zhy4BAqG~{Q=b$_~dSuK`qB^lC6&qdrs7;z(ohS&@YcSig+&Zhgf%J=EY=~AtABaZo z^B-G+ayqYVpC=hp%zX%N{!1rpFC_HFT>aKbd7zCN4{e!hvqYV!bS&DT4k!rJYcP!B z&CA{GPxXwTb1_g0?$mb){`pgQ>%ezs!(gG(ybX zPOq)5&#?{M{d=;bVR}sfc9{fVSL_1I|Ju zQgR?rE{49bZv1zd#vZq#`q%UWEmJALur(y;xJnyr4wx{@+&vC z$W#tq^{9djYm5w5Q{;?9w<0IN)E4Qyxcptq20)&yGpF69S9|E?7Q@(ZuWp?mR`!4A zygCg2^&&t_*m%w3t)>tLC0XSmEs{7btX4MDEqW%O`k-{$JXeK>SM~;9g%}T0Gb;94 ziV&Dv0Fwz}QAYDizAJ^L*h$t%}a#u^%dXOhb(@njjCd;pN(-jQQ>HZi5!+uHZXTqBCwt@ zo#xrnm?p9zO=Zf2d&}8)!nLqI_NB@0%v@B#nn8_KV#`35kFnH9tRP@KdCWRwBq#vX zl3;oJksqVmB=g0PHl)!UNXnJI5?eVp_22a6g`du>?0R)0TuGpoIE&OkWx5<`gxQt? z)?QW1tyw*-eWYc@b*0jN8ch4TLXe`q+%%WUlp4%kMlL}7#7nHUlnaE*RC$aR0h3AH z#oq8DRHQyG4W$#r@DL@Df?0&daO>633y9Kzso?ZpBD<^7Kk`I=W6Y*uHE|I@g4QQ7 zyUR;VO-&kOMw>HLkeP7pF-iw52zhrR#b{nj+^F~|de190Zl1=sSEVCk7TyJwoH-2< z-#uAA@G>EeB0zW2$h4WfBo%7|EDl=`m@?zUYWp%?D1pb|c+^z9c(1G+?(`_hlMc#)Ar!ch!B zGv+UqAQ3sjnWt^UQ1h3;S}S>!=~tD9ot|iDWSX*_hU+|XV!W(gpy?)AW5_$HD(N#{ zj3ip`yXL@5cmM+l&n3KiWCiBJ=&0|cB&EfRoT(wr6mS|wlx=b<3h*Rx8KOuqmH|#` zVf$uVTMAqsMC=X=^}j@MWw;^es8EO#4Z(4_5nxI)Xr+-%hFL#E)gNLQb}JJaug0Qm_iI= zmf$Kw%1q}$WHd=Z2{SovQWLTS!AQf+FnOT_AS{>DOG*d0n>1?C7QMynL?K_uvJ@6D zltP{I1Enj8PCx`zOap$#t}`%yA!k#3z(@*dPwA#r*Izu(439xu0CC4M869%53 z#ExL-G8}U^(rRD?mSdgS1zhckKyD$Sk|p>dt}_Q1jTGA4&$Lo-Eb?jZaEogGwSp>b{-px02N+t`f_yBF3GcHx_r-bk<0u(WX72&$ac%f1Zji4U5I#<~!QUao%Z))yIC`x_nGwM31_Rfj&m#}>w& z4||6q9q0Ye)&EvA@1ieVZEm|ZQxrQ#{!nAnthv_MBkwwgSj%opGFPFUH_zuQer#`oPlZ?k=^U7N8oAKUue-iYk5w@TjF3$p=-sQ5|y z{=aBsBLMAL4?983@4XpQIJ~+?zP~Zay=7hd(z9zZkG|OX{yPXnTiYRRxb5h3>C&X9 zJ6YoM(?5Px7i4ZAWcS<4D%v*71pRMPrDm(`Mx9b`ewt2X{_Gz~jhyM;?RnXixvOLz zwzoE?cYH6q>uqHc&fMktd$;Rz@sT-uQjlIY9dDW|^TvFFU&F^U>5;aU%JuX8@w(6} zhrjm;T^F&N`3ruG-|kExDZPOF^XEUWzlWBkoC>_U%1Xh!&GYow^jT}tt2EMF!v<2f zTgwUlq_sHMeyDlZ!y6|L-|?H6dTcf2^WN{OxF7iK(&c`6j@yZHt$U*<1L*Gjx9xld z*~hyc(7;|?JAj$Hd z<5I@W*p#Pgq~f2py}#u4EzM7#`y1gH?wCzvE8KG&`>DSE9`pTm&*i&PYwM+60gr@6 zMm$_PQRxdM#BvRlXd&{7V>*}`SU(nE``pz%{of)*Q`vpbdWbA!+qTRex>28f{;*58 zM)=bA(e$^!4^LE};;_PND@pyclaA`9hrKxWmlR{S zZ-r0`pPGs^SmD^6;@slN;0EaKgVQUI{fVEvSUekAQ$|t>o?xD=B$6#$WQ7((%+ecf z{E7Z1bz8*>bMjHKsH}UW6wPE_Qt7SJbzccz%}`Z)E1}+xA*u{c*mygYgqAd z-=k5QdGRCb64h?dwdFKUeb?JL*Yz1$Q9bU58&CZq~9-+dJjOrtpQdNDid-@QM?IaemH3gvj2;-8YqZEQzK_`yUcQ*iK$Yj*Z2+pmb@ z*4s92a*?D3KwhMka4JF6GCUccg9-sDzyl%YN{viAhf|~A+pVo?c9p*3ugliLqHPi6 zzeuOo^|Z|}4Cct=EyT#?u-f81pp%(_U`B|=;Y2C;uC27Ow2P1y3i481n31$HduMz3 zkKCJR#5~MdE-Bi)d0l4#!4HK+pLLC2`pIjNPOl1Y+F^`vSq0x()>%VtM;SOL*PQw} zX7ls!PJedAeTkj_>l*S{QGR`2Tf3d{)!6?Si`RUZz9a zk65~8YSZcJ-D3$()^b1&?> z$Cxc#FvKA5P`wo@{T?nLz^-2eOU#K@@?p(65$~chqK$ zW(pSL11=|36eAtN8$v=z&Fd!r4L8etx{GyD5(BqQkG0mdj*oHQtR}6r(y;1X^^q@7 z)9V`d=724YzzE5g71m+}r6HN8TnXu<^@~VHn{~Ndv$wCb{@S0u{skqVECnzcGY*BX zlIB-Z;Is}9ITR}d78TzTcTIjcU~~_IH_8?^B3$NsUJbv>Ovjsf=oATAJk zimuR6VNM(&DKK$u2Y|t-VxRJ))c93EW0>K_o8KXDE=ppcZ_n6UT32mJl{S2F3Y1dS z6bVRMO0EYM zHhc?=A96B;PIH_wgI{(wAMss7!1!_eZ`Bbr$Z8U+2(2}f7bb))SP3nXNUL+g1e(f+FBOYl2!&MvL_mTp)p}`^gHKA!4HVsf593Yr@hLxEIAk;Pbq>8 zyuwTp5bX;>DTkfGXGk7G^W3cM{NiF6E3}03*6Uf;*4J^wknr@}`Rx`OrX|`!2nR@k z0fY*a5(zBB&7`(IesR$ZKQu3CS=U6`5OVpD;i)7Ml2Q!=2(9y+Q#!mXDT2|Anw)5J zAdlgMJoxrG{N9tOe&g%6ibnZ7-JlhXH2ntaFQE!YbKyQh4jFoHjZ36V8v~u{oQs2B zGBzyztLr;=?26s{OVsq>>!iLdv)X5Iwr84&{@!)i+qDf&qUrGxzoITxT#zgzAxTya z0xVuwB+x@=_m*I;InkVhfnNX@5D)_Z1OPKe1SJ3fPh>sS^#V!9CAlZLnRB;|h$@X9 zfr%ajH;yDp<}Ug`7WgCqca{Bno&Eq2nHejZ000035_7W;rwAm~*`f%E`03J|^8k_< zarJvPn@A;HU9L`TAYI*^imdJZmmFo?_ml)n?ftWCq`iE%?QCtFIAmSzXPh`BO4io+ zc)Q8g&N%S`3DO*K@r(yl62%A%zY!23005Z*tC<2gZ8+Ao?AemFH_g4@v9*$kq{wWx zbBrrqV9l(ICo@4! z>_k5CfDrq;g&Dty%@49;U6V-uLia{l&;ddnX@p9~se2gZO?g1b%8OZTI+p|QfKs5x zLmc$*1=HGT$iU-VXv{RQpJCy*EIPC7tv!p zyEUQ=jukLfT%w3FQ)EV^Kn`c3yWk8D!k;XMbGk^l9pBkG~ z9Gf2J$Hy24ZyY*##61r`%1%zggLwvY*l;SLT5=7fTmYQlymNGkPUk7t?6C47d~|+@ zs~%}f)-^|&K=FpPY0PWm@||=7PKDaaP5{#wfX+ADVi7V3esq3_sUG-Qm;j>h`jMx9 zE+ZWSmIYQcJcP{BTyI~xbH%Q9@C}h7vMGY&ubM|9|L%7^ZeI*9dz;Mb+Z!u)SAe?M zzPn?0FN0;jw=x&FmlqOzf8gy7+_(#PR!RcvFLU}CHyrHVD0dggZ+ZE^yU8(rEc4Iq z(0B#L#qXT^MVG;|KfO3O_ZCW=++vLly=NJ?JKTiKty;Uo$B%<+C|rnt-5c`X{Fzp9 z`ToL*+3Jw21Ryq&>)7F4u}EgPE=A$F`-Wu-BY(Prvi^ld+9wnFX5Z$+lh1m%T*Xo| z$v3!WNb#hu1{0f>O}bq&^icurElSNgzz8*-g_Wm4hHRdiC1ewG&Zqgb<1N7J&c>fS zeFDE6-U#K+BG>P_+Q>|=>dVY$s~$(q4fD@Oh66_4LaB-{U;IewRM@Um3@L^8Nnaeg8>YFBF@x+8b{t{pRg{qvDUp z??R@H$G7)J*<)W`NZ_Wg&D;B`C0*rh)zyt7YxC?s_aAz^T0|s9Br!3^r9~Z^F)Bo!*;|##l`VcB4qBJFuj(cF@{t^8d^3I_yLRbaw0vQQI1`uOneFEHJD!-l?d zJH$q^?)WXKhC&Qoi;qE4%s%8rgQO+dI}_YvQY^+L2QB zY^-%SIRyxL-`%15HqLZ0ESo5BUcP_iX*io!*A3u;U;M}Yfn9sTG%}N?hsWpm#Jav> zCBi8reBXC)>b*Z0-Ll$9KPs}8WdS6&sa+~hl4>2n-8 zk0)_+JxF1{eotd9-nHxZdL*T+Iwbb%cw!$gkBoOf+p&~-t^H?rvLe3Dt^f3qTX?iO^ztvS zrT)st=kG9o!W)xUS6P18=R}m&v*QiyV|KUk5a3=lUj3c&&;40>Kaz)-cQWTA$Om`$ z`KhK;UQ@d6@$L%!@lP|C?j5H%%Q5ELIc2|q)v3Q>Q(iaj^lpePK#!3XGS3os?2B!p zhgTU-bZz{}15H|9K0)M8B!2}S9D1l+J0JAPUs;!3xWYFW=1aFf)fl`7?4Q1+dMXbW zKHGj|SBIbWo+uq`N1yHxBW?@stzZ6zn+LCQ1DANuTlqcj;{nxz#!g#Si%%@Pz>|h8 zN4Bo_U3rc?7unlN1LWUJc=y;1-(dA!z^k{oSnCw#M6C-RZCT-{XA0-MkyjKcBm2bbDRvb=rT{fwcZ09^_uVd?w&{Yf(;Iw z>{XX7S!DIN&^?GyP{X1R!x=j50`d>FV1)RF5ZL@iQeS;@S z|C#?5ngnvZ6THw*beeOOM?F;TCH$%5^}YW>{t4(^!>_!tfsr=v=J-bUf=3t0`;W&C z0`hdDe6Cj?`I`2?pmFbg^!xwXcbxs~7o8^l=8n;8;d4P{>#aT{-)>NQZ%SY3f;=JKs)AQvgvtpIBtm%I9_pKdRjb!_N9$Bl^>D$21{eP(waq8NG zTUJ_DHg^58yfqcg9j6V4e@|&X6DYHd>B|HDCLG5oS@EO}bw)$Q2Om^pGq1*SOA z{A<2X&bD2uH_#}7p${n8FMHcE+k9JR+b-J%+;6r@E}Q-@TEQZYZ!^`swEFhWt^X?+ zm6Li*QwtZ)Oo4h38x4aFrzjZGqq#QUjC20js0BvK({4P*a)zvOMu+(~e(=We#vqWA zTLCXf!DR?cQHB934)$91ldRZi#-!B~CHB-##{c^fXQEsG61mC+$-6n{tF zEASCS&kbf>-qnlox?Fniax$x^iTg_h#_!6nmm*!YSr2j*Z3kQJp98BvbQmDdhr|Cu zr`KEh2({1|Df~XY9(eh#eZx8Wo#N=XUd^sn6p*uZ4PN>t&vA(6I#_mkd3GEIJ38x6 z+$-W&l`&P~{Y{r9QQ6d$;sTMbo|A_`MGY(;aj(l~D`&RE`(mifD$DZ$r>EzWVUSY8 zZ6xlM@h{4pGV!Y1@A`6nHKR13($1cUhe7Cjt1Fr986Pz*ybe5n{i{UIx9oK5wUx*5 zOdsSOXF6e!WyR|s%Nj&YA59k5IPO&976hBFo=%5BOAYg=+c%)L+3ME6^22=(n$Pt` zUiu$#zgbqV&JCXjR^MsV*nP1@x|#TY1}S+ZUbQ!k9JZ)y#4oZRqi=n z`Bth`v2yQIS@hQ1nYwnp@8_HN>aP{?do~+gyhySG4gEbeS{$~wl-XuI_L_*gQBRfx zfipWGDf3f0?b}nEz%omMtGyt_NlZriCKM8Sq%wVls?@{5j5suW4faarY!jl%OI zM&xm*HLdIr{wPdbKjs6RW{^zMY~Ka~IB&%&(jZ;0!%5~rh$f|fMoW9`D{MPSrY%>} zwd}i=FH7_%TbsCC2+KQp*g7)S4~RHZeNh`=);rJMH+{JByk}>gabu%6wGX4Oo`nWM zUi-|GD;Jy;lvuSPlxH|UC6e6#zH_0oSo|`}_TFMkZ6*#g$V8H|gQ@Y$1>c zp(!0i)o|iIr)8t2 zVCwuPRaVkJ5Ma)T4rzol0KnjgD+Pui9Z(zQ4Yd*3;TOfGl^?33_H9M8gHfwn?$uE+ zTO*OICErL%0i~k8r8-~(0UWp>F>q3CQu^*H>=qp|c0-VQb&`{TCdG&IK`)wm{g^i+n~I7)LQm2Fj=v3TYkpLM+Az zPijBu5OqHM%X*hR(YKxsDB1@EwfZ`ewgzKof7z#lcrgd`iFzaB$UFcO%mzRbr3JwY zAuXfkUg9&&Xg=_ZUDLEDt*>p9tg@4}x~E`#aotA8&;V&1;GwLnRzWb(afJL{07$s= z0E~cCQ5$-kPl{K=X=POSFwR#C)g6I9!B-Kw<}_+=RwQwvLdlR(fcE4&U@j|jj`gdv znTUFFBWx*J4L@>RwRNEO0FQ?6z_9>4^hShaKV2Cy)q95+%maurNXZA1!!1ZdFVr-7 zdz^^V55Hhgt>SNhy;rnBIi^_xAT(rv zI)q|=-WbcNP#~OwQb)D|h|7Ap0Ep%VgCcdFMWku?8v2{`x`rV>fy6*`>A9p~BFa|` zKo!IQoyOG?C8Ruc&@I%_BzS5Xfhxi4e1JP${?(RqR3_%z)BSYewh(A{u zp~U64W(7BMNzr!r*;gG?A7$|f0fG^dH|OSl1&|UeobWuaNw`!y{f$~WQ4C|27m;q^ zw$eV*q#<;HnLspX0XG`L_QDT5ZZ|XqSg67V6NFbh(Y^c-TPayz2nU*=5{L>LwXiV? zV$O#MAzliCGanL8XPA2%Xjg%DHTW zin)U5LZd5bw;nIGR5%boV_^xD?6pK-BbRTcME8bYIiA}9en5f0IyDI$lYX6P&jKFb zks5hX#`FRI(Y){?hM`nolt@`U)DwyhvCvc|RQsfkcOf!U_z>y#*^n{YoT92%Zx2K^ zQBeAn5*IIU8!$#lv=Dimw^IzG<{W4d4;p?Z|Lr-XE6B$XMTjmzBak45nN|v*1mEb* zJxt;li>HtX8>U%^sSCgCYrVPuA6MFxA8d`H3(W|2MdbKM6BT4gB=_Dz9F%aJVQcfE z6DD{3BE~fv;Zj*(tq{n%K#d^W79r3{%u!YVt+6NqEi{HnA;J@Aa5*1-5&Rlfovoc@ zb#1Q}4e(J!lA;UH34~5@<}2}P0A>NQgBSSqT9c%-*I0n~HnuX` zmIJ*=D3O*xZpIwoteh)^G*iY5wUOq>54Wg8{<1R8&ZbQmeIO!;no&#E4gqB=#bL%F zBo1Sd6_`lny+%W3@D`i=BL6iu==LSCl_TKT9r-z$u!bZtYN3S6tiU>Nd6DZwhE_xZ z1x|73(_0*V5&RlI!)(cpOar} z&(CMOD9cLv3h3yFI7kMfVf@&s)46=5feeA>#h>)0B`9NI#!L%R(EK8b3O7A1!Ojq*e*JxC)h zH1VlG18Ky^du^JFD7NstnPR>`^dP#_+zDj~=5j!cy;4KHz<3~pMz5vcIm4n90f(Qv zU+eoihSm%+z}-Ta7LSvMdB9pVwHd>9Mxhx1doU(upt5-v@onLDrU;Xkpi_t$J&lDa zDd$#4sgi4hi9tY4F-8&(G|WJYsJ8Gp(<01Tf-NC31Vz~G7(_CJ7ZRh!mV+pU2rcpK z68+;}M7D+8nGwb@8@ zs$p(c1}y-Z8B77e(gmpka;2qp!Fxuem^%C*|JZT!=0>pw2wh0NQA7QNXq`qYMZ(;S zVIeUZ$G}#t;(InyBprTZocv$>9}+Z@0l!PcHutm_tLNIMTi-Da0o@x{*Hr6D8XVthG0f6s16vcMLx*9nMG`A`0$P=y{wb+%Z3Zl z1?d9Bqw0)EFn%CHR0*LI4{&2N$_(O0O{PmfDNzkO!Wb_gz#$o<2Iys_h zyAgB|#$u9h0rN45kA4yB8f&aiD(Zv5VnNi&8AH3)iWYuAOCeA$r3`RlMoWXXPMT&S zo;3V~`3P#??OsI`HwB_a%}P5U0^=h~Zxfowv<7>eCU6XP9vEm5?;3vN_!P77(IgF` z3(y3qL2&KWz|NG?BbD)d4mQyeASKn!#zZyvMYmG2vbM0Ur9Hyc;h%C6r8OJD6xI;1 z5g>-HOg$q?hBUx>Ov6qZVB1$xb!z@ON!rtumu7J(Ie_sK#UYQ zF2fwfG1W;nE?yCd)L-n5PQ8ai+$#MiLggE1zdroE#Yo6V2GdnJZ(^#$l8KB+Nu6Lb z1v1ucv@ijDh+y+CqSwP8+{2H^BM?=HEuyMF<%$}GBprDAjUK`t103R zKkm586)5C@t%YP;HH)tTTQGqUhJ_rAje>B1krdz!xz4B*!H1uBT-6FhQ47WpjF1eY zt_ph-48p9+LL{{#KpvP_NJrd@jAjHPUOoJQe{>2fCj`erw4qU~vw5U*L=rHK#}G@A zMkq1P0@X4@VJAh`;rEMFGkS-s^!B&V2W{`pp)6t9MZyN^BX zFKcFPQ~C~H-NZ?BZR?-6{;OH^j?aIK{FZI93*ST9%(v=u%*y)_UqGvJ#AU7H-_M*n zIfhJ91R8$DyaGKQ;{>%@g8wA2NjvBzl!Ay{Kq)3VCZ&+C1QckTRtLI7EQVjOpR8@N zvh0%>{Zi>Ah#;a#(1@=YGaE=GKyEmiGqj~7j*-@6338|+J~aG5|H~=*O}OP(;=~_D zN6l{!L?lsGh!@c5(uNi)oXS$Qb7Ks?jf0liL`4i~_%!l1W{kX9->bd8WiPYtjFmfM zJw~cWw%!e5+R`ZSS4s0b7I-0H&dUN~NVjj44pnrL_%T#Gi%_t7`212oaLB1ocPG z5l_6zP%!`kl><;=0V4{h8gDbt>~2c&=~;Wl^%* zTAZk)+p23$?$B*z=jTYnU25m+d z7rW}?k-vDztBVhK<29WHWD_r(#CzUfe)FSWe!l-hSIv;~Xz#rE*K^*AzS+F=$KO0t z*7d}o3?2h1Kp8J{h{Y|&X^D1suhzz~7S}#|zJ0#6Pa40m$(=9rV{AH*UeErw-o89} z)qY-gs;&`AdXYqG$YEMTSld2D)5>ymrEYy@XPW)>&d(RBo%-^up*HXHxw5`r`u5WL z3S~dkRoggk6dBJCTR*#4wo~v}0jQe9P&D&zhF?$m|o zKip?X)I!2a4Dg*{5zcw;?v<>G;0yuBx8%gjGO5f@OD`*&F7duKi9giMun}km$W5V! zOQen<65BJkdl8k^Y*?}#!5J@RcOtY9^iLO%AwTjaz_Eo|Wb+`HQs=KE;R z4CSq&1xPv^5-JUmlFh7x+dD(km)_DR8fqb#nReQqDzrQYgyqu!|9htFPfIi7j^JFz z_tSZYbTaua)B#xiXtT6nY4ij&&djuGExdnm z;~*W{XVC`^!6UL+A;5b!tIeRJg#`At+hNyXus|r4#tjCro{99 z$ry!vKo;Wbp(f$W=h|nyy=HUx5r>R*wwg-2IYC`bGNXl*%^!@bae{C}4HNxbrxp{zt2%?JFE}AKQ{Ma~5X|qSwW9#omx|Z%!&D%rau#9x9O1&9E7Mv`N`Ddd;}d zQ{)>Cskg8ndA7sY(~$$i?7kypi)=Wh^1Aum9F+>FVZu-rfE^pP`tYbF03J{d(>(lF zYSuci9j#Q<7U+XRw%*ry+OOJA9}6>awtA*p01sBbhLu+A$?JYx{zyenbNl^5kB9n4 zNP%69D1U`rGt$bTtDC*r`B@o!cn8M zoHj?F7R-=`c!y1qc&LhU?&kr|^~gI}dzRC7YL)^~@e4W4ckd1m>^*Z74hb_cYqC@D zcFtF~e-)DgPM3=6_l{j3RAh^LJ?y=O>^t>L*p$aQ?S9Zze$&}<1qMzoCc4-f9m zWmBX(NE5}P4I3s~s1(<C%S5K6_&Bo8b|gsk>Sub!+3`$XPsT5L6#u+p0PnLC%>jy0Q5jZM*ICg zL6di5=KJ_Ej|*6Zpe+j+jiL;8sk{x(v~a)X04H=OKLgXS)MK zy7RJ(JXzY;pZ=oV5C+SV3k2=St6Vot)E8~f6t|DCjWSIG_OZTQQ(g$;kvfdXh_p{e zPo1V}Dd`(NtlAQSG8#YZ!|g*;lk_hX!8i7Ev&7Ba4+s?zzk|0&IzU( zZk|adfQ8iot~^PXhzE4_kv@TD+s+O$_51yS-f#I68~c!L2ARll=$;|^xxSct`OVb~ zo0JRW{_!NAyuagN7#D<)5nG=+UB9&C4url;sSxx?VHHcPmU*Fz9USg6uJtFi^)x;s zYP}jo`CIHcAqjkM3dEj0=oe~jZo4<9dJ8eD(`CDX8A-uNw z+?2WL>D6e&_gnrFilArTAAPX+jSHf&SxJSQs`|xXR}a@9W)Y*v_aQW}`$YdIWT3m3a^Pt6%y$v-Q`;etZ)LbG-`&~(oqGg*lZHFG z=)Hb^*knZ6C(Iqq(U;J{X!K0`5&o(FHIONOz%O6YN%D@ACD{IpSaH4U^BsO83O*q} z@Hw5wgpfPgj*6GsaAr zONgvTTMEo=*;(c99!G$S6EZ`vN%hAER_J;nUdMBuEM$w;DO1OnL-<$U{l}2*>0t~E zZ5@BDvfM43G|+Q0G65f-TfFr**?5b51&1FHGhU^r3L~suBkyxfUP` z*uH#G&S76i*24B&()@C^Xq`fNZN7P&L=1LHVO$vecFg_APN4+j)?;TQlHj`_Oz54y zC&{=7f+KpDAs*pp=Eq6KV9*u71yhKNQ#VNKg5b+;EPhWi7%&2i7RHiW{R5>kqG%aM zaB&)>`(7@nqrn2149F`IEbjZk75Y5Fwo>oi(rmqX>Z3M@k1WXLj>mO7*mdnL4Byfd zZ|{vS(duzR!nkd0Lze%xz5rjxg>DVVh-*)Mmz7(X4Ye@=l%{bIyZlP-mHt4B44udu z_ZYT4TVImXO~GR;CCC=5Po1yMnep9n-rMFYK~n-VS5dK;I3bpcl*ybps*^*yg5YiW zoxT2S3PVQ8F1|V|PnSz0Cz#Va@c~Mbx3{bDpFVaO{tMfFA7_>9;ZXZ6H?ZY`-HceL zg6JlMKW$I?Kp`W- zm4dzRo`+gp%C8Szb`z9H`*U&&yxh^KmkEJ^FWJ6lv*oVt5BtZ-dPqTsj1L_$Bj=xd z3(dP{lBJ;E1wli4>ko7P74gNqZQ|{U+vqzb#5QkN{EUeCgn_+0dXla6zY;#|e*7gM zG9K;Kw+eUU=2+`(Ou%S~|NQ0poU6k_U~x}mcvvYywt$_Yc`>ES!J}+Dm*I=kUD@7>YL%cC``lI(+;Bdsf<2CVM{E>8y_ghh`uThPuEm6 zy@|n~29giG7~kv9;Qtj{U2Zsxeb`37z6&LZS@;Z{VlpE86Sd-$+OXveW!r}HYZxnGLHa+#o_4sBxL-pWrjFAxu z86*4b_qyDC0|1cXo1S_1(Fhu>MQg*87{n+zPFbQ0!>Xivy#@#SiON)GL+ zunm~GLn_Mf+UPWeHBjhA#8fjcF0?Pqj--bHxoqeO(PwL1Twi`x2{ZL#UQBUV1h$R_ z5ldJxs)89>PmnEWpFAC2xw8nPJqe7k>ML$!+6s)=BE6OiYqHMGp2l-=98m)a8G-ic zb9v2sCKyKt)N`D_dP}8_V4HVxeS@SAFO-#LN7F+Ov?@2Ylv@YwKD>c!JhhDKGzbB`z(dNH)*!sj01YxJ zVo2~sO%t;H_5ReW--q7Qx`B1k2r7k23oz6}=wikqmCzCtW-#VTFN49lEwV-J6jcY&&ES?;%<%jT4yU z2_6WQa#3M3n26Z5fH7Qr-9kp7eY|;?z1sS47vZkurCwo z;Th4Y4But^YS=xx=lJ1A?+I#Y{KkUx)d!4cFlue|Od6bPrq=PoeFwcp^m0N{&}E)1 zO}pyW`pKU}m-{dDMtdClNRpsO@*!FWkx@{gSRx5400&U6B-9v48C%r$AydF|k zRHqT#Q!w;6i_7svb``R0>zS+3&ViSv6lHrIe}K0|RHGQyGq@vJU}3C3dggGCBPGZ2 zpM`AlEthO?c{4#N+w8bevd|E1y`gsC)UPzaDFjv!$psQi@gnjH+0k2hvwyWB>iTjd znrzSFtn0TT>P&Tj5|rjTt&;$bJw_oIwgwLr)H33<9;>?}&pRtJOHyAo5fjvrw&Prk zwHzRoq+yQ5#v(8V0u@3?PvSSCo*6Pfc)MLp;@c!8XsU0VcK~ew)J-*3C@3Ujg2A;S zgXNUM>?87CAv(d_Tz`vU;eQ^(RSDiFZ7V@7WwJyGxiw%n)T1*4W6<4M0LTIaVgCtfgkm{XYv|uat|QpUh&x-C$8v#sCU*%qQ7!Gv zU?{+Oh|ylF5LJ3&tDQjDRYWHjWI2cMQl&4@GhI(Su@T7t3_}z(8d7O=jzO{BNtIC` zIK-tZWZu=!%^dy9pP;leK~K;{;Lrn@z`lAMi6Ed`Ctn|HIRdVWTuZQ!5xQIa2#dRC z5}TkEb?PMq6A-dFVPa4Qh)4^qaZ|?JP;YPGkzgW`n61?FHyp-h=%Xc(_)1jsVcWnVL$Vg%IImPK4u#1y9H>*ww*t z7NnWaM-4S?4s;~ zFi3E);}jN;HCAFMPz@)@b}?K;;wNM`_sFlZk|y$lx)mPB>A)kf;R=KX8bFDZ5s6YI zh@^!SU(x^}BVRw=dnJ_mWnEL9L14wLDS8Blj9|P@3Wd^#`ub5>Bg2WKAlc%53h&KV z4CS+7RnG*yY_Q>)SPY6{uYfE3Jf2CXEypdsE0n{Jr<`JGJ0F6A!b-ib2r9xEd*>wetFfEw3#g z3Ba*+v|PLr1+) zp=$y$sLH~QIdqip3Itbxa%=W5UH}#NW6ETz5Zq=Epdt&rlPKML8+eRt}rcx?^{w5<4W5z++bHC9M!N5Ku)F)WKS>+2Ly zIuX5{keNF3Ue=+**O9K8U`P8PsqAR2=Wzk@M4%V6#z4W;$P6I2F%jb#(e?@W0U1T4 zckhlnLHf&Q9^}owcq1n+lfGy5_ITuOm!KxTy{WMXFUM5IfnFI2hAr)Np5vI*>M1S+ zRUuohPR##6l9wR5T3iIHR_1-uE0zG^y1=1?F}cHF3#U#zyy#N4$elvGT_x$8V%e_6 zd!KF*oK%;ep>(9jJjPLoK3l@9Ep}V$VUQ6n%Q<9-{Xa&U)rd-b>u*;$v2_)rmJWe5yE#Rk8 zduWzz63ez7|73_-Te^b7w8lUXW>QR4fQgYUuHnp;fn-G0Cw1G=C-gOV7t>J3TH`cc zKt0A%t5;e9oB$E1(RRafI7W1TLQLxLFO6KAmDHD;^`}-+AD_)}U4-&Eit0GH2#?dF zC6Z_?Qwk%78cHn4LKM()2u#MYa2b*R2@AP0^XaMc@_KnV6+`+<&oq>@F2;TQl^s9> zFG|X_`(^};IjlG>!%3~mu;Q}{+3o4-fVsI@`kJ5Rx1e}!%$So5H(?t5%pi5YJPtIXI&8}B0Uq$qnDKA5WoN!RyZos#HJ}6JGh}U$;ZXz zC)r|43KjBx`d36-0^5anC;aT3hu3Xjy%J$DQW6PwgnE>Trfm)h*pLxft#H3*rg^le z1rPRUU4%P{mrJh#oJ6JA83(n9(1nc6YA@Hipk4?Nf>4YkJgWh&>Pxhi2>_=^Zd?SG zGHj7_g~I>DtyR`HJYGMn>>|h6GKWQ$jE-rfHt2&0GzwYSk{RID6-fv({YpEKE#s#u zOBHy}g}mA#HQ5UKDRyiy2T2MPL|WIVG-!gwP_Uj^F29AhEV4!I6y^f+=DRs3M6fQ0 zcJ^B$%DVa*3av*Nui%6rEm{JhCn&~-n;arSMv#5Ie0~b93WxR=@zrLz`SmzF1Scv) zhNXzmYZM1aL+0LMkxW^V5)RBpI2n<@3^F%=x0!$)?WD00LI;KoA=YaRB6_N4Q?rsG zmEIX~tkGNy8Tqsde&(7%d+fZss=AqluF>nvqY?Dg`1EA}kf)4HQVfA`;f31o2Z;hM zwh<03&I`32P{_MY|M=`O;>g zr^?T#%~FF3Pm5cWtv1}7h6Yffu#`Ix0Ak>w%!q2)_0V+;7ua!xjLH98vD44a%GBq} z)0?Nz;I~Vfj-Y3Si8pY>fY=bcw^D80gat?UZKDbYh|FeUDHSs7_J)35c4O}mXv0Z9 zTBYm+7!V~RrcqRDA(R@OV+yUPNvCx=3`Tr?LhYdbFy>4xJ#6c=_QGvEn?hmafFTIo zDyLd103@z+)~kh(;$jO5+52^E3YcLQ+F0@71So0?sIp#c4J<-(Oi+lLCF1On@^&OW zWc@leiA=FIZCt!2WE6Ke=%P#@AP^Is19ha#e5zl1BM}jwkg{LaCXG36qpQ-#5RxeC zvL=bW)nnmh1|x-%0AWRMjL3**Pp*@_H4=PiV};#8Vs02f7&;P#w4La9VK0`_z7EVrE&5Hc{9af&FY!=6Q$o7c(^~OA=&=b!oI6@%3q&W!RKEM>k33)v+ z0LySiy&ST?I%X=;Ro&4`?7T3xYOqhb+aXd9MuJfJt({UTKg*&%zf z+bv7mHEO&8CQ0j~+Q21BOO-$nj1|=AF$s3)d_uN`R ztQXdHu}olY(?`XS5$?;oak?bC&{TCLUBqovon*UwXe*gqV0EUPF%%A`T8@eB#3V`abX6S$p_`t`&S3Wk+0;maO zC{`3h0HL7V|Gk0*JOPU4_U&SsyZoAfVgZ}!c;f|HRN!{I6jFc&SpGyGB`pZVhtfAhT0{N9sKe7uAq@1@m;nSntd4<0O_&2-dgs8ktr;unbT=)Zvf ziG1(F=kmz!-|+n}&R&D=`7P;lrj>l&`Pg<(d9?EV{F93Pos=3g&z;X#zGuwP#Mjl* z)#uiAb9?7QU*c2k>c5gB|7X8%P~YS8qn~Hk!gK!Typ{Z``FGp!n_Vm%OSP|`em89L z%<6pA-#cjL&-C}Mdw%*q^8BQ#?_dKV(s_!orq8C8#!2l2oy8ElTRh8k!Du>Rdays6 zAG1{b(a0y|*jbx4=8+!T$q99f+U;0CXClMVC)tR7!p8JuA6Z5E!y`xZVOiPf*BcYM z4-h%R#|F~|BDB58~cdM$y1 zUu#d%*oY{;<($PkTZa^H4p6I;t+RCPfqW$=?Amyqky z$S==L;ghTf8;DzK=>(&yN1hBa497taJHOM`EwOCZzt0@5U3zsV>1{$*be8D%aFHWT^)0*(R>)Cf>mbD1y5CxYpHMB~?MhV` zM^SEPi*gTw84r!s&`Y-dI%5{+U^Ib2V;69YU zle7=mzwc}}DNK`4Ok z!V_M)FGTxYOD9Is-Di=K4<9)kTrDP~gAa1s(&>pJ2!?m0HqaLD8zqZE704Y(@M&aI z+M4>>dY0O0f%J0obawe3e$l(qUJ|CTXSjYuy<-*Yomrvmy3grnau`usQUw21_5^pN z9yBt8^&R{QKM0n)IUej1_z(zfF@bo!IBAZQ2IQdKwJ}$*mwLKP%e;TwN;{hKAGe42`XpE#-FF_XB4vM^ z3djn7N2g&_o&6t7SzwoaD$qfA!z!gRF7U8<)rn zL#p)K)jYaeck#m_8!gw3Sp3nzDu=TiDLal$=Wh<5hqi+bVX$XX|J#G8!nL(tykbda zp11^KPKUlq@m;$^Fpx^p$RVB0{JTjrML*b0VAWbHi2F>#`g_d7x>Fb_*{PpuUAK72 z7mf@UKGn?q;q*29bUj@v9iN|1w$uME@8-`v_-CNteZP0vy#C#7a1(zsuJ6G7^zFR= z-`CGG`Q*>Lc~-9{KiA6h*Xca2{gI!$_`IhluP)!&3XB81(b^f)YVm0G*hE_Fp-$Az zDE#5-Z{L3u`09==T+p>0)Z3~HxB8zH!Qs%!5wG8U(K=_p@99Fi!y`wh`Q27u>=4wK zqs45Z;0+md;eEtH(>>?dgTzvwH_99){o}~-Q}y*}s$TdF7pdjqrEuv%cQa2$(2B;a z>^4N){|`DxHyPbRobLSDz7V%^7s(fn4AeT0`OkzJL1*HA*LuYlRD;V9tCHf~e>Pn_ zb)$1E)V&chB>yzM5fdNoi``xh#jt0G!m8Pkj&sxX6&;txpL{c)JG*XudXDd8fv)Rda1RJL-J> zc?`@Ga_JluT!wV0V#(%hoyDPfP=(b`=Bv@=KgxI=95(eV!sn z0Ovw`rO^w>261FQ^=jy6X|vS*_O)S|yr-du{*O{oxqS(Sf+O7*1li*lRxIXha(a!m zpZv5eO{r1Q!RPz$V|DEAfeSm1bG|UjUG{vq0@qdc4OOh3pQYHTYA)Sk!Y*92AF62UVQi+~%g`$Q=s5y^Y}^8K;qFSc+zN=7qNB z)ai0O+@5LX!K4*z3`#3vwe22Bj84y8EY}iui)&36=>U2R$vuwiVKhPRX;~D4p7J`l z1kjUTlIy8{@U-f4^VJ3P`h8W=kesGS1y#LJ>rRP3d zcn0xsc@D+Mkn7`bj|6z02|I$M3Q?yIpj~$^o(0)@bqQiZb_Heq&qeqVhK7_MM@#cs z`L29hWyeS1j`Ymf5j9e_b31RtUL2j_I6FsB+>)Jc7Nvv16)(ZumhzAMpHnCRJq33V zlGTaF+h6%yJBOUg+C=d~QE%RSYqB(v+qzm0{#QHB{^$$jxAG;A_eedk8#(d{@3ZW`nr;5*Al~V1Z#$s{}B*ZX!-dAhy)lFmx!9!AyBUro9 z|3hP~m)1`IRKksX`2nr}eC*>dZH{#obR_Uc=qX>m#fn;Wle_HUWY(UEvlT;*!5L)8 zChOzYB(|G!pK>yCsT0)Zadty4wa3>Y3;W)!y`7_SOLqA5CV0Fu=Qio}M-c9s>R0;j zI{GnS4;yzzEYpBLev9CaS0!#o26^?mvX&0|wJqcsvV9z$V6*l7uy?5W>au;u1cji# z^*96QVvzsK&qeRW@+wb$?6m;OL1*IZlbMFZ39uO9K9QYwD+x#6lYr7TP~1Lt{dKP@fTl$NoFkzgal^R+y>DP*If1QWHbPTC~j=gRC^cKpXXBC%bmPC-1;q=$sjHWK)D9%aKI<}Dx zcKQo)TWLHL_NmoRp_;sA8W16Cl5emD4p^H(w)D>#*R-O-LO@VT-oN04Ers* zN!hyG`daN}eiQlxJxlKDIo}DykP9!mYl*cdAHuX!t|gr6{8guhGNr3~9JG+gkW%Lonb#ywP)l4wZiFqmC&d6} zU*AXnlg*ch6X38I7LxNC8O?v*_w4RB#{`utyl%t)8hPX8?_Ar7od7E>$)fpBds6If zsnQ4(8E-$Pvyt+Gy0m3FL>}iYQ!9(U6X@*A8GXuRU)2$Bp*PE#pd&-xotw@^$_eVo zdvBY>jYO4MHNZCxZziEX_xX+ENv;$`@+8+ZGHmLW_BZv=mFSsrCc7zEJ#n!grBA$H z;k9Vjvbx3=fC5pmRZYQUNYrV2*=I-cZg+H7P(@=nJ(TjVYx6WHH|1+xPA0im`^!&) zw6KEI#mJC*=d-iY92cM_=&;gi#BWZOG2`zp=s7`isN*vou=;9pEXKGX}S z%;HM*GaC}9TNk+mBgl|@=d-KQ93G&sxF>eYwruL0k*}XWC&bJuEy#nNS|unP2f9xq zLpn=THbka1i4)Xn+*W^=tRAoBOA#l@iiJ(+%3Y)lK_`iK*~h8r5RoCu)4D69@~+8Bhwj8t;!3&^+%lv+D9*mho9afE2@uhRUEo~ZR9`x~ zH0us1$HN(HwYIB4@}%Z8GHmL0?cQ`ZQcF-r3e#DXAA z^7&RqHch?Ko~GWq@;wvI04hrm_r0f??Z%ZCuzhk485-mMUrndAc^q#_){#w9ukB@> z9m%`h(Op1g$7+JVSvwowy*+y>*+;bwHQ7rnN9>~-1PGvv>|zSM$n?9#Oq8M_xSJ5-vn0J*Cyp@4Vt3}L%7(jhO!Rn3o=?R^I`Bt3EdJ|AQ(-r+?uf+9nEx>G7dBI=s#363c1oi=n9 zd5rkwOh;DQO@B3FIE>}wy7^y@3>SVn>~cTpDlGA?S(~6=ae_O@im0{_;li2i?r`Ta zwVxq%ab5>UV*QkNO8|h#k>ls-XH)A^dGyR86K9gLe-@abQya~s#zT|{T8u@<@V69^ zA#z>Y8o}QIl&Wz+RSYGDLDuBK7!VrP8oHX%;Q1&Frkj*qBO~p%HTb`c`sSiEu$lH) zMD>U%xnN;DCS=fM2I_%j%2&uTB$z0#J0@|U@)Va5C15AkmPQoLufaPaPHU@#fp2#H zKq5o-iFL1(H`I+c6EKl6luiSfmX#2&E{GzLV2Gs)IW@_Xuxn)5)L!my>K7?cva;lw z+_~X^r7@E0or)ryl55DU_LWKK4Ui`O$n@^Nk!M1gpw$$hnG&)T3xg8xEmT99(u3#t zT7qGdE^21Jm2B#w!CUv8ywn}p1y`(J(YXXciIqgBJuMjesI(HNH5+7E(2*er&+cW? zBp0BHyaw5ODU=~uk7UdV5xFW-@RC@VG)^Yjhmk~x-XUK^k-ota_fToP4u_%6E43mA3uXwGd+=IIPA&Q?Bw#p5iBV*AFyh`S zP3!@SD6pJ?87ipaoW>EHKn*ei;^`gvSOg&%QcV<;dXdPwCVPS)kw#)7F%}G}&MaZ!@7x(22G|=wZf!QYopBI~~Guio@InI>{Rg$&f^% z$kE>0*`2(q9_|9PM5&`0OgEqkjGZzz+YFL{5iu<^Lp{@ElhkW_*|WFOEQ_IJ&BWAm zB9QinIuHYu_3$82S%cE-+*=cDa*K_#dn~h|(!q+TWu$Qi?dG)7Hu0>?fIUT!N!5C-15O6NFIe2r|ciWi1HOxvifY5IY zi8+m$+RhxIU51+Bn{30A6~Wd5vxinmf}#Pc3vdY%IeoXCh(mBqYj$!?{;!d#Q|ac$ z9J0Wx<-MdMZiJX`3>Iswrq>{UsDVpFE<<8YBUGo-O&b%=244h70YN2e$538{Iqm@~ zb%tv>!^0zT4(Tt^dVduce>n6n%D zW*oebmjVq!k*gS$u>vN{p-x)U{0=;kO`WZ@K6|+!-Tvg4XJ_VXdbfU+pZx6Dn9Ur< zW5Ax6*#@IZoZ4`(_F3o8p;l?rEIqTxCY{#YBOT3p8V?10^E$`kodM{zW=xwP5rAh0 zlm9tUJtNGX6CuJ;X+vm^^Rt*E0}V(hurDhxgNIJ^a{3lR5}1gVKgQX+>A zud&mkbp)w6CdrVE3{E}1+PyY!P1gMf+smOhuu)?%-@?T02%!aYL^sBx2u4eo%>c_7 z#~~-Dk?W`L)TPbe7E>4hUig>X`V@T^ZczTax6^kbs956(90qipvB3u7qyZ~-gh=Jr zflkmWI2jUC8ad8vGus>@=tbjsPEyLLD2V6-OXw8Uabj4&5H2b2OtQ&oJRIhyF!*4; zO*McZ%c%D$j#ip4EkLVy)uIcmfrcRA<{We6w$peY@7p{!2^jj>Z13DsS-F)m`;auQ z0OsBUl^_(cHRI2Wh{%wh((rNH6gCS8`fA+ZAvq5PiOeO8J8jkU24ulJFKog_FOUz` z$Z?*{^3$-OZ+VUKVtk>fm@>E>ZU-wGSAlhkvA z3@d?z?DPt4AWCWxvm%H_FOYB6$YGui@`!DHn`;D1%LOFf^@fT`F}$tkj*6g)J1yp> zWaI}pGSKF>MAwz~Zl$JaVBcn_PE05OA!Kkp0hkBJ9?FdcF>#ucC~IVO`sgfr`&%`p z4Mb}Rl#U~vrBe+3OtzbFODl9exEIF{91O`njg!On-~UggjhR#Ld+ewD4}EA*8d6KR zf*Pdjxs~X9qW1`mtZ7DRsmLau)&lV3-q5A9!%JB$R6D8dR>hbwu#7VtR8h>h)He-F zqsWj><4K{%y`V;l4vz+Y>a9_LyO_5jO4Hb`ri5gI5B@46Ls*aORVwsY0B9Akh9PI# zg@h+tFOG#)wM=QZgf_cLvo*4O|9*?&0c^~jlQr9*XhD{M1SO6foV4|*K&LqYN)_eK z=rZK1KS6%X;t}+g*Vt^xK?yP$&jv^Eh`};(?Os{EG_~0#Ki9}AtbpG=dI411-TpK& z(tAq+4Xia3K!(7MyqyK1bxv|}>5Xi0eg9VR;Cg0U0J@fhArjZ80B^01X&mN*4iF#` zB+U+;IBe2+jX2r+yM0ET_;Da+H7aw5)|7(4u|vi>oJ-q422<}OUX9=(#jTOR zJnCz8_@4U2fx@Le*jr#uK>(Mu;gC@oqI!^$%p8ohhh1b3xH6>EHSfMhKg3Jx=J{rx zHT=|4;r8Ly4_VM71L8me7-ZhNB4A=E;!&H=sBsKZP8u1c)0;krgV;01ID@HyoC=g6 z!+WoFhN+UF23dpwVdTD2R2mr$+6esw^@Sg8#X45tXz?tCkJhb71VmCLkl04 z=8xP#8~N7ivGG7QCfrHBcAX_F=)l1>lp@CRMgkd>S(fA-1Ek1gNY!i59`x29UcxWn zrkO<_>=oBKA5t8kFCeE<$505ED#7trihbCJV32;-$P22e!JnmU@&4VOY1_ed0#VR5 z5EdMmf~lC zGa@_A0OdNgh$S)#Rlq zfn-RPY3~A?3(TkH%^2rGz{;gdP_X2~onBi5_XR6QLP7>%1yh`kjGs|3dJM@rjX%YF z`g*GW2f2N(JVC|s5*5O7V9p(zD*>~-B92nV-P%^Whhq#G5>py(sF6kqODoAx?-T(L zl&Wa(5KdbHKq&e}F%qp31Hf@er)gw@PCD(dlu6!SUlTwS8gY%7pbZ{tQbP|L)U7uY zO}ARRGcPi-N%}bXy6wD9O*ePPc_n#TeXbaY?IXGkwVVYug<#M%W-{Vs91nxdR8cY6 zWPKcYU99|xlS`?|3FRxp&{*>~RPBivAW@G63u-5*<^pCGsKRQ*u#nBt$U>c#4&)#4 zl>?|#VP{^TjY|fi%0#fxL72uN$5@@}z}Am}ygj8zL!ThMgco@TO!j%>g_FWqkz%oG9iTQlZDMU>KM zB+}YR%qbO2g9DZp0XX3}q$D&lNT+<-Hb$UljfcD>S*%gNW9P@5-TJm#fP+~}dG;fx zo2-u`uB)=8aM%*D|6*97WhfRl&qpLZA~@H2e&Fan~xlF z6YOxEZfnem7rJlaWQhO(gaC+W0LmB0(v6^~vdG@|G5Zy63v*VsOU5}R#P+xe%;x0w zuce{HxB?6U_wQr*gPdgz3>n+i0$ZrTh7y^TFW&mmM;(oL*YbMktsnW~^N)HoT$aPv z;;D=H{PL@>+~$4W>!T}r|Lf`_-+BD8zv{{pxpg39ImAE1e^viSDWCM(yz>0ll)sBJ z+~+R(z4X#{y!2=5)SdsK_A~TZnt4B6qa)Cx^XYW79sB=rzfxI)edFi%Y3Fq4x$~`D z6EE?{{{4;gMV9morn76{}#|rfAMd% z)l0!IS6b!IGau-;`9%Tota^^-$Tg4{EOD&QP5*Ym#52=*{ z(O`2?s|pl!Oi#Y08K;slI?tQ+_bSd5=jiCw*)AcT#Zwk$ zPn0&hO?y>DX@QlTxpSs|ZO+MCQ4CmW%@PKVt~6~kT$|#=dQqZI^dMkE4)h7Epc*F8un{(I>u@W93-c1aY3CU{9L0vo=8=<^I6_CgY0 z7m791YO(48aMs%&n!>;;oJn+*>U1>T76pf;HOv1hu5CQ_^kBY!;*w4qA@eaOx>y^q zk~2Tku0o3gr52WjVQ}4)>#biT8|GgJL)>Ge$+?`loNC5&$4kjW1dpl3$s&n1Y;Ckw ze+3sxGQmlu9727<+0I)irtW0S(X{#7*bP#P??*hPtz`X|Wl+#s{cDQb3t~>L8pgQ_ zTM4<5mW*4PA-^M;ByF-^+?_~%A*ke-W4YjH0!4S66BHwJ@dFuiIV~{N6k=hc z@A)EVtisF&v*fSOr?WQ}#!@g#Q(~uofdqQp1ur*mf5AKIpBQg_x{-AJNygV_PIr&b zBu&*_MZ`M;$?(ei-@{JqwXlGUV(yGtt%qdDNygV_r?$B6{ z#O=K6hzo7;eaK`ut+aN!V|*7#4Q*kI)_AV@xT0NUp~f(w4_&>r z=-9T|bK@@=&l=B8X^iax@uB|vhn#u8jj7BE@K0D)hp%C_cxA8e@89qBp1R4HrD?;u<2tF+?*c8Q$NiOkqy79Z;l-q} zv?m}KzWa1cR@bHjRdPk=kE^6kEQ@X0Iefs&rCu%#vEpW8SK_;7eP85>ntsWc>Mq2V zaYfYW`GHRt*OK{P;fH%W`Z&iP&`L}XVd0F=DXNr=|M5rf=Oza^^NWPb$72k{w@C}-+cN*{YIjEPkr;7 zZ#>%QUHwdDl9D3(4xf(`f2$Gv6$Wn#n_XoOvn1cURl}^h$(Zp^(CXFajNZ1f)skOn zB;J-RAx6NS878uMt`hfS8#^rsomfmpr({U}9qqd+lhbJ%;w@oHTt=g(&K}^qVI(S} zjJE+_%5UzTxHy>{k}>0-rPYeJ#5$yHfw%n@7RN33tKC6|luMYHVKU7KxH>{vZX@YP zB*QnqSAlqXZujX!_795cGPMi_>!km(#_*NnEF6NDV$^64`-b_pmW=;>sz2pvw2e2H zfYT-BcL=US+BVhQk6{_T)7!#xf!#UIl#JBsD4sFRlC}iq27Q-O&cGTzR2CQyh{^TM zxEri4`g?QTaI0eyKP6sQ%1_cEt_obBtR*eH|2khA#QQjOH(ELfFA;Y9J@NLDV>Uh| zJkh5eeAY-~k$pLBHB|T7g}yJrqS*h#G7iW9KlP@2gBtn%decH!on5vRFRii4xE<5G_N$N|IZ$fbM+OhQf2wQ877|iX?BO8n&J6qb$$(XH9_C9YW*Gy^2MCn9v zsZLpeh^oGRWf!GY^j$Td!eI3cq0Jrte2_gZnBoM4Tq6h~XT z6GOTEl#J~6tW@=LI3ib~fs`+?qlknfF#=|Ndu99ZjOKc*M<1ziGbGhX!}(7oQgtG# zn|%XmK}#$>ICSk{QF<)pG(@K<0-#+uQFj- zx%4l;>dXIpc;E5D^Ud6RjaHEq(zoiQj1zRY!d>OLY~viOj(d%QS^3XC4+y#Sm=jLP z1gmrCKlH1NA!%*L6(laAN!(Z@x8-JE2OmSh@NPqhOy&E|%?KFR$(XB7XbI|bJlfk4 z4@nJm0o4CBZQeG{G(N+|=lyRTVBs2jUtVCRnsFs#tUA#iRqKxYb|gj8hQJtJL8U%i z${T{Qg@bNqGAremHy6}^>mKHeUNVtAIo49TSlXoRB#pFI+p1WdULs1Z2{i=(5tIb(uv4Qm59briysUZuUMOiUu>@dUS{|POMr7nYf6T* zo=Ur}EghmNu}DB_Rx@{N%J5B9+P~1!czOQUaYLixy*k5=l`89rWBQjRmS~rztu`@( zf=35ZRbn{Ub#9rGxIjR{ej35!|367SY(Zystbt3$#V`G@>bMTJ9>t^%nG3W)YMh2l zN8&Vu(eGHeo)CG^ho;YgUhsVfGA652JIqQ?cEpcjqyr@jKZYm%0@eAorr_QP0@F6; z6vp~6*UiismSpeHtAyEdJc^JCkSqy!iSg^pWSFt4?uUKHo$vg$b00~w=|3gIbx+t& zRr)YqcDtmA%?|xkOn3vE-0-wa$Ho2$rd0zu8^UWxe;i>7bujC`OW*zVKmYs7^~L?X zTXy|Fbmn&YtG{&U_0veA)d{B-S%;Y&U`p?Af##a?%N`VQ9tvp;S*0L?~1kZfSn3<8;cT%`O- z8pnnItm6z*|CZJZCm=+-hA=0At|V|0Q^`)U|Hj86{a45DYu;Pc@lqwj7jF$7eR?qb z{`CIfO$=`14FBWzRoy}Ew-NQ&soR({>$17O(#z-0duZ-)H7_B4xpz1q3;6gaZPNjxZe@a>B=g_AM>Zhx6ZS^-XZ=0$Teh|FRC1Vjb;Hi3P zx@f`M@UT0)$blVf`zip%xsH{Lb~_)(5i5>272IHH1mKP(1{s2*PxWi8@k-AfSsU7c zj9FclVY}EL6UDZ9Pv91k3Sp_u02H*2s+e1{Fvd)A`+EAhGJEY*B-@L8coVMe9KM0H zCr*l$Ab7Is%v*pkp`1azP@0@$STbeR$FecWjyKiZ+=Su~7K0(H))^XaW(er5&|x7B zIq)&Pt&(Q@m5-ZDQ7Iur zyTIfh-IN*5YAoKe6gBm$VnQ8nE17FRpntyTqNP_$CBXl)%N;NOeM3AlWmCiO3nHsRBt5;%#DZ>5tK6HTUO?Zy0zK28I#^A z=hc@lv{$1L(|y*840jae#vsXwZF_!*O2uNZp@>MNQc$^18 zQfon_FvhGA;7}R(=Y353sbrv5-|eA&*W&I@e)T-)F-ho{SX+=nVq?J=1DW0scQ@~x z$(YttmHGUOhrUZonNzpkc=pq^dG~-IQNY$EgMmlVP&CjQzOo?*?^sHXoOD<+tkq@? zH+Q?25NJ2?zlo}j$6%rm9%8V!dFQ73VzV{WRtRLW7nBU=HI@r&%&E=MTFR<0*YLSV z1S{SIk*&^pF84W#@sjTi5dd@^kmAl4EE&{lPa8W^MpN&`E`B`hzOEYLkb$%8Dq?SO$oXfbLu&AraMzI zL-xwINEXwzBD;Gb)Lbu(DF}O}qnHnw8Wh3OKWp1t$$yrNjet=5B5_XFwLJ;;iYf*nWVauk-jX=~Q7leotjH&9B60pIyFZL z8MAgO5P|k_Z-jBWzrL~MFlxjVGH5dk=N>?)6Oh3~7@Dr0WK313iGUBjd`X;cRAMn4 zO*mLm^;5*qPn2Lg5VR$Rhqc44WBN`dOIP(%`S(H3u0`vf4MH;o2SL+nfNIT_v4v|w z+y13-@0-l}sbmh>C*Pu=PS^GA)b|}lvH2qC6pEeij12d#)gG2m}8U|YcV zY2su~>L{M~w_(6_8B;4QeB3Px`*eW1?D60TG-LP^QE#M(uRW6k#bPMU&Z;aKkbSn* zC4_-jeRQ#!LQMx8&nPtnGAD8h)*v+7Pytt_f85#A@RCrgJQ}&W7DL@P*B<;+K(t#% zRtOT1GjNy^02Db*b%-Q4>XylHtxmLIe)M^y8%>|?C35v(@DxBhSm=<}ASgYeLCWqR zO7z3sGN!9kZBQoo zWsWfLvv;HW3+$yIDMy4z_Q6}gA#S6IGu1ZWO)1yKuO%&g_+*{W>()d6(Qh~nqOdY= zRjjI%u+|DTbO)yn2^j%IagD1;X-=Aa$#B(E|Nd>e&dsd)BzIpN%nuEuznWGiN3qT! zx~4b~ChejH66P|}530qj#^irWOpuYmYjvAvDx65_NK%Ap4e^(Ng*Xxg3(c4rTBlf! z%5R*!Q!?=NOXJQ@_3;{RwOD>6Z2eerH3cA(D41hP2S=XTb^sO)C;rJ_mW;7op}*CT zA8uMqCz4tc0ObO~L}McjCQL(>oFfA#3Yal@Q#;9+*H6B~{r5U82D*z_M^a5+ zW_13R4Cg+U6~+NxZ(^AfzpGMmBxo6mBUHTw!n)@fZAlga@TrP*uw8Q|<0QSGhDt}D ze@D5d8}Tw?fJPHCOOiPCv1G5kqkAjBRcW}qYO#4i!73pPEj>~i zA;o9lr?Coo?1X@RB!6YHGMwI6Z}V?%J-NeVOH>xq8Khjv44VPFc}(~(4VEr)9Z1;J8zKd|-YD@5U*6Q9|ml#F8gvtd^Ll8?(FR^7g~?>;3z zTqGh%?!as~#Sox%x1&ll4J(jwG0kY(w|l5JkUik0jXZs zB3!Jwl4C5Vr@BC7bp3a`iX0h<7ax8F)v7YLpOzj$~uh;w&5mQqc2GAeB4#iUS#w!X@;O z^*J(LTEsh&5(0z(AP$$(%LyN{1o4_BrGy_ni6l;!DjCLh>uKmJ0UxPFd;%tw%}J1A z8Ph>R;v9)Et~*+L5I8_dT=y|mu9A3kZ3Ky=u_Q{6P%9xurXbuq3I$s`_|%gVj=J`I zzGS}M{j8-gyt@%r!D}WLWRyTCQ|96ngPjy|B%x`->)H@N!0H_PO2)#xyZV>oSU^&X zl11E01IHwWEf{OV-8#aaAWt^Np8lJ1XD4N84)z}M_o_m?sLMrBjA|V+d;})|6bUres z)KhfmbFBI}&o}7PeQBGw1yf8dbRU`dbZ2p}V^j||TtTW%u!_Vuq4OGIySUP|GJDln z2mC$SxnD!OcIo&Vt*esedWec!660eu&k}tJPy_x=QUmt31U%&9eMPbO2!A4iM+Y=mHNkh1yW4pu+0&z z*Oa8SP=bOY%~GIMkqE53_Q)|MpOS{|5#PnsC8@1syou2i0~MHh1BdM%oQIg#IEXsZ z^4(<2+OoGN9rIdDEt2wS#ko=$rD0pkcMi)KoO+HmQw7P3h;L%)g48;`T(}U3Hidwz zYiH9SZn-r$VZa?cCduanmJEw}vE=s%D7Xn>CdI2uu3ahFzU58jB>&qRsTZIlAsiO&HySckZLh5xe4xk|1}uUG zBw$S1o0ui+SW3e&4vg;%MaK5Qo#}OyNB4m|rd!c&ssOl*OnMd&iBTFOT&I(PvDkeS zoFlg{^Fj`^2B`3m^&w#qlnPM+iDF+Qbp(MBQR5^f8k9&^jGu#x)9oNT@9TLEwgR1_ zZVcn8g8BAJyn@npV$&XL;}vz#5FND~BkNH?~S(qjUr7D3)bI-MX_p`m z>6Yxt^=y$81|vyi5@}?n}mM2!Ow29}srC_0o3tXNf5FWs1g$1CFX?eIEZeOH{ zW~Y50@6ovd9%`y#^V7+s3P>f$AeWw&rWZFUnA}1vCFpQh-M&%*fp$Rk9@6LpSSj0F zsKxXb@5o^ZC=7)!;UYtnsw^a(PQcq2X``} zBC5eftsD`It&(O2G-W%IUpSF&%ud@r0k2S-=%>usz%uG48jFd020)W42XB>-ek1NN zw-3`oAE9ZjAP?!51xJNK#gcr+3CT>pNr3AjWg(&x=*sCPzHlqu%uf40-lJ#(<|?V5 zMu|-{$f08NP%8XQst{zzImPX<@+22-q}yn18W6xk)Ry^aQu@%b-mIXdqyU1~Gs%`B zaA6-W8NUZ7RNI5>yzk^a-3$OKJ2@(q(=&au;C3xcF+5_RyhPEVm7IlR==NcSE|ST< z{Qq4j3S@Y{VQDJhyB_@wTjj&x{J<^co>o#F84;T=GRul3m=hs|Cll1s$)4%k;V{2_ zv~9>5Ydi91mz=JD?gMz6+$2U(bPeN(uHrK=`XcCA9_G`zajAqwWlQ02!$Gj`Q@Aze z^}YS&67Lh_CCtQj_*(Hx64M01X{EJ|v4h?BkiCNtR#)3ggOF zFtAcp%Q(r5|H1!*Bm(jpVoKy(zcYusdd77zFL7R$orL<$asF85bp|&RPs))@8t?;Y4=zT`clhfVnZ(1(W)k9Hqv&5r8Qn~tz?mRmRSaWs zQOu&4FdmF_daO-S7j7fw)s5Zd&b$g<)~G}WO8O3y39AYd71AV7F3M(cw5w%ntRe}n z`L{l4KRB*2y9nIB#6S-3x(J(*?28yBZrws5+lz$5#=T3v7xzqEytEh;V+R!ma1ci# zfAcJB_F3h!`2uVSe=T>hf#3`M@cZ<_ukvW%ukaF=fL9XRNj?hXo(W^{X&uLA7tk#X`yL+=d$0yyX8 z^a@{L4$ZQ62j;-*4eY&-KVAmfxR4|B|3*mWDUs3|fP%gKZYmu5?gOd4_o zRK9SR>qBXL6R6EgIGt$WHOodqM|BLpr?3c943k4eV`r2df>ln!b(}C7p4ucnK7Yqw zocrRaa6w_VaB32+ti-pYI!+j^eVHc3WS}+HD<6ABW6HBeio#Dzh>ctpooh~aq0rM2 zyg1OwIN*X>7sxe~YKH=2lVm`O_EKRaN!G$VKk2TlkZJejU<~=OPnP5j ziw2f%16N2#91sc=s*z%xXU$kzu|jmV=ju*T4nA;8s$C(JE=AF%S-w0g#S>TvzS>(b znMSEq;o>WbBrNop>w<uC37pb1X6G?Z>Ec8b#Go+dt4GmfF_Ezg;ldqT@UJSaB6CQG6*Op$Wg2{R%wMt|Z-8|1Y; z(Qbp&M4bbF%p^+XO40PWp*+yDxanMm*nwfjs&8omPIqzejfu&`I-~ANLW+^}g zMV=ugiZu09xk~IxYitJiI#Ym&0p*D4?UpNp=R8fC@GEh}4dQYsjKjfSpW_tT>`ZxO znFJ}J8K9*75KHH<*^9NZjpxcjw2bZB=XiDgoDt&J`f;4cGR!EdaFi0y-zOFrG!Ol3 z`J2`hbKFAzo4JzI!}CDc(PgL|tTdrKv#{jZeG#=|shh5_g|oA?eYRPW%hbhl`P-iE z`FyFA8y;UYMJSO@qG9VWUl=TX8?4?6)5)QU!%V9t&EWo&K&J7056|W0)AYnaWT^u( z+uCtf{Ldrm24YKoq<$n<^n`r%G8^ZUmP-vB^L3TQzP8f(8(1bgp^vRxcI4Ge&{R~| zR#}1U*<9r~o;6g_7oC*;%D%G3Xxr53qRwezo;UQHky~+Q&U)cN7~p$Wo52aef$`e3 zxb6Pu5`}O|orEz`&{XDQ=8Aw3pQ$6KCZu6%c(%i~Uu)57&Xqf&I6hmRW%Mw^2pfzt zosbp~Ih2|h%3ww(+lOq|INH#D4_wpOaS992X>r@`vEoLKRS9IYt1uEKHdUn=^4!r2 z%ygW_`IbM&)4oRL*ha5x&+aelDGU;APgu2D=>Kf|tShT6<1-=OIsc4(*;o61-5arg zcwfMyIKB3)jGs;}rb6=C>7EL~=b3rtL=|Fc&WUus0GT4_+}$bqkPvRS_ILuddom z2bMYvGu?mdt`TLjbJ@d5e>?C$)IZIW5Zy4}ss4nGj2obMlP3pazY2_pwA4Ise39=* z+tCxBFRaQP^LmT}Q`E0_M1jnj>(qH`Iw24K%apzC5+`2%>_unpE0)E|JqI^HRHcn) z3Nt>bMfVF68S3UkvFL1>^W_<3e7SF$e+J=mzOeRQS(b5NOWpi>yiD}_OW&417n~M| zx%2#fZPoa_&z49 zmew4?Kl^_ieiCVBmA{^cp0+KKU2OrSZp(r<#qDf{NH<{OXM+? z<#+o>9a0@n@&On9L4REXM4JCP*aiPC2s^A$Ydpm~&AG8Zx+gER^l^EK7~J6>x6*kY zeaL*+zQQm6lK#!l-M6<3jDbB>aLcCqNX(1Tc_QxCA1{Hk*ZW_J&6>8>X=Znw3)t|k zH=9*Q0?MsO@795;Qsu+BR=@gjtk!c{sUid zf$%xz#+|T93uR=OefE5EFT!1218bo5v;$}j zODBtg?#6HE6kopB9Ef4=Z{R}nZ%&S%Z$X%U^2Y%FJ2kUFK`xFbD97?K`ezxhE0`mV zf5|IoVb!lNli^+d;WG5i^Rg+$^ZLkhnzF(9*rxCaMT zSJ8P}+_?N`(!IO$l&@qyu)xi`-+10%^u+Xu&X|_oWBNB!?Yw(X+zob3DZPS?^xhdZ zJKVVc*&Q;~zuRU#WWG2X0-LkfgR8>X+1lW2O8m0AV+{w}Tc*9^eWrW$9ST6}jVzGJkv@7l8GFQ6mY3Em!4 z@Q0s$dq=w&`x|lS@E({RZTN!q(3v=6>Y79Pvv*@!H}93zLCx93W#jSOBjP=~Kc;)1 z{?MSe#sYQo+5$!P!*Hy;%ep%1-vk{@T%$@mH6Rf00IJ?*K>PO8dk}%Yu%W1HPv{PP zEp}{iu38MB?>!i_;q8CU%N)``&Cq5Zo_sna_(lbhv_z-@)pu zTY$g!F3>S^QuSJ`Rk1Ryb-&C2dha?zAMTnsdhG*L@SVG0oWpAupvo;ENbjA2pTk`f zO0SK80{?8UE7rDV1XR7Xxu|I`AMvFPJ>>Ncpl)p`w)am{17Rq=ZV>QK*&RUrJ6c=o z2yK1|yC$vQFhcizVYV20i;4Ye@h+eO%`&v_4rb25x62vVmDK|(-eZmQyq!%vy>K?1AfY-Zd70h9clP^Unji#Gq&dUR2;l0gWzPJSXweOqMphMm1FVl6HoTy8RvoF4p zJz!Jk?^ZY4#{X`1L?Y|G>Z)A#ejS}U?xqjl_jT5nclB~N_RhJU<`gLjt)^?-pwc|P zzHi%0e!IVP{lupA{W3mB12A8&G+zoQjq!Mk@%GmQ?u@{a+7yC#X!Ak+~?!=m7o$V*ZfraYCf296qY;3Jc@cOx`n~vsP z_Rt?5zy1E#bVo!(wtcdLUaB`*PdC-st8J(%YmqP7*L)dH6;_G;=6hiFBk$r@pF)Z? z`mVX)xE_rtJ;-G)nW zZU5O_tU$1|*N5^zLioSDl!<#{`Kzl3)S@DPVS8^+@b_FcPUeiYp~__#wMc~jXWSxl zpXZnZ4>fpRq;xp~-nx)OGz>3?F*5I^$k)S%6hC5rJ3LRL#(s|FdE~zGT>f;#qd@cD z7v-F}?N{BMLf;`iaJYOr*S@b41M3LU&GY{}&kWT(v1k60ZoE^LOt1*uMBD^_4Lzfqk*&WfjabM~4WcWSDmiSILjL?pskEzN8-_ zz8B1?d zoY=fYJ`#Il?USCde`xknH9dL@w;e-E4 z551?}=PHl!KORF*UhzIbHf!$h(PB|XFaGxAzNUCy50Zr}jiu#Q9!Rh9{-{@{@a$JtK-PKvd3ZfV zHm+YC)m5o=>SF&-b;c%G%rV!v+}`zGyHV|LUG-mQe$@TOTho$NjT5J@=1egFk;bdq zdA!{*S@Ws<`rF#9#!ddazl;8o`$CsHUiZ(A#&naV{WP&Zlp^N2agq{GF4$O&0ql_kIBd-LxW`f8bYv@IMWl^Wn6SE3l_8q2Koxnu<-U%$ ze6j58baX{G(_C^c@4~+hD`yAljPBoI@zL8?;l3>CRd&#aC9aLeAG8y8!Tz~k1#{J91T`YKV6+O{P6x0$7HL_eMz z{$Rt0WK?PnY47&lAPHT>Q-?Rn{VYz@9KKCPd3h^!cb^+??!^D>g` zFy4IYX(pb1W1ek05LB?93ZJstofbaF(A;)y`qed;8eElt5#6ZjEU;7+@`HWuDtYo( z^|mu$vC}>=G#`4@{)r3cllqfzS!Hcw(=!dUL8>$JR9nkr7OoUfRj6c_GK+?>A(MbrY62iaf^Yud#jK(itqj$+wYApv zA=B;Tb@~M=2Xn;&0AEgKtTG*PPL;4xZM+nf2JTa;;YhiCIkKy4EG+A5T&7gx!xo*Q zCRJt-R2i5MAT#_9vP=|I8v+_AI^?QJQk`G8Yi^wlos~qdD=cd*wKi+;eC<82X%zNjwU%1q6v&l4D$n!1hh*^SU;!w3$WnmCb0WP_! zG|-GBR)sTl%Zd*Cw+~gXs`DJWh}4`U!Uj^Xz(om@mt|mGEDU0*2NB8%g9A8Mzc0aY zzWkW1A9Lx(s5K6#1C>HKD9#WRsl?!yX0paYVgVX}M6$sdjQQ2$6`8NPv7+ALP_0?p zU?~_$xPUU$8H=-lmD}WE%v@HRr$;|HtT83?4a?o9H79s#K-h?aQNnXX(f+cNh>w%2 zD@|Ge>8XP&8S|;j45eAQs0z>1og;Hq2jDK=4!O>th!Zlbkf{Q(Sq6p@lul!n^MlJ8 zqcb)fbf40iovMpuVlJ^TNYzAFR&YsFO7K{+YUrk|(3Sq+_Fm;TR%WTM_n8#qwa1UV z)bxtE*Qi7SSwE2ETj`IMU_~@ z*x2Jj!4f|ReWui?49~4E!HL=S=FayLoSB{YuFx-~U?@}}%v-COz_LM^c0^zX=#|hq|a)AKclQG@mkQ zP7Pa#C#8xQg;OpnSv;w*$fE?vipa7wG#%H9^9OUg9HI2bAi7Y~P_dngDT;ZdSfWZ{0P3<#w&3TS?X+ zpckk>v&bDRuS2fd3QXV?!miL%Vov_xR(GRM6D-Uhcj#F`#A()*uqj4h(M>U~b+SxS zuwR9MX$0WS<>5o~&zuHQOTWZZApPOROMmnB|t8cNV12q5rSt_ zs{1LGfl;b}O(~Wpf8lOg=8MlSvSkaYy2#U2uu+tiMFnIRN&qQi0$_?j>%zcqQZx=Z$WNycpAu|w6)L$(9M3?Y zpO_c!>f3Ax(x1`+wcT|QqQWu3RTX3jIY7S!07fM%l~81DT(tY((Ee{5`Ed3g%D&IK z=%)92R>*Z~E$|lLnzCI=vXh%o$bJgeRpA^$NCe5!MUY0AMxx|1cSlpMJim_Z>%!b zJBXbsv>aUiw=c=nvS-)Z6F&?~6_&k~e3cs*J1f0itz~a>D?Cup$y&g~b%4plU{+Lw zDoQOx8iNB!tucKkIZpNVV@%(+e=z|;3>-X@^E=lWQO#p#5YFZg(kWzSeo#I7=Fhd~ zG`hQf-skaPtxthh837oUHI7LZf6B^Jp$be22{l|8lJnujxqU0_EBHWxaQ48w5?ao> zvzKU;ilKlo6xeGRk}6;XmcdXsWn$`t&`2CNfBTb0?FLV`P{zBq7;E)1ZQ8W!owPVF zr5+Al0s^_BlTF&A?}s_D|Qpu(O4-UuFFTo+2M` zP}M7`!W>i}2nZOkg%Sc#;z(qHieyfQyhWemQ*R3Fv$0yi&072touS=xmpVj%Db5sA z)iBNpVuhUSS%66ec8Y0vIOT3%YJ1DtP$(^HD7)TO%KB@wTVcgCf342t%ATtYN%}-Q z)$&NJS=TWlIFN$MsShl-Orn;deLr7rdi%1x8(S7^XV-$Yxc|QK8J}pi;U&O|0YOKD-f4Z+p;eDQeEKxH5MRLtJ?q4av(4>h!?-Y%h zyg&K1{s@8nQOM#={m?Hc3NimDWYE^R23ZU(M%!$Lo65p#=IxY!tm6uU!`3B}hK(b! z<@D>>wyU<4&6aRuZqE>36DVIw zaBluDZjaUR_kWCc?YpwMf3}AkV-_~^_mfTjGj2FZ!3f&l-Q9V{b}nF$R@#lfhSTzU z@x1N=&K3Q9C;xD_ypaLVy(O-$ZOhtF8#eJKXSgi4Q~ED;z?T}I2vA^Y@#ud}h4U_z z?ElmG<|~7`{%8&-mo91L$%{i~XMXx;T|zFLpjOT}9gE4Jk(qu=dh+mi&EIf5~SX zdl$FI|wob zRpH}xgMw)F@3RzA^H~XbQtzVkihge6{6Eb`Vag7Ark~5Wb(U;}BaXz)_tp{MY&wC3 zZR6q}z<*--+->XdW|Wc2{jFoYyH?^c*&0Ht%WU)KID7by>p zVEkQh6=&A6|B!x8P*?;)s*PV=}-%2E`7#`+s4 z<>mPHg71V*Ix@Gqh0@v0et$LA9X%TTJMWHlTlpP8Us(?OKS#%_ySh@m&fCtBu(--o zy#?3CP5xB>M{a`Bgv+u#Y5QnP8}Ra!1Ah@DJ>g++L#K|3E*ypSu2q zJAAEanlu#F)k=Sj@O;zkTd?J|0CW%#0{{R3LN+in004h=kIHWWYmO0s+a#`Q_}85q zaUg&bNJM;hP1FBHx3n#b?XDwa`)U9FjE(>RiO^gT0RWc4S!R~a{N-&)C5c3mGyar+ z+~%6hwv_O5OdXnXjj0OchCJRwGefm|&(*+hcF((@X4*Fk`r@@}s_2>?I#3B}MAMuO zeY8Y36+O`@w=IUDq*J%RlBB=ORK@^+2mleyz#SVDdv~|H?ryndxv~HINp_NDP2%0M zbL`eOW$tDM%}}nZIn+

XMejh20lxNcf2MiVpfY2%_T7m^7jQekyww~gJV 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�A>;nOq88bGa6o3!kPNk^(EcCPQ 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 z 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 z%0A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%0ABwZH9hBwpU(b?Vxj!SWlMYX zT?3Dq56^D|7B@HO{TK03u{zgDLK(8g#XY-0VnQw>4@F1@<;aZ zp{=CEWwls&u}Qa3h#)pfKsVlrhh8J{wBAe|jBBJOBG3n2pqUk+P497A8bx6pXs8}j zt)hbom7EBkA1Uey5m+w)^C%2jCxwNViz_u;6o?hG6GAW!+L`3Fj3Pk5mB&M?lbfJH zGY240l^Hz-oG+>gkT{w%%6#gda#y}Lh=x-|0S6`_(lDXLa%Yi>4LPGkf9ohqoiKOX z2>@dEPTdl87@*~#x@Ds$5?ji{p=FaGtctv$@J>BtYwC!~=QKOY^Z12J9!p&=!a6{h zDP^-W4Kl!4#b6UPj?&7Qhvs88$|^F^I0^*P6*y1>^Vk5IA!n56H+)+kA)!!=twEea z7yFdk{NHEr0?L~>dV;{@cik74L`EXp*hT)7YwocC4p z<`6P0rNEsq6bGN|IG_d5j@{zPK!$^_1kI84?6OA^(Q%Oh>EMLkn$PiQ&tN0FwO|ZQ zA!rm!u=O!eO38HIQ^#ByrRX3k4a#mG3re2?VraKzGBgkfC^%yw1O~J}KoJB_j z{#T4rAyaSz#p=&m-x=!AukA!?%`+nkk>z9!x8DJ&4yk8ETYHtOD8SS_dC?%&ietcM zaA-s+1!0tzIC+=&;_+I_fmR3C1IzK8)1>jaf@(Sq_BfYc)%x!)ch)zOzqfmPoV`17 zlnp%xUYxzU09;1<{NMtTnx!@KGmrq@G*}O9;%OH(aC2zDfyp7))%t=xL3||K{MklTq~`h&+m76i8@i9|B7N;L@IP4peA~1kt%xQ6|Wq7cg#=q>dG8b|uV?2<;`BuyZ(O2hNV@#2Lhq z{K5#1K-4(OZ3*ijON9%mMmkTFiXY?JB9^Bkc4U47h>c%$VoVxSvrP_TbiNAmMiB)d zg190Up(3| zcIT(aQ_edF2olD5rBiT)CX~QTG3N*b)k6I2|7JrDMnrPtiCr3zDbDVF0ga9VphbIY zaM)U7r1_)N&WV-iv&OJdBUS~K29_No5d@wsX4qB%i{%(4Te_@~f<{x6lABLBKm;(( z8zgd7Kb-?coIii(xL8%c(>EEaGDQbOSSyHQP@<#8Kman2JPPTSK! zj6swLYm6~@C|&>_tTf`) zV9bnzCqlPq>=hPsY5(|~5BM6^cQR!3XohMHIUyM$HO(4ea_u#R7m>%u7xrF2$~(aa zeGSdlNI5w0V%i!E$pER9%CGS+bP^tTHnv(DPC=Y-tzvSe)e@GEBM1xy{gDMhaA|=) zLyZw2BZy739_)O|{pCDk=U`<-`E=lsK|xEU+Ds|qjv%1K8AymwI!z^Z#Kc!xX1lxu z?`Tj#I0jHp4uK_{0_al|VFYuSLe~(9kHzx=1-h&RdWYD0*eVE^VW$Ja3UZ;G3;6WG zkrj=HrG*N?K*|P#JhBNCiV_W@1j)=P6l+S8z;4y;<&&9-T%B+B=$dwp(6BRoFed;c zQR+j`Yz~6o1r%P8eJ7%MW;B^WCI(EoQx+(@ldoEFKQZO(dEM2*As|pZ zYUV~e$a!Q#mAP;!y{;QJSy$0S&}}I5i*^j#w9ZYfuvI}s4;j<`K}JCfpThfL%$^Mn zo`c1wS;X_xHl0G2OH*pF*A4*HoU?%-Q^ z^qtO)ckdC{|HqYrV`|iO9{-fm#uf}M(45zu;O( z=1|t%4K*unmd1d<9adoG4>7-C__}g&9v>v+i2PUEH)?|-2O17*EGC^GHG${gL#zsE z&t^~=BKiE0rzFWJ#;&?~F;*~<;7Nm`w+f^^R2CXp$R46tML^3D0|WS+>o5>1Q(*>d z^EqB9TVC`x};O|8fyvB4n%ViHb(aoXL9im)Gkx`@FY z+kFPTW8iM|yFOg_AF8UraV8h>%=n5abkwHlj5-lzE2C%HQ$S)4QlfNw|KEbpQ6njA z_s*ruNlUZZ^AWw9(jI@Vg%QgY&eC@q!+ZL^BRucjQa3mz>s!NWLP{8qI?^QJNNN>m zVu#^ni98+aPc=cHM72x5@dzu?h#+x=}DKjMe=xHNc zYD<`eSWw841R)F=Y`XUO^8kspA}qdTI+LQt_7LbDB?K4u0hp894r);LTu<f-z)pP zLoB4*P*rk<)gE1r1~UdL6)`G0GssCiF4q4S9x2Pp-H3t;sEj=XWM+g64hTIc5H7Kf zrJa@q6)^pffh}#GHKRgzCgAKnC!P{*-D{u%9!Cx&KA7@w*zCR9PEHQg!S;ZatMM{L zJkbR*=7NB+ufBU2oKz6AndYEljpoq6ia-@OcnC}Gv2?Ik1w2TF%7+t7yz#XXXeaCK$S_!xFivkWVP+2*lWH9jM7e(GL?_PNCom<82 z>`DX60;lXgtpjsSpiG_-8mMD`qYxc}aoImi^O&=peD2f4a<3s^SyRZAOL|r}5L-<% zezb(ZM@kac&|#lhU%tC(u|O#NA>(z3X)&^r15fVlqh~ZMY8~o}UwsCU=RpFN7{GLc z)749G;9+a)v{X_3GXSojwQCgDi6JW3%!XmlO%_yBosMA!QR<|*%c-~rm0SfNBl{!& z>F7%{=BnwsDUnR?;UJGG4m1zaeq>JzR`JUQ5O5zX5Kx)xOQzmG>45%<|0iB~2 zvQX%rj}@^c7#YU&WN#=zn1TWyqboOVvsa9Ofk#|R3DR5r<;;;q`MCD5g%jf7TxrF9 zQW?HOKp(oRvzEgo;-=UbrZpMTg8tZe%nRITSff*ck3dE-0;Pe*kb$c5KMmnfNtAs& z(F-V5(M%At0d=)ukAkDWnl-H;nSRMCSytmiBB1$nrgvtS+?3 z!!f)D1ZSv08Y=_@s*KDKp7gL$W3kL}B`Zb5TOdeVlmMIBIE9nYi@?W=0(Fzi+x2Jr z-G+aar!m+eEjAk~L0qN@Mmvb5gNu-=7uMh3u*vGbf7&Ey1O+KEXxgUkm=YV{qu4`% z5|`{0i61W~TzTNEZmCW%Fb09xB-#j^BG*Y2r5^bAo{D;moN_%xg@B_Oo>|&?qDqgU zIi{Qxf1?K{Ep#FBXdE#I2!@j^8j|w^oy9mo3lvfqBz}>7LqnaW9CD54n6qveFc3Jc zW{7zt-B2CF$|z`^?ymGyAkwvF1;?0O?^-B{5{9see|>=zT4=`~MKBmbjdfXyL|}c2 zgj>OLF++*+VdmNh%3G+mgkY6Tn>6LH7%8JZtx$AXLyBt5cUn9R6RJ@R2CmwBFro(x z5dZa-$dq%*%mWal80@cT#kPDb$I|^^YD*fI^b%Tgu|(jQr9>~FUmSfCMb1C-T9%;Ez10FJ zNh$kL6LXqk5F{LGSh*{53@SGg2(uH=)2?X%C}TQJ;7=fh;)u$*1RA8acWg8GADy}Z z&Ve)7VIy*A49%#uro`HGDY=B$#T5BaJWpLlbliiD&U)2vLHhg2up$J zU`~~~g3zitwH)F!MqD^P5D)_ZWB@ZW1TX*qPh~IEQUC(ZA&L7&-MpnpN1tsZm(R&0 zO)CH*cN9u?mX&SS$+0t-_up{*3P5INjEDf>0S>l}r6Mz1qUk7#KL5Q@~ zs)HFoKo2W<_Gmmw$lV;_PEVo6YpZFAB-wU)o>XlgP6GqU zwhyqzWBWTCC$id3L;NFmxpb6#u@epY-m?Jm000>xxDh%4EU+Z*B$I#!+gf~oR<(Q} z0#OnnK|yy7x3jl%-#7jD?f(1E59bRL4j(4_`~KaXLa84c`Dok(A602w<_G1GLu) zqmd|C*lBM&;9+@jiR1I%@XLie4|_LNe}Nz2jgO0gfqi_F^}F#-ja?T4e1V6^xaCoD zCh&C3$P^xOiy(w0(KzWu<21hV`4l&P&b#&%ar3^pZ`_SN>-M*OckZm4w$@REr=TIM)HlQ2xGa!JVCZk znP|UDg~C=RSO+4}Zb3jRDq_N*V4?#7^TdJ#2o(Nx{tW_$E;`FF$Tk28>FD}H*o8C3|4 zi8}t|A(4aC>lw^CR|H%-&`E($;|fE3A@Frcql6Hw34Tvh|C#;1z7FrF|h^<7{X$tWMKdComvdLMtQMFCApQ^SVQSnaQ%#6v~ z^wDgQM^3AiQ6?B=%BF~fzNzY^WjDrG9sBE zBT!tl1!`bDiBuQNUt{{d`>W3EjTJ$UjJqA|UMG2QQPpB}^jms7UBYS?8-?4WiPFfe zNgxyz>ItBje7^N3F0eh^;JDi*=7ST7nmBMON}+(nICd1(&bC$9JQT94iMMNBB(IhP zQwunUnZ8frLLsUFz>-l7b*h@poR{(81l#0C!OT&J7oVXD{>+eWJbPGxRME&hjgt?4 zt>nKkS=Ja9Q!p)GMYlgsT626mn@2r4!c{>O!bD=j8f!5I!w?6A3%9|*pvZ_RJ_IH_ z;iwl>oMwqQOib}v(-lF5|MSM&A{6-QqsQayB8+eZ;d3Z4q0k+%u~E24jX=T|UW4T9 zvFbzR%AM#LStY&l5{rly(vIv7g>F6>3(#o%)qxxGqfuVT!ml6fsRJ*~J4IbZ2&D5} zzu*uF2gr_pNbC>#iwzv!9VT9OhqY;@DEglwkq||(235rN3$l*^2lEGgC1h<7R-^6F zWuyyM9`-N;O;EKjlUi((6qI{Lv`X=LR^M{#zC6tQpTak zLoMYo%akLJAZ$cGAM>FW#P$0Ptzi%cJHl8pgeXMRXre@i)J*MW$rK^{7eknx4%OOz z?A!ipgDn;=H5?+gF@$g^&Vr-1I5spfjha%TE;SA{Egw7Mhl}6|S6xj8Jw-WFd}<0; zxHTkIv_)7`!Np-P2D@we{}PE0tTqP=Cfsd%IwEwAf+t<5}w6 zXGHZ!`sZ8-E6jMPmIZ#8v0Kj47NaQ3M3Xgg< z@0fGaGs6gy=7}PgiI1TYz<^x(C=F8h_0(rXu@(as@B>4&;86@K(i9BdaiV`!sev-= zRg0UA1R!&`!xT9S(L&567VvtBpk)n|w45^($!NLU++G9i&tU!_KD8^=og#6MVmWaU z(5Tc<$5`=SAfZU^iO7Nw*rO52e$+Y3E|(h4!zB1jd?;X75w;?Tj`I0pG?15a2GUDL zpd!tQT9|Pl+Bz>V7t^g-OwgW8293>4DP%7@{C(PfVl2NQfFMm0q>QIsj>LkU6l6ochKD-+mZOF)bVEAv0tES&ovNwYQ*j z6~%+0AsIf20&fh)7TysNFVIFk`2LZqcj`!-R$` znFRS8B3_xe9>rs=Tf(>iw9+L(^x-%e8dq7$z)O_SO?pTDtWQRl)~*ssrO`?f2--_g zwop(`v1y$z!TFfi!LiIkAPR>i5)z_Odcb*Zb4WP)l3xF2{Tk|=qw>7wEds+7*lUSs z?OM@J@3dAi8c@x#LkACH)Qgtge|1c`d|X8<`9@lL9gn$8;!p!X2BJ?7a&Gg>xiSD@ znaa6s%e5=uA0Aph!{~+@U?BFip61A*C}einnYCLYtz^+?vJ7w>#cSa}H+2zY(wSY^ z(&AbQLo-mpqIM8HlP$J}19{*Ff!b?T=!UlY9(n+wUA+_k zlp80`u{?_HBUGRsnNGLjYNKUh*`6=~ClZ&ro3EzH??Ynn)hwcUUwdtt>^-`*7O}dY zs4pn_JA{p?%ywI9f7TisEcPZ%C6igN#BOEddo7@UD^4Z(!!Y5Bw6)zFR`d1B^hhF((n$?-v+mX z-`;y}$Ia^l<-)owR>Qa=y0|V49VESowX%@4Gb)TAP^k--(k?GjRh|d^=cMzp;J8Zr zbNf%KGWTVpNBh!2T0?F*gJri>j4bBGp2oMAZhyPS+_zUfzj@8iC|?qt&;a9>Da+Pz zvkO(17CUzVMg<_Jsq7X|-C?abE>6C2yIs@Ts;dvlvdzn%92!F2$G zy|~UyrLU7gQ6ngnu$~${2@4BP8%^vJHBHbEW(%acehWDGNgJdmO=BcWUGNG#Zagy)8`*zOBbN_kNOEe}| z33vT@y}ZAk<(Rx0vWB=fl=Sb9UUKH{`#0$8-iCm|%1B;@lUKm*TRZ?N+0@M^B<2_n zQ28A|wCAY4xwG@`-9A10=ho**$>QXV(xwCK2xoUBC&HR@fu%n30Kum4JGU0T0Ia*7 z%fn@!6p|im%kv|z!v_OBl_#e^2TcyHyXzkLeE|nlw{v;leoqm3m!)mx4z^`P6<~uo z;mM|=a0d0VdJtE|*BOrxN)td=GnA-Ji8!tzV`?TMcugSNiGk2jgit??5P*8*A#n?1 zwrrdkz%alerfdBS?SSALHH1rNA!DlO#YN;Qfx4XONZ917vllFm)OZ#U*{>}*mB`s? z2gk=VD^9o)(hTTjkD;_KLDOmoll-=gmYyV_mKoAR`50bo@x5$7R}SwJ0@4=#asPMh zw^zH@29Cm;C~7Uy5~C33E~;lDyYpRGmK^w9(jj<9y<2n7+`;PUTNMM12FJ{rLYid% zXDug71LTYAFcv(c;{$174tzKg$!&4Ddo^_`JFv5;60NG^F5{wLmtQ2V9wofUn%Vtj zhVvau$x|DN2cb=G8A;TW#z5KkPTzNLiB*Hn>b)&LtT~OzR<2l4LR<%2*CCz~y464c z?*PkeYi!+nj?eBi!$kC;r+pv=ohL58%B!mS(o$!N5(GvYg27w&|IML&MXGtVM8qGB6e*zCv?9(j+Ev(m2SWW}F^9a9~yaU^tJnwPAr7|Q}i z!TVnTfp&5yxuR~0qD$bVdGLz8<)oa~^TlhPrq@R?X(s8q#`d14FA@uh;qZI|1}+xv z9yuz&L8n_zrld3rK+Cb6Rz{=1PLHnvg#)=_-3mip-*O6M06vk6mylvc`=k3W88C=@ z1EKW2H#$3PDc6`C@v(lFrt?fPl__(RU|f`zTmTjxmYvg@o3jyHnM-FCsy-I&lBJnX zt>8zH%GlonpkeH*-FPhavpM;i79MZs)45o&0@|mbK`v~kWJxo7)e!_iv#B{;kbvEV z{@&F?lEOlA?YJeD37ymD?J~Q9n$XFht)4HoYs;etZ`bH>*6n^+mb4e;QJWM$$VlaA z+_7`|(ItUU|J}HID(~GyxNrDdAz4mIg&R)&O>>e;+$n==Ia8jMA9eYWu(V?#5w&&- zb_*dgyz5@ub!@!X-B1e(gjRGS6**0wQRhf^NG4UD{-E|(av3Dpvhf9hC&H0MlU+BR za)F`@OIG_5w_nva&WB}=j@wRzB9D;0|D4yP=yt~nNuJL~c@JlGiO4h2od`uHt8*=W z%P<0tr29@2PFbP_tc)PH0bM6TkxNfoK1>3UE;el?Y`KfnI2y9G3+;<)%GCIih;40e zF|;#B>>KA&ol1CH*uS`zh>UrlR6%bD4i5|eOW@3*(B!olM@Kg3F`rx`n!G z>dIHne6XcijX~IL$k)<`w-MpiHob;M#+G1}K9apegM(AF-fjlO*M|@x+GnD|NgXk0 zuLhmM$06-|X=R8vqeleSn=Op=7qZhR$Dw?EL-=Oxy-_s;2{+6s&w|6kCx!S~*On?* zyTf;eT1WxkJxD9Nve1b?0f^7Re6;|xkxv24-7=Al+iZP|E~cjBdf1#@A&CEM@1@oy zup)Hnc9zQ@=fgUZh}6{@msr>fuu5Z8Q)OBwK$1o*yA~oET~rGn zJD@cLX{BYw{`Q-4TnNQxlg{;^1_jqgv`8_ktAj#l8D~U8+OCEkh}7h!TgUSXHbx-_ zRPa2FrT#D7yRX&`H;902<6dlCUcQ;rVY0%Wz~@$prW$VlawE67pkPh1e4|c~{v(O# zEc?5w8^;ezA=9%*2rQj_M%8l>08d+^tv$Vqx03xwJl&QF03IuL__Sm<^_bj?*UaPF zVC@M!trRWY#*M4yYp$08Benm|>^IrHw39y3N;y_f()gOVV%DIoH}yV{I|rgRJ>zh% z=9Wiu`_b}+>n7P3KQDbOM^2-AA-qqfM+Xih$&M|iOMRNV3~Qvd7|_1@gbh9^ z%0X?5V%IjY4M{FJxhT!e?ls`+x@o}A!ot(TVCy4l){ac8siYO)tL%L)0iYz;G_J6@ zdOFx|EmkWU3k~rD_}odECK2-PG40Jyq>Fhv6R3T#YX+;NLx%Caw4v0i(f=HkVXJT! z0MUb8qzLG1kaBLf3Gt_Iy}gNDaqP=p>VaB>ckBbhs~3#aPP+QmyY;~y@glYSy5}}w z_px{C=Q+_K&yvVcR?oCuVxA=e7|S@BEdwY7+oLpCBi%|*KhTRhmF!G<?CEptNf3XkphQ>M+!x^wYKcE2AreZy&^Rjzl5^EYpuSgMhY%L2B(`O{Ln?yY7gzs342V}dzj>N!*v!9EfV-y=r@LjMvXd>6u zvaGe)KrvTgn+xdrw3pmDYn?{Zd|rO9MLB2GVk7D@SwvIl+i1fRialw&=a2i6A29%R z@Vs@TW8e8rIBFi$2L{no<<*DW7F>Opzg?Ybx@4Mg{^D1I;O@d@#U5{Ks9oRF_3TYQ zX42kqNqVPdab4C2KifFj$R>8~X|;mj&$T+W)iLy2y&78!NY1Nz&Wt>|=Wpb1vvVD0 zUfZ|E-doNbkE_cx!GYyaUvv66xlSx zMcb!6umg(gjev{n(O(uHlmGw4Od@GlPXSezh-9LDx2VKlc22ukrEQ!4{(Cw8pMH_c zbSA!IhIT}i-C7}PKZ?f(J&=~N+Iq4I%gPcL4!w(abxj6Af{I1@dh%?}g`rUqz# znH7#qAOaeM}2eVw>uNYTmU4KQz`b6T%N zxBTE>e%w2R?)&e8bMO~=f<@x24^QB9YIanQqlO`BqEoHRq=45mtlycaF8$&=ruP%43hVQveDB z92NPq&1vl9Qld;V1Cg?>K3_K3-L>lIZ4j`5*2;boTXEyl?E^~|Tsb`9?Uk=ihDE(a z%Ws3VG*JV`&DlfMS^LkzzY;%y*!8oonJG~p&#pS8L0>y`-ATbEPV-*SP|ZZe(ejuN z^l#BS>&f;1*_YfZBO?K1wriWx%0|$WavlI$2$dLTC7P%Vi|gfFRTrY) zE^bhfvm^Pf{>HJ9|8i>#Fa4Jrsn$qFkuq%N(-Bz$f>o1Wa}ys`3a~BnyHq z&g|p@#uSQhH9F++7m}e1A{mdLOfClv7fVn_!|MKS*XAp-CsDvhI)0KXP-q$qS9T1k ze~c6y2VJX4z1@57-#sGwZ&I7;H|$ldstIfFP1$FI{YIam?ab~I3o-3v0J@EftcYJ6 zo;T{v+g#-+7>Y%hg47thR(mebHL~-Xm`>jv5;@kw=?6w9{h?WaNEUDHJJEaLxhBFb zdmy%8KQvE#6tGviW-|co!wrzm$&)(j;&nimpE%1o8V|<86UprZA7_iF+}Er--&gqY zS^rhAR;{>Y^x`<;%ERT(7B&yq6KDPmHx;+e<%*u9-NkT=qTx@+1Z91Cr!J zt{S|MFD&G8b>Tgo2t4PGn8p;Q({q}-!|y9k*z!+LCVWai(4*mhs@{wA+z=ctGcuJ% z!ct?C4oG1sZAyN%B+wuQTt493@L{HqZUApCk@R*_(;@FJTT~rV-f~GGJ^g|RbT$!~ zI-kp2KMi&9zV3N=C-tL0jNn|>dr8?Vv_8s*@V%?*vSe%j$Fm6j`h5%)#=+7*_lL4H zjZVk4fX!l)t>z25VH0reSK@z3y#L-Ps_LlW@w%1gx_NSrZ2ikH;TXdl+UZW~RWJ{X6BGM<+2en9ZZFfD8R%jfD)8>I7`jRln zpI>JEWT4ry{5BvcNPmpoo!PWeo!~dDKhn*7ZGMk_(zgT2dbVT@`QC1^;5ztpj4qK3QBfosdNg55Nz$B6(% z<*9LP+k{aC7X<*s_x?_f>U^Ufps)^L7yuH-5r&?y^WfzrO;C%=0H*$JXfN=FfYNz- zi6UF6A{Yg=OnSWMf9jP~av7eZQ$i-r0T@JLrE)1FG(^K7S|ObS9Mk-`0QWqb2#e~` z-4?+#O+!^w)mp%f1M`H8{b+SeBBhL?Im3CY^4zDSNGlx#U?=n#1JEufRxHqIcyTv^ zM<`Huxz?Wkrw>D9u!8EeBy6Wc&Bk@qLoF}|317_%g*2X!8-z%dfKp6Y7Jf7wP@F=r z)H0-W0q8@-O*POnPqW9+mxnbL_8HZt+<@2lfGEf!8S%1{bD2|b`9>bYNlqwIUJ(nO ztFp(v!g>DP>JAG6Iv*?*5IgY}1c6oqM~x#Wh!Rqcr&eUF;b-;xI;0n0Wo4^$jLL{E z#Otjhl9OaEb8KKr#|@k_Er?{J0d}#N#x0&fYtXt71a^3&M8t%(S;{T)dp+ys!(uO$ z-T;A_j8G9X@ied?NL#eXOQhD0N0}Z2Dfe)}>Zgbr&~P4tnp6KQ_N-O$L)XXRRlZum ziR&2^XnsI9Bf&>Ygjd z-vD4Zw2sZ3r3Tvm9AH_YCTY!oy&5Xbp!hTi&;l{H*6wJ83@w~hD~trh5Inn6Wv}15 z#zI0?$GMDpP=?C%1TZvEra~OrhUI4pJ$pR%2)iIO5@xp^lmi_lMxef-0UCJaw&1g7 zM*7U@ohl4!xU*pmVH)kR=W#fpo=MWE4c6nn%|Zc%enCr17ve)Go*@;qq4N#B*fBEQ zaN)l2D~`merzVIUnqn1|9fE>&tInnIF)nhL1u9uXL$Yj%<@V=05lBIf&M1Z&f^<$~ z+<6$dKfVNC>t|J9#o?T`TY$%msU^favs1L9ATb7G*PvdMvc(;%R-0e4rVELa)|L>Np(H(Q(#DLep_6z@t0{+E_>D|Y2h-+LI6Y~2xL1Bb)E*a z*d!?Da$rEQc}P3faO>^addbDBE(lN{!TFL8KHx$g%kEjUSWyCp3Lba0uW4t z1`yOrg|jL!UoIirHGAD?xO|p)u;xh2ie{jOK8iKBLIHI3sfj*He4!y*1~vZW-h}u;ZM5e{~mR1zSo-9hV2j{3vU3%lFh;7=a}mv3X$-f%qb3k4H#v^ zCj6%`&?AAmsxgc&Bu)!}6zQWa9CXJ+QAdus(WF^URd zMqdfnDvXix; zg?d#x*bWaB(YWq|<%Giw4hw+*d4t8sZ!Z3*9Ig8iOWQ4*& z39{s32)KkYN2>qK08txvv{g16=|D~>DI{xb0gj3=k`OvmKId|tW%Tnq^l6_bxqEw+ zMw~7~0Slx0%2S!;0ZurcODu7}&Gv*9vBs*73oL*Oh$4P!R&k|-fI=Y@$|uKz8!|i6 zhXUd(O_>wPXQr}AJ*5CH1q7);ST(-NA9t9mjWgMxfOfc7YN^9i1L~C>9Ds z^zx@76p{nXLXv|OfthBP z5rXd2>K$V>BI*fOQjlCjTRXj{Sk5ELc$zVRIwz+L2)>v>nD~K_Gkqp(D=@PzAm7y! zhoO zDS@VKo>2_*YGjm|H;?Nr5pRY}S&tY;0VQyVfw}>mXh^gIqtF?E*ZbuasunbOKnw_SHnU`dPanRm3VVW50;EwrG3{0u4~2+Z2ytm+%Tw#cWhsz9 zEv5a4c~ag%DWu?s&uXO$FiIg@?(|wHqr_%~hdbOrFcCeIZ~}AjgZ4-xyfPUqJp~+@ zrszSY;>sbcAX@mLoVNUX&pxzk3O9~1jwl$A8|T!%9-sBrScI?>{6GXLZyc zffHLJ5H8w7P;SzN38qGcho+ST!*S>I5gs7L-twH~OQMMC#&a!T6QLkPD3?Y(Sxd!* z-p}Z08dHz!6FhL9h2a~WvC|nzqfRG5M0R3nuBIkDr7;q79K>VD5|XP0mLd45uvmI9 zBnPv<*kxQ75Bh{XU~iu~RIOR&DLSLTgisi#0$s(CiFWh5DCdbMDM7YOV6cg56+k1d z1XkgUi$e(m;=^_0b*({K?KmYrp|h(O8vi+jX+nsQ91ph;fuUvni@8z=F~u4IHAtc; zLP89M2uv-O&I9-U5?7CN*MY{QxT>7%Wtwxbb0>x-uz63QKp?}@SyE2?%p_28slhtU zS`>h4LMcGhW(hauxF~daER?Hsv)TZ4K#IR@_bxcIM5kCP=lfg(n9doiIy~k%ki;%* zqQ%()HKty7IIIkvp8_azm`@=LFc&f1DBVVV{p}$FpJ?+~$H)PoL&j4qv787T^nyy(0llePmtsO9jz+8$8M!la>>E32 zzJ{4*g`iNhf>rvP*cyzs#Rr*ouFt}Nz>&;V;ZRqOGHtRJ^lB;)99I$H0WmEn z0+O$sa76Ak64smftOR?Pj;H|CxLuwpt5T4yf!I49sv8N9{@t8Vq`XFZL)6TXMOOAk`aN{scSq%VEK~>M2*rNpFIorBwkLb|~8C(b@_i7+@*e;dO zGl7=`1?TjOf&J?TBW;*bNcT1m5Q^%dVln_HEaw4$z}Fcw@p%2w$*Z1-nHoe-Z5nuq z@|h1-DWym2<|pH`Uf0SZ-IhPUULpb%77#>GT4k9)0}+-`NVB>MBV^7$46$Eu5wsS~ z7*G*BR|#GyD?^p$499pU1LoIU0fDwj3)Fzav<@1wM2U8#fJjMmpr5d;j8i{lB1Yh1 z%dw#%5c=40I*t9rc&8FNg1}$%OeHj*APEC1LCRWBotG)XEAJ! z3_xO+RRxoao45El*lGQz$78t~2sz|PfdgJ=1uhwoJylZNnEbN%k!8KcP)0$jHRNPO zQ>BSOa=%P3kx)8FIzOhE|8>ASs^pMsxe6IDl6ywV{v1J2&?@Q7662!vaeo?;J!VQ{ zmDqBSrPVrWkX8_(8mvvT)bB_2?4~R8Z@ciK*KGfSKrOdh&lFJp)zf8Q0EHraoM)^~ zqWReW0z=dg!jP1z1cS?iR^pBk8gT-I7^Q{NGZ&Sf&=4~5k|3n=DP&GlxjFPOgVzil zs7+H*5H2^Ds+hmN&<9~#2)tJe(g>9?3Gmit6|baYV$$HFhhGgMZxfb{wXhZe?1mbt zAY4Obl8-7RG&O<+uC{aC2^)FZ`ItX{tVgUwXpC=tT698 z{Mg;{tN%G|A9URP2apVJe)HuoR#+8j8T#&b8_r3^+b{C-KEm#LV0!Me|H@3TF>n3c zaU6Kv&Rn=hew`1#y(bp94}q-Xu8{n;y{cW|P#^rF&k=+FlT6VbJP94RMZDbC6kqiV z8}`8M=ug7<4$g)xz9_y4uaCU=%J@ib+xvIdj<1B$KRB=N9lUey-8(O|ZFf)H!|qLY zZ=N^2&)&U0??DB7d0Mso8_z|Kq1|qxZ^{F|Y<~bXvIpxrrrv-{s$ zwc4NZ1$e!a*nW)z?^rxr!zLcJ7jmjb+*9F4*XN_}V?{il@?Th?ctm`BdCU2?bKp0Z z`Ba~SO@7-xz1u4DY4q~k4&tso{66y^JYA!%8AIE%@Xz8?(Kq?{V1&(@c}@B^zMw)A z_kYBniodB%pU?0gi{gYYej4vgexqOdc3CzRFU#kqkB`;8-3dRJrd#1Y-aLR^@j4dc z*i}Qmry1Yp`EeKb_xhh`U{~Y3?W*GEu=iA+{b@b;*glwewfxswPk_flqaz+J9r$#` zlVZ7sO0kB|L+y$e2_ zK6%&5{W`qeLOkvFKKj*IzX1Dx*Y%i6b7#c26XL`AVgI@D3tv5Y-&OD4{Tozmx8F9e zfliM=lUW?5G6&mAGQOccV{)Sw?JP~d1)9G4{cRVm`Szb*tM>EF4dY!MvAyNFBzp11oZYFvfK0enyBkIl`@Td~`wEcnT(rY_cULu_>KJ+ym zd9wO|`qo2V{En<=NBdFvEz6a7?CFxT$j1&c%;I-ogqoLnQwxOq@*%mF5UhfEs3O>O z001?b5=Ui1``2(l#2q_?&vPHQvGG@|Zgw+&a$L?%9g_P8R{U3b7dy3iLjz)7|+lU}S zDrcv&St_3Cu+?E)$<`vKs*q+&F3MR5ARLE3NYmHQZ+pMDTDjKb7m;5@ei!*)QE==828tD*8c;wMt?#+kGIN*5 z80DavJFW5mtQ!B{Nu&@~1`-G<1=m?p z$+MnE3G6fhh_iAcj}f*sMkDc55OagHHPS>sKr?#}XjYK%twqKc`CsIIk@-dB7x-TX zo_OOJ8L+(S>-U`3pH2q6_Z|EdQNv8g$5X-#8~{Qb)IBc&0O;%I(-CfD#O)hpWPM-m zx&8X-;Rir2wTwH+N#~k}2$o@~b680Zo}F9o_T9Q|-`o5B-5WsX?{}sXZ{EH4>RHi@ z`miJBWN;3;`S1Kz8ffi4rJf(^(>79B_yG*FTHFh}9@>Zz)ly`fM;k0Q6-iqE-tM|8 zsY=c>+TooLF_EC`PyXUXf+qmrjH{%nZ>%aAnDxt?nBrGj87(x2?M+%|cm4IMi_I>I_Pe;=!{3 zu~%u`acC+2xBa{N-n#ql+m!cKnHw#v3Dt+9#G|C#6EZW(X?W$4g2JnJ?~NM^*GYv3 zb_L-uC`Vq&1$92C(55q@7<{19p{>IACctm5u<+leydqYuDAU*&Cp+M`Sb>$MuNpd^ z=8!TrUjiJ;dx$_f%*Ti(x!yv76cfxR$XQU$M-q#G(9W5v&b4G(4?tG4(46s_N@+Wf zIh1sL)|SL?AN}@PM*sLIbL8uUD>+s`?_|(u3EX&<#WJ-0zn@IL?Wera;%_FMkoN6g z&$n~;O!;4$*}eDY*`BT{S*h_qn>6YnrJ0zhr&vv(M&q%kdG}MhGDwgtqG%{RuIG`U zMia!Gohqg0s>d0E{(mG8O9#t7Mm!g@IV1_Gq_?-iZ0A$j2WHR(|EFpF(6_;pT-$$@xi_$ zzk0gS2SQTko=(#ctDT=nZP+HfGe*- zPop`!SQbJkqrvfho8u19ydMAaghssxXtn9ih1vrQS5pXK$a5y72P>-!g<+$1igcO; zdQ%4z)FhZH$;n-qpjqB~_ur`QjoIJl!7v+$5NhtmQiK4*a~S9t;RX;?nZ1kW%(#W` z+jX-!nh*#j8Ic+ma|DpjIoNWvHJzYN9e_BICT3z7r4iyi0#yXSBtS?(_3jX;zwa77 zW!~HL?PDV?X&6s&V_IK2v3Il$OA@F#V0ZecFdSUGG``VB^a z8dy^qdg#;~6C$V%ZoBVziuhc_M!+%5D3!vlX+!x2oOQSnz5w>kZm zMj^Q{e+`Eg0FU@;B?lQTL4e^IL)|sIR^`2i+<>mYC^aWR?QoFhReMqh%1}@To>zmM z_-PJv;x^bvoLT~@G$@BwS_`Z}5RR1V4tsC?t8C7%xB-fqPJ$VyXJ=<#l@eL;MuTQw z-PQf=WC38J`lz7>b@6Lw(n>v6TR?&HBVJvD`^~#V{Z$1EDk^(PL+!e3PjAEwbrR^iruTpIYPxD zK=HU=nslqgEEYI92T4F9o|~-J4+O_DECgM@y+Ytt=Z$q4g+OPh&N;K8hVdHi8HPac z{H3vn{`$GO#s2_T?Lq{=LM@a@9|80LmIwDt+5755xj=EB!#O7ygQ>I%42DWrgDga( zP5M2aOV;2=UA|ZU)3)MmDEs~yb2SsU>=<%9_*8u_M)fhTK-$zZU5vAOgIZ8jtCXU0 zLZ_#+*gx@ETO_Xwypq9 zWI!W1c0D65TTvjBPYgDBr~bdpm8`G(9o4A!{-uMV-!enxoJ$bbF%VA7rFJePlnL$3 zUPPw%?#h3jimMHCo1nbzvjY5oa#b%d3`ZFdGaYaNE(RVejaP(!PI#nSh^QzPF)KsE z9-IiM#abrP>ln@lpj9^$8>SfV->JWi1Xcbkr*1^BtBinh4dpced+f3*d8QJU!HC&t z`Sp}<+&lPNn3FwhM zq9sj}NX@&`*6~-80QeRN2!G>cg>-koF?ldZn7T@TzwzII=*%1u&A=5H00aYlkphVl zGc#zyANXv)PSgn<1Q1#qd+Gp($iKF>z|=G(xt(Grj@|Q8JTZ0)8?K_Hkx35dS{MgRb2W}s%M09X#F+l!>e zP1~d`Yu(y*?Z(oyftiw!VBW4&uLKhh0yQiT^xwaa|F2>dD}S!Xf1mtc0q>Q0tKJy? zX&VoVfAQdWaXwrN55sx<;#_Qdy@MBG;rH$npSpW{-huD=iNq=)XE|95KX<;qBjdz% z}J0U?W!YhR( z^fJW}(ABti_Lbk%)uSx&#k+STzWOF0tP~nNg6wuAI~i;qp}=B1k%123-?8rdcZ;97 zi`e3LF=L**eL>*0ks#(83MKKvP!=#W;*w$YFk`8BlM8U`!xwAfb$D)Fe~2_=@1Gls z7eV4Gg7oPM+wD|iN2Gg6EKDOYqqFCnZ9o_XPr1MD-7>d>kR%ChzqUcpvdz0xo(W1? z*FeZ&$Jh;oY~Bf9e4hD)K{7}U<#%dbMKdfL#z!dw9phP0NUVlK?!5Qj4R!bLWI!}s zT(gdX!{N3Hk}~zd0O5cUuqoyOAsjd^9>Vw9_)7rTN&_lsKw5v=;u1uj zByagdAsf10pVK|cw&c#nBk$oFbh0eg0fW3ko*R24-4Ih3 zz0AmSpsmY?Z(GoKqylivFFRf>)2>Y(-D%(%7Az8^YY~PV9=}N6LOkf2B7M27TDGaN z{;0MM!pva^J9$nM1L1mIyaMO8{2NdJ`1O*@={C5VvgY8FUz26RDEUh;GVF>c9^((L zaL$5oXk98WKnCt%kYk*7MX~75-#3w{_Jx9k(XaqbEz)QMfsEV+6w*sM=(-M~013K_ zGPmn4ol|389HG{|_w1ba69&JF?bdl5c_1`|E`|Zt`&{S;y0~-67==iPG8WSCLN0EF zgmL4(Hv=E=Ms`M&EG1zM3^*G)WTZ1yGz1@Bp(w*`qP-Y1dw*o%aF*01vp@ zG07T3PaknOqrBXFY(G_TFjTTbz8Al`@t*x;;Xinv%3F91?t6Ri zz`OJOis$wvYyv6himf2JM^jFe6#_TS-?s$c-vcqsv6AVb+A{(pEO^hu zsJ7hNNg#Ve(7js@@6KcRMq03N?$i3M3vM33dZrM|>X=L_bjw6)Y*#lM+ken?iE%=aKBf5}d< z8Ng;agA3d6qC2>%-HiH_|1#fm=%pdXPC;{nz=4pWnPtLQdEg z$>6cs|NZwU_qH`MNpsVM*L2}jI{UCez!K_0NO@fo;PQpfU2Dwf4cz%M_|6K4Ci>#C z9>kzgv&>%38=I|?$`65?r?A;}*!snfD`k_q|Ho`U<&7Ku+n3c^VbQ?BDr!i78zKW# z5*tYX>;NlwO>Zx=f(+4gX>!)BvO+R=JTV#UNsc@2biKV2e;2s%7xg=!2_TRupzI`CFZbIOI-mq%+u5O&Nma;)vjg{ zLm7eGbrSe}B`*c6l&p(??L4t6XS7C_Kbs4Yd991*$-y_VPgW+>aRLlmA;F>4$H_bY z>d+}X@|y-Di^69%rq{CH)NJFhs(&k#d43K;R$00EFKxT7){nT=ja2R)V%;l2W74~! z@6Dr;*gX=Jes*nTEDI3)7O$Rtd_)mlwTmXprxC1MCK-fBPG?3K&Vk({pNdCJCVbgo z1;yT_EBsS+?UChP1Z&x!i9{B)+)KgfX($^!Bo#C)`qWIu9B$yys+qIHKmeagzDW!*B^)c;{L=0D!w*U4@+M3V|MZ8VlfN zrh~&IYW)S6U8!4oy~~fkKElnwin*tuFMc!ZA#OmljvZ zm5Kv9Lu#nOCIR)J=X>o_ubhp;s2rk5D=c4>B+|mPC<8mQZs!_{n5ox_$5qLSs+uy5 z7=j)`(@49u`uSem5X9bo-Qf;#ZtG>S*A0xUq()PuMVARJG1ND$gz+qLM^q#eaa|~K z&6C=JDCwFhRf|5mZpz6Gf>{hO%J|n6WC{di|Dq<+mirP|kYubV&Cwv6MN5F8Svr

M*Bf>>X9FIj?)yNd$*D8oaY9G|Nsepl77XNIahj+5uG^eZFlVxJA+#nd*Z+U$qY% zZJ-J{NomF(30|2?iWZB0esr~&l1S&)*nmE4pfjfVBAC5++0!7HMIC2e)e3E1pGZjJ z)dpm*LYLp9JRoSr(_fqYN?R{}^XoHue)dJD2%T)(fmkZkAe==*`$(CX?aX5x`zXY6 zxH;RYo@PuzKZ^-ZGDs2jJ#>VIk}u7|Sy>d9wMrGTZ}5!9={eyk^M#_I=wB^fDZMsB zi~g}%hk^k&2sciu2P2h*sKZz-=%^%Ct$Jg0hq*$6B-0JUjX|RICOnlz((c~Px5WE= zq&`bIwGD!e)9%BRLN;!qEw4pnv?u+sfg4uiwsw35oe== z6&B5n^d+j=l;!An4bQ7o7pbmi2lM@HTfWNK$0jAIR@U_^DlvbEvtV^CS5Zat>6`FqArsZ(!? z9F2hz)r`t`J#SivicbTOff(v9tyw47_bSUEXgJ*l+;DBd!uhja@T+57NrnEoXMChV zxAZ7*;|HB%sj8|-WL27=AIx#aneHj+>p{QtC~)JJo-bfd5Eg(xcI&1X<*D!%3`2DU zji(!e8#foE$u52neSQL!&GSS8{lA|flA!7qvTmHG7TwmD(aZ!dS|eCAR8)7L&@yE6 z@q=LHbQ*9!=P-dnJ*WPCIhlllfigKziD%2kByOD614RbVsQ%_%uh)7_b_Z;&J@N7c z4W}D{8_6@A)dCim&x#sYW5&_|r?87*`VE4O)A_)x<5hrFYwUM+{&2)Y&KfCMh6Dwt zn}Hi5q}4(PIm3Jdu8uT%L3hY&T+oju!N%$N;O2pV`Dgm}-?|07@&weeoDPOj%HuS_ zaLf(78(^)fC~Du`6RvFZDJ0yQvFt4qr8iEi1oPxo&3kb-A9Y^!MUPfD)En#YE4o3r zak5bc^N+}Z9@@l)L#q&Jn~D3T(E3##M{b;_2sj?*x*Iem33)Po&6TCgU%Z+Ko=!Il zH-`4XP;sLQ0;(1e1vuL{Mdgk`O&Wk6;ECt9~LW>yZwx?f#%A#Q-^%2a_Aa| zZp_JS{Fz_b@XcZTO44n@V|H3d5|wbF)76Kys0wE0KK{@7z7Csm^+&3aN*edf9Elk+ zg{JDA8WdSe+rf~_D%@i{X^3(&ag&#>kg!kKI!Tz7E`c3&2v3wKG7bvXtGB2rlRwFx zu*;PMtU(2XRl4+Q*G~m~q^-!cPWE+#z;GInX+W(n#9j?i^&;^XLS;L`vKe!v-S533 z{0c1;)NESFKZ|Ju7-1DiZG-88d5=m=GX!E#D+zHiM__ZiR7BO8S3A->=U*Rrh5OBXP{8W!?7UXSB3ltx z>VDKa61^}wtzM~bRcdZgB*67<%sjVUEdSnDbMZZ;VD74g`I?ei+Opyk@^dOgxh`s` z$+pf;Jgv!S2aAAK%EIKho;N`yH*$>QkOM@ zvcCj>vHwssUT64KMq&9=-ppR2>UUQj{F{G#X?rdIJ9>lzle1;X=UvKzY|nD(SeXg2 zUN9NbJpUast#92MEFR94EInZ=NcsptWJ1~vuDU3=2C)nbI6s?_qV25mSeZUNH$z@kGBgPUW6qTiyvbB@PA zgyfsLC7Zx|&J705QPj{sGst2~Gjg)`4TA^$!vCm(IPTeIdNkSX`w-D%_ocem&6p+h zOl9^dN|LEZG7>X$gfGu-au)2~2~SGiJT08nXWt(oZ}}FG?CuLpUkA(3QYzc)I<~e^ zQadoXetAd3z}VlPbB#r!Vaj!Z25%VjTkcBVx=o{V-2t@t{EBm8SI6C{E69eZ%6KOW zT%S<|U0)}`_w0>-hcZH@u#Qaeci)!Bk>>dw^JK_u!b~+PY=3Xv!MMnuxOE#b1r$c_ zp{EbhLaJRuPk>GaV8tNHPHROAb!E9bI}IM|mDMj~4a+xNA|rQ-2jS0#l_ZVIu``iX z3Ag7}o6NWam{~fOWm)!9u*zRTK%Xpf0KUsMEbzpOmac!K^QmT%FAMA`_@ABO<9cz9 z5vbTchKpj7qUvB6QKM$pln?UMeFyiRA4zW3!!33&i* z0pa%dEyh>`tLmq3h)U*?T~o|o;AYx=JL01|6q$>hg(MPK>41CYU!{_w!BKu{$Ul+g zTvhbJ4nKC>RXMB-jirW*t)^ni2Dj0-XRI(sRel>BRgTLW2az9gY09V~hN5BSo86ia zKsJMI$k>ib_|~biQ!vn}jq>2Uy2#FOF|ax4Sa0BcrW4V4i<40}uY+q9)P#XbO@exU`SoQ53g!h2n&e7gr6_WmRwEvl4tKl^+{}EB)iwtlgm?~$ zd)dng18Jme?T98!V$On?NFOztpJ6}!8~U)c-}u#C6EU#0JY``k?;{s{HDZXdK1NB# z73ewAI%*WHJD-N7F)BQp;g194k8$|h2McvZ>qu1ZO>)?jql-tG?YRZWrhKjcJC|EPU(cf&1y&vlWw8QHx z8@OIP7@Uk=tT#T78$=9D+R=OgzDKXgV^dFQ0nSXwB;GHWrYBTUBE&G?F!souHPRiW zjO&4}mJ*JRO^5ALPB@U=e9Rz^tQRXAE9{bDn6FYuM38o`EhpIKZ>dU@?)o9&#jZ&DP~yhjmE|uU)_{>z^v~_wqlm+_Z;{`3%$_MRR9q)j>$LD( z7-b{jwz~QKDyApBXRh<8a5tV=F})4jD|5>?g|5E);&aw7q|_MaEo50}BU8iB)jc`$ zzbJEx?VuDM6=txB3_4tfO(oL#ErBh{$l~U4^^=jtjVtB%kyibi81_q>w7y%R9R2wK z@b|)7n6j?xLaVaPf&0@;3)JL032Z<{x>k7rnBt4R+`1St!;AO4q2s2^V`OJ)<>`+z zR4dS9svlEGZPPY=xR@l;PqV;-{co+#sDn%lTB8MM(o-!$XMh($wQI|659C_O_ZKiz z;elCC?S+g1I3GF&w&jsCjE2fdlJB;5v!IWbg0%L>y*knBX&!r0H*B!vZ`st@=%>>i zmlX!>t+7w9we#I@;AQr9IcZHrF2 z^z7JMDs0I)1$@;jD5J8Qo^mQAuP!$UdhnG;uqN#B1G{(U{i6@oyR;@>d~;N zs0vaR_FD{thR5 zN219l%(Y#)m=@;d+9|crylLdn0#iH~3yv0&t4#-}wd)80lW`lQ<<(pl;4PPCv!E}` zuV=|IxxV@tmJ_r-Y(KAs7xtxxC@E+bb5VQRj%08C6xfWku<)!UcspYaIElM#wz(4m z5L>rF*kx>PbN4jXJhIz>)-0xgt3{w%T;1P7-#&rR{-xioLG~cDXtlzF7>qymi7o) zcqSImQj)s3eBf4?f|}7C=DrGNBdw?#rFFIYsVE~oy;-uokVdr@%K*D-^6kXWDP&-1 zWam@3g9O(MUoQ4%3ROpd$26UiZMoQ>eQI`cQ<@$wj%)29&6$Fl(aYrU9dF?2g4;>l zC0aVw)E17BB@?Tr;AS)yxa(fZbSn73G@`2vxo_LK%gNHDr!s%vV0#;H;lX?V*V@NM z_rMu=_D^s^xz?Gkx?sloj?R4e*QQ`tJk+)l9wgYGc4C)aJ!fMsr`2cwpx|(J0PFvM z_I*B=plv)0=g0FB2F`-SHFo)wwwN!afZLOFW^Y6|zCexPAVqG%i+tj1IH)P}!B&sY zC*JSRha$3WJ8z2}q_7k&=XLAhzamB0*?)QV(WQ6O{oj3lNt~l_XJH_3-ePJaWoOJxedM+Dt%FYcv9hPdpj&B)!I14>} zaduJ>)bQ1bstPP1+_H^ZYoKvrN80{9X<}$H=>H`S)obf}9+Oovzkkv>Z?6x}Kd~U| zbrPq3?55rN>xF6*RNV7E`Yv_Pf$4otdQa6B{SYfXaDfu)_)gsr4Kfa1h=aOz(F z$Pz9Nhjq^1CJ8y(&b9#r-ts;pA^>V7Um*-|;wYgosqFFE#+^0~DTxmBS*9{=v)h|w zd;(N$DkOA34y2qp9f(~#}yj!3_04YdD9yHr^`Wy%$_M2jtR)6-9f z8K`@i{!L_S;=VrDen0M&dKKuG^9T>L^U8{gN!@G58J>}K+chkDml<$If%|AHsZE^c z*4u&gpJP>YFBJh66<}g*{bF5Pq%&xM(&ORe>6t z42wF1d30Ti>+89owvyPM&VkxMi|y_3YZUiB)Z(V;_Oqw>#k{yOJiW`;-A$#o+ld;g z?zA7>-Z~?)sm0fLSUk^<85w;IcvSPU>2SxTR!LF!0q0}KcnLoKC~Gi?g4%FqYqDBX z*R@WBec3Pa&#U|DhQdb?_t_AOx7=1d!4G5iAis0PN_y%oKimNaurxGXpU!qK!L|W( zqIR=C=iOwptF5#Wjo1JIiAi%bXiA38kQk%4+iY>YiaxjZ)H4DA8jj``jiyTlGyqJ` zq`3RAiV4Sl-Eh0ALFgZ20|hke!(+A6)Q`%cZ9XULaU1cX+w)iedOP6(I-W`ZeWc0v zAV*z=aW=Y1TLU{I`OVo~Y#JS^b~W2=Qq#5lbZ*o<$7$=&>C*B8gT)R21JcqJB$({TSCa52r+`FQE2V>l-gbqV(*bk3(SiM zE}w>wrRlMZY(3-3bAZI#|0I?I;H2RLb-uaT%h>GL`{3XvNS8Bw)nUh9IC` zBIB4RNM3c&MB zz;T_7)B-3|R5*$ZL|v_Sh`}Q0&V!53dtG;ZZaktajp}J5A_%QiQV)hWcdc9+=mF5i zf)OH8ZSphQA`)%Zn7!z-!)zhSHb%H&Lxf73K{mWG(p!Q=j=kuzzeyojLZv}UrnX$w zoI>qT8!?wrNW5uigw;u>JV0q!;uFw8mC^tn#;)GJeuMBloqJMVP=2O7!fy!}3LGVC z$%35El}TTU$S^|0o?IzkQpLE59zj4m(ebDBPrVg}H}j^%gcjKh0@Gy%eZLJd7~ zPE#B>vvr^Gr)Xp3mhq0uro5Ipg&qg4Sqm5r((AwHT9Gr>{dwb+A3yoHg<{+#RZjWj z%UI&Ctewzz>_1{3ACaBQiLdiymFg@0G5cQXz)g*iY=1|sOIg{KJUVjl$;#cTjNCf; zMW0ysi7;UfKL2Vyz4^euT;PEocu!Amzc)YQ%5P?mf5wq9@J+clcjWfE@5a{g=C6Jh{MB)ik@x7ui?{HV2+$uN`0nCeJmb#Jsx41O zQb)ep(C)3_^U^2M*j;_ls)GNM%&LFgiU9xLFX{E3QZq)LylGx~Wgk?GldjytKdfsz z*8Xwwe=ae&|6Gm6jVnuFb3H#%85i3M{QwYgVt+Ri55jZg-VFQ?PmYnryt~Q&7xnP@ zQa@f>+I6+}z721dR zZ>I7`cHfnJ{JhihlclG(UAxN6ZR^kaU4j&46tDJPA)mO5X9w-9eJrhB+0ZwBe0^W_ z_K%yaFRy(5nmhxddtX<`Y1Q^SVmUi zWmC)JB$$owKtaD+M)BWPW@RQM{ogzjBg6Kpy`t@9WMEx#Q@{Dq2S0!4w`iB27~viZ z$z$W!+oMb4?Yi&xi(lV*UqT`EVe@(C)^G0j&^DJFt>2Z+ewsdu+xim++F5>mLi8PS z|CtY@UVYcpqv*5o&;F_0txK;tq?Me_`Xj$ktC@U1A_zs zZ*k##xxkJ2yXA9Fbq*=}7UXdg3;gkY50CwS#g#LgqD|Pdf`)Ky;0M!lS?%0*!lK5}! zvzP5MX?k{l3pJ6H{DUjWex&`^-vkfmch|$>XeQ~Bc2WJRtN$7vq949V2FXruq!lCE zi?m=%huojy-_xJ#Pe9tlyFJ4|NADCgZVuaIykj?#j_EHiT|V{ztzS>`^ijE?Ky^w; z>Basipv0DyjwuF|4vz@Y>r(AvA&Mx7A}FFSig{LwY-E;Vx#l^?mXfQdYq4E_%! zzTzliJdv(L`4)t5qeSl@jSlqR7LH)n3tAu*gD4s4o(0AV*z8+!pf}{LKS1^g7|k{ zoC`0{b*8ti<>2AW0Qg8|pWHJ;NAtLO5(8^}HDJWO9J89uc?+{Et|x>-5d|`7VExPC zJ?DV?^7`nR8(*${P~kR;k``O?Zk+ijf(zn@2&4>EV@A|UXAAE?J~8bD|H)7Xc0nw` zFiSxevN7i3*d~x`BLK~M;hFWO5`XDCO;e6VEP(|8f&!FP6{Yd7$iqjM3*GR&l|SVf z9;+T&g7O|l`d1?8*39CZ;m=2aey2el@XpOe@}q3PF=WpY!Zp50t==C%#mxnwBfN55 z9*=J5mQli9kFA-w#fizh+4rn5u7ipUB12By)B)ZyY@|V0dgtV8vIowOEfNwC0Yl`o zLK<`;&nL4om*`}mWFP>fi8@!-;Vui1hYXIQamINl;yQHV;$GM^SGdg$%5^^tYih9lcHF-*g5#~G z_d674)Zsk_0T~iEf@roiI2LZnL^9MRKmbBDv3Uez&)h035(6#h>qc^uej|PtvX2Y~ zYB>aJNFN?odYpp?ts*#Tea;5nmEbo+iuJQF@bHKa>IuxZ4o#T|D>Z>xN#@$2FZb6! zNKr&Z6hsjeQJh~dZz>v{aX`}$1j*u=OZVeZP=5C(V(8LlFV%_Mc>xh(8TEh*sv`uX zsDc@Ul9@kj=~}J$03%X*a>;foS204*`-8v{jIva26+}82X3L<#cLX8$J1BiVl z&orawE(Snn;wd~sZ>0!1Zy>4jTn;=y0lB0|EIvl~f|Tls3IhkB*0Ne+9q_rt{~9*Z zP=hF4V1O9>0)C8gOJQ`!3??WGdh>Im-nx=8aP8$9B|#w5f^CzvH`8>@d^khRisFV? zE;5DpR-pwz7-}m6!XdwGT#e`00+a%2%|S*WG##!ukAs}efi=Ae(wGPA*Fn5$glHqc zY8Vh14Rg{ViBY&9?f_Mn6Mfq$5tt!4QF;$l!UB~?LZ!0;AY;f4h9U>4dUlz=>C{Dg zW2Z(=>#Siy!ePB`8Bz<_*c}0|>b&UzFqFrkVP7T|tAInI70D^D8~_#pCT1V+5^>gY zrIiq^2fT!F?i(E}*D~V;%Z-OHeICyR4q<3~qXhG91A1=)>x6qEmcjG}L#czoS2@BN zCh%M%fD|!+w^NK2#4Q8_Q$z)+7R-)bUHD1%P-LhW0M}-4)~7hbb=KkHw_z*!fVez{ zIEINwb7O2JA%Z!eRJa2VEsAq=@mGVgmeK1NXdT;p-Rg*&{O~%V}j?s zL#^W0I#@|2BpKP3;z!k?%mC;1B?o!WjmlfOmm`L31#2*CyxI!@XJi8w91)JJoz%J| zA~7Y>9382#FiY0J274M|;pqZ@l%ULl^YPw|mhi&!QRY3S(YCGim}8;e(+98KtB_YygUk zjRq-<1WRGW4#B}vOeQ;Nf%vM9r3@f}qUcM=l^l6>;g%~f!EA?A9`5PKgLgTE1{2G% z5JR<=a^Px5?^y|;=Q{%oPr=Pl3zAR>rFYj5#ZsOsG>ne9wGqwhS-QwEPejhmIa)C= z0ZT*zfVMuD!U2IZ>Bf`j(qS9ub0GNfB6J$gDoV5+fW^ zNH=gvUKmD=$J3E7AY&ka>L3wkHH22M2ccJmiq7;P^?O0k+>r&P;UoYOE@Su+N2qqk z(NhasNfFx3Jjg1DLP}(ogqieOX|}(hhRF=jW2vHGAuf)|)EL8cP&@*7D5Dd-0nKAN ztb`KpmFgVCczH9hUXaYJd(U-@S#uABw^ z(sH;Y3NI<64(5oUp;JOJ9G)HPcr4kvd2LwK3Y zEN8AQrVi7*?1`zu)*}cug4z)Ap72aTow<*$Ai8vty(k1CilT^$D2pPK*Yf43VsP5M zT;=@~#bW@M**ULZD(;@F=N)I^o(d?4A}FFFilT_e_VMzk;;{O)c8`1-9}=dv$q3a@ zmRH{4^_hjz-a(mDGAVO{!T=P;I;}w&Xda9{g#yt@ucgjh9qPBKD&4%A)crr@u`C^6fqSA^?m~5RscYjF9?uM63cTNy3Qk ziN_&t>`(xWqys?Q|2oOY*)-JWs}?teTqUa1wUeL{ez;2-wVYqWL$}~a( zsfth()M4c)jFgcO5CQ;W07O6pAOHYgWSrEB0s{CYKzC2r&8}3QSmN&DmaDdTm;F0X z{tiH9W{QXa4gm}htVCv*0b$fWxu+9#!U11Q?4kn?5`a`BHmwN5q)8f)H<6}dx%*0z ztgrvT_ndnz{E_XaC(>A`)5DXdvh4JDu-0}Rp0%;MhcH)1_j?LOvg%Hz(zfk$Vdxl> zDgd7}zW@M403$L00BB`5NkcjVwx<#BdMh80z%8c+lVLbpSEJI&(#_kaJ*;A|ag z=0CfdJ3rkzFV`^tu=zL4-;e%&;Xf_;p7JFHs7 z|JTpx=J@|X$7G@s2}UKNSvVmSsfJi>JiR1`zuox!YX9kVB=MJ^f5y*c{*HcBhZ^}o z_J(d*yZofX?U!|1(9PUET}+Lg?dV){XR|t`Ga4F1-(y~<4(T+?A;5%PZ+(T8X0N|X zGYw=!55R7kxyZm)ew?fV0WNM~3kD}o-x5n9P-VtA=2Z5RVpTbT26{B~_UHcsdUNw; zw50>G?Ax_PC`hn6F@otMXYJ_;IVMt#3_N>z|McbS7Er9$(&OuAQw^>u4FkmUg_|t$ zuix1)=sbJ2L9ueJ8<-0(;#qmi*kWjiqnD4;n>%~m&TxHUEEm!?J_^)W+uNF3NYZT7 zvi3Uh&W);&x-bn){eZiM*I}rlDJ4ao<82YT%vs*e-GntIPnNtW^bJnzQU__~d1HdK znsnN1?~-<=?O+R#yK=E`ci`2qXFgz=qZC!$_&&xy(`HP~E&9A-I^ z=mzt&nc%wR;BOhfDOMem@sY1v&D5JulzI}HE?Q|ALJuFy)g7JfIz253eL3nAk{oci zw5WT!wUF_e>mtMny~3W!1eg{GgX?s6>s7ViwoFxGv?1|IusowRqMJh3deKb~UJplS zE+@A2r{ToUgcw>+HTp7a!d8U9rjk3mYcI=SjWfYskyzD^w3_pgOtisp_hxF(d5ov2@mI)ah&T@Ezss)@DAh08Bu$zvqE( z^sVzvM^oE;b#g(+*6Mi54La<{i97Tqo((s;t7QWFz1uGXl-?IS6!V~d^M0fV~dMot9zK>;mmQnCB;({g~Vwh z(8vCN4wCK9c^XjUnC=S}zFh>jn`JABYDG=bb3Jy1e)i1KuqH~A-jhw?&4f~n>xu7Q zqA)_h9`LuP>k-uEY`#i8g^474$h!>*t$ZqX6x2&$vJ2|GRI&lJE9+S2RnfPm+QS#L_)%wvFnXpQS{Fp3{FtrV3EOTWM2kE zHw<~Xdwuz7(p}!>@1TLyE3eVfAL}c7cw*jHTU-Vsso!Y6L>6;4KMJF54F3;~y^-K) zZs}s6?I)^xn`FBQ(YSEJ$<|5CWQ(Hrd&wE0AnSK4cZW(hN&he1MrPjmx!K#uXHeyh z8|ruiTJnZXokwT?0M%ayxpL`Ovnx~iQ(`wfFbUnkliPSSvu;IAa^3?rGY!%34B0@^ zUQy;4cgk&kYWj+>yXU0(O>~GXCqJEfGwgiA;wvM@bB%UaCQfT_f3bnHbjiW?d-&eT zG{bDT-}&CI4$8a*$g@kHLYuSQ)RD8(7=rb_-@7tPc$esy7QMh(jyM(Zw*%Di<{-6> z{GjUna4iGPbLKRuEwe6OvOROUU*sJ32}1aLkO?_xW{%ROr+-Gb1JJN!4R}eo*#)E89MQmT65Alspbks_9hi*;HpD!e=Mf&IHE~Xw{mX-4&PJW_aDA zaNw8HZ=m8}HS8xgaDg@CjK9rGzmGP>V{ zSaQ`FP{Gk#sDx3zb!s*0@v)xS}wVQ19IgpjYD$3#chog&=X=D3lBF4LR=7j4-eCw2)AAgzpH8D7xWSekYNWp z6+4;+v_$`vhM>g{;ug;c(gw8P(b9=I2fjqMpp%ZAvOC7(xV+IGb+4S$3>;+L-v?mK zBbK^2*M@MZ#iU_fZ5u&aIJ9IEVe1>+WZ_TFWT^>USfgAltMM;w1^@z9tkX6c$_Wm< zepa@g2fy6CE_YmbI~sb_^=nZXT?r2t;i{3Xi}Voyi zDfS6230rFj?`m!C!=d2SrrI4P5U_CQ65u#Jsy<+LH#jP7GyeSUn?fadb522dql9vr#SF={EN*ma;X{D2`KIzrupy2cS8@@2 zT}PdeYYks7OPosl6&-Dp0Kobk{QH?S<)}(*Nr@6AKp%ip_^_Sg5Eof$=te_G5=h}5 zf}W6yS(n5ym!kRNnB*6n*-rO!7ee-#gF-Piy~D^&NNV@%Nh%Lhhn0d?_BuMToatUL z5uMv?<1*nO9HIO8DRHFFbaq00>&)1$?QM4{EqnUJ+!$LgNh;D2CXMk%RmCv)6xy$U z4=VvdXxUEy)6nY+F+93&j+dh^WY_v$dZyU1{~x$F9YMu@yCvC#nWa%*bg;P+k(a5N zHJi;e*I3j+l5hr1g=i`9dur5ST*-#ZZueB3d8K+!uVM(4JBtpRo^Cv^r!Pw#X&aZ7 zMBR9r;ZVzHf`Z#bvDGDvTc`B1hIN^!?F~SaMv`2?d%N46kcq?RhV?tzPd)o^n$%T6 z1T09;*Xaw^Zt-x;bR@hv z4uI;JD;fOa)%IA1%)SAiWBrfYU$X)uZPb5Z;xvs?h?I+>)CAw<9idginZUxo!0+ZG ztYUxnGd*X%r=8PD)7+Ceu>o(*Ag0`3f>98Eps07G3?3z^T44m4t4y$y#;t0+I4Xd0BN+ zQB*0gLq8itg64LEgMIS<4Az*^^)8et;BCmOj@8nD4GO<+w^y9DWizl>(0;Z_hNktF zO-=S5+14^~FfI-odT}x(6?t-Uu_f?Ooa_b~Mf zV;{cXJ6Ol*Di(7}RC24=Jdq$5Cl5iglS7JEly;Ml>9$<;8?4t?nMQ$AqAa+8*91>D z-<@@~a$ApTO_<)RNNTKlQ^BU7+Ej#FRa-QStr6{{-){v1>I28zGty5Ckpc_j3Q2=nW83J29E%VpD~|l zMgKwl z{ff`D$l5}@OQn)I(HcIyc5^3tH&bv}l zvApZ_z8tbDdr69cAn-r97PG^+qOp(c;V}3Jj9$T{Hg)F0A&SnR#&+({Sv_~~`;jlo znmIli2iJ-aF_FW{;6Q5n$`6bhiq4~wWRog{a?qkLrsh)vQrllFTL!#loIXv+I}OKH zAuW4}@;vu!@xxs;2mI8LzB4*xnEQX8?cLvQUu!`G(CtkCu*;+BUp$UgtD^g-&EE7P z>zX0W+t*zYPx^NI6OBX(sQyp(Ur{^ZG9iDJkb8CfX(|q$?HNU+$`&vF&NB z6|#+Z6oSZ?8^HA|K9RJ1?!4yEH+T@w3e{B}$sK{zW!f;>%^xttIPHSKOD@nXF9ca? zUkkB6W`0(9Rn!1bfaV12lW!c0MGROv{zzKo^a zW9aL>U%}8)5L-`ehos;9-@U9_;qi(5i~S znB%|8!-0|8Q2_0KaN3V!8aW0#od!*#jfRh1QQSBMde0ELMnFEh!G32!pm}JEgCjg! z5tdcTGD8#0`}7x86|%|=>uIiEEJJ5jv)B7azK@?l*ImcHe^$9#-`ya|sVmBt;%@AX zw|9b^q5k0piLB?8yFOD_u$z?`kf|!QE$Ckj+b5B2p7}Y5VcMbcjj1IOy35rMi$GC( zz3c`9f!$ZuwO5UCJL#3G%$LVJwHD6#> zM4frStKP`C^UQiQWfx4u(hpav*15R}YOF+?-9OdoZRUbi@Ix~!2qaUe<1!B=P@+Bh``yJGT%KS^6=Z7*X$))$f&I9vqL1(L%oA8}c)?qj@Dq2dnkt_77q8!2Brvv9T#NpbI zd_{2T@7BIIM$X-q#t75PySEK#x2U;!4yt^ps9c#$^ZKUpcaGINk7hX+LL+!55_;e= z>dcf)`mLRcZ29#{SVK&zyE^b#{e6*IPlMe9n$KVj7rOpsD|=zmG`f6R)DHRJeI1BH zJjWo)9gbK2LIsBHZvqYvJA6^^D|6#{sOg0hUc_dTd zu;F-6jXGc0!8itUIEJ>gLn<;c_)=V@1x3*UgFHwe#zZ>*t0_l6*G0J>boxqHJuiOs za}ygE3}0;oIB&zpjf=E=w?z0JmM?9Hl*l*5y&wy*#ao8c_m?|*U*(370(t$2AwrYQ zkM}#~gvFNzdbnRXOglf^EqqFZ6w9f68VF%ArFvZ~en5QuNDmz!1sOzEh zy+Gn8@ed3Nrxz5c=M+R`uUlaKw#%U0dfMzrJt~qTom>sLA(i~h0k`>>Z|$=rd(U&; zQ#=1s>s6eao6Nb?_zHvVhfbqx9^cQm+;8A+y16gg*3u3Nd?_3K`7M^!k6gp>R5e+u z?qCuU+%~6!v3^ikJ!%wQV|0{DTA31i@i2_JF8fpm!Y&O6-_stc@Z*X*bjt3ypj4WZ zSHOYtSi;Mv#(>Ltb`IUW4sD!g6rQdDY|v^QRz*8_FaZ}T$Eey?Z_`oXcx8ig(#PHp zrV=+BW% zc%7P!IYvH8E4v0DuRe;C0*0JQ4|W&=6y9LU&Ymnf@*qCiK13a63b@)=Vd(5(7;mwb zAy6jzPA)~OToH7166B7aKLK>_{eIDhO?Z5{<=oDJVK!>eVWAL*JP3dQuLPJ|5EkK8 zxmSe)XK>yqF5NBV+ZD)&tabxTg%POo*?bA8C_`Ut!L#gFu#Y2hu1*!;FL4f-hk z@KZSxMp#_i7(ML(ZY{s#FD*MeY?)%;sMje@aFS)RA%|YXo$Ul5j{AK#V z;Qor7O-?=bnXztn(d4r*HRu%6Dco!2z!O8HlwPH~PWxY7+b_*_t-R+Ca^bu^S)o!; z3-SaOeDS)PJ?<%AVY)eE zcMc}q`eo>EljGNXHfC=QyIvHtead4V4FM};n!`bk)rVE&x~$-@IXIX%oAU_HXa~jY1$qiWg&AXlpse4H^yYTarC_56 z-um^yvJ#${&R0@JNr5G>xk9Ad23-WJ)G~otwD|S)JUGWi4wE_b13YANhiCGKza`sS zZdy1X2*mrQ-vQ}MdwIlH`~*FX-QaL4OB#ic%GV>XGlbfG;0hn@)Qr!}3WyT8H@78- zP>$<2j?zZUcqcwRi0?MykVQpT9ykUZFmX%M=EqNB74Ky~Nac`KaT`j1j_Jc!f*_(3kBc9y-mzHY7GP_cDFL!AqdtvL|OanjM5$_jS z#|4kCdKF)OCx7-J&fmwf@H~!!w|*$U4XJEBSBT=nyK1*EE)0_^ycc#zt_6$4*geTz zfZ|Sj>(8d8(B3UP7G*q{>R__Py!`O1#+~P#)ewaoe17Z3KlfKsn9&X~gX~WI%G{jJ zoSI(b8t2HtVO5xenc>MSKDaaKSy*FlL*#vZdnk;TTd|eTdBbRS&_z6kw@MB9@%p{a zC$=9ZdqRNaw7^W?YV>XKL4=*d_O)7K?hENR9>n*D_zoZ zQ?1GfWeJ>wPL@uj?n?o;vI{pn40i6qG1TR;w@4KuhBr)Jkx~ut$j|W7hXUy3glj(G zsfm5ZaaGJ%o7>okEzCLqs@d^7VF0&!`MX01>!Ti(6dNV7+BTb<4@tsB*|8E&^GQm5 z;7(74`?y0nzoCRmgPJ5-C;Z9N^I&Bg2cJSbz472SmVwjz6WV%_e5BPfFHzw`0>HE1 zuu_4?yHA#XzyxT7d2`vByzte26aERP70$dw*1NhqiVA{p6SLJQfZ|hBM?w@RF70j# z{*G5th+(j>%*U~U8eQR6{fIjWo#7BbzAvpmer|%3sB$!#tGqbP%hNQe;PivaW%Av& zr(B7aqJg2cu)C*U8gGz~ve~WX@-CB6sR5}nWWayXfxrjZASBmth1M_kcONO{OGDy? zYOE=68b&N$29fNGW!HFU-(6YPiP`IPsK+S#CY>~{8=qE$@^vMs~^~4%L z-=4>Q=ZqI?8JTa;I#nwCzvAi4*Z02k&)@oE{7QJ|__O4fLjDEr% zmw5W!?|rBfq~1~$J6%X4S!Jj!-`fukiuBjj#CHZwO5RI*q^0T>LsjaX-&WH!=#FUG=v-M!c>XGwG|bslyV=95^6A4rMrnaZ|XFup$f$`A{#+ywb{!!%0D0znZiID#m}Q?D}@p0 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 y5&qUvdje7}+jGZTQ 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
PR@(ysnDrPfVH+sXRcCDVW`ptUafuw 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

hH)&O{)S>{EMCX74ym8ZcpYjAJ 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 z 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

n)1_^4|*bRUk9_)Vbd|VooczEKW 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 z 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

n>9?X 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

  • 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%0D(dnG4LK&} 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

      m=?=8NJZ(H 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 U1yt|D4uC+opP?w+oU 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�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

      -Wn1917cE#Y+}w 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 z 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 |5&=@ke+d)Shb61%h27{wMEDfa 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 z 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


      nuF?Vk_iTre_ikH^bWI!BOnNcyFk9w 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
    1. 2Em^>zs%JqMIPyZ7|Bp_>21ZeH8y*)+Yzp$gO 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

      TN2Wmazbk@HC}wNd_uo#!(|@u7g0CUZXkn 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

      nA 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

      e?bolSkzOeEqq|C8u(HwN&krCNO@ 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 z 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 &n>2rC?$cC$gCLf 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%0DM4kQgwtI!r~FrO@Cb*+xwu2>Cn2R?7#AG1 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≠+ZSZoy~b6w9HCKiaLpi4T@|#F^Xs4 z2|R%i>Re#uZy3VZ%Tcu$i>Gps6bTfwaL8r7fwHKc5Hqa7j*HT}OcpKjD@BBs3Y920 zk=D!3AS*V&jdY14Fn)HuW{_HfEO-WuNDM*86v50e#e2ZU3!FwX)cInFt#bv>0-hr) zBnp-UO$vZ{kT{YFzY9U&79~qC*OKKFV1t2!7b_H9FFx8T^nG~N*PKUmvYIf#Ryjgt za4x7ZVrdJ~uxu_r?*vitH?zzmSW%1>5Lz?Qb&^h`D1rAG^ zDX>B&fb7>|?-iDFAar_MCkGxgf(d0zA~A&4&$P4^7N#r~3T#P{5fs8NZ6a)B$`B4L zJ(LzrB|?m1cwnLlnPeEvJ_ODbnPoY!MC$bdETy1X#o~)Epn(|V7?0F41AUp52A3VX z8nMDhV+x|8Exp!ykah^?Cc@Dv-6SmJ*^SyO7>7Z`>t2*{!4e`QHqtN;`9K&vu0F4> zLx0Ohs`KjGsYjJKze*?Tf%1nRf$-(V!TDCBh99}&pIYzK_*0FPVKpnKUrHjv5o3zy zXB-7tSD+se>W~(o=Eu2DlUw-1D$1rJP>_VN6Aj)2iY@m@&-#tEM z;~wo!FKRibCzO*vN-6vUs#H0sge=4c#Fh0R+ykg&B+q6d&HMmR5D)?Y1OP)r13&;! zZ)C2NgaA^$>6auubb)b$nYVYFy7}IE$}7?UdrvddZ%ZCqN$dYEmVW>cArd2^05E_8 zcxB5BtWZ$PJU7!uI^ZX~z(){tj}FR!2?PRulB9*vYQ@0Ex@7wRW@G|??~#b5$n3WP z4j|pu_0mA>?Az%@skWuF^;%l?ZkifcuypA#Zg=St6i5Ieq7VQ8LI5>00C0_H*1wYV zr$vGjfJ&%>zbD;#x3%_u*7imEY_Opu?yaY{picpux52EvaknL-EvOKQK(zo8L69Fn zkfap>2lyo8{#71fd3-CMz&@@2^74`SkMYopNap|f!{!_7sbo3f}M;+b>^p`SS)M#3`IUfzGp$2g9v^@EouDrb+XGB-1 zPN+YJdgywF=!Ngx^8@C#iioCmq^3!=;;UJ&=OX3Nv@6DSCi6nLW+z_{$p9#&yQ-2( z*9X+ejdHF@8WU@iC;ZQI=IHbCC#urYIGYN(=pa3$u6Y()GLkHEZPl<+q_EvMW(3!y zNq*%Kbo1yAyd%5%6`2>TqCWguob*h;9@=pcK^$WaI9udR^rSXk1Zm6IV+~Q*d8ppp zj()gq(@b|trlMd7+KLL*LhZMjwW=ZPG!d5RL&`NhyW%?WdFm}*^B}3~_4Miz=yMr% z&dnYwIVhI`srFyMmQo^CP!;r~rfqGi6K%N`efg{c9@sYzpEsj1NwdL*u0b_X zgL^KpRE@dDG!VMFaumC3QHST{=Vs?;DP7LvJKz1TolmZnp!G95>s@|A-{m9HRkM`d z(P#DN3U_(A)YVW|^8gnCa@88u=#r=&*R+p%O5J@4k8dgv=S3=U z;)oRnK*BFo9Fd1tncuXiPTkm!bVFVc-E@7-Q@+mA{cE2`4X1P7xVC>uUvD>}j9x=W zIzKzB>pX$yD8o_dD}=;??@6sNmF>zkFt)b=sx_~V8cFVFGp9HIqw1}0QsZ6oc1pDO zKum1ncI+qXDYZrvcZp8#MYSc?eMT$#LpuH8*;{}T56H|kaaV&Sl3 zP+9>3iHAAKO|`vgD@RUsvtS3b5n|`exKVjmd!H-1NmyHufhuLGs%Y^h-9)`wYc$(#Z4Yzp*=bb=`%YJ(+(xcXqRLyE2FDv%7&`WdlJ!kCsxKu9=+0@y zv^oh*BAZ^&Dh%T45$t;QVjUc=bOjhp_KV7}{Njm8rPfAG{=hb*R?)NyWAf(2DcoK% zU-=i>S|`4Eu=GkM(~p^*Rl{;{sQh8ea=6>yLubv$Rp&Fuf6JPu+%qBWU%$pb`L=(( zl9emG_w4E@+O-x4`}5`$CH2Ld+CQDWPn{-PSEO;5rzn|Wp~un7)XkL^Z0aQ&+LEXG zad$pOU=SSHlkld#iWKwN%JU(^u23=^MER z%jdO@B#e@&^sU1z6sa&xxDA;7LKIb2)LMem+f245Gu{Iqi^WXlcuhRo2u>L;{g}M5UOG^&R@pgUNA}Sb+ z%=LlP7kh+}b6*C>NE zIDMB7{M^OvM6|u@dVXf^Zad&1Q+F|ggjN#X;wl?YP3hmiqI>fxfgSx(Ti<%AzUz;y zn7NAQS5w?L>Fa&@=r0(FsZ2w>66;#OZb5d$yeF2jerJRHPItC=qQ8&Nsx6PD_A@2D z+J3A__stdhW&e`BOh+)(T7+GKDd^r<90*E&?zN?>g_au;?U?MgVb~gh*;LxTv)H-q zdt)ZzP2FdzA{wX%f5J)4Sb(=2VlBiXcV zcJPrP>KV6vOUGGtX^)M$ZBu4@O&e+wYmZ3g>CmA!`_go1TE8wGEN|9sQL)c>`?v&U z@Zfa~98GrwF`cT@KnoZqOH!G6^w}7(6T{mM-_2fS^~f@ARZz&rxBL>8Qy1D_4>_en zq0Ji4j97tp$W65CsrI2OSXEkz08j21Sx3eX7OeI_nh6< zmk!o{KR_%_Ip6eXk@({KyFapV)z&H7#a6p@Q_EY`r*Gz^W%JL`HlOB|OWxPxqF8 zy_jBM>to-RAJIwq_1<<_F1aJQ_ajrEbOg``G^kelfMd zZL>~#%hEG{P?q701TUMA&mZo?Suma(9huPhEo=GFEmUTJ?@~^|&h0 zv8y}t%&MAVgQinAKgNR*-`kCKk7u!DKCT#}U50Syg0c6eV>jI>ag*2DyIAPcbwoJ1dVG6q9a6&&tHpO=9*<;G}n%M@uI=fQo4hkAdQhbZWqQcQ?HFPuk90gs6FpPcA7*~)%xZtsV~BB-j0E2 zI^m$^#CD%;M|vA?iSKD9f8&~2u5u3|dfMSnCH7=&!&OwL*(jtHuh$*JG^{0L-YP)k zF*^R`+zi#e-E+&5z0R$_VwZTRTzT9)nX2*PIk^vhLW>tTMzp4hBXyOK`+gs9sdHWM zpyXH^UIm<+0}p{K5VWujw0dFN!-T%NW~EM@`M=)78hI^^N5N64pO4MNIPfogk6n=` z;Fq~_Ej;(0(Co{PEV~M+KhZxRYzrzlAf0}E$O$L123D)S5Bz*UFD{fOE!+<_y|d6Q z((W0X+1K3zxp=2wVWM6(9sqA;MARJ*tA@xIw+ z6yOM73UeE-CbRZqJ4nCXHr`T|I@Q(88LMO?%giPIVqPswdk2_PixUx#u9UA^M8SMg z9@fviD-Yp|gla6MCU6sUn;8Gvo@&lLZ55q8+TIbK^n{z)b@r3l@r;Lr2){Hj)m1W< z-d*_5++;pxknUH@j~tB;W0~QZx$+)7&o|KG%9K%Sr%y&b7+;A53NFaEw%LK?e0Q(X znx*)1K|aZscJcXRZk)Rvp~1*48LU?#6{}PGF?sT!Nce)?WGMV2e_3S}?M18MYJniW z8FV+c;LGMiknDeEwG`Q^3||pSjgz=q@#{P}5vq3gDys%F$jvM^F^1iSQ}e;h6NY0v z4K3gCSqlDtWw`fnf&hEP`%!+u*TD}Yi6P6XDO1AWqL^?z#gE*kp1fp`zDCE|B#!G^ zMG<(h#sf}jtF{cHF?Gkw%*y@D6^><74SM6t3tc=GM?HUIwtZ{Dfys_`s1JRgc~ZMx zn0tQK3qMqm99#yz&%wrzU*z#AZ8bxU(~g~L4Q=s*TgK&b_f)koj{FwoGq2*s0N+<; zX`PYmD|Q?>fOS~>6E|tb?ovo7#$jm(oH8HYGaD*Y8r8NPU`VG`io6Iou1%iMh1Q;V z?~-+!w-obt|5exqEuprO0`suI*IQ){OXMFT)5d;YjpKmzuun$mw4L3EOB#Knp&TvZB0mYnn2VK`u#82KeM76%&N~BEm&g$ zlo9sgNs2>~*W#cGw89gq$lQHY4#~Sk``}y_S3ZFv5JNC!TaWuvx+_pE9LyUY6en z`|A(V1AH!as~73=8bW7bL5rX4SWJUS`~v?)6|w)|mFofGKAdk3dxODpEtLlt;FjQH zg5z?ONDzidPs|>JMWhGP8$v9xX?n!j)~-kC8v6^U2;I8&*(18bp3v$?>7tasNMmXe*2;88>sG zjFQQw!C3Y{%%Q!BE$k^?TJ*7v`QQ32ZNVT2FiFjD@=VJ`pxXkJuuj=q#I>SY@bt^I zsW!!cGKBhkBCw%EI~{N3j7|QHnlR^*?&3cNY8d1s+kO+Jf-#eAW^-}dVh_b{(`rVu z31tB~ln`W!7?(MKm7f)9YH##P!|xQ5KcRzkI_*87mnK12noBF6s9`-&T#G235;$^- zmsRk^xH3bys3j*~LAGKO4oM{`sf8ZIw85uuY0#}gx0&zjTGE3wL>MZx0%4j|AVxOS zdrwnhVCmD+Iq^js3Mf&@=3_&Ym)msvav(srCQRYP(TTBBx<~F%=7AtdVH+jZ4=rYN zEa`4KOciAtiQRi=C(HPOpO%jwmiT7A_Fn=wdT_-O5Wy)nvB?^oxdNx5OVhoFz6x|w z37Aq9b>cu9U`ZAJB-%~&_h3uTR%~&r2!SOnfVuUS|6?3n$t;_qfLNJLv4)~xOAvu= z=ZwiH-)T#VG5f0UiEmo1B%BsYlY<4-s3{a_;jB^{HtiVJ@2g*C0teXHSU2!-z?NJa ziSClUWfPm6P!lk+8wNjSnHfh(C&BC$rX~LJ9~G#qVETR*_}z zBOlcPapQjTh79G(m1iQ!XXTS7hy2UnGWQ@&%eErp3D z{3KwCMEN7+tTkaeGvDbZRkc6v{rgA>Ql@wS0HIsAG6X$0b#nN$eW{k{nu6XGx8rY; zNxca#HbYSp7GsJz%?K6f$)Pf|3vH^ZebVYZ@{>5o6q7y@9qlI4hCRsSiBhA%H{YpJ zKegiEw{lnkTS^cnX;^Na#W;!*Hl{6SmD>60e5FSIv0i{{s3i%*5X4YxU=1@ym26oB zE9I%`LaE$rJ0%kVst+g+LN-8yt)+>3O0K8U6;pjYfaGGqlniK~e1F==sihuy;4k~BF2$l)N-nY* zz**&1_N{_awB*RLVmOp?Yg(DCAyr_D0<~`@%u`HMl3N8y&^h{M285lHtJb(mfr-Ml zRC3@9PM7r1ri?l1-D>Jk>7=W*CQ}G)PP?x4KuaNraxh?GJ^3AzQLH5`)%FWNLW>c} zqFQveH_=Tt(bObu7y{8@v~o4Mu$bhEvLu0V+#t-?h0v3|BqJ}_n+j&`B?bDoYVQ!< z0yZ^}8=y5KS6a$AQD$PA7egB{)#^qaseAtuBTPO8VBAYuF{PqXLKD{5#XQ8I?OT*w z!mN`#bkl6 zLMpnLeUe2iB8L}C_1N%w+LHbr_a_R>c# zk_NqxoeoOr&e5*xtA3$!do%Y`XC#a=YT(KzT-hmABN_^Zr2*|Lp~eEIo|b708mxdU ztte1TlUc(BhNoi>&+5JZPoAEkyg9MzBB4zvL+!y<)Jh=`sd$5coqVttakbD#=NR+m z*UrtK&e7AKEY(RzksmgndQceSLJWIJ#g+*gr1NQVMdCi1mp_+&WmThf=BqbxQmjeE zR#rW|BvU3l#O4gc0u8E?>LZ=#h#B|PN*oD8$}x%r_!#6slYvZR1HaT+otHeI{M;S$ zGa5xPWbX`(-I}oJ{)U5o(oDXj?!ty6?uU8w>bwUtXK$$_AdQ4v5hTS}wdt+I@8_Pv zm>nKE=vlh|cBeU=#pYzHugE#AZ733l+m@VDp{e2YK#S<}5X72Xx%Zq%aokNrP?1b( zkW%)XKDdiLqM}sicK+>uH*G}l1Y=P$R9mR$BPX(f7zJ;!VUT}@WK!|ma-$8Yv``6x z)^r7Mi9Nl5XdvZO4ZHo*bsLgqSPrN-!YK3reT99S{GR&@;p+3_G<4f_DXQ(oTuV5l#-K11d=4uX-v6l-*nDapT(4O@qfojX87A+!^yxS3Malyte32_cvp>2i2* z{_}o~KM&AUV8}t|lx8w1(2PW}d`vNgH||L;D7LSqH5^|iOU>;f7_J-YK1~+=C&v?0c?A5BqI;K znKM_&1R|YT`SGV>M*6{}V&eZY1^h?$Wo2@7Cp*w0LU&V&>sQuzW)=i7q+m)ernL3e zL0E~b4(r5i{0$?2XdtvVk3YzlaN#~~KqRtB+mkQ|_*O}>a3QIYP>ATB{*b?>FC+EB zT!j*RFIGSkqAe%^+fLlK#)hxb?;tvv5Et|d7r^5(4dFt{l8M1kQA>}pxK$rPEOSqk zKw5xJ@wdr{9v@dm?GnM@CLj-m&XQ75G6_1g7cZ6s96uvbu(;Fzdw6CpU1r0_#i^kw zV{d0wh$4}k+Z9TVFwyaaE}uUjMfC%W3kSf zk+dimBEYA+{EKXM|H1QMkZ~B~h0)@KlA;t>*NoXVX032Ao27uBf#=!7cn5x2J-}l2 zYMK@6>?vMLIhRBa?n5nxC8J)+Nl^@LaZNY@D?Fi_7M7i6W2RbYCDl_g&ic*ewn=tX zUoa7}$&3ZQxzs9fI8($CGJ+Y4Nd!eC03;@m=}Z1_zh8K{pEH~TG9j6?$f^c$-p(Ra znb7E#%YhAuy~lr(UZm@j275x>m?ZYa%wG$tG!)~a?-Jse5EtGXJ_j#=$kl5uH3hFZ zftovV0ZOC5lXx=VNr)MLFRPEFkio!xxPNjNb@0Q5UPznJ+uemB<+EFnVq{A-5VCUf?UEv7MxAS>a*yv zTXeDmF3C6FTnTSL5xso5Q#+Dqa0xjEn9|P7YtGw}i5~2xe~}2zkK0m#k080KLcr=x zl8Uvc08PbnBi|6G9(7{(7M=;?y$(bWGcos{4rVH~S>41UGL{F5ZoXVX4M4j;-xLYD zwb*A+CPqro4uAp))@!`^D`NqY?cv&kK-Yv~(Mpjt{D%Z#@NKG#ii^;mBup1Gb0-YQ1Yo4USMm%WS_;I%Wg|&L zHf3Sji#O(3*ThJE@I%)igf}Za+OoZglrjaU@VT}Tq97lPD*ZDESmRh%#($7z?P4|5 zyW~o8q?=3g`{T;)L*-q3;*MbgX5QOlki-S$vYnvA}+d!M+l|J^yOnofzV|BSuJD21{U6$Rzd~fnv8tc*^2z) zZ@hggO@T+hiWdQyB6KS+uq~N$ZoByIfcaovr!03Z2dp)eFlNP@eZ@84kc0DuvV84&=00~A96 z@HMI%m;nd)gl8b=S|5FY;B~-0>=B*tfRBLd9}_15kBIDq4GNX)e^(&oZ88m0)i&C6 zIH4%p>@+l_r0eW-IJLR#PAiPdtkctw)pG9Q!Z0q@fPes)0RWMifTFVl2A3_+5sH!2 zW$#Kq?e2uJJ(DfP&A%I_Y_Jquw3T}QQtfKpyG^aJt6`;y8wu}Eh5h=Ip+C%hp|N7cnOK1PtbS?V2=}k*R z)T>bYY3sj!{#1p-)Rk^^i~aUTdb*xnL&Y88dL`8V`}IB@^q1$@E|JhFc?N~xaXDNg zTi{v_&mhZw$&|JI%>F$yo1SWav%f@Zx9|Jd{(|(6x4!Q8hJII$F8Qt8GkD6-($8h) zX=Hk5^t3&+>1=Gg%-k-`K7MOZ%f;giA=RM;(>jVOX)wQ-f&urw7%Sk*O=_1LAnK)^ zs39n_uI6IL0!2LbjMYQcUSGtARz5EXN@-FpMOHO-(i&9|QfrN?(UOyWdk-sD8w41& zzE}aUIMv74OR^RsR?{S_#L^IL!Ak81Oeg_wOWKPbZBEpoy7${o+#sw$Osx>Cr9D&u zAlrcwp_(c{)e<;X#_2{DlA#dw(vAn3^zk8?Sd0jioupYu6$Rl^AX!*RJs}~b6za#u z2@OOtBF~uV_S^w5UkR!LyE$*bN^jwFtAD%1z8W`QnVJNl_x1e^kbkTc}ehK z+d@RFa`hHSk+VUT$VSk{+mS!3mKvjEK?m)zJauGU8WYy9utJp}kA&TETECB5&5@&} zp_K+DC#ts^EQDEa$oniSLlUPQowxQEEQP*d#K+4h$E1|}W)Il0r>B3^69OFj1X)|9 zSwpd7cxe23c)4*aWcjmLa)bDPGyzj-($L7y(5LCv=4IsL#cQ~o3U)v;KHfvra+5$N zR&hpTbKHnuoc)quEJy)wGjcUFa3vy|&%GzfKDK-id?O+0CkJ#JBrKRlGu`>W^Awoh2V__v2&{jv# z2Z9N03v{NLs^s9-t0$|MrJ);3ODjS@hnBzgjLdzExOnlY@$ypk78_u<^gP=L{mBT{ zv&QNz#@R0sKDbUkwS0SuP>=!-A-6Lzk_>hydtB}#UIjrSf@o?x_7I`8cJ0nK`x?!V zQ-#;zKE!1OPK*z4lofMb6fOB}{)Tb@=i|74CLi}_^28fDM&`ry7uGyrimPNUt1;fA zX6c&fdMe`FZ!b%{8Q(`s$R2EoKn@%ti}T1LL>c+;w_MF-)>%=J7I?`L|G-~>lbe*z z7lJ4lf^2MZ+HR30+>9lWtSC%mo@`VZIwP%@o0T3*2~su&px~@AAx5=EitaYtp-4qf zt$iVKqBb{`@L18h{4}9{&TH^NxyiYi|Ck8xYUY~n z*DVnKGHv$`p5N;?eaY*nBL%owYH0Ry&k3c74>Y;(v4|?buiz_l$*Zx57SI>H9pQ z5CrqfOA+rL&{ogMrnQeu{q3Uv5n9<(pSfNs?rh6iGHuR&U-4rzmdt{Y-$ZGxk6Dom zZ)!jI-R?99>sY-LO#Iq5vL8byZYD=s2Ves-CvH*~y}j?D8nUR~n&=gA@|-%}H)DP~ z8bMf#$1mWNl}Yx&r9<6FrK#hdS#I@C|5G!(pIacaQLM2+^Yr8Z_d$jw7Z|5>VsCJb z5l=5IN(B0AcRf9I+pqNtLN6^>*m*r!3S@Q*EXcb+ zw1M@Wmtl$Usq<`T^9!>y!+c7lTW^lZ)rPR71#?rnyif}B~q^yn&AXD!Rc4= z+7eg7X9WfLxOKG4kY%wg&GoG6@;nB~XxNT+9G#C1MiJ%uT#1tzjhUmBJ$7Nr(0W$D z2+%KG@(aJpsWl^eH&ylr)kg0UUVJ_`I+fR021Kz<8Uqqaa+{!XH#dUokhvW4a9>t> z`40V!XuDFT6X}tUjh`-LhIZp^jTo#!xPhP#c2}mvgmnW=JJyi$R-<>lM~Xym^);RP z$9^9UAMVsv`KcFn*e=ZgbUzbb=6>1v{*03Ep zE%oxym`tqrYc%GIMWR63^!p_dQ1 zLilvQq+HVuz5KtVk}lbzbq5+kucIizLN}d70A|0jBJltE zSw#95-Q%y-gnon1Opx5Qpcu$DJ72hJ+b&cV1vYv22JfDDe?jMRGd8dDoP&n?|kOD^U!3Q3?#KUM$I0gk|?nh-A zy9$71EBIYzQNa_m_v5jGXx>WOf{BYX3ak?>9lJFSci0QwnUPPC>z$5VxjB%s10GeN z!*dXS|MSs10fVQjJ$u(v7D6KPS6LNvz^=_du;M-sykB)!;Jq9@7a&Vs{8cB&K(Y}W zeI%zYsM&|pfJ-6iB7hzqH@wqdOfUm03WHyS2yh45t>XXfHiTy7xbu6Ta2=Jo=8AtP z7aU;6V{5_7p+mOSRu!lNZ=B=qul?@PIz^6m^#%~)3E1(9PCdM80h?|{ut&=nQ^ziP5z|-lbx@wG%#9?GyT~b zmio-!^S7{z)ooT^{Iv;Q_(8gT85xb1)b2qZ-E!6*tUcXJZUykX3+2Q^D z^0AsZF*{)TNvq`X*9N(d@$QAkEZH42xL{)k0yqUil~E`3wC!lhn@q_Q(`8?{Z)wFSXSxRaSe9=;ldtG8L9 z8F~NwpOu#Xcyigz;d*0*(@hV>qiij%%BpaCxvv1LS1dVRGyjuc&iqw0xb~a)d3XIh zRxqH={aA0;qK8(wbpK?(wZ3`sF`dcK!p}U`s7DBik~dNR@T+d5o)rYYeJeYT6yl9K zSJ-YD+y;GLw_dzbt91_VSsoo99?#~^B>`>RW%%Ygh123I2D}Gx*Kxo2R6W(oWqi;>d)T6RZ$a)Tj;@7a zH+O$9a%Ez?>3_5fC&*LH%jxWCbK&HyJr=5p{2%!Cvr+aKj5ZSG$Vp#?OODzy59#;4 z7c}DY^BM0*trbLdelS&T;S@B?{rfBYgmI1Yb3vP_H~T0y!hVU{B}?SBJzpd+Sx?Zy zlzjyRQwReMYN)Z@we*`AjksB|)HbH_iD)U)Xri@ui!!pq5F7wWkl&#z4hE|3-ejvQ z3C`Bf@lMEe{Pi0z^GZ66D5RlG`B9D14fnGaO)~j?B9@%vj`c}JaP`am`YK&pC(ojZ zV>J;MxfKfux3+E-<$ZX zXEl0Y^ZrLqsm+_~=5xh&JYp#Fi@g48h48zt?;jSMcD#fJnPK8S)w}2PClA-MJo)Bb zuXV8U#Oo*?x7x&Zb*>9IVcAOQ?8NlZ`SG17NY`!$7VwpU(@QKq3}ZFl*!Q*ftL-=X zujqZu=i}%PUFO?0&rZX+MhQb~*Z2#b`Cw-!VZwr6yj;3tiKbs#g3wBBKAbElsf-1> zz!G=}XJ6PJ+`dfR`cmW?2wsNu2{x%S1J5^Ulyx$Fi4`6_dEKlVRmEJ^=kIgTB_ z^V(P(>HR-hd~*+dh9-Suz#{RrC;kTH$wPu~HP@>ZncPsm)5&Kl?k*$;BD&mYfM@3C z=w@fV@q6BZZdH{LUb?HU5GuCf_0p8-&~EZFlD7Ve#S* zY%O>lEq@LKgUShyO#p03oeC#J(mIpQ+u=v11&q+(183b-%3mZjTqS$vHV1nv}V?vi+b4 zDT$>5H-8v6c@F|=1gy(frK&PJu6RRcy!Y{9g-5rZ?PtNA;p@ewFR$qJOnVd)BzAxt zIe**i@eBF$bLD0@+*7y)dwGfJ+Z1=%9rDD<9f~<{<%Uq0&;Qjff9lbbF9<)8Bfrcu zOQ|n%*zY|M29j5MSL@3+d*y}?`u9jY5EX_8`kk&TWN9rEuGT0DBku>HkUM+&UzP`D z&mR5grO$FyhUTqW2r@W4DrAYzof3FMwwe+^M^J>~|2OV`?)(5j(+S zqHb$mn7~I);Hn!jF+R8p4rM(2>hEXzi9cGWzk(`&CC(=(RPqeg|ME{AdhTiaag9WG zd*0`KCHS8w-chL{Au_L{#ZLFd0Bri`RW$m5q_~tX|KaJw}(u9)Dx# z8Y~Hg6i%ok;4#hxn8?H$O91F_@y<^-f9Co5qt-0cvH>Iqn9OOg^%|yNJd?KrvxGXd zRSQoLRN-VysfxIkc{!b%9f_+|eCqrNg!L5L$AQ3u{L$=w0Lw!D~sUQAY`ut2! zwd`!xc{&G)wGK)*0dfIB5DFr`)4x3pp2~2g(l7bkxUBpxeGO9}*TVp3v6flASV&K= zkb$A7QtHHxp-?oTHUOH}4=k(&$Q4{tpf= zs32LMe`@3ud=x^)f{Vccia~}@uRFiwd^!DqC_lDo0RzhdnS=GVP*Wv@1a%k|aZ5G= zQMC2}E`d_oB#AX7SkOJyB0U5)Z^-vcrIbQ3lzA}_qf{XcGgL#Z(?#*+3;=Y0cCEoP z9yBIugpSxO@~p@^sdY$5i~^M^49zpP!Y;M7aXwZ4e$j6Xx5C<6}0G|Ei35hwD&{rdYuSFu4nNK>(33J@Vuq4LU+ zHF$}Cy@3;*#vc7Rw6!oSKw?2bmuW~9;ouoMF=HTQhcD*-Ysts|r%_7MhuOKFx3WDI zz#@QdU!g-h7mDm5#=RKxUGZvacvm8Q%Eu+k&C=9O$ES)Z0TV+&5gLh|=46XJdm*WB z&uil9)5PNTtEZ8`Bc~dg3!JioAoDR9A8zX1DzkY<%$=8m|NUM&GoJKPiFyEGX&0Sw zsZ>*d&%x}(0-~Z}M&7#_h9z3{IYk@6h>&`8kwi{vy2)=jNfn6&qOv|HE&I6ne-4MZ z5^LcFRy{ydizQU5isfEeKzKUva2wSQF3*4Y6CVijNv`#^F{tD~7!B_uva9VTA9;J}74irSu|{)x zF$ijzM^hK}f7I5vYpJygPxE`W-ZvG@QU3OkQgh z`siI&HgtY%{uHe+^Ars+6#-;H8wLcdVa9NX-zQTBP;!PyM*V+9^y+a5f=D>{A()Q!w;u(ZG>RBlB&@7qYVM|d3 z<4PV;P*RyhB^&3_4nfNP2+5+4nR$#;^d!Z24F)+ zDDMs?C2@x1!4Z;It$V^s?hq69+}Oms^pE z6tU!KB%s!a1-KApmI;|ptkS7bLP3sZmIJVt?0_2b>nN-~LIV)wNepd$LjAi8YQqZ`vGU)<{S&;fuB&ieU0FJ>sQ39&F zmFjO~fj72TsrWN0-T~=>xc^1&J@?d+DBxsjtqF=G1GAj&wvzC9z zvb0M|%tzv?k&|-$5@5I^FJTTidk(7G9vPF;SZvs$>jfglY21w&0$-FiZWf#3w2o(J zB_7{}eizgc1f>|LP^oZxk$^$q`O86t5Y6J#+c_dIUrRkvdYR!d>J{N!0+5JF&b7|R z>gbDnq-(j5#bN@J4zg(k3x&iQDXm0vZ)S`QozL`{aYr^al}P0%MxT(G2XZUbl1800 zalZSW21yJQ4aT}WbT^gdE69wvLqd*cPzsAdM0##$qL%7hEujRWc)E1v!)Ro=di}JW zO>=@IRKq31FoS<90ImBgM<*ht-tWbyj!K(;_HsULZ|t(CIe(AcOAol{eZI-MAQ)ID{tE3dNv`D^d%_ z0KcHe(((HpUHRQ)MQNErfQlxK#iQ@sm0EElSRBk#Z~Oyo^r3gl`C5`4hhXHOrIbd# zx}E3}F>oOz7ro`AyY0*|%9s>_h@nWDa~h?H51=8%#d?oeIiB2qqpvRZ@6jsSN<@-z zAO&4CZkp+o$V~`uSUp*D{75;eI2dfasJBcgHB54gSEdq2HA{3zy`kTgo0p^Qbprk8 z>Pm1EK2=(ILPK#G$pVvUXrt^m$^M*|m51w4-ZgmeFg<{B1eF-X#9)ae=X&kxpidb& z%e~Yyw|VsXpA&zPnU_y>60scv80Z{gDUy=Xgd`=}Va0?3$@M~VGg`>Q52sA0_!-)p zxsWmn1V>}?SZXwM44H-oiP|wxZPIV$F3(a!{N~TK%Be5iEWaEp-jv{KgV#{$Aw)6& zu1Hj&cDI74xZ(#-sD!_xdift+>If;J3Y7&}=0k~Kd7bnt3b$fnv{ue(RJGgD%l-64 z=i0+auzU%`KEYI;LSylj+?@iI%DDLeW*{;|rJ+&+4)!iV<{|d`*iK#cx8XKuJXC_Nr-TWZ3LvVrqj}FH z5RqBN$M^sRTLGUg&CrJmRm@x*NU+>w37F6XQ>nQZY&`}tW~WRpGF^eFipnC1;V5j2 zl~@jp3IfNN8V8+-F{W8UA>ys=!Ewxo)~jFer9Gafe$X3Y7VfMt7b#vTfGh6+iYAp= zE*MPnxb^NG#_@?rOfUdbi!)YIjxE@_P$>js5F`>gAXFT^Ym#>y3XK=#h{Jfx1`6Va_SH_7PSf1>su7iHaBPohs{F_IKB# zTXX)%cB<9ML1F>r7}$!>wB5w{lOThb6}Y(l+dM^_xYzx44=Rn{%N>ZBe{#)|k|3m% zLW~M&NwW;-4Dx1Qp$G|zrv``wnkJsfffN{0>1{#NQ*Q(tmCf6w&3XMnCf3wLqo{Nfj}P74^&r zy4hQL0Ok%5k|5a-xp$r>h-G$$E;~<*GDhy9B3^PAfE5>Q0XMR! zkM@%lU6)C7t#QzQsGgX3hs_i{cpD>d)FKP>zfR^ycK^7Z@h9#=(=tL!VN7Z%2f~yT z5EMg@DBV%50u)@nF3kAO{vUS19$BJa)8fOsyWY-on<^Lp1R*KT6UsfBN`FB(d7iHm zCub}@-(xONd~CqJgchhUb{TM6=4x8 zFL!QBp!t-tZKWMO;=ply`fNmvC$xgug152iT>czOZ9 zo%+N71=5yyQ1CGUVuR65b*DZ`BmzQj2;~3o=Qn~L7RuK=!SN`HD09@g%vjDfG6Dw} z%;sQA_dIEU}h8DwMb~WYm$3_BptVm#3KM)WD00sa< zLjxuNU~X0ODovo`Jb$dVf0No0^F1UCn*h?2z{Feil73rgw$PjjjQ6_lzqI-QK!`|+ zh5!Ho3JA8}D=P2Wpu)Isp(GXpA|Ixz_!C$2+zg|q zZs?@{XDt<-kouQ`AK1Ug{{G>^c+h0#ki*bpmd|0h7!B8TP3j_y%!F#hwH#ZNf(sy@ zkY3PUR!$c2T-l8>38+iriiMhKL7+T>&n^rd*=JiD@Qac4g>fmr@;lrhwW_RZBp@Vh z!Zd~|q(D;pry*z{qWno=1!QE(QJ0~Kmpojf{jrrr^y5?`Erd$1stQxNb!Aokln}!X z{VaZax-`gIdhr^*=RJ(nI?w1j%E%s_tiW%A5Y0H&6*a0!sl?D3|Emc%Tgtxe)fYrV zlaHN3mokqQhCW}ion(&`rS(N8a3|0n+u~P475yg);;Q4u4iGbP$2F3PEf*PD zEJC}z&XizR$v+`?ZxlfVSD)d<^93yzdjUkG&{~ zBvC}38da!`pfw@u6|UxRS*LXnhVS~N8eqH3x7~7GyCYyl^BP%PLFOQS+&$YSp#+0XaN>n>}@V7#pRhw!tTnepg$H{() z8Yjv|eq0WXIo+am8tnRdQlhnTWn)iu>y}#ztV?O=8qmORr(*8Zx$!W+Fe2f^%f-uG z;LX{)!%#;huU=V{?DJfRxmQJX0(D%w6d>qGXVo={L%5ZEuny!T^_wbjKU#zYthNda z!X1kKB2UjB;*}TY&lpdrXozdMry@0wD-o12DfEt4OP~UxY&|vKFfP%ju_?rpw%Llz zRv()ipU}3h=Nc&C$~U#eW{tLbZogtDj2+@UmCs^Yckn!5Q`45VHL>gx?G_?)sd>~z z{M7lfG0AK?AWp6#Hev}1P@GXL_q3a0y_Jc;sZ(jeJEFVW?YeR2EFe!o+iXBJyHnL z6aNq2F*RbU))%&zCcxgjwQ9Rg*G6;S){+#xxC`{8^9vu9pVqa57HUZk?5JP81w1)0 z0vh+lxm!E@C*}qidS!PHJ$XJ-1b`1ChD8ZY+iG&;x(jZubOS->TO-zoCapu|D<3=K zBnhqK{Oq)QhH4Dmja*B3>|~JB6GIUvCng`lcq)Ud2TFGCm3GQSKT9f$;u;d0RjGl! z50fkl+?0WP_v~?hW-W8bhRXr-T!EenI(>>ZbV&F4e?JxH(U(38KcCxB?O57mLTmir zVGw%sMNt!V6|zUTKb&jIE?Xk*XZ#uRVq|E-P+j28KnOwGRpv0)vzYH{La;rSxAx{$ zXW0{m`xt+&j6ZM8nX}+$BTP&gFDi+{+bCpqD{5NRDG3u`rA$f4pD#}u3&VJJBTXr< zxnb73kjd;JTs=r(UFHgo(0>y@YYtgGd^WIswz80(ynp$0v+EA5t%qydJ$)Cgf){3* z6d&NTs>%Oc?>MT?{GMeDVfe|y(|TQvUUcO<*=FiyYBj7Wj(NN^I7!JD(r}fjn{7M_Op{}W;{M<+j+@`08bn$BJXMY!~6;OcIB6oenO*cr&wu{gqOSp9q zcxPT;NP3;*XV_2hHjB6S`==FDJyEWOHbqJsSFs&O^TcpuR%e^c)nM%#qfQe$rOAT4 zdv5I``QV`3hP#=|LNKzrTUfeVC;DtWO{Wyebz5UVSUj0h8{FP=1|WU`piY@RdqZ(K zbTV9uned)2JXKcc@#@Px z^o4gU0aGo%Xzx2MvTX?SLOES05+J&_JFuEU#ZSLoPxKx2yX8 zuPxXuRT$moO?HDsa5^Q89$f!#hMyG$UQYh7JJ^jPnu*I0n3BYzbcLoia-e+b+*}zv z+HCxfjSRi6Opy3-<>#BV6`S$ihf~Oq2={A?W_?kCmY*^$X`*S{5=1ls{#u#F+Y=0d z|FhICrLeuNn=eR9cD)L!RkOZUD-+H+86V6a8@LWETs}N)D>>yo0xoKmmWs%l@PLg@kzN;Oo1x3z%6_y>5E zH;F?Diz3tT(Wm<9DmqpYs<0@(ZX(-6mva^9c76w+09F)t{9@!W@$EIOyu$ z?o?a{NB_Of{u+}o>0{^b;SH=nPI-ax&RxR{Dj^nH1fI-R(4062U?=NMC?L!}efyrw zAmw}CAdL^pzl`_rkX9VlmG4$8u=3i<|H#My*|Nm)$L?gTr$B8Qb**2zD7?{QESVD@ zdu?PqAtp3;4?NtiO!8lS{xVAJJn@NYhhG5D9gjgbdI;A*>v0I>x#0a6Nze2?oJBtN z4OtNHiQ&ZM*!{6&Z)+=W`)}~9dwfMk4J!VBJNMm-mz9rU;-OdMGt@H+AW@4Hw<|uUWl(?w|>b zx}_sI#spZc#xZ6;Ey1^=+5tyQm;vR$-of>^Th4eSKtKiFQ)8hvRB!&P5H676&&phP zY3~ugkMVDwm~8BKs^hs{4!rA4iZq{v-ai-Y+gsi`W-sQ3z9vqYT}EDP6d(6LkIjs~ zMzn8t*Dk!sANAH7@#g8-FFjfA4Qki$j5tIU;{-Tyg{|}S-Q8H=^v?m$Xi6iufXyA9 zpYhTOS&EGuR^_+UNWZPO(q7>>{`hXjII!Vd<9@3ycRo%FEqossO10h0zA~P8@(XX0 z^5KHME`e(ZbjL+iB{;h1Y<&4L0A#2*^mLcOu0%EImBSSYRbK?JMjjj5+fWZSFx^fWrUbM~7nUiS@GqG5MxY~tHxu4Z>1fAR7?<^u3`LI1V;^B#{sKfEtE z_g`(3x%R*C%_!)DUSNDd&ed>w#hlk4F70Xjn|;pg;VjIBJ`E4};)AT@e0UOULw6T? z#%zP^YD@qCZult(fL^Zu-1T(#1ndvtZ;3~6aDkjl(9HlK*?9i*?RFu-20vZ9grq`) zHF1VL-Tgq~-{F2&SFhrM;_mpJ+={?OtNdeP0j@HIPFbucb{nq%tsl+BPZZ4#zl_~= zO9}M^zYo`^apyi;yWp!S4;D9M-l4?<@k)Qqztt6=N=hbQNUOBV&u_xH}gVgF>m2>C_B&Clg}7=EK2 zLW1Bjg+~wx@F)*n*1$eu30eGCK?m{p_-p?%7^LawE-MuYUiQ23g`uloudExx5Bv~O znfU4WfD$13$3l6>CN`m+zwnO7J_=vOIn~B*z=%HlR1Z|=u0{Y`FG>}!ds3dTds-9y z=?b8nt0{H$_UUpk-1J5+P*{zb{-)_Lym|t8{4ba)Fc0Mbdw_NWMbqP>t$*hqX2AaT zeHj66xDfBR3y{b>yLf=zI_Tfcw*ori5?`nvD- zM>|2^`&p0S-2jH5B|0#1uYYay7T!PK?|36R@hco@{sYrnD=KOh+W5!sil!n{o>bSK zzFCvvHvo5g;h$gutX}WgaI6Bcj3u!T$c~KRc$F~j0$sHK$a+88PT4BC`!#xhurf<~ z_|sPMv5WR+{M7hdZu;h?)A||&wh;P!>II8 z<{X9I-_+MpLj0jUg5VaJz$);+i=97i{D?T02+U-G-NSHRz%144H*40AJZJH3A|@NJg%Y6d!ulHXwqXv2*G<9Zq* z{N}pcdydNcXY*aG(WOSu=hA^-`-M6zVogQVV*$Q%eC}YSkKM-p8Skt`g0b!6WA1$A zI>Pazbrx#+y!iO^((&j41^CVjEj==O?WuM5+0L!I1}W2b84~~L_bMtWAB{*LK4Ugu zeb1x-fAuWwzq$x-_(H};@T0zQrgqSJ@O0;*KhfOrwcBf~()=TbZtP|C?RUS4nr>4&eE6O8##EreK;KhW7BQv-STBs#gEh zpU=-n_6g>l&`$Bj>Sq7IzBV$LzV{RzXZG=_sK&BtZ%+pm>g}CcyL0sDvs?S*JF%`4 zL#YJV1StSt-?V}kJSnzQNXkt+VrUANTyM4fd~m=ToGVbj$_Z z9TOlpO51{`y3|?FIUl9lb3X%TNELjesIy-EI^P1NvC3}j-MrL6_se-H$ewRj5Dwu% z9PseqtGp^12tsH+q~)&_JAp|&u>(QjQ$7OG=J1`t2CV+R7gFXg)`#}qBE$Zn#x0;!(hL}nS?Aav0%mbY$rHdi` z-?Of}6bSBP5Z84!LtnPTnrO znA_eQmd0!IiY}R(#RWtvqTjZ4EPc)V=b(+|CcT;}$4**l`-CNnNr|&ld3Ie7c;F?U z>C%-s+_r>2y|K&c9upGtqQ~;}9pbGwII$q3c;O znWPa3*tg`JzJ^U6x-CO@g8;xsw)e~4=D)}EK{IpqsEl6N-x?bIIp{}!_7B==XfbA39OVix{dTKpTV&1F zpWJD-MT05vP!LK2;ZOvTpsqYwJXZ#1-I=G}n-h=kFerHRr~$A@8mPRAOF43Q?T54t z;WYz)$2UKlGMNF!hJ!9hNT-}0OGwn5wgW3dzTpYY7}hnm^W(V+A{$UR@*^FI5V`m> zkZ*_t>eSAj@q6WqMHmNa#2&IXt^IzKbv^%E0op~#~#BD0w5 zZtZ_e#ilb#|!{eS3-`44oJMVSR)Ijcn>gi?xSI+M@?Ao9E^rZ z!6S?b5~ot$9U!)QkYh;ltnv%xjV-2)J~nBunsR|}A+6-Y!p-js(C^FF!-bj*7Bo*SA)!Maa0sgs>r6{aP z>emdS5TZufL3>Tcp2d;!rY8<^ri@-8!_!>o#G!i-5)D#1c%qd%FTQ0aVP<;O{f71tV}rxG zEy88;ymE>RltGqwt5B)kfr1BVz23lxY;tS)xtc|)(nf(Z4pqaZ1yd2%6hutGJ>k=N;?WAFHL~89!c0gurEw~R+N_~q za)3$%c+DMraXE}9t&(^?{_r637sm zX(}seoSS!#Af!H$){78WlAtMCy3uoL04jCoV{eIzhK_gr|Z=A~B}UZTm(M`)ECfT3&>Zb#&*; zwS-j8AUw@tu`*R$HtNu%MwRN`zr1vl&#wE^Ri@Y*XFnCm(< z0y+-(+OgEPI(O%E|6#LS(t`E%(qJr7o3tGZSi12|@j%0r3~zCC4OY4=R`a(W$vWYe3h^KeQ~-HGeJ-E9NM~qkzigt5&7#zaG?HR?T3sWhi0orT^e1>8 zQ<%F0Gik>Mi^Rc5EOIAJ!9xm$r0P21An67Ny)U;a7axuaJBO0i7-0Lw$;zYn=hH^| zE3ne{CQBeVZg*fF1Ej-(3_Jk#9M9^d1ZC!RueCAK;S-e1L=Gca4zorOn`V0IUlSJ| zA4&_(!7^DXk||D-lr1r^C=>v-S9z@D+DERyd(e0G!noA~tRNH^VwB=% zwKNAp5?ru4VDAj+5&N&qyf0k&|A|9KjguC=&t|nIQgM;HTMfq-ONfxpVxea!C1F7p z<>?dV!3f`CO20lH@K7ZYF&K1^Vk*Su3@VCONk#~rN#%bHfc1jPBtbyVD=1?UO%;k_ z>*L-KdXZWo4k<9fu(P;I?5=}(1VR)^munDLUWiLTNaW3#IrU~*MVuU^JsPL5Qn-LH zlE^wot=j?j1o}qeP?SFJdt_oN{j5B`d_Qd(A6#WtQ)yM_L6H?H(8v-L0Z<}JMc_Nl zoOARZy0gq&u;UivfOG)3SH)u=%i-cHVH9RcXQo9_{W~2H+M$3Y|S< zQOF-JdhJbubHcnd0)WO&tiskL3DHH)W3)v#rCF4x{dxf$%1K3qi;4txB3?A6wSb@% zfaXIU9pJQCHvvU(g?{cc4^S3`ONmiUwWT|^kRSHHG80nVoUVLj1yCD;s4dEiS_mZ( zEXWq*uu2iXpT(S9_j>YrOP$6RD&T@a;vHkdL`PN%8r*9p3x@vRcY14>#;`?>b9zzK zlncheh^rx7G&F(}yuV0t{W>o3y-sn_fa9!Hd}&-`kfsPwoSmZ+k*buIb3w!J!UHYW z1LUVC#I#}V8R8+VMp>nZz>7R`m_siZlCb<@X@fI)wA~ka!=34hwA(zA`=DL@EZ5#DYJEUS+gu)6X zxf~R9u((`cQ<;WfRic?r21$SHuAq(>pk(M{kbgokj`!vOZsG+I376VbpAxLC4DZ~7~ zSEx_V+@>WieM_IrX_$74tkQ^!!GU5~W-7>5VtX#GmT)ZyS2Xp-A%gMo-xgOd$YtjJ z(M1DO=_BDPp3lcWMmPS^fQ@{xC$x0WuWsJ@!()=gJq?24vqvSS*xkGi=DNo@1whh^ z07`)rco9)dVJ1>_*ag#>ah>WE0%&4S#3dsN0}3FdAP-g{4z4{GC~C_ro`1}?wW-^* zYnss4;ew{6(jkRRQK_eU20#j}2W$oV4t8L1O^)wq6F0wLM#PCkIEd^q8k~4LiDq6c zH6VqPD|5#*+jKeEIZ7K+QFcSqLH^oVQmp0eP3lgFu2d{J!*Q*w08{UYn37(Fwar(; zkQED?3DJoTX#;?TvC2w9hcYh?7%4Dayd4|uw9QWR4}bW|0^4NGPy_NNbq-UImu-cE zOvcGgL6eMvpcY$Zy2X}_p>;K7VqgO&vJ|`R926EvX;ClcTV69V(=)G!CZW=kld{|B zp$=NP<{)nlEL_P90mhfqp2hqoA(dvV?F^k*Vq;4Xl6obJ=?ieLrW1 zDoM?3{%=g}jIU-F6m_Jo`{4Cy1pol>KoufK-E;e!G%SLvdE&ZOkWvTJ;`AqGcVLOf zq{dN-`5a%n&gYNp_82!9pr~@RRqb^PEr8mHDtD(BBn~kmL~8e+Y5IS^5pt8 zIs&B5!PtXrC@mWuID+MEns4y#G%)wuo)QeHn1-5?D0CzjSpcB{RSBNFAw$EPhN(Ya zrxQbonVm<=h03=nn|mh>h7OI^k-V~K@f#m(UTUj$RlRa zfrk0{iadk1o~9)zCt9e;p6u(S!#c!v8i#;-mjBr%uhJ)J{?IH^@l#S_h!LXTG0Vk7 zpirxb%DWXC)6>6hrWVc*q#pD2dzuE+0Aj#dDiTpvMGoe4J7o88bEvWpO_egO(l{_W zDPoVv5~7+QD>zbNe&#LbV67)e^`wyzjF3nWQ(6t~T=w8<>5vCYU~@3Tv9D_)jVxlR zlxZr7$rV?QN^mF18QKBI%~}6wCZ~8v8wmyuJ2yn?Q4TUGh9hbVs{B3JS{6->DG)e{ z(;g{tVX;<1dr(3lshi?2QGZwOlRn&$e`ma!fhqptIk|`C04lPJ0MFnW%9KZc$Lo~SExz7Uxa4$MvEtMu zg3{Eg5Rrz- z{=cRHu!mshYZ?W5O-YU<4-E2EN=|uCd}n{^YX9e73Qjk4f+M*quNo;qSzsIvinyag zi6(gez)6F}qLAWOYAOg2F`!$bcufL*NJ5UVnrDvM9lF{ z44srAN9p?FbMN=1cNDvR`gDsmAs+pP#>enek1R71;f}k2OFaW>^0L{z* z6oVOATtHhBl1YrnrrS8~Y1iGZJ-ywr?U@}l>$~m&3K9Bl?_1UZEFiQrRuaVD?nh73r=F#wG^a}|OS9J}L+l?<4!W<6mdeMk{x3U` zpS|=%=0U72f>U}D10w{8l@n5URGzs621&8k>T zEBzSlxWq!N)!f(9sHk>r}w_d8ok9Bn{ux1wzeG^ za7Cn-6*D~(=6%}A2D5QR@|gT^=~2UGy5pW!3n|)P$E!I#gH7mULf|Or_+j^M)LEG! zJ%9%wg7Rq$qZJA4Q6%J;>s;q)xTv>Wc31X^(Uh-=pG5D%@awvg8a@$;h8JW$eGO(V zS-p>ZUgYMNQP-Vc=6_$G=2h}@CNjIsOS}wqK-2&1t=4{TM_<0|TO87yp8hia_Da8` zkdp8>(n>>+q?5jpib``q!Za>AYGw0lENGzTYnvcJ0@9LX>DZ6X%+^!HHNjxElbY4K zrhCN^BI`s{vh*b^^~-o&`$K?VCVp*u;O?WR7W{kIIV%0RUw^HlJclyLHFquS37ST_ z{E3T>5ZoO-%$<&xdE0zpAtz#I->2;-{g{&er z(7r{L5?@iE!WAr5tXb7)NuN^<(G_Vqm(KZ>?v6F%txZv+y)ur)j9M=FcnUo2@5U`+F_=Ejqa=S4JFxxK(T4mGIwZBN{K1 z<6Bf*B!CzWmh@yPUuqY4NOHCd)w(h;hh(Ap2t^!YHKR!|_Es31UtR6SMaPsVYcpZa z3Foq4OFNbl8HW$ z+r3W9$mJzJV-eFI=WAkC6!m$X!wkXNWuTO*ei2OF2im5HT&f5%VszhLR@ zacz42&owZwJ1gr=`o*`A>k3xacAHW}ISAOg#N=9HUwq@FPsoS1m$oD|$qQTe8W7A*w8-wdACA~5-7Nj{ zuedPy_qmjqc;9%vwqQ5|B4}{r^|q*szX3chugA7$p)qonEcy7@cifj)s#o8Cm#3_y zM%AoJXmO7&PZcV_R9ZA83#xUSii4umB}es7lYxty{UZ4-RjzXpSGER>w+8!@ow%+6 zx|d?Vd~vDyFp)Wl9Ftpx1(A&@h>OBg5I-AR1Y2EyN#YXP{_!vrCGhYDlA@Ircg<`f zixiKZyy)EKh%$cyR4StyyO#HMhRz&8^=N!OMIR{)8wc%Gu8To^jm(X|nJM(H{vy=b zHiufoEmQZo>^1A7cE0h+)Z(+CbrL|@v8?6ckW^yk+k?Qn#!e-fg?k+{SRdl8EAgj) zZ!q_3P?Dk)EvPcZ zspvWiahlIM<95ZHfY-`1u|px(o{bG&=bJLMj;`TELFc(>gqx)QL)0ZI_m%&Gm~*0W zsFhq?h};r??X21Q4)OqSXHKeCB$b|@9b<9r3%OsJTz~%8>UdMLlm}i?Y_%H4W73(3CmcBp$hap>isVU;A_JPr1X=9&tZ4BJmWwV7jo~aLpnU7a8wD`vH=?X zDE{fq$76BV9{TUtMsrtwE{;a7MV@;nI~SIFXf<$q?ITLlCLT<-o2qbL>Di9l*nVyU zPZ#zl9`UX|BePS*+bCxn7tI7z^qxi`6=)r!Te}lWg_%g-V`9Ei@#7@%{-e8-*3`b& znr%=KcKmcrX5ziAnM;iXl%ipFa_0H?Y?R2xnrjDtPv~Ve8ZE=l7#GzmTr3-k|1;4S z=%wFNSIP)%vjrPHIc%aGji2GZG*nL1aIaBx zP`ERP{}$pC{%aD*(22^d`5r2ThM5NH_P_ImE9mnycsrH~yHao9-hY4X$Ay{J-_|fP z%s#r}B{Xih?}-aXP18ALo2XC(NS0SQ|MYs2SxV;adKbHcRv9HC6UIi~>$EznqyB5V zs%&J551;!QNBmMIUdvK{W|PE#la-yabX`Q=7TR6Y%~Tam6d%e`&sYbtI=T+ti2{72 z&g-k%T~F1aGNC*7`5_rSC9|FfSmf)vlmF~xSMsWwx=yjA7)t?exh&&*+_x8b%-oM1 zHEoSV){8yb)d{^mq%|I}C8Yql_9yVBWLlT3{}S33+dRsc5L4Kg;r4<<34cOaBfN?h z?WA3Ua7ztSVa?#(0X6lLZ~b#y9?GHnL;J+JzdxAzyuA4j*wB19NN=U)iGPn?OO(`W zv3t-f?`*12p{1BLvbe@-QB6b}6mZMZLcy7lRXdAqJHH+@SL1GLhIYdJ-Pu`p8_snE z^pm}D4jiXk7M5D)Ul&qwBYeRTyPmZsF7TcIXvea@UVisI|H)JSloh&k+~O9c;%Qv0 zTB~;>%Zx9+qJ-;r$TpS%WNH<;0G$)rHo3jiX;9(hm@UTBwy8DOt2@HKPFox}{A)=G zxJ`Crpbq|B*Alor&qBP~H%xCvH$|{;cv+Td?TE|laf{tMH`uFM4oDC;2r;_OHa5Om z0NKgXjURsi$c%yOj?(pdCuvB4u?M>D=;FUyKO67KYwcHK$n`X9DQ+S{pdZdT27!LF!%H)jIMX>hOW9 zTbq(gMd5<|%c(vr{-vV~Q-L{|ZY`Ua&Q)pVWKTsl`D9ilH5CBx%9t^TxU3%xrW{CX zRQ&qARr3`v(K5WxNCgp83LBnEL|c5PR|enYeE3F={wcpADJ)Eh zdP+L=-zT0}5c{oZ@4CJ;RpS-gji=OoPPc{m)qLD`yqVPlnNr}Nq@E79*u?Hgp(j{1 z=J(UQVy`O;rA?xbnQs0w$^vdnE_AOa9E`(FIV`TrnZ@{Tso6c(MBCZsPI4Q^(g%#p zmTXznkG*2HfqkBAB6^rE;cn}68*B0x?+V=h;g;p3=w*q#GDnZ@ddpn;2(dvo?_qe= zwr%-_x&E9G*8{EAe4_Q)+UU^o*Uwy=CupB_nfl4c{Q6Hdd&u>n=%x8DdO?bZ$+4ZO z-a_4rrgdA#({o10IbNc*GN0FZp`Uj>y7^^1%9ly$C$f;=HSf2X6Zva_0oaNyZ8 zPW>)bFHa5w_LVj^k|l@Jfi=m6F_Xjfd{}n@3Od-P=` zeXtH3qfc$s3TkYqyvIjTOvgt$QsTI3`}xQ29=LMP7tjhV|4r6KMwiMm&yAtH9bZ4P z3$~^1Wy>4UY(UrGntXcCJ_bCpOz!yRj7-?E~QN4COzBLySb!j2c?yty= zat;M}^-LZ=lmC}_kCX1rIY9I~c=x<|wm+|~!1n9euBAS+U*$jePpze&KORf56C0BQ zn@VLDb5zeGHvy|-_RrhI}AtJKbX+{=4lHbHKE%`}cRQS~i7i zrtk9J*p<#1d$|C%&>OBhJ(d8U%NBoyunpqtuaOZrv)1^JTZOG}hvr+8cN%{Qq z&!@m9`u8KkZuhInJ8x$+5r9=Z3J)t6uK%Pb2oW zwEI_T!;@!cFxfdgz2O<|;pva*+v=B~S2tB)n^viX=ye>*T#Iw~LiQZj_(!@R)K}4= zN9b!G-Izl0-}XzV^VZh*a>wt=b}=~M|1f>r1mQAV6@6S+o%+|(d0KxQ-N^GQg++uB zSF%(u?Gl@VYsx$uta1xiP|yP23c&N(x4+}rnN8G5JoD*BPbU*lK7}QxinHPt3YR<& zk%Za`nq#sQk)dQJ-v>qsbx%3(SI-Bjh=D#j6Fa% zdl#Ke+5A=A)-a2Ma!7-)Y5gBFK`b|J6N8_7J2&9E-f7SK8VYfvEWh?-iGZBSA47#P z&F+i1o(~kxUbL4DEC?H~&1N?-dX^5Gc3IeQy=uE818n_Z3B2*jexyMF7C(6|F~9fH zAM!aAB?whS?Guy=y@5^{whM7IKuPjMxA((w- z9*?NJ}ZCb zgM10lGi1z-{-y5`(ecL6{Qta77({4ZcC|kOE5cG02O^f)w)_VY0pO>HsYCD^PgGR84zwAn5hkSv3HIva=M+XVz*IuG9g21uVe3*wA zj;+__44~%@uaI0q8FkHT{UT1EDc7SrC3-tny^WI~jHS>^nt~}O0!e43SwlVq+nhv> zy)u(fXf7x%5L@=ra5QhZXi(KwhZ%Qa_DQ?eaW2lGL7!#la&*mPSN>w*!SWy{OSM5X zVD2!IMneZ2|B0t>vZLk6tpA&tuY{&i=oZ%_c$mtZiU_0t&wAmu@Yk2;*qB-%8F&Wj z>X^k)gDc?U+afhojvG5i*cq~dn)WG`?u9Z)F=`xao#O*e3>mxx{U8R%ho78GkImpx zC*`fb%tC@DqT-ASw1Y2FcG~qHt~G?n5>M|iMR2MhxtMCNDMet-$iuICXYIb$f(j@B z88ZVHx1y@0iv}wk%Sr;k)w$WEw3irN5hhZY@5CNCHHG=KwAGu@3$ESY&8CIQw5w7a zh$qI81yez8_9Dy~)IvD0JS7nYu6?ex6V6--ERqya&Jn>`HB3`hof7hHiX8SNxq499 z+1=E>0&&ni<$uA7M#{#WBo(zpo=07Xo=U9`n|?9M853BGX%-tCvWzj#erRhng#zoCV&C5=V}M z5x$Z!sdh>bWJP968$1b8MpoS-!p${`$gV+pI136W6?bJS2})*j>;RI1PK(`K^_bNA@NcY$*DunQ0Bdz`r0pZDFUX78)-WcNWh|HSqB*5=sj02b#lnB5sAp2 ztC@sO8jz}`+ba+ktM0cGXu7pd4cSkD zQdY(_mMgD!I_8QHMIs3C8+7m1inm!UJN9kf|MPDy-f{l_1{Wyqp}P^4^U3h@+)MLs z^1ME!Vg?QXzC$j}P@XEorBc#(fC!m3F$d!q<}+X;K26RL3oANkmz+QrB=nHBB~n{w z@!()Of>@rL5vK-;+>`rDFmblp?{JHP~tSc@Q%Tg4KWBz6FQf02J#tLq!{ zC2_RKP5~IGBCh}$KXe#bO%T2pJ0QM+r}d@NO#Fgo!w6NuH3tYR#H`jj&Be%*lPtR6 zd*0OoS-F5;dWrq`*ruEBqr>UX4rHZV^g7l!6_%v{2OSVhwA6^KoQlw(ct<{4_dxGM zrfg1hM71NQu*#Y$k|I>REy87P9Z)`8KfO&)jBN$L;|VLE_LN-;G3<%}N8%eL16Z5? z<#mKJ1Y=MAEX5cmBt2kTTu`Rceaz0VwHbaSX;@5S)IaS1MEj=Obbs zb!@uJ99?gnCuBa~lP?@lEKe_~oN4M`zsgO})b3eL6F;f}P)k&UW)|+4fo^QrmWl-ih{;%AJ@> zkXXP3MWRsZt!L2e)d_UueFJ6tXiO47b0uO@=dH!{BqED5##UjgKzGUS{BhFdMM@m& zpqD~U|B*;2p{^PcRg*0j1AH=6{91_qXl!vXi+^)Tx$?HO#?tr6*BpeEm`RD4m*S5d zRDq*pvF+B+pTU15-Xo2ag~Y8D0|aBhy#*%KAcU~f1gBHGtOzfyr4aqjNGX`wF7|K> z&lMv>y%$SwFjzDP4afkjj-U4i&sQ=71WD zr!I_3xTrbxDS(~QZJ->;a^oBQCFwLY(^$$aqB^OB1qEezDx~PA@x-hPq0&4f^J zOXn8Lj}f8;3}A`jwT>aUbG-WFw3xlGz`O7Ca_PLhl9f|kmr{nfk#RcI;hfu3@=mIe zl2sdd7@@013a#yKsqVk)@Di>4K0LZy!I z%BjYP3Z7i1FcQ*oF+@5KlR$V81llSk|DW;lSskI4N<_tzqhc@`3OuD&glR=U)`{QR z*qi=uX*vr>hg>N=7G#}w2y+w@Y>`^kqW;4+mHq8dK+GDL9kvjl5Q}Lf1|VFDYEb@4 zgCVMOwG)ktv^p5Mj2t*UJlx_INV#zV1ib2TMWWV1uthRhF3=0P`1iiJd{p)STyi{o zDk&u;dMiJa(hF`jV-4VpysG*O=RCR8F@14hbMOTeT2Wwtw8b>&^-cgLrH3L_w}}Ia z^`(VHC-d3ERq}EP!p_Dx5_F+@DU5Pl+ML7`xL0frjDj0n?CKg16Z>3gnB)Y2DKKI# z2Ggj;o-3@EWHfd&nlbGA;o(qY2H#heC57-nsuI9ssak4G3Ry9&3vnD(x?!3h5M9rF zk`n-0k~=X%BToX^WEr%8Vy;qC8YvABf=mf5gVs@V!NSJw!MqIm~LvEmDbk zy%j>Fb`%~x#B-mt_iE&}Se8-^B)n>QIe5ED66a@pcJ&xnoe0+VlL-FAr>UbL`dzyB?KfafzokJ4sGi^n{+EN zUP41J2TGzzbl?)efhb3gI6%X;)>rv>Ly2ezaGg_79xN7xH4fiFurtLCV7AO!dGWs> zsMA1p*{j+R_Ym8bHTdOB~{b}EL?GwpjpA)LELy8asu7?r_E-_3~ywdbM z7d~gL|IVd_p?`o$JB?JL#vCef6r>s;#wnXpAiOK<_#kxPjOMAwQZ2;d<{2JoLsm<| zdc}(*@FryQqpa`$$|DsBo|{@M6&HmLcx{RYIFy7=bfZjZgRFm-C5c%-pfVSct`v<@ zA5&QSq9v+n7Ef;2^reeG^XRxSe)!s^1ei_EgNb?Kk8oB7LoG^BsBxS=QiVJH<-XAzQvwWxZa zRFLLOlug{_n=r4nznE5iE0LgpgNzW^Yh&bc2nqGKmnr-C;|ulo>ZN7-rOtc~eYPY8 zEuVGT#H2(6ROHA+iczRSL%uIMviB~BBz1w^2LmNVQA~qU*bnBts(~Gd-K*(5mci)| zoqP5sTcIQfMF!-8s6f(*6xWhzC0N_~y!Y+M&6Wg@51klDC8lOfk6dV9t+pl-q&wv& zZI{n)DT1Dgr!1ON6Hv*q%xYBfWZ;Rpzc1H)iLa%~Kvgnl`C#glrB3IHghhD<0K zDtrgeo#6HkaW(tU{)K%-R^w()oP7JwhP3|cMs*z*D}|?AESeFi2WC{n zZBwQLgG+H)Ihp>SW=_Ck_D;V*u)~+Bxfl(ff-!CwMIl;8&*%b}liklH?8myN-Mahm z0qo`bNST$5ZqyC^0%)3xOy&&{7eosU1dDW&gfNGxGA|Z}04L!o6x5Hwj(S2t?bEy_ z-RE%yUe<3sixzz+rGxJ)R)J{>C)7zJFyGBAJp@51PnLo>s?YSkgvE(#*y1cDaf_GK z5{x~zSZ(vQQAvgUX@!M2ndyKGx9smr=#{m2f~Qp?4iveDX$nJhfwR_-9&}n?7RXQw z1g;_^tx_8j12a%-jiZZ!kxRnN7bhm&JHIh|L_+78PE*BJ0P2NXK?D-h zhZzy#Wf7%H&deyVy}(9A0BxuZfz(NH<-~3U_n&v<<5BQ(dVXc~Zvshkg9yf4HnVD} zhmHswVu8(`UE|Vz)qQJRK=~D@Oihje&TF1zgC^$=AOkk?Wd&uTT-`Lj^!$A=Kq(I7 zId)=j-VBhS17EOJMSwQdikHNM?qvgW5K(Mr#Y(`eMUr9f#?UdE2~^IYOK{YB!YXFu z%FLh^$?EA8S^%+xgD6=~y0xgOcrUK?i*^{X53(FtS_NPfK{ShNAlj*Qs_?eq>?2RA zIAgA`OoK({i3%kY5?Pu>cL|=dLsEgOA9M7+Jo!_wab`KN_*cw)KxqK+5YJFr zzm_(>AbBS~20~VZ@VNUDk;^{pqBa~Oq((EW3c_GJpLNdk0thG?5r1?0%q;Qp54})Q zEH)KrGUQ?&B*q~GO2$-}7KwSN+yz=4AMO`!&>yn;u0s%eL_#@+U|P&9;}~$YBzW_U z{GQx;ot`HCKg78bxPZn}7^R*Gg7s;RLAbQ=S|?drhTDoBLL4FZIhJ|P^9WCo7;8}} zV9+4m^u%m@fz@_}xx(KUCyIfOD2HSlxFSU%T5+26k^-jYS|?FYZCLM}120B(7qXb5 zqO~>0G0(VA4L%*IF%kFF9dR9dv6iPkdh;)aO()t5Q4zFY9K5=d3JEA$G~0;n)zjDn$)6ahr7 zDL7j1UCw9|Y~i!As`-}1)^{eSD-PHWqCTZWRS{QJClwZijh#EuJ;l)0bj-%IK?Tl+ zv4AF1hg3oB`eMWHR2^ZZISRyIH?I35C~h& zQCz@-5D)_Z1OPKb12zCq4`gT55CHXaZ5Y1w(6%%;+XyF#x2cjKkum_#TllJPCQN0U z$;dk={{0Y8H2_3Ja7P9J&j9TZGlbwT&u%(_7ybuY!dLj}Q(a}?8N`8pMT*dRCq2u; z7mu#{tLjPqZ{mApw#G4{hP1=BVq3CfIjJGn%C64w4cSC?v}@ThSz|Pm8>%ev0KfnM zjf?;kgBhY_eCpXUvSa~Tb0Ds{FRp!VtL&}0y=yaDkYM45cZh>#Y`Xv*wj>sN36?zmfzZt?ux_7Ax-$sfs+ z{?6||Z++PFF8(iPKehhWhqmh99eiJ)LwjfJEA$FKpSo+)@4SD&mP<4B`Es*#emy@& zrP7t1k)5T?%bQ&O=%0MFoX&qc4*lIH>Gt+g`g01M_DsQl=$JgREqWGIq0o!cAMJIJLg-abD}+R^ zll8XFI(814ItW;3J*b^_VA^SklG??V(*Uq8?rEEU&6A<3X3i#8wQu7=5J8S?SxklC zYYQ9Dj8oC&5`FIKvv1lPAL>v632jxF6e_8%gYfs_VA|_-3{rH0wYfadXgWPnw%=w* zuC2t=_NW?{WkbbE`=_E?R#t)74R)GKB~)t_M5`*Sp%2BRX`vFlHp8!U)U|{-Oqk8I zFmy7uBhpA(5KrKGJ)z1IcWae5%FD^6=H+6Ws0I3LD=i11ebB?CwcVcX3Zh-G$RG#I|r7+y3?pMQn->R2w6zmrg^|pQBa%e)TBzaeMacMURK> zVYRUr&(K5opVdAkSI5?;QtEB9g)goZ;fK{Dedy!P4gTrh|9StH;bVfDHiOo~R;{96 z5dj4JVWXAF)xh0dAWQ8cY6rl3TE;4HCCYqj&jF%gdKQRRJKlAK11SEXsySNwe<)vD z`n#g*CCF{(X{{fPr;vMJ-oOpbmR}vSrT`b73QNnz6)jQI zEkpftf?k+O_T&6H6U!h|yd6L%-66x@smpl&#{c7^_vYf`yYsK!&Rbqse~2d^`dMBb zG_)^1Lure?<3s$z2HX#7nUiQg`5y^@Ik3{$gnA!YU33_Cm>dE|z|A-tN} z%TmeAm$c>7ywgk8O8|TuwunuL=|ar6BzL>_eP1{1l7I?N%)EE1Tdz<;72iwanYY#cbk6%HTpU5;X^phaswhS_Qcm18)zGop-hl$M*avwAyP~gev*y#c zLdO$odGkM(MTC3dRvSs}2R;gIwJzscosUuS+11hj-+vVD+VRn-?IvPv&O)mdxUK2F zuXTDnZqf93C4c(4J{|F-YS20y4Iwks>;|2p%PMAV&o_YuRwsXo-F5E14e6AOYjRAj z;fqxyO;IkLy|JhI8YwXA>#Otk&T_%84&Lp%?2}P6RzxDIS+`lj!H-fR#6RX=@n3fx@$aQQ~ zPTwVLYxCW%u}bbKL&rU~`7B&~r^hSOH16c7^5v*HZsWej?B^Ke)9+`eUYI})p>1Eu zGnCWkXY@7y`Yh@`zQE^MpAcmje&Z|slm;%k_Rl_ke}DfWFSQc+OYf1H>YK?@a_2sC zUe+&l+@hVOmVfnUUAmtRgi3TNopoXFXKkhOTVd%G{e69Ca}RS{4)NiS;y>_&eB};{ zUAu|t3isG1w)Fo{*SfBu-Oaf7Yt5$|1s|O_^(Z|^N_u3Jg7x3QWhIbVygrcooZy{G9x>;cuNQRx;cYvIfFwyca6X zb(oQRIiY&HWw4X~_XgqY7nXPx>vle5)WiZ8Rnsf*-~#h)u%YnexLR}aN7=q8S~gN-*ylLzNYe?M=R8`oD)Y>SD4Cl$3_ zLCCzMUpmTn*R@cz@okNP^(47FMSJk~J~`%$>*TFEj%?r#V8+nx8fI0?9O}($j)ui| z``P;mo3q{sN}`mv%($IY^9BIb-mJ+cz@<58x>A#D_<@gH$s6Zx<4{e#`1;%B&fv$_*mY~c~bt;W0OV3~FCVzhsxVZggApW&URY`?UN zN>5^A-+V2g#@8^#-4BwV1+hJv`>5m^UgYhwQ2@0kw>g@O#B0_hcd|QxfWK=cj5l44 z)e?>&>(sP;tpor39RI03X6a%}0-WNP#X_YPv0khHBZbsn;}{DmSf*9OguMz&5A!gyVQI z96bzQIAgopp3pmSXC2$c_UXfaRu)QN5=PrFCI3CXK?SOv2-k$B?KMJdi#72}9-d?uva7h7;x5=#eeD>D7s$=(whpZK1(qfP2VQ6@ zVq&Xu&@QHhqxA&eI5Fnk=Hw1dqy@l6%v{A{>R2${KTisoMxOv9z%9o|dnM5wUZy_jFctNSbRg^r2aq%Fg#{Tp+2=KcaD8SnIg{u=gD&G|@fBjH-+UZ|tc>lfpHapD_J^@znJvB5 zsRC{|FyLgXVjJ%0&n=pt?5xeK=vb+Zrd9;^17U5TYUtFqZ3C%Pa~t}8zxj2V3r*-U zS}vp1dQ-;;ArtBre#1=_6vZsuKMof)&m#DCp(;na=B*~R81pqMyt@U)IADrQ(E2sE zLX)|;R{5uin+_`CZ1Xjfu$&^GQ#{jERnv27Svi?`LD%sMydZN0$%5ew8N`$fVS&Mk zY;oO19N%{e2NrDS{f+c5Ju+E3d>W#;j!5VornHUg(~BuMc7V6Qlw4@rhv0+n&(WSN zMwY2Iwd)~FRkk{g{Gwv{hI$8fM_U`-6d0DwMv3kW*mx#1%>0Y%;1#fK)65(tT zn{gc1d{9TM@JVygS|i=1&qb7p2!n=pKpGIhvZ&ooF~R?Q=C^uf$8-S%vt4l^z3X9@ zj`$o3;>HEl+qK#8^yG41>qZj-iM0y2ElSkxflu&|E@h6{X&ARi@fqyR5quKkUV%Pk z*5fsXCrTJw!s?b8;_7E-Mtrfe1B=cQ*5`S0{T!p@VY3I%_aK6XH=fE>t}?3r`C9p? zEFAPS&+W;|GyBIx{E=K$iBkPt(rU-Mbr)flx;O~;YKoJ6`eeNP4Bv!Q70ce(Zrp7C zZCBTVVC!_R+ERs;Cz+%9&X+m+${gEh;3wjKMOC8(QnFycbt8ji<~3Qk`IJVz(Nqg9 zRN~Y9l>oPS@5ucm=gT)U_01OkDt+a4W#?dQ#h1i!x^m#Tb%X}qT2r0Ag_QZ|?j==F z#mz2CsB}$al=Quuji}+Ch+*_dF-XS&BDfr+;+cYWAm@3`C9Oc z3I1F8RMAE;hur29S5e-Q4J#7#wD$-LV9O1VU*7xFYn`m=7yk%ycwrj35%<5rg)qy{ zg;))ju)IPQ)Atox@_Y0sttomU63e(((fwAPWo&+?eimLRRs4gepi48KLG32~v)eKY zJ=wyqE4YU8%_Dyc9_r-(zg_8o(3^^KdYQoyHjnnb(USSw_}CjwB^Cbf8~7y7|4+4r z(i!>m^ILXVDW_})4ca0n3#a3H^^IPQQ1b#qs^V{W35#axlRwRy)Xs+3y4W{IO?aN- zw5@DkVS7Z0uOKA(z<~hw)Le(mpD(iZ>?t*t{K2LPLO8aIgI>O-D(bf?W3C@Ccb3!> zL*R1j-1)AI$99O#dr#Ld;=H?lV2eKEyH0__uDb`-cnF6;nW?2G<qB|-n>tny?Y#753omQD0taEXzxM2G-dC7!-Sx%gn(0uPdS~|ZA!Cl` zUP7>rQNtxTV1+C%xqIw^yJzrYox97Mdgs}BS~U}!uxla|^1jH+_*fUamKlH_T{LZ- zYyA=5)J;wA{76RL#ik`nvupS~-BZ?I8je=Wc_*(S?q0ws? z4A>U-juj_~%H8=c_|@swkBfjdJoELPQ@ZZg!ZZZyN8x50&}|Uo7*4>>E;%vD7f++q z_c9!un?b@2#~Iy@widc|`U)QEeR!i-ej*sTZr!u-e$nmc82FD@3ULejV*Cqpd1W6y*BcPAxO|u~ zzQ$ezzIgZ5HT4UyBllt1;IDD3d@C{H0k-vE@2cJrU|61=+jb8fW4Gbb0`SW~bHpqB znQoc<&-OLNvAy9|Z@2pHm-m4F`}4JT*{v?;5lw>Qc(-8*ZQn+|u^M^X`d;8#6BXO9 z1D~8tr5P3Iz65oY&EkMFKv+u5)d}qO6*Vp(>RE`M@zX+6(j7QhKNVk8~~rd`(_kQ8ZH_BUuP>C-|zDU&TbT7aA8nS`?x} zl2I;bVNoiHj%kP1IO$!X{U!RjZ^~`5x@K7XViv}P`SF}k9m2FIn8-%^9$e(BKW-?=BKqUu?NRu$^ z&LAZSGw)M$_+c(r%$xG&ac737q=+lR)JjejH6@kZ9FqgIf%o=ic{>zYbj;70%7Gyx z>u1)pi_xh`h*RQ9ef?Q01HP=pro(_>O1aQ8a7@z$5^ zDx)MZD!WQOD2fRax>p)I4U@1|9dLM&L$QrDYtHUo-&g7@Wnb{k@CX8Mz z#$-!Sn3kO=U|vcTVkcZ03v716&e{6pnzr0}#H#tsW#6DwrXQ*Tw3TKS+yOc-r+6f} zf8NWLnVA%8)kKo48tK6#?T$G|Y#~c>oQcxc%Hd|F3_Lk^6sK6UiZ6mzuIm>_4<1sv z{+n)Iv~I&~LdApx3Zhy~*PNNCk{0{cRsfsjIC$hNE`NEvQ<=^jge49nOR8qp3^E}D z6lvSQu8~<9nL??Y(ilGxc4Sia-g`9Fv+Bn zaP?fUUK-P64m1bXR|YS>fN%%3k8+eF&RToR#v7iQB~5}cvgm;+Q7xSVWbRP3GpN3? zBbOsH$<>;fK_R%{ZXtLP$;l-!i7n%x)Ag?4_yf@jezcB)uH=$Y_?Sh3Z-%>#?3pQW z8%b{KRyuh<_PewNRm&0f95c0qgl2*k3n?d;jGa=1%5C44&df7y%`whnJ=j5wS_~1AFCsLS1DQn)th>Viwz7Gk%3!hXuX3Pt|xM1~=1`LoW zzqWG%6q$UlM_f)yJboJ*#m`iJ(#+Y~)f^g^u&tb2SP1DoZm;FZs$Bd8XRUry6a|KY zt))Rj>@FI_CbX%p;|?4UnPNOANauAOO(Lumpacu`et{10ZWIa3-E z#HI+vK&m3hGEk=wS}or%3Sm9zcCeHo;-duXkpT`;q1QCOODtv zsfr2+S<~4|4J%Y^cVMPm3h=#O%VZmeOI!s}$&)0o=9xE0NKTenzs8J>PR$q7HV$YV z1yYFBhRInxu3o~z4vG}ThIrGMV(jDNfms#-Y_%L|_{1+6!8*cq5L)rgS=eLenJSl* zG1XA2OhU?2W;z}dQYY8avGEy6W7?$mGXeB6&cRNCIfAEwJ0;>oCD)Q&_c`vGdjqtl z7_3y8Sy_7MrjLuaWDJ1CkH$3%J0EXMmmJDEJ-#9+B27?oJ1uS0Avf0qYF`a;W8??& z%^cB^VOszyb0~pgSs;hVC(1eNza4pY=PYm-iV6&xtlfNP)Q*Z+U`*5-K%mjTqC6$l ziQ-E!;6ggbqr53SfvN*Ky?rm#PxP!Pz?tiXltsn?+(IP7ZR*5|TFKPAnI?puJ$i%TebcEy#Xkb za%01!(yW!>^1yfe!eVm{h@>Dz7oA&`CVu#+P`=>n7n>NuF7HK?!JSPNYfWsBs*OK=>o) zR{2xht98%tDJ4M<2*I97klL>l0!ED{=!S8#;;~{syoCK%XpMRPDJ7Nkh?D!|DI z`_)m6auGKC9h6%z&B&0H#Ml?%r`Ww<3Rc)Sq>X0X_~nXiNHj6d$};&cy1iL(52cjd zF+SP~tbJ4EK{AvO^BmZF48lc`NkXAOaV^sZXnYL0C^yf=l8R!&77b3kWe!i&uuO&qVc0>p%B^LUDnj!)!6L;k* zTQ}eGxLZZBh$_&7Fix=PxR#a+MPeI$;mz`Cx59jDc${@vaz^;29e_;l$eyUZZ9sH1 zET48OD71*_<2^YO`U8%bNlA|(2b6$`>^w9$JiX+)sLV*LnI4WwR72!Gd6efRBm}?4 z;Z2@byaeZ+@xn@m-eSGva-w970){oyT&uJhbQcoTsOg7kWnzFKH zN+AxQIVqM42#bu)$C6E-zEE$`F=c6{PAwdS)x?d+Gy~XOoU>GhOZ+i$E7dU%+>O4#pyc0?0QC(C1^`{5=0ud8%b! zYq2fDc>zi+e@EiX7OUwrS!|NR@WkJjwSQi=BSm@|btTA%3nt)k7=aE1#gi4#A`7te zf_61CdT4@j)RZAbfhf*(w5OM(>ouA?0MLC7S^}VuUteK*0<;!EL5M6|GZFpw_(Z1w>-i64k?;o`XK59ZyccttL(v z%2;qGnAs``eKW}P0Sa-790}mt^Gb|XDyNbb8G#3k6*@=uir-2iorLixhYPJ{P8+6F za}SoDsaQHOA|C7jYD)-!$G7JthbBw71-B##CQl+J#<&u!9LeOEamCa(zb9JFC0tJ0 zN)cJjov*p%20Sz_RzFp|5iV4nrPW=+NuH<%K+T5NW<`Ew3yeK5KW$r-YR=)(-!6K! z=&a&{TMThrAyh(HB~tGcy^31RC0vf!9JX5S<5Ud9h~^Bkcr~?}TT0~>6=~p8sn&QX z?!>?)NC1e!(J63wHj1%yH}d2(wL;QF%z|4;BrAsc7DxlP#Yu?8(}h-y&`T(CNV`y62qsMk`H)xqZbE!y95g=Yn+TM-kH z(wMCPL>VQN!uw_{HmzNYH54Pv1UWpR#2OGJB{1iqqdb#-$nn$MC6Q;t%5_3Y21zx5 zIv>~es#jD@B5<267O`OS@( z7n5-)(Czcfx#=RO5=yPbu??w?CmIy|xR7c^F9I>Drs^)O?GhFXBMmIDsWcOzlC6NT zWZ=iwZjVzCOLx13Pa)N@K?ESy;)=boT2$*3)wj&%vMmN9_? z({J13wC2*?F5w2q(m>Ke2+8`W1ZBob0SiJ7<<~6=w328;BZe&5kS2!h&$2DJ!%MO(eR)i6*?4737C6OA|DvgZbp%z;KHdP!x{P=l=Y4o{*z&3Z1~ z?GpMb@1yb$5pCj$J*Ik!P}^~&d=0H;5-zpuBA{0ZQt*-`I7yIuF+%k+ucr2?t{U$`9j0^W-nw;Sx%q~!b zb3z8WNwH6;YvCDj;Uzv7PyH8hb_tV%NCI|Pfijb9TG6c}Iu6q$_>M1scpsKBgkFlh z!CrZ2;a}**RJ0R>M*?a(3W`37V-Lm+7sO#F`b?p3GHLo#PHTDJBWBDTG#Dkuj_N%%0+v<+nDldPx|6z}b-DUJBt4r(0)A+CPY2-)YLCOwoTc4q&jX3H3n$oi* zOR5fpAasrC>3>D`;b|ep&0)nZ4%$te0xc%iIVoSnnFB@u%4^94Dl&)q9=v?Qz!771 zHVCXrDxx%Nm(E6^bMXkPb3N|Ff7U}ML8Y9ZQVMkIwV@pCWYH{|#|MeV_~d{RQ3aA~ zbvg}l)WC)&tv2Zrc4#>+6EZL{oiwT_TEUT|WIIs^%E&J4wjJ%IR~KERUmDM$LQ__e zcywI7>R9{ISARVlLyL!`$F*#QrYoU}M*tvZaA|7J`6>JKT---rfankq0sv$HLsJAc z0AOEa^VA_g)Gywpn02lkwgbE4$dzN;q>%uXW_sUeaAV}SNQ%<#{;gF10}vvTqagq| zfC9irNJ-ly4QLUb5bMtl*$F%004cBSFaahISY0!-TrokQK%r$OXV7lbU;mW(J0S*b z3KMNu8rV`q%Mx}NJlLXk?L!`_HadN}B(`lkI}IImEHevDC!n&3001)pG&2BZ2?cU( zCdMlSDHw_^od7!4we;QX`oCWH?bW+=&h9kC0SIMy)$ZWjVFP0!q_JLrzW+yczxt&= zk(J5So25&Omn!wv%HZ|ID+k@zCQHk|r~Wffjj1~HN=}oSY8*j~FhL?Lp~m(gq(W-# zfBydMOV*vT`PB8;#UCDwx}(iQ_3G~*=eO_t*iq=;OJP6l=g}W}z}DjA-+tf!`#b-( z3u{UTfq(4$vCr+3V0L`{qtA<%_f?bCd;aFV=lZSr>-H`i@s~5Nui#i$UQA~`uJ{)I zG(_F+ehEzX6tkb=3)aUbPOuie6NpJSh_vpL%Ej9HYP{#z4C7>(QF9w&gbtWkJouQ3 z-)iA%Y0fRTTUs3KO?k6kJ1(ti!h$))G^&Z)kx&IDw$Bfx*C{tQ`X15)D z-E@rz2dLtGkd~7^5kNvUVN<1%2vbbS2IxBqp**(N-|smOM#p~cb<|kAI5ah zFA8zquB;w95lCY#q1+>AVPfzyEYi-7iR5aRO>e4!8<^8SP|21_EV8XCQTWdZ4!$IEoz)f$ z?XsyhLpG9`6JZ2giplsDCICG^!oQaNl-GI)one;KV8#l{Va9i5veb4~w5&pl_L0L& zCz}IRD7H9KERgNV*2x<89F|nL%eJ75$mL`@aZ(sNg>4BSt)Y5Q5r1=IzwQJk39&b> zq9_3=$@=n+9HeG#bI*I1IU6*xOliO2xR5kT&1#04m6vHIp*#i-JOm2zo z{9B^b`s&{HAX2mf&bx^nyEUz`Rr8}6XgL|VnE4pLa=3@;o{|54t+y+>;+0YTVFZSh zRf}a66(%RL)I#iCA;`X}p(1tM3m;(Dmetpy*Gl z15&6{LsZ2@7p6&5b(48nVI+6luf!)!YOO6of0BHi9L%ktN+Mh5$r>?Mw5`i5A#FmN zdgTqswGQP@Uze7W%vE5mgP|ZK-xk`_lMx<1?U5$08QXrnq=HWb{l;o6)#A3P{jH_i zo17VkW#4lodwX4{vh*8g0k;*)I^Z8BdQ1jtQx=vO`@&4TnStv%!e>!0v_|PBRvi}k zF64QB;r8Z{>tX0zV9UTRe?tGu^mw}VJpH`+r>yON&(eNdze#i$z%JQo`H8HW??9D> z)$6FMni>^OSC(@xg)&I%Tl43hzC#C7m6Ob#E=PgDIva_j`sBN&1cjL$l~WnpBtr_aRpn~QI%4XTo> zTt;QN?>m)rTv^ZGwT0iORk*5xo&`n5vAuTR9ajdUEA@%HbNXfN%&V=*ykeUN^OZR<^cSTf_HF zPS)l!p)+&+E+3iqfK=2W5DKn!XN9Aujn3gct^%*= zhfZtCWnGx!8UwxgSW0&^U8AEa3Tat{Sny7#xFK6}gAj~41*ehIYbF|kj$_CAL3V{W zk}#CFta4x*=j;nXZ;S-wI zS$ph~w^Caq6m4k;ibr~>zh_Cgdc$N|@UlbdWoLN~UueXMTzxTS=rikco#aoEwKNvRs{??i#mU9v`P43kReOKAtgp==O5-le{b~?Eo0S zSYMPV>$!_F?J_KFB4_t2;*l@>H^pY@$=B4ql%>xom!KTq4zV!C@E}78Evl>=0zf}} zCBv36Wej-X%N&~y{11lGKjf)WVfw_nwI*1~X(9W^B3_Qn8jjPmGMqDG5 zC0e~?hu%j7NO))PCa@?}?AZ)>#^WDN2(cBMQ&C3~w!NMGpwT!yG7khtJ%@CMsP3!M)|6;Q;!QA|2%Yeu{#iImW{3lG4R59P>i zS{o9Gj@XMh-JL4)wdh1UTmR>}Z9K0S#DBnhtKTS3b}`j{^^{bsPJu z7U{>P_6D}SLN0u(&RM8eC3kG_f58A!=W^!pFjOs`1K#pWS5vJ^!$r0JX zZSd{q3fAH3cQ6Eo_xb7(b}6o4_v78SZC;I%X?GN>j6c<`wS^x(V8_}Km)e~TrBs7T0{RAbAb$c5F>QsBlYcJK|^s z1nngmmOR@eAkS4O^`cGm&hhGiy_c7}jILWQ-?Q9|?UN(SRISr?xriuh7GhV{etdDX zjBY`WAAnvR&=f4x~B5)QzTdM5xotIUrMVlo~hH~zJQ0`Foz^cLAEj~E8CI+$@eQg6U`UjqitAt_g3p8k@5DSg zCH6?BH@+B>q}A)jye79RUAP+5mGaR5MtGyA7$&X+;G`5Ech6QNamAO8n^ZP#kk*r| zQMJ>oBPVa=?7hYTxRRu1_^oUq;Gpnt1iJ2ni{{)YS>cZhtI!nAU75e4(f*m~)5s-x zUr`~oVR8I~Ocu;?GzpE1_ACw|&H1*|V0lcpC0qDuSupK9T%{q;GOr_&q2H``2m@NA zEbwkxG{l6z@wq=4c70JK~O zPXeysapt62(7Du?KAR)J&AY-rcrK+!Z^4-~?S{T&^BM``8V1PV&3?p0QHp2bBa%IJ z+~DUpA@frs`P5A=65aBu>{1XBTo~kKx2HzE}?1cjog5>T;30ev2Qc$&&ZR~=V0jI;cxS|>*$qI z;Nq*DNDslf`@CWrp#H=!&vaY1Iw3xMIV_BiEh*@B3r|xXepcgcldiJ5 zw0#YBUqNN>b_LXEw__g|`*pV=w@GMp-Q9z$w(d)`%M9P`jq}sJKNj0~h7x`}TkWn@ zq8}tAAmMaFel9H1>z(lCdx47%LUiwUD-E{7cddNh3?mH~$e0SJ-YYd5;|6r27UReN zFz@VtV^`?rukH8xf!{nXkn>cxT={twHSUIDJ{2BCqc0Kdr{%vw?eE>}0})-Dg9Y6V zbm{nqX@KRsqorZSwqtw+m5e5>iyg%T#ZK&#BUpjxz^H%0R%3=m8(YLb+I)0bC0eMa zfmF6L$VX15#@&+**rD&=-8p#5^A|-2dKG3DGL`bn+k{={UN1#IO3ZhK9p}#fa}StA z^007DCC^U8_uy^q1zni2W9Vy!ws?}ud)T|<5J31dXBTg0>9c3@JLQ+-T@~%GTZML`y*wTpG21eKe(1de3+0>r zuL~K$&^eWSZ2*maId%y4?_W^Ko`BxN_LUIx-~Yx1)^M@!4+r|#;YKi|x1XlpinN)) zEH?B};B^*_&ks@ax9|Ur^9G2;E?tPaHYqHluWB0e%^yg~$owSB&fiY={pZZEa-cs- zg*2Sl&ZHl|>_m##UtUIuqK5-9l=JJ~z2$QA|5#sFf3TApVDp-9O|p?a{(O5g|IuIs zIFqvYCj6lmYA#k2K!&Ju4^y>rP~w)i=66zp#L z_4Tef22~l)fBv{WQb6nsSpZ-Pd%1)fsb8z118dO)o$R5{U3~IB{nAIkzlENgU%}4S z<`{ZBcx>+3sf){U)B-8-D@q$<(g+GHX2X@l)8|#FvBxeA@&gI6D8zs*2pNMJ2U`cy z(k!+m4p#?YbLU_7UTRNdn8#zK7uUu9W23HKXi$j~Q0yc@Ge~J{xd4g)gPegNu970( zUU-}oYHFFHQ-rk98on4(5v0ICNl@wyoiDgv56)aruEqZ~(oomVBp3^=pjoMu+UcN+ z7dD3nCC8%^zW#dfi~cliBHij(b1DRf((sfl2U@5m+*mRdA`*a#BE*G$2ONMU-NowTh1mZLb%Jo|R=S7<=VI9*#g#QIX>YrYapwuKYAs1mnwC zhRW}Wr4N`^VTjlc!kE^WYpW>%Tnpwzfp*C#$F_bJ&0*e`X(ST#7)M14bEMZwprwf0 z#3!?cv)0VD&c2_(-aX1#Onz8&I}4g!L;B)-E(4G$e%p7?sk#pK!%M z7m36^3|}&6`EAoax;I>>5fMsBtsJV(emez+DO=8z3uL<8|LpUU%|J2eMX(q0#m%*A zQNq+=86Ok4&!2Pg+$U#Sa<%2D3L|616I~_BSXe?#;ipuXhqtm-CXXHSmEd!k zs55ZW5)^ylJECSKs(~=Ol+~4xK78hFH%9eRW$4phXpTCJhQmw>0$NZKAHpD>(-%ss2nfzISnIcg10Oc5|2JUnq zJkQ~nN_p4h${N}-a?51O#fpiFCHhiW-+0853n<8Etu~MKRbR$UbBvaAAPp`_ZDQUJ z5;wF_-)}xav93JnJ7wg2<~&`_{U83m`2OGjG^dNXzyDi* zoi+0G2>Q4X$r=BN`x_--#H0c6rS~4dZ7@sh+etlPBv;<+Teiye@5L!x9+bxw-KcPnJ57%d_+B&X#-hE4aTt-<)#3L}FT05uHlBgQe>Z(E* z*x<2$8zdD$Yks0vqQO#s<&kSvg~Q$a|>FY2g2UE()s!?@63ThUU`uQK_D!bS!92iW!WrOR7;OjgHDYC;VD8~&{ z;{Kg~EswU%qr}0(scw^&u2JzKngEhcm>1tAYm8}fP!>kBhdnB1=9+w^M?2AyjW@BVLp3eo+Zndh!ZR@_5-u9oB%=6JFJ6ReJUW#1OX=;Jz)XI>MGYHlXE|7{- z^H=Ep|5iD@L&yoW^J|LoN|C`l{QnuL>8E(kM@U66limU3t%-e;P3y!L0i-G3NdlvE zOqz*D6`wx8ciMvz!1$WT5fDm*vh79IgRR1hXOU_>0}4L9+-b{G>SSP6ocPE|ifW3E z7Dlp(D^4Tx5JZ%trHl+snF@Nghao4o)Uv{9@SzwKu6tm{BjG~UTqb5G`v*fhwR|5@ z&C_8V%Ts+|Za*Bf@Czm17r4m40>})6A%-J54#{d*F$=_G{IWo= zqKDV^Mes$5i>+iO9AxpsGvir;K}7cS8Xds#5-feD|vQp@mOwG8QO0k%h zLQt&M%wUZMt;0_GRuYaTk?UyTGKv z*GL92F}P}zTF0ViE&JQ{+N^36NzkkdQJDs7X_QXvn2utBgs~Rx^KL&khhqM+L=;!Z z0UKrDy1FE>*N}q5d6=KIo5iS8WL zEib!0O;+A0Szt*iV_WXFT4oV}La4y%v9hhW5nnY2^jIi}NMoUx;6(T`e67%ADs`{<~o zNJ48$CFm6G!3;4k#Oge7O@l46SvROJ590lQF(>H{OY?s5apB`$`J$Z8CSvlfMJX47 zQHWZF7!+a_XL1m0Vw{3T%CUNpr6W7l%1FATg+(%ogv26AJ;fExNT6CT0_{4#4KP8= z%o&oJSv}Ko#FrYWo}mPThSW~p3tU(W7?7@KfTAI43`EET8BugYTg7UPYEl4C&K3ZX z(!8AHtjHa%1S|y&D>C-P#Hc_k=9Lz}4J2h_mZ9t$l2~aV*uf&Bi>Ofbv>;Yw>VzQB zqGZeWmOEC7TSib$Db8y;8al~DB!ga934lw-!W1)Rv7efv1ajqv|x<>18J#@+E` z-UJCur~y&ZdZEG=2QfOtBh0{@;dGd$^y4tI^l~~ROes85+E95#KGcF8=2=CW%d{r$ z_}MtE9%d*kO#_n^pI#K9gfYx^5+oe~Q=(a43F!mMZ}#AB+u}*ngP9YkLJklj;`XRO zp{S6bf}^^k6u*ZbCOfAjsLXH_SQLQ@#4%!0?M7BGqDo_V2LU{8edqke@P*25E3l;R z^|?p9J5p#^2KbB%wgD_Tx}0O#t&UR<Oi11CjY z%1ll%nR6PRi2kriS94|=f61+tWp9L0-CMN=0T1Xb~kT&qbKhj*T{ zq9(I14=J5OXR_V`n2ZJkA4#>v7egfpT<$rwJa2zFcRiC>w3mmBr6datkpG8gvPsVs5o#wTh#+)Dlw;{e3~I5Gaw6~@I7an<7_OodWr2`%3vz;i#IZ|v2LQ{l-2j*0+M0!#p$6>!o zL%Sp}lqK~V6GbJELRbYNrNl%QrcVF*pK;7Vk^_3&rJ;?0qz@Dz6$*gT;VcIlQN8jR z6?>9jAIQ!5EcryJo=K>~1TgYbia!x>B(Eel0PP#rPc(d%)~H3))hapCJH6;DM6}$6 z6-ZR!@KLob<75WQ9SF2MLrKu^77S`Z(u@wqdW?h4&a@8`;%_sgJhm2?Hj~0oq!43O z8KOF40LvkC-7|MmZSa{KY*1j<)r%-(o?wuXm#WFWalLzEXB><5h(2sjlvb#|bSVj! z)UF`GI?bA%^_tReJfAc5?D{gcS~!m5VzJe7u}1BsN-C{~6i}>lfkjAQL816_gin%e zFB)a1_QPVB9Hp6BJxKRvSOQmMOa_fhda&Z0z8e6)5f z2t`Y`09C1%!GgkgQi(^m{cQJu`6$;So%PmgwHRWUstLFWnuS>iM4S(MgjUxZ%G4w? z=Uo&J9r71v>J-2825+&fE@%Uxx$k|h=~F!&g56-}a< z0S``-L&y5@M&;qtzM1qR$dqDCF+^?mNL3vo+Bj9fO?fN|Eu2_b>fRi&ROc?~OUu)WXf1eNJ$V=c)5?m|{qqJIuJhKj}UMljQc!w-C876hJB}$R4 zj+_@L@D!YJLAqSIY7bzcdjP;tIWEmdUkVGJSX65^>2P1^{PMQg73Ao7QCEGDNR)M(nr^M#$&fG(b)YyueAz38- zyGjr-qjC%Te4TP@#b!UyfAZ*I>Hpw&Umf%SxDXHm00jU;LjyJdP!DD2)FFV>FSg9~ z_CebMbLKXg>Nu?%$+KD?fZG=J+PR5I9@QH6y#M_mC^P^xG+;Ib0Du6TfFc+Ha~P>E zkP?0gzj$@m3c7$7fFNkbBsr1|ws>y*1~W&00M}joyFtKcEE5-800BnU#ZDzzXpO~} zB1cjr7B4PDV`(hB6g0z7v$JuA0MTGWJOCgB07D}HMPLSOwkBdGe48*SvMQ3cY?JJ} zFTK0#?kl@wtHzcqZU=WT@Am<&ThivN1P&PK=pO(-#Lt9GpoxF^&?7&)=+mL>FQ5FQ zSC>lKO;j4{nb&@$sp!$CdKf8}Fx@~5?*`O?U`^{!nn(xs((`}#bz zkC(36-Yf4u*VglL=4o?sb2&4)ls=yum*|_#QvS+M*0%bSiwB>^PbA?;@{%nGP^gpV zVUZxY;$Q`*^zp9_{zo>EH<6ji%$%v;-wU6i(ReYoDfShnYBjSSmc~|sIH4X+Xtvix z5_aJ`!wd}t>WF2q4QRBbfiWkdNl5uotnE~IcJ3SRr!qr=fh>a+@%ucxfYlD# z8RG0~ZET0oib$x$7)etTERoo#S~hI=u-10Nwuw``!^Lg0O?vqd#-a#St!tta42&v1 zS2oAk5OJOxJM0ML{ZMI2*%!lBJ*F2LCbA|APmxwQ)7P5~NXehVg3V4_$qtSx+KVJ! zfHj47`--$U)vjD@qm?XAhkAdVDui)3Y@S$0qFMw!wwgFNS&nTT)-@_c$+j^}DQs#R zvuJaz*WK9XhN=@jyH(g6VU&`wMW9o$fX@bF^ZY)BBD;2*I4&c2!-X1pWOwBZ+sy=B zz)g}zi19YRv^>Z9Ij0aR^)$NswLCiR{K$1U7HOft9?wK7U;*tbsGhE7mB_XOpFwnJY_Gl{xetIa`nRg@x4%D(NN> z%E4)YBxJ0qvDY+TJ`QCzP7x7f3*ddLUg`^OB~dGc=qtx94BM^AW|jXibKhbIuy+}N z*EoAnmv^#t8q%V7+Bxs^m_72IEG};!mr>?!1{v)0j_#xOv9a?Mvp|!C#t<)B4JjR( zZT{CSqr7#3FjM!X};XdMw3njCwG{hhWA?*ia{YHrv6z- zK{K(~czXZx8QCtvK7i8?P&RsqH8i5#KBmlU=D5&X@91g%{FjzLKSw(lYC`Gu!3{~> zyhK@XNjrr1>{D2HQ9Y*FbANefFM*9AF^#ziVQ!x_`z3~+dT^P=UgGwL%j|o@yq~4B zPudFa2Rc7zx&@1{j}_8&hiJkmXr+*Oyvvqz%Y8E291Bsd>yuDsVXH3@mAS&K=V(^M z%4`J5n!moZ&qw@@^JpD9Y=u2I)Y%tp6Sns|ATjfFqJ9AFW+JP+IgZRXXD4P7Z$Xqt zkScb2-YwB4HmxZSa+=*%d*}`?XU3Q2$|g?c?ktqlX8xi)^!+S{=!RooYPS+$?(wJ7 zZtcURFQZG&qY1Sx0B_3o2c}PF^YyNa?}A|uuUJ#U#d!WWNDP@~7K0~370 zDiRv{p@@yW53YTmlvZHxw%bRw`lc$oe&WctPqq217M_@Abl~AZhgn{+O|z>~rxM_X ztP8YN^sJVmHD+}1do_L0NESp_G^i4Db}wCPww?QIQD*d79V9ooHvt#1$2PM1Z?@O7 z2kkv63)rfxwolcER%Q2z%B(>VTs7HEZt(5!+U!qR-L~7t8D?~R;Nvv3B_S}a85hKgSC7%Ce$+NYzmoZoL=jwlWFZ5J^t|=W;_agiyBDs z`(Cb%0s((Z9~m$A*TL~VJ5x!P{h0Ui=E;BkXGmA4ZJ!er3n{xacM+1ItxHj1^@)A< zjonLD_IHVIKGoG_$ofHZ)2TN2Mn$sjN@u}&bJp3y5H%@pKGoO1>em?@AFK~6TXh_% zo_H4vtW7i6F5%6mc>B%0I{RMPvV12RbR8JG<#d zA6FRkHoyS5W}^al0>}3GcYxV1Wx9j+wTn34T7NTEJ}X~CtH*_q1{c6He7cR?(enYW zT`J6ti`KW?1r>bz@bt*L=^>qTmmiDl4t=fLk=h9kd{`wizHM*!2pbw8Z`Mxx4;0QT zFT{)YDs$OQ(OuZ51FgpDv1>Q~Un~AE2a_+H$zJ#7UN+VieN#9h!h-LSm8}}qu6Sh{ zOY0~6_MJvO9x}Mu8yj^t=ds;5Mgk#f>F_I8vl3z2PI&kBa(J-&rhcJP=XIf@ofUg! zVm@E)k-PCx#nyHozZB3JIk{PG98XSjBID-mSYRuMZ(V8ZI7GZacrg7N9LY?KZ|*z_ zOnsX8J_|h}^HVH0?`2JIgJ*E#MO7*EJwCH?-*$c~PkeNV^juL2zPIk`?yylVe?JEM z?z3hQe(5^*&8p2^`V(sFxgrJVjnzQUU2SYu;>TW3`=HrxpS;{?uSSObkhwmewdB8z~?r|6WZ$C^clr!do}`8jn95v|=O2Q&0AJDn&iUUqn4Oge9``Z5}hF zW>qhr-}|x~?O7ZDKkY<7@$b%Ih9g!rxo`A9gYQB_f4(wclT?_s9n-IO|1Vpd(qQ*^ zn)C&Lqi-E{`V$p6g(Aeq`-^SHP4nA(^>c#r@{~KM0QPrnQ3~nn_BRT+gdl9KQ0;U+ zm}dLePTRL|^f0VPNyq74hRt^4?g=+kK?`ehA)BHzwqI-G#Xo~Me*X1MmiU+%;f7I%d0x@Rtzr=;8p0@c~=tM!5QH||-9@{>Vt-o>94tU=ZUiPS$ zZlSA>_O`j5KcAuL)BaL)Lc_I|LfDtCBS+t=W3ZQ>^+!Kx{myy3!Hy>DF6O?QDsi7B zvI}4EH9{@>GYgA2JeL0FRcq&7r&w2e*}Brw@Y)+NuHx}K<4wdLFD7-H;Kh?qkJLv4 z!$P5z-xA{xJR1ul-j9UnL{TsbHcqI07v4NTSA4r=b`O6ms!NqL23*)Ehm3+nSF}0_ zV%k!>vgt#AQm(D5G|<2Pz(Sw8lmZ)HPHbEq9`b|P4kdpJAH;)J7mhQdv;Di^HZ#-T zmyUZr@5grgdO4wre75Luf?Y!bzU;>VMF|fCl>ji?*TLmyXU&JE5}u=aoVAWDk7H*l z7DLgO+T2IfS5Y$j9Y<=vru#rGT!^Xem%%*t4q)`|O8XH0l7h%&z(8mYB(x2sRmygz{e z2b=Rugw>L(RMBhuL@Bndbih(hy^0?%skEYk$KIMZ3WCwY$IlcU+uwwDI?+7sEaxr{ zhy;q+f-??dzb#2i>}__>+)1G%y4YFjv6Y>hTnjW3p?jg=|Hr7L-fJ|-<6agG2XUrs zxBJHImZNQF>)}KAgYx_F?B2C(3sCP_+kSBOZGZg)>N`q$q^kcsAAVN-4ry1^Lw}B` zJJLI+|LT2}cYN~hy-J5#!oP0@|NKb*{5J9D8*S%ld0PF~QSZ&y-Lrty7;!OboH(8W zkNT?8>1>>pI?2p^wb!duxhkF^iAvz#L!m!)YJ<2czW_C^Kh~bdV^+7$j^0av0MRQ* zjbGPl97<%t4S3|`EHFqPp4(UUZFJZtG-}H!aUs5q(%lz}JD!IhpH8Qg8(bI-&Ff89 zV*Z3K*L8f`E~2sC!_2Sf?l%^w$YgAGi&-m~xtk|X*ufpedE#mK4KYtrB*D8gkI}hH_A-bB*xwx zU5fpe=73d9Cp&pu$&aFInQ}1zYWlbvTCkribffB&p z861(F5K-W#ZPxlj(<9eB*%%w5TA6m#lW* z*x9R7pVFV9n(g6ykBMn5%NWSqgbCjH7Bgv3@ydn0)^LvB6Z4Ya8F7ANnv5Tw9uZCa ziHwaj_Z+||jK9}nLWAePb&_0R_& zpkv2Xr&0TRN`3zO%J;WlGqiV~xrv?h=LNjjgy_Ywx^PrAK(FW&kF!ShPmi;B?&7MJ z75rQ>=UW8jcHQdlEZ6P6!5XY4UzSrR=h-o%WzsSSH$NZv?5 zCWP@gavO_WbH{&Lhge69XP7|!m`q+^aLP`=G8inr@jz7(Utd|^ciBn7`%sfwXnHLKu-Lvi|r7axOM7}@c?yM$*7mxF6%{xjS$rl?!&f(IJaU)aQ76sg`a z>`(YD1Ff6w8BtBi%6{g(u5+mPI8FS@mw)A{5gB?|8Ii%{;=jCbD`RN-;$|GXmOAxp z{N7-VpAqP+g+SdGnT{wf226FPu-u&%WUOiqWls=X^Qd?7wYd@s1zEWfB4Tn{0+v= z;fiN(UY8?K!crF&mY3%~o1nCY-Wig|=_7#Ee9nCh>D=NzjJ`ex}F#Cx&#+ z^2u^+-Ba>1CI@2y3D+FtU$2RkFWeGNes5j|S>mhwC~00x<-USGEQmR4l|+CXaowJC za$9~_QkpD`WWyVL!Psr;eIIiS7=Lez58Dnc!yV5?9?tChI3=!~-qQT(3mx$W>N$Tu zqFulEJC}vWv!@@Gk;=?^<&HC5Y+;i*ZsX7X?Gg>QjmW=R+8-qkj)PiWaH6SMY~;6% zvwAOA?&dc+&dLX}I%zQ}s{Gs)8Rd^wK;DD2w=ZW*dcNGHKl4O?R4y8+@4;;kwUTh* zPS^*)jD&qoyyi<&bm@Qp)h6&uDRDYs!|82_550g2^VsWMradDObh5+UlJ7qcyC;kq z3K`)~s)r>LN8si>>P2j1#!+l+kB;giHayv!?YlSsB{Y>4yvNMA_?v1&Ui2<9eVZ+c zgDt0C^rmCFF9i3RT`XU!TmYaz?C27aF&-1BMCPd>)eT7X)319S@Ul*(T+b3G5fH`n z{0FB|$8jZ-lcKfTWA}ckC0SZlc&}ru@u`5~pkYb^1`jGQ184q6IGf$D#jUNyEP__@ zNEjI@h;%-DteV zl}VZF`;c>1sQLis$(E8g&G9f{_VdzP8gun;pPR36lj#li?%?7QJ(LQSASY@c;#dU1 zhQ(!BUY~x7_13+^q?`t+6yhBNgD-}VYr~p7R^P3O7k4(w%-gY>F9g1KI)J}w)%9e{ zBnc@%Au(fvFbUu=^V6aFXTf_;I&Jq@N`c0|*aN3rKu0EivL~{bhYh!PHp-Re<@#lr zIk`E?y&OUD2#bj<>=tr4^^x%j#geGL+qYA|xI15yBYQera|?JVm1&VN)`?t*ClZ4{ z#8S+gh4ef5@}9gKN0*b`$K%Rrd(PxlqGQ;!%%~mNLbfOMthu`voHsWwZ%LvA^~X6$ zjV5E=*RUc42YH@%Gjl(aBa@lPk?H;U(@iSLfy^|qtCA@R+Aag6H6<#ayZXV@4f*Mi zg2f|3Nl_%gTZ`;QRzaw6?&ogL@#EoO%qvtKHWY8)RjMN4ik<}YqKI#sHp)DexnI>{ zuqD%REqp0F1cXUMl@DS!d{)MtO>tyMywh9cy{v*j^sq}UlR>Prq#gL5Mk%$@!kRYB z{GQF$UN9|C7&rs4XZ^p%ov}@CG{rT~}IYS`5^M>P*zOrx1q=aPkLB$HFB$ou| zDI@d5GfoA&cbRx2kmD1qAOaT2iZkY`nZZbVxTmdmhIDD`9fuYOaNZFM=k#8JNuv72 z=~2w++MgW%Eu^8{bJ5oXk_xgs>t zdbKUADlLc)Y)*#j7j!m*_!Ra`p(VIQ#Ei-8 ziH=)@`u&WW_Eh^md-vKNBa!tHh(Rbs4HXT`oDNzjwOOO~$@;W<>Op5|o-`1=zV%)NF*uj&A57d_p7Z2*C+-{TwyIuK zgG6bmoS7gPAPz8E4>-vxMD04|tch&vpW$1TVFr_>15RA<4pf5KGI%!@&Z?#;+)=Q>H^82 z#7~9NN@~|G%*t|>31t%GK6Aoza&|smrx}<8!3?Gpti{@*?b9M0W9#bE$yW{xFIAD7*$wTNdoL8-i z2lY~RGq3C8-khD=w=S0u7Wiwd{nM9$$ED4;QEWMDa>($)YFtJGA1c$O-U@t#1KfV zff0Ugi!Q%siD5?G0;H2CkqkxF%YaNjRS~=2V7h??#rE zltQf~NQo{J&+ZB_4Cm(e0T1GfM+k#F`j}nO{J-Mek1ig6{PT0SxLMiH+OxA4XxJxb zG#$oEo=Ba0^t2!{^f>Ln?QOeZB`3wx@~ zgOto=mFUmYdSHn-QKqD@%d~R~7!^`f1kZtQ6ZuI?&8=hND4deLURnzz8FP$HD$hS!oGq48>R|tePDVcu zaJP3L7K_Ptq753EU@zgx$V5@;g+}=2iT@&}ZOsZjID8K=fr>&@D|431HP>;cTa<{` z1qmyn-7{KJgIY#0Asnd--b3=ZBtBpld9@DCGs@<2ks2lZ=Uk%H|DP)Y zmFefXK2P`@I$`|ZzYX%UzxsR6hLl2s_>-^}^%*dfF{C1DeTAg)y|o2rN-z;(dVZdK zb~vRF67Z15Zmr2ZKzy;~6wxhff~q%Vic7|lOie_MmMHw+tZ_9=m;1?$AYaS5>6vzN)s8TEh2DF zNRaf=0B+rC7innAN12^V@4nh^){JT&Wfs=&M1hAuLn-JjDzT|tDukS|rJgw&xONU= z^O@b!lFQ0}@t!o|^@cpIADEWMrF^DhmTM9g&91{*QMV1nr_F-UkJV8XSf$QZ2T$&uD*-yMkaWk_+oz8lQ0B?+1JdDUwT zNq|g~jQ^l30e0s8iA5dtzOOgFS>$kBCwVUwfu%riMm29tq< zqKvr~Y*yI;MLY*kfO)71+@|JLZ$omdL4pv%gv6uK5~L_o(r7gk^ZJ40=^0|wE#xhj z#Ej6WUTGmz6U#^(K{V=bq~X|WFO{*In_g+aM_JDLD2s`6SfdO9BctLQ5=X?E@S56- zm}6EFgthi~h|DQ516-#FMh8U8ZNa~F{Y-^o96F#Ea)4=&uvNwpmX1?mM(+FvLeS}D zzFou!NM8Y{1p13L&YU7`gWn}0(`j1IgOaR%niYj%IU@jusYZ-Pg zQMWsrByG>EsqzfTa#5;Q#Q3CEFyg}_LjTx=Gw5MuWw`Rm+hkrjmJCFhCxpaEDV;b@ zFRZQer(L;i&m*5^0znO8ObQja=!@tnPFzeF^kUGlpgG?3M;TTLgOZ8u>QEeH5G#SD z1{Fx?zz%`1$$!{8KQN(8UIjaV@)8m{f@f4KDhP?FBJag~kB;k9kGUQqb`)h3k8!!w z59KSp7fP~lV+_Yqt~s)d9FJ&zMwL`RuuW>As3rtRSo#La$m7e((nQ*tRKt^@gCeXlkcE9R zRUx9aC&G(gFEKXFmyfhj<2@utL^BNxk_p}q%G63IgvET>VsncnQxGB;Ice_|jT)4y zlyWR((2E%$!q#7%AC;GeylkoASwdUXFV)qwUY+qZ?pSbn&MIB19Q{v34TIuco6>d%A;+j2 zdvzGJ4o|h8aY+dCuMm)t(_gADGc9@KJHYdplFX@2TdDvZ&{hL8E(;a*hy4F)z35Oz z++!dOG9uMkD+8g50Ti{Kl52r|0|(M~-h0S{d0Wc>nvB(kUP>;8b0r7~ncQo5cFl~g z^*v*M#?nTQ=1C6fa|;+q7WF5(4u*=9(dqq9;`8aXu>^O_YLX?y;sm}uiEf(Y zYDxwX%3M=<^GD0S{w+OmYn%lu0)rxj4CuvxL0RWPDwEXzB<0wB?|JG5-%a=D>V4>h z2?C-tC}$!~8%&N!HNa~D4*?eRwsT5d^l6HnVxesC)SCz3)l^)X zBz3Ch_Om(=#S;%M`kUVvvPS@!fe+V~(z$~Z<(dwIi1x=Fhmx>*`}ae%(x0Jw25Cxz zd<@u?3_~r{6Dwaa4_GA!OBkoYPm1BwOItyzXx0&dF~Sx?@Q;=-!1IMyp~mg~Rl!ol zUf~2J_l#1>BqqTi2uj!zhABJofA>$^%cb$-e5tVO|5bSVbG`pKVKM<)dN3miiwMIU z06s`kPy`qi5plXeRQ-OkM}B!9QwmWIo;exr4}lVfQJsNo$klq2O75IzcslA1S+4RpAD*s5|?;e@RuHKKs%oCLgxSnGsAVX4@wa;Mf!+5W^P z=u}}aEEbLd5IdIyGz%Ti1O3}S`TC!0|N2Kypsx+!4NcZj{?O{!=xJ(LfBO2bcilT`^sTD2<-KX=-NC0{zVyGt{Q;;mCHFlZ;0_3W)b*3@M^~9cnVZj7=gQgoxmnxXMG7_`PiU+(ni)+43UPqC0zn*XC}ota_N22i zGxV?iDo5-@fx$Z$nR(W+v8Z98A;4}t8rllDC*|{UGPEB$$ybL4BTpioypo3fjSpf` zo9QNl2BOF#*misDZT4n=nodn5<9O5=3|5s^A@iLR3N|F`nVL`Dcru$ZG+Ujvh@-@o zc#8=(oFgHYuM6`iF|t|Q^<0*-?zP2&Vy8OO?$QP`vcgy(3j3N5O*xva7F$?hohJ`L zDl(2=O_!A=2_a3dG>x^=>+DH&fBfm7P6ooDec{(kXAHTCH3gYw%gDQXyfoPFg=DeK z@0yeONP*RS!p#H)?M@l4nfWHtxfn{2F>V6Qb{Sd#DU~|j8|-46(m0H@ll?he?n6K) zo$-8!5$>Ba={i1}gwz*JhIcbZnwbo(hQ54W;)xsVf|%tI)d%UWGZibA@O^H;=#jTn zp}ow_k5`(=YHzGe?;VN?H zWOt+A{MSq8w6&!4wN8uePK5%vs+bUw9)i_2IyZ z6v_O~o9ld5C7hpH-8N0db`ED|)bV9J4wCpp{!-ffDtrl=LaNqtD`VN;}h;|M(N5!BcEc>&NpiJj4;M{d1 zmUVRJBsIZLHZF|R1$-bCvr z>xarG$KGS^Ry?-ZQ*2Xij$USNW`16VKTn_mvgUZ>iH=39cY0wPHQ}&9e%y{hnSJ;_ z!5+{RkNFL_B}mx;cVPw~26jXio~x!oQ+hXZ+9NuVQA=GImRp(W?=x!B*co`PePnD8 zKil~xJNe-zji_jY0*z?Q%*--TU3Q{{CaW*1E5Yyq(mQtM=Z)~3_#%=b(V)?|FDWQ9LSY%wpA;7Zr76w$>#YNjF;9Y?t@km!Iv> zt5VeaF(TQW_Ds=|31hz8CwB|M&uHa&fuD~4i*HUO<1P$FGOF?x3{O?q)n#|)igr6j zTkw9CG#7I+^K$F*TR92QuZ^3@hgRm!Gt4BrT-65=C%&}UX)vE|=htUsWOD*hV%M`Q zy4Y2cdysCx*0I&z8Y=X62{zyXrZwaBBIW!Et{H)5HZr%fCQ@3k4 zGxjU?A(0Dd(=~s0U9Evnd#WAS%8{J)jQj@dAX*E+VHaScUMyx8H}*FV6`yJvj^vv3 zdD+<^8PRp`wiX)4TtmJGHDBDed8Hriy<)%X^BT_mWnLx1Hsj{gmk?=bhumub;!Bo? zWEi{uc8a-P^0_=qmOfs7Sqf3Rp9#aA@ts{tBI0ie$OGszSfD2)y{9U?Z1w_yWaQb${Rx@ckY^EEQ7x7+@T|h%5lMx z+$1XsZw2x z?o71&aA60dbJ$&H9pRXEn!<-}pG&6vLMIeOc_(>li94c|Qht*op1ajX0%KwPIYj2X zKM&YD=Fn$dtUV}>>w(S6G{~bJctS_J#m>8Z<&QQ~J@3xoz3a@++s$P;y3R9}K}{Wx z3CCreY;5v+cjg_y=)|u1XVxT(wM?e3jbX<{#HDx31X$wNx{HfthBkEHT|M0iw^csBXM8P^#K@e2QXls!$5Ux`Vr{Q~*cb**T=0e1~O? z3>7Vg#!Xym`O>i01rnfNZaRpiG9h4p$E&-`3||HQWMIzDXfXS1}- zVaRRwD?ud(b=AA7#1a6sw)u16ofDy%laZB^z|l3aW)684r-kN1gNKsYspdw?SQvs= zInca0Fqj<9sKPtQVb9`k* zj;P`y*|>*=_rlA9%)DE#?4_DWZkfIWFIo&@pa*>H3QgxRNSV*C0~-zCws!j(=;9fB zj90^rDC4H34e@58Wh>0WYi{~*E+v1E<+1QL9^IE1Q&jW~;ECVXM;wbQczaI7RFNNd zZr4r!t<+}zw#m-El~Wp*ZD{ZwUCpZ$d1{3(D~j-5%xtsQm6gcR$M@OO#5QMB%0^yD zznnY}LtC1gxa)DU@i73s?034obIoo9!pwrQ;{*AQOP*FlvD3HMx6uy35*J(cTIh5C zuyQd*=hGf@+nFC@DrBQ}N6RbE$GmE%eOMq4J5!RtaVO%=(?gq>XR9lpN!3vWPJp5W-PYfE>V^8+N{-fA|?)r4)va>(2 zv@J4{!RBxgPi<1s+c4lTHk@54E^n*@9%ftRMYg+TNop*Zac1x7suEj9Cp zFLoGzY>Z$=I}7c|B(<}>IvWsQPE7DI&4pO#jl3*bsqaGt+i!BRbkb7BgLMXXdYQgl zpZ>6YRm2fn9je@XIKa$QA==h*>;|-IS=gA0tq}KwCICB{Rr}#M>V}jzHw6IC9J*uA zBR3+S9C0p*5};f{f!J8`N!?>1tBP)sQ%M{xNXV6M?jlBylvr=Cx5b`i*6P> zztdGzC~FSS_7vv18>=|^IsQW2{-AOfocWXOOLLw6wdmmZDA+QlkfsCF32GKr$k4oS z_%p;_J=r5ZDHJNw{@3Vsg$<6JJ0JzB4g5`+@J4HG(7)o$S5`@68?|1Hr0l4Nw_3H^ zRqd?Ri(##GJGo&0zFuT)^z?HwbFy+eA}L*r%2>`zGlE)*Gl_j(L;Lp~zjYYnz3TW20Rc`MlY8_tZq1KfRnfQzLkgqM}I9HY;foiGr=1 zK}LsojV4Uw=1?!ES!xX)_Hym{0HH8{#!nMk^Ez6|Upiu|Hc~;~oEQuJx^FYv*l~(g zGe4+S$^PrSmWBHIntG_+p^d{_!%?}c0zwkRc6f!Aj*USTkl(LwQ?qqUwb4BkWz{2} z3~!)2d?31HGI(a=lJi>@YU|ezGm))*zqsF3t-gjaA0Oftd=)o4vR-rGs^bXlTG(Gb zW^*Pj3IIg=`9z$fL@mMm`4-^6#Vxq9@d0@JNA*!kkZ)qhK5StZLn4W~U)ktwP2nWP zw#^+QvtJ*z7XQD$#=D8n6S+W$e2AugFn=n!fR=N{tJ`nl5Oe*~_+sf~zjMoKf3NV= z(2qH~v{U2~=F_*f^C0IUis5C1-B@+0Sdt}8^EhwxK^ynbn# zhMTFPZGJ*!Cs(ct;U5R=m&)4~g7hxX68x^1YQ;t(3|;gv4{yJss^aDikNW=IOYd); z8?Zu5UXQrh`1?HdwOKU9#JK#zsAmG&7Jg?hYRY{pXUOU3M{(!icUi)xvB8exTVr@@ zc*7Ve2ro43Xi+QL?MPG*Fr;&;klLN9w%E7f;jB($Yv6 znb}+#5ED`*-Z~p<|FqCnr?KaP42NWxrD5o;#W;n1lxRjm?lb@wA!+mbk25IUe58PQ z{_g7&G<9|L?w{>_!+0H~Ls<5Uj-6byu@bN|#A-!UpWIfu;=jTlQfZ;>GRDWwO6bl9 z(rD2djT0`C@e4~HhIm;K@ps(mm!`(SUp?%cd6Zlv)qELG$EL^pX!kzZe}~Agp6)X8 zQ?VLNlh@c$p~5usYp3u|jXQs0Z^kP-$49r0+g6Z$)MdEi_-&QJLf&Cy1({LBH^Da- zPdvXdZmWf!Z)Jd-^LUL{Az06h|6PKd#moa5c=M`B>t6M?b#yI!FzE$NFd&b0J|f^x z|G0K*UqwzQ?RZt-@xEWbM^jo$ar{fOpGWF}Q{C))&22fJU)4>(be+4^3U6E2Pg_g4_wikfV|=>qMp$WfUx@cEsT)dDy~0`!xB48cj1D?76#GnW zV^j%o1!(!`>vUV}_`p&h^=cYBr@?pjd5sOVI59lQa`>J*ix|0L=?=4R#mxMPw=Obo z9EWUq#a-8uPi5CAB~A0)>9Mb};R>;nwfO7NL!(bq;jtgzklI9%ksPynDFG$`GI+)# z^WmD#&l>Q~ag_r&>FE9|Cb7AfDBKsbc3vLn=Q@6aV1*n~#T3SIhnd8-&|iPz`pa1< zpWYfT0}1#?H4ECuA&8`QHWN2g`inAF&RD?X7}67dqS` zm6J`20Wq6Wf$|Z9UD$n$PufdO`hvQfE118#-MV*sSHYhBw6$_@?I>+s#7@06{p^*^ zaA1n;qk88K|3?%zqi-Lo`Ylmdv8aVo4#kNmCjNSc7Fk4c5<8C0lP!h1nR&~}v-5`b zyI`c1eOZNjwnomaYaRKsd;@`FTbt+TecIGg-2A&pg}eR-zQR%}x5b^y(TB&!$lob( z(Pw5(74SpP_vQf8nwO0(FKd}IZ!GJS6^JM0zh;;fDy#5fG^j1@P&9Nkw zVp0euk})ix<{;gj74rFI=W!4Zd)MbE`)9;5VsQzgU6zz_jBx}R(Zv7=Y}ktQ|HdvS zSgwMRNUE)vXp6`|8+>~Rwx^5JZ0y|+?r2b6!&^NX=~u-5FtVey3gZQWY)_~hE2yuD z95}gB)|M+LzZgpwXQh8V2pDLmjzyst3joDK1w+rg@3yx;>-8PgjO;{;F|7l|x)Uf2 z1VNnwB96%_{=VD4@YS-^D=11qpy+7rA}v{?$CW_^F=)qTBVGw{DH?F+Wd)~`jD1zT=84m2%uibumv7N!?ElV&y%_1yq_lY>f+ za(ugIU5(jeVO4lU?5&Sv%pF$fT+pt7$LzF0tNyb(Kv)_sl~Tri~jL9XUws5ce6S>Dq9e9mB-;<4J|_} z3xU6_zM@uq4r7L&02qn;Qk;9KhtL=wO%dA{#FQ9uXy*K~YMkGNsZ%aC) zuf$G50FokDAr15_yrfak4E;Oa`u>{2-mW#r;)|HaIOPhu0B8BY)SY8+VOw{b!RbC` zO_p9>wp`^(5waXhq|>6Hhs9%4GYH*)f&~>g$>IOBoW$Lh2AS{0BUC!y4bTq}N_Z)w zIVE`)sYTy5oj-%VOLnPl9ZwWsg7N9ViX*YbNTm+03L%si-EyVZZ1S&M1vN z+$&FHg|~I=JM?<`zZ!OQdxc-cFYdYRVvtju!2O7^N%!B^foLo{NmIMFSkjX2+hP9e zYiv%+$JshcD{@{MIp|pj=+Yz+ELx>iu|Og;%GYdm{7|gY6^f-qYBZ1#ZY8kI*swDe z$4H4Ro!{gO#fQUv5-CL@fkinL6axmSTtjD34x54c|Bpv+M@!*!mQo3olv#l)T_D_c zxR&F9K2=UUSZ-G+)Uaz8oNS3E_QWh?3@U;}NE+5eVr&#Fc`H&%ob9Rys67_Mo;Nd;efiKRQQZv_NC%w|r2n9*Bc0vCIm4AjN;A(i3{8JCDd1 zGNr3~KvHRh+1ZqOYz)L2m654_pBDv#bb7x&M`L7Du;d`Bw#Si^YH^{WfiP$wjtlaH zWs3Al>(-DvPeoKh<1PerJjvdxz5MOiS3dE9#I+K|*sbUeO{$fw4?~HQ7!g ze9gKxS`AgeTTX~y^9tB|-AG>FzJ zQ3ye-Fulne-7b(-SVXmxBkJYEvVcnw;6$;v&QrNa_Qmm;+^@NX-?0u^WLmA!i}>%aMUEmm7Y~N1ULn%T!ra(vDk$2je967%$We)xh}g_3&;pWk z2EYuOSVdw)=iYtVr8XF&NwAVN=va|`-xI#)N1kM0RZ`xD{sb%Cl*LC827Rm z3>I37rRJzleR;+p^Rl5wFs*bCv_7|ruq>ER0*Hwu~-km&~uKKwh3A9mGN{rOrgXm?MaB3Jc(<+?gG-tLnJ8Jn=&aRJ536 zP!^$J1j||pck|IVI9LQ&u$a~=h^Qn~MHW(|wbBX)8|(+@FLB!}$n|RM4j+o^CDLTC z#7KvE1j3LYP!6fwl3rx1JmLFJ!7Pd-qu4^Ih$RagblnF>VSVPZg7pj2$PDWpmP$Tj ztr5aH$A=10cIoN+ymhT7hgd^U)v-w(4i%PC0sd=h* z6&X9_WJNSMFMydiGcUCWt04U{azbB;2axJ)hfszcz;FiWOIBUkm6(EED#jn>l?CV! z+&?A%cGO;wQjMh5wO}BzIfHWmqA6EGmBoVx{bi%!a=w}~x#(d=Vv?MBQk}6D*l=ub z=ua;V@GH=NY3aHL;*vy&?9kD%r4}Mh!9ciOX0j_oTyGs(R}?+Ls?WdL#OGKwb3Z zV~!#H2l&EouN#xA45>Yx-7gI-Uv5L#BVLTMzbd}al_q*<6E<6S2255&+AX<&6i&_& zo8f1cX1)?{K<(g04626W`n1+e& zl$a}wA_|leOagnM4_8%F=v713N!{y=zFm2@f0})B-R_wG9cwsUAWOS;Qqb8KV-Vy7 z>I&0h(47!0J!2J^$z%=_vb^7+P+DBUH5@PpASkJIDr?75JT{Ljh-6oI(%V#)l8{6> z>w$M-(7E7qsl?Pk3My|PXRJ)#uxREEJXi`6Vu3D_1};J|E!YA}YqU+=HjIV!`ug3u z7e@_ySNrYW7w-0VE+e*(#1ulO|A2Y@7Ic_r^MsNLwHe>=o?Dbi8aq*)meN#ZafoxF z6^(EumSNR(05t|LD4ng|A|uLH-dDxpuhF;9IMNnroVs!<-N~rXKzp{)Z{%U0^fCY?EWLsS;QvAez0# zsccT8Wu<5;4oMPWgKz!w zVa>J4mfSf~ATh9Ks1Pc_98n3ILrf8DEFiNB`C=avvYcg>Knxf+kt8S}Vj~zr67a65 zE);&RCrnH15Hb`f6huAdaqv;A(mAR2cZPm-O{Tod=bk!ic2bZeREdHJmLi#X3i>lq z6Y5#Bdh5J{)xqyQ@>`P~|K6bA()tDdUZviEjZ{FX!Xc{UTg0Z`&X}(_($eo_$RJ^r zb&SpmmbhZD@sL)0EVNLH523E#+b@Rh=-bhC< zcPt{XQ{UZtUnHk5$SfePyh0Jc${|>l-$KB4R7waX^}Y6cLTE0PYYNC#pr)t=emPVz zb`Dt-S;cO6P3qCf_3KjyJO}I^XlZKrFwPD9#)I7s<=_7jMl2ja9g;DOL(bMAQVnX7 zmg_@b)LCw+b?96w18*{t!cHBzz_n`WmXJ+FF|DTFlf<9AFA`#LymV>DRu)OQ)H_9i z27YQ|=vVDz*4@SNoaJkH=3aQf&adBB-%Z2yoZI=pf85utGUGuhfGZ@Eq!z3!T#2ZZ zQjx@rCmtv$y;sL37s0a0JdtxPWs5=b2SVV3q*6r0cos>;HuZg7)Z}*6kImf=2#W&v zjRc&oB8dQ+yp!-3St{|B| za-c!CuH@acI;G^^M#17MM28T-5_>99Hrl^3Go<~ICG(|Segey@fNZ4z}4Q6NS}uDnY%fCFB>9)J!6B_VxAC~X?WNEVdc%z zl*(}%7?n0Da$?643xSfYq6W&A=385DD>(jbVWkaD?#D6X)+0L7Lt{omr=%FXG{vvUdM za|o#!t$<>}zA`zYE2z*#C;_?0;JQCcDQzbp5FmC?Q85=Zy$ERK=rIst;A350>fGte zP?8RG9HKLkAWVvnhzM#map>Ap~VF7mnJI%!bNL8uT7xL6~Gy8xU!D_Z|- zS}q>-At~AxMU)2ouI18N48m?sE+%OSWP1pmkHN2i!16j+VhtqgN{NU7GjU6c#!Er% zYtLBBFfLq5HOmJzAZw;$hsUohETtb02(>CQAW<%_30PozxmTvOCC5nkOI7;VBiQOn0OF`4UACB``&4tKOB|rp<616k8voRI`)befv3d+CxKeO6p`XmT= zMnqs6?GWNn4`8AlcAUea?zWDru!?E>bO;EluyisZ(S%*J81Vo=1^{Me0F1#3gl?{+ z5l{032t;!OwQIX`eY^XbMzaRftwB>RUikBdWz;OmtA z1%K)6J7qsw=7Rh7C^R!W2H;h8uPYC&uAub4`TCyS?Z;~{fqOb@V}!7jrXChmID#q3 z-O?XXlLvsFg_PqYrBV}!d`UUAR4;+J0!_YDUOU6a(dhMHy*hX-LZVa}>5h<;)NU3@ zDU2nsL^^3r+wh$4cZ)dD+cF_ zKcd96LC*rmXhI&()P&YbF;(Unv^fvqWC4?YJr@!iG~JzJa0sLx-AO(4%#zemX|kU| zHuOAtxlz#1O&F~bi)|$nt=5Qz8X(|W_vnqyq0Y~N+#WjA$DKW@R~==@det zLJb62JD$g4n)2xU7^WynE1kY_4D>_DEENBFh_8fQ{tr#bmk(U{k%utkQnNrTlA@foC!*M&05_(+Qp8KGAbu_7C zpfF6wBG4_}`c=$XWIUmGUOqMKsv`wzb9#aeTC{WRPX7R9ZYV*X3 zBct64jM6(Sw_K5sjf;1#Y^le)TgNlNqkH8F4Sy|!d++n6oVRO?loefLj=mruRGSt;fbue{;+=ym# zOD`V-iJ`ZRvn=QBQ#ld3L=t++NvxM?ogucSfQ#Pn6>tFmLKGqhTGO$*O-e=5+6AdO zwUsy?T30r7E#2zWx$`~PiA!M5YuhS>YA6(2zd9!NU4AWu*I`d+Zz9m3r^XU7g#IA^%H*qA){g!q+g-Nur1GRZx%Xrw6K16orQ zy@=W3|8g+)uyGi=>|87l{kdz2W{QPX*v2pFfQYbM1eMcRJ`lfT9QLK=lc1XLC9^+7|ZY# zZJG%#o^|eJa6GYmdUf4j>#;Z1l(Q{uUTl%*CJb7$0}<);C)wVOJ`sS>!kynEn6J?w zwdDQ!DO)wD8Q)7U?L)&3*CGIGyPWF0N*FGBCYRu{jo!w3xpP?96Zf_47T*txzq4L2 z1o9$i5_DqKal8KQ(Ak7@50@}s@UkAH-*qhuV3kSj`lh}|OkD~)hA`@*OUmJ!c}@L- zuU@uF{fJhXB}6!`Q`?vy0+PF!&=yHmbi;EZx2AWD#^X1J>{DJxOst&Rpz49NWC&S{ zByGPl>at&n;o%?Gy+%19Dcp@4^%tRa79qdcn2cGC?043&7>|$ic!WMk@^zeq_^_-} z@A_4RwYL1e^@NCSsBK{l8aoM#VOc>|fLVOaaA9jOHKzEkn?>boK@L2{5h{PbJlnL1 zlET)Q?H7Uk`uTYOlS-k8acY9Q-`C&n!s(c1!ue`%3$E9*5X%3$T7aRTAYI~gb(LLN zignEPLA!&Cz|99zC|>|uzV3#=h!wytX)UQHPv{g*3uJ<2e;*YsLH?f(`8*-}0Vjyd z-6}Q$Rj`-}PICBe5ras$Y(hosEbar(e0-PiZz#{B4VWcRz#xA6i{d2a*(62rUuxe& zuLpS@1+osc#aqZa2f`=bdxPb=*&2rPly!5P>j4YU1Lh!ECtW)YXb%3!jA}=e$mBlOfBN>!UFc)EWZ8gRSU zn*u5OQ^Q?%x8B=2)G6$`)tun2O%hyN;}ShC54b3Fd)=w8C5ywVVEYUEB)!4*D+I!L zccTMZOXEk<#m|N?eU2S7!cd*3H1pa|oG@w^L5bn%TO6p@#XYSO!520X^!LPqYC1Hh zn7`1;qDtXOgoEq9SaZdlk^f3Scd5k-aj-Hw?Fc0>!f97vUYyx6l6mg!ZUcEes@sry{CTh`eyH= z85!BXUF#QN$Wf|W5*APz1+1Q}$aFWj9aiKTUtc^ZoQ&p(_TbIPwSf0YP|6~gyi$sx zx+hJlkG>+fqY-R|y!(f4d62oe6Xt2Bn2+cd&hV^S*D1NC#?`Me7La|-G}Nt2AMK*G z#on-li}!&5&7h(M9B=szyAgfAD3r!a(WA>q4`e|O%sW?2DnEa z8z=2G95l+g@G7h@RAxOTAt4EC^E|2(cxyg3obydwm-?Y}rj%aVDOhws2iF12G)D zT@F`!y_pVnjlS-hYxj)g$FN?CuqpsAO+jCJJsvWTX8AkX=iyFg1NV26hrnK;$n-Xc zZkJO;-D6p2pS5`Sr?2^HRkT!PEvzfG3F~N^#&6A)jo^hK)>?LEPi8b)yXSJNyX8?s zZ=s|xUfaYMdg){fJB}8FPJh=z2kPwGsQ>C0pX4WyCCZM@?y;XgP_OyTW|2QQ4$?s~ zP8n{8v1A4GDgMa+;1J6LuJ!q420zrgGcdEWV<>a`P##(P896jrJTm?zZ?`mY&i}C3 z3jUSVzzq1!_A}#wkc!~E;)nM)(B2R`BofrttA(CkAKkTGhLsv)CLou5`f?jkIH92? zaN6${*3H`v-A>wvsNjTXj18fS`IaFm)OyE&uV{z0#gdsKEyUxdx$s>T@RUgY8K=J@ znSQre$O>gCT59&Yoigv#P!niR;mnNtkN^9mJad3@a@4%jD6V>o#+0CCgJeT0=(WMqqcjL9OL9I zBF;3aCVMaQ?>8R0bT6NzEaRv{%-_a$J2Oa6c{1~zw?W{BhFh%lZM~gQ%-RXtK9}cH zjg|kY9xfjAt!9*ZTEPJ5Tm9lA}Mzoh(!P2JYne23!v{4y8McHQ}Gf@)}vYyV(lv0jj;9yRVb|MgM# z#%^t0-Nsi*K?RJ)pU3x8CD}pr7TQaa!Sj$T<*iuc1wKFU*KvP+juwOKtiAN!(Q1d6 zT0W`KQP6y+K96od3&z0!p=UEr-!2Lwzv_+5-B`t+AvdYLh*lP5Ct9`b*5B)G`}ilD z;*UGWK08snMtyq*g=v!%J16HF?R&CW1^!j5jY2P*xoQm)oH{|hf8b2NKCqqUn)UE1v z`7$b*QED^a6Nh=(EoAdV!U01^#}M!*YER#$z`zUzCv z_}1!iZdT_rZz*c)Y|Fn|4Yx#WYm!^LsoOVL&(P+iEicd6^K~e5Z1;ZlM$j(1R;*FY zyB4$+JpSB0age%Vo}>jyJiWcD-yS7& zpxfZ6r7}zL;hSVfAwwzA>hIir!rXbwGJx{VhIGs_M+1Yek*w$qt(64@tl zCZ)38O6I~=6rhilr6xWz^KFw!@>lef>#P42x!Bc5yx07-MMP30!&VmG@Ygw6>Rv58 zDr_{R?0dINHk7iM((0;nR%GGHvI^?O%oSM-Nz&82#0qy3S19NHj+pG*d;g8#Tx}&YDl@(d^*?w`a zAhx#Jpzmk;Y?sugg?)F}*03A9QxVEeH&-vzt#A7apC?I)%@Cx<#x4 zC}h2`5Aru%Ku_Z`@310c4Y2;LBhLEUD+pj#0Kb!>ur1B&i5_e1v4kK7ir>IVHkZ0G zM;ubGUmCQ?)#LuB&&ppX$VF8rLP%)Ga*yP?e5oZZGN0Vtqdl+;GR z&5(ppB{O-jc8W4q$REhnSLpAWzwMk17|M!C%^Spy4pjT@kT7+(?H`i&SAsC7cknqYxR87>(14TSM=X`-ME1 zrGBeuH2dNd8Udg-B1Bb8O|BTnSDus;;j&B|+uuBHVy)!+8Tw2)V_-($%m~0Tf`?3i zz<^8Z0nKhWkYXsY23KgOqUh9FxW=(C10xXU zC@GpVI%KCn6CITrg+K;*RlhQak;iQQ#$pf%t)W$804ca3V9>VOsxag+q)v_SM%y~L zU6?-{R=hyLoOigMV}<3w3ll5erHr7AAJC>LOLq&8(w{Jl20}qH9?UeQD@HL!FcnCF z05fEhNLmNg?*14vOe2I4Vx?L-!KXpb79<}BrJE^F>!FY3f8xFd(--AS5ofHh5$ePX zhP5Cg(P0~yA?Zg2btCl9R5~?6JC4SNnF6~oS6rIZ(J7UNqc>Tt?R$Bsc(+GhA(BRfOxWlJwk4z0oHD+DG<~$0K z+;Dh+#|Q&ig+SDD_g&K{ZEwB{x;cEf9{ga0MRD14{lyx>$2*k}2?Ik1#LO3^AqivY z}& zd~{(h{b3J`9DeNm=m${2o?}Vi<5DLzt)zLRouwjqV~Nq1F`BIc_eT z-swr>lW;~=>y`$@y#!&)Rn*NqNg)AJQPiiX&rEVH|;j;0+BaVjAnOncq;5L*5!3wIwnSqY65)ErjDP{VdDU^@#)H8BPg8 znPvhZyNj>~P^g%mL^iS^+}6amQvbk6IOrpWM35MPCnNPxWC)RY&E?7m*hbxo#KWP- znESR^UF8VOpfM5kf~;>~P$X%Z3M)+o97_v<7kp1VQKVlHqTwfbS*hp7LbM~}ilvVA zTFgDxOk;5v!?Dgn4aV}OkQ}FSvy4eY?0^2hy^i7FdiB9^lE4mgwWSmjCJQi#dCK6) zrjUL(-)(&@jvuF<(=;)$<1vg~jCnM+k)|yrl=>RMa}Kc91zI`B#_jrkEFGr~>#6+dC*T?N+`iy ze5QL9JFe^3jy#1~N-*@?S~2&9QCbPL;d{LTVM$@?^SQI?XmE4?|8o+sy7U;h@z_SM zG&u?2Xs4y zxR8JwO?z-{b{AO#2B>CcXI3^ZVfwd2wL>pMeACSoiYdnKKI5VS&GcBK zRrSHc5vsHlT7wBA&1)h)SA;gQA)-F2P$1 zO3&CPN99kdt+$r(vNs42Y9K^`OX}mA8Br>#qK@SzvWg=&2I~%W;X4t(q}C9u??41G zl!mFppQm^m%s3XVM1(bY)&F{m3o~qPn6zL}*pdVxwBntr6f^^%sktrVj>`W%iJdKD z1}G7nk>?+%V|&O_kn|F6P1o@TQ7uo!&MW=$J8QR$V~Nr_Bq2lT)y`lvsPRywk)YMT zQero{YjU4V(mVJqan8IQ5LH_cQw}g0C<4bgqkcb%is!2>=Dwp#V=WdcVSodh3ur3M zUIHB&0L(GkugReK-%dLt)6*vV57x45kHs&!s^x38T z{QBt;P5u2>oBdw=e~o^}+@Jf^A5P!GAoRBr6hyr*!(zvQd(P#5;s+nP3iF~YY2{c` zBXYFXjNu(YYvwi_K^9alo|17!GDxJ-3vh^>nayYIJ@#-0Ej0!rkin3|04YiDk|p0H|-if)WqgF+%d7VrQ?m2d4GCPx{QQpu3Il518lN$uTkJ=FvVL%vB`== z_b1{=cL?RNV zB+_UA@jmJfrPSacoe-})x{wUmO9gB#0+L3SO1k8O1|c9QK_A|81HNN*+@HIw!=6A) zFQ@?$=VaWAnVMrYrXb)IaP@1jIm6*31AmlkVi^*O2{y{Ace|2<8fQY*U0>oJ2_WX zCT}dkGH2+tbusAC{T5ueecQ76nS;@7zxOu%QS3QKR>bH?8m2ot}!w5XJ!R zw8UGa!Aiu~G%C2W0CB_Gj>}5+&84DL##JdJ4CT@Wt(Rbg-fk%v5mq*RIi{G4y8qdn zX3VU&js)zq#-DPv!=}8Rd&swA-{4{fzzI?#f_Kcxz|?BA(}YD=5VB{ZDkyT6Z_gb= z%2jXd-~I<5J*#`Vw`QxKC?6?wtQ_X|AOjtNIzov+3PDH^XKs)WQb|PjjTOUmxB`vb zdZ1NXYS9LZ5!h(LS7VfjaqUEv>{@RytOXr#{I3BI&vl8&4hgbz65)c-d0VjEOhty{5K!o|GlDF0m{h(^r_xDA_B+&z=E zmGeo3d2$bVAiwR_2Rkm2vCnw7ZDdI3e=_M(HRVNgDSdoMvF$H56k(`ZJgBtW8HB#F}~>XVm=?z|pY- zo(>U;)=3J&P5*L4%Z)ZTMCNJIpXnD?&REYY6M4#HDmDh4iqAu(Y?hA>QoDhz@P zy46T3>huXOgC-+gDiTjY&RhY2H42W5P_U#z!;zk`4tJ1mqUS!o2k4aYt8+`trR&BJ z$nQ8*gAHd%gqIeAnaXpY;^|KjC~T|ciuX}}D6YgEjJf-5@9Ujj{AXjtrk{AQ@*wF2 zJr*JN;j)^Cz!*4LV^az;*)O_KU)&te*a>So-K;^_d7@{ylA=JsgBeF&3I2W^l^Uyz z))DZMitGt>7a2t$fgx9O>Z$12VvS|(%3%99+Rs7j%OMNHWE`AASDV83Od_cOy5CV{F=BXQ}NKmOmA zOKmA~M0LgpguSyJq#+$+#`jjLyh-|9nk~&jUi<$M$Is_a-F66@~o zzohyAAc$y=r~u#r4B)ebZb^H4Dkez6=lI)`U3K7gh%bCWQmpEh6|5uzpTb`*n;)*( zyU(8R_xGzDQVrVRdSKVEYj#f86i8)y=UnZG?eEt|Rcbpo&o$P$?2#IYXTneb05bqI zGXPf$XSa4HR)7tJ;2|_;{P%vhYp-irdy#D!$s=TukxBnscQ0u6dJRpZR4^C}V0{7m zgAYc){}1i{_K?Qi{j)FDqx+`qZjXKY+NWLJcKYp&o$i;<-1~T^9`3kvzk2YHJ%{#} zO0#R(+dKB(o=xx{y?6llC-yIImm0WTS{i-3R3n9x_=*4SUn0Esm+YVO=5IfnEBm4UU!Qux<+}ELIsX0X zn|*0E>EBLDXW60m>w;kO#Q>d?<}`YWvS$&odTPsJ(WO; ztZ*LZF+rB?bbHh}7EP7Mbq;Hn=1a3bww2wrFIZ);yij^Dcu>=;-OZ`ZL^}{|?gyo% z^y!(1f|=@EY!&db2#IDmR8Zs&!ktY0iBNu!yNHlR0)$C&{eyp`lO@ zHJ%ALo2Tq3gV{xP>}v-aIMRqM8YO-|E9M3%HCK@f|p5`BUR|vx$++HSga+s`zzbjhyF(q$x z(_>X)32q8|eG1ie06AURc}+Y1=($%hl#pf!_XV~qi0t>doG=%IZ}|(%Ow=Qwxu}@u z#n*u7)Gq_pM|v6*j|+EL*#v`Gkv8iLtgDQH}4JW?OgouCcwnupvD(EdSnr z>0QYajg%N77B|J6Zk`L9!6Ry!6egGJ)!1Hk4aYB8iM9a7$-Oqajkv+S>r;j=HDRi4 zH+Lc*VMG5%;_n6jsSoX?-VN8^9wW5@jjeW@tdsRuXaaDu+Z2oX?vzEPDKWkT>?V%c zOjRIoB$I(QtptUVO_u2c743fbme9Jwk+N5>I_@eEq~LRx*+R2_!j}-dO<_0T0kwyo zx#x+RN`to-ZqfHbm=@<(jXD}8wZQNA&D`UnZC?tY>m)kjO6Y(l%6mGU}Y;S{lKP@e5W<;{*>uYKoP)(}kr~UkS3PbPf z&b#&19@8q~$b6mB?~Umqy3)=wHEglWR0q!{z74<%!`IdO_B~qr$9jW0!R%ue%2VKJ zCVL6X+M21P=Yy?!twZmv+_@Y|U^RiljweU^hJgKD_{lAV>^qB_;mTb+*w_O_?qAzG z_swz{Fr8<{)na3qSyQv)8G*WG%K4MKpotLO?+oidIJXezyDp4$6&4P2)}XKob6TfO z8DcXwH?PGTerpfdt;6tX>@s^FIiMNpu3XR|ic-nfKs>KSgFDE-TMG(5YuEc*n%Xhl z;=7(%qIOZc*-h#46r1%!ed8uobM;@nr7I6F`Um#>!kiy03*a%}`wq>0j_fR+j!H*I zma9kWk@M6(b7m(}Wy{IP&vfR$a*&VQU;p;4@H86inMMByGGBq5h3gr@RzjWKw47E8 z2;@Y0VoPkCw#lqQPn%w-?W`vqw;db=-q25+5Fo{OtjFI?OHCcx4BlK;o`yzCRiP)% zo9eKQYu=me6k%mYQBPoINA3A(Is)#!prq&SCB?Sh747?{(bBo7m2(P8QjL4Kb6d6U zp5EeY_-5(Inr5@T|u94ZBkBqG0(}*(^M4vay7F)LD804ZQz-XQhuWixq3n~A>sBoBg zQ(a6%OAOuY{9U?_EK9eWKlRbXcU}F&tO6{roLvWFz+QxRI=0nCNa&k%(3Cm~-OOC3 zj!#b!>4mxZC(0x=)imU+5OysGy~spjxDD`xJ>T_h!d;4)^^-a@{6V)9w97)38=eVn zoNzV22r3_06Y+^IKhydhW8*?5j^N)oo^rizDm=coFs#Mr(>CEQ>&@y#xz_0Obr?3$ zTYOuVZS3zc%z0`*(F)~~7ndTlk`j@)Dpiuhq?s5cJ;Ggo4Xz=vZpgsK9OPAH`J{?! zE9w5GDVv(K@i4T`MWjT>erV#rP2o`AEP`IDSj*bpY8LUv2H}<4O$4z$+{osbG42W1 zKbt>~%jD&S{`oEU%~a^(`+LrdC?Qq|m81JiS&w1YbIQZyyWQ{qN&O6r9?_U8j04Ao zhaL?4d!(|zKyJ$P1H<&U0-7le{ioL-@iRC5GrWwYB&`8Le_olKFv9E~uEgb`N^eEX zm|B9+rDVBt^PxLKb0myy{KMxj`k#QudCNaEwPu15v&68Hy&la!UzMMw)5_83%yj6= zB(kK zJsdQXc+Bs{XGoaxx;{yz7r~9jHTdqr3h!u;?{U6+4(yb{3t7eCi7&gFTfG(;c^TR} zT_eNJgoU;kJNwWT^aWL|A5V5!jRZgwvvSceUGnr;ZpXJFN?(kEqH^z5n4(^(U_KSk@rxa6h!q@9dt`E67fTHl~)nnOQ^fXC}44wyeW@DyHv z@Ww3^NQ`0YH%}5(0b2$AWRXL<*+6;S3c1mxVvITib&gSX*1x&iSkG|hpcCzO6V*8f zqCWBE0ZQQ*wK1BsNtzx~el+@Uvok>CZk19AKit?Z^ekMY5U&W2aRx~Jij@ytu3e@`vMQXfDHcjK6y zf(CGlp(^N!Jz0Y-1R=!H`+Pb4u+LBjz}!A8NlMU%(14r=loH?ZENojX-DAGledBs$ z>Bi#Z!vG4*6hY(CWy=?v#@#nZ{!a*F^2@FBr7%X4J@CnN^{vz^Jurn|gOXZ7MSZ7CFzScO!Di#;I9LT6gLDY89@0fAmrhJOl#DocXZQ++S7M=0F=c}AlK;nD11}zuAW+R;L=LZQRL_@R1 zALU8wI%CKG_wz5PO$v@<__iD>7-h^w%)jD28-i*hF^H; z&k=7LTfEFVfwgOJS~i9EV>8P%yB}tXVOcBA{a>clH;Sdxlo@_Rxu2C%$OmfC#=F+~ z^lu^9j~o>Z5j>rC+GSn}vTt4F4Hwb=*HnmpT|uCc8~k-0IzF4y-i{Jx$HabV$i71P|Pr|5m< z%X}oaBQ4A}1iF1kCr`+5t+IH&aCTSIxZQ9iqI@K@BN)D3&&8Ra=nhhzcxwkM{Nti* zM)ND`a^75qc6UaQ3nwzSVa7+FXIBdVUaRwgdb2~iLI(9`^d!G1xEEt@*sdG^y`zFK z)`EmyQD61*mdVDP%#wy`N%4+0bb(4uhHlnY@4vwAH@7rtZTh)vQC?TcZ~O+5`q{5} z)W*Y1B}6K)Nt2h$$W=)uX-<38Q$DGcZ5Inq@t1vJ-O^zG|(nBI;!KaYgv=i?aNRMaVv4KZAlXJ zJWXB_prXFO7gzZH#Z2qnUayL!M`!9=W~CgGVV%(7%6jA1J^O}LChh@D#uDC&S#a%V z>hkn7^VT_|!`+M~_j!`PaS7>aF1WULaFi3@afYL^JmB0i8z7P8VR1B#lZ%Zts_bO5 zYdXJ%N9*It)o11k`8(GEFVqK8P@{@G#^@L2n|)J4_RiB<`FKt4HgyELbGUgMKlV`l#&rILUHLWxC9|MSa$KGb4@vxW7%`~MU{44_H_?g=K zUG}lm*PoR|J+2uC+Gt)Oubt!d(0=K2B7ryQDnO}ma=Dj%zZ3M(`1yXQNnp3{NJ*h? z;zW!4%U5|7ha|=}1L8Q*V-MdV9Qr6z_PgmfcJJkoBIR>3i)dZ|!2Q%iS`H=Ha*?PO z5M>2o#})F9<^;BwD4%OmB@s#0uHcN3tun2w4b-9)NDBlbZ&|NL{vku|5D2@CI1^EGjKDmPE#rC!4hi(w7?xU3^5QSkW+h;ycB=bg;sJR zE>j{~r}b5|>6c(k#}r#u;NlV5kSUJk2>+<>s&pom7!E~AB``_qz)s=ffBKM8j$&ZH z#m}t*u1FPHswt=nf*T|Xfr|fXL>5&Vl&=QF30y=uFIDz1W(^!GQ84q ziUJFZq)>S+)ogC!T+Ev{wgvt;YT^Nz=4nkOMc`8nWX5QLtsw>xc@%Hdi{5g)bRmm| zlwBvO8jNFT45;eB#@C%F_k6dPzNJ%CCj=;Gg<4!*V~nNbAnrlRTRd^lH=)+IT5an0 zAScD?PbfiL6|qaXS25^>AaxfeV||0E%?8npK#n3j=4t`ra~0@Gg@;ar1^Rn4UN{wH zx-r6$F@jGh3N(0f#8ix=Eign@Dns!djyiH0opyE!Z$B_?qre7B&$8NuJs?}CheRGv z#qxgqQu$NURgjP+?ht_x!Y@WvIlbf*hOQkJGr}X&p$^42hfe`9XpPHlbp$klr*vu< z^*WE|QUV)qCfyUAOo%`=`Jibk!Iu_eD6|LX+G!M4wbd100L;d2Tb2!34@J!CHB&ON z17meWMQDxv(v438x+})fjtDppJ?kgiUdNWDz1~UO8~P_28A=^io@ZW>t;Er&MICd~ zUt9T+BVduHC{S&&;yEb-M=1*&O;?JrMOag&EnS3+2xSrs5K!@FA&SJ_;hVidU=E9P zD76?Of}DDoR3ZZ@58TuUO5@*b>Bl6m*}%ZEA_<*%TEM7q#pEPe0W2~6Slu1j#tsZEJ_t4RY9O9Zu1V8uc-uGCl}C3_|G&#zD&OsUH6 z>di`5Ku(p&Ss1kT5TR)bA)>S*@8n=_SxCwXw+@AaTJ7ghFdWFZfILAVSQt^8xXb8B z%85*l2s5x#3?xFDiDPk?6q!0STKR)lPwcWnifk6w42K|+F?$B%NQI~%A=P%sgR-QM zlv14*5o->_%9e|?mO$p}L_BCspYG0GReFzaM1T>}SSK-}DIIgFA*Jej3W~*FTsG-@ zuxZ^W-6axCE*&3AgeHZTB1P3$iefS5pW#-qlq76&BXOci(^Sq;fdLj{nh0=Hec@tV zSU1@UN+B%DfrEODY8sff^Lr)^mfrb0inA1&RFjlQ60l6>$3_?sco#_muEkg+g@-8$X~4+EP=6c4 zjy_uPMo8e5mtpIy*Em$I1ln6E1*Mwzx{nkg!x(ioNGA&G&qf6>B#5=3I9tg_Oe*qw z?HkjIQ6hvS=n23z5QtLoC{QE5#eB66s!gewCroc7N}_6@(@KXR_Q7>1k1D>=J2&a2 zmy_*vkZ>&>6l`r)9D9`{BPyz&SU#n>TE$eFGU`MMFp!;%K_XKz*MR2^)DcHpj<7Yu zCgJW8-TW}{?A3=lHFE~WfvIlQT-XUn>^)&S+##ZAEELJ+I4NUs{wTLJ4fO*FGiyk)-nOb`5CmH&J=FPQV5J&_VixDyBf03bIeU*G!S1rmfsz%?;ELict{b)}k$?Xk_KOSV)sd zTrv@JnoY70qGmM+fr)uC1g{#BIr=OJD;Bzo(3#$?8)%ph0ssSNogRCEN^wdwO*4vk zISM0AQ}UHjw`{KBP~w#-c6z8)A^i`Vw^XY|ex&Q7rkG8T5D;mC45}&7N3C69?FGoC zApaXpAZ)Ue^^`*pSW4(dR474Pi8K~z?{A|l;dJMEbDg-*EQkWaAu&@s>z4|Fn5YF| zvBl~B-%pRY43?=OhEA(Jx>(bRDOaMrt_#S)6fN_7cz$v(2iHSynv`4YmICtjPAtU` zBEaUbOf?2PMWN}mW1w~Rh$W>ylJrEP(x~0Z5E(fB>2PWc1^8cPNe; zaPf+2Ks*se3c&>X`pB?@k|s8l^nfOQ^BU#ei_1 zu*N}1TvEU}!zZiz{-t^X1*C>CHBKVTjJGL2MwUNT;3Z zJH3it!mmYW9WFhvO;hc)8mX20AQHkoFi27YkvHM^q?R)Cmvs8?yrtF8(8S3uUkk^J z0S-ij!Bk90ilvxpWYlU^`YERtNnLg=;EXLc5H8N1*b_C1wOBbzE>|F+aFx(`_?joz zc`O)%ut1V2f(3{oCP8CzPOBCV%dvcQbTcPbpslG)b4&$DNH3uXO!ESsAx&kjZl-sb zrsN_VK&YZr%mE4qPEC=vI8iUucbUdZ|6iJYu7QlQo;nq0(4-e&#Sm9Q)m1t51iPMO z1?h8TX7h70bTslBIm(a9>bOKYtS^d4YE)#$&Zwn%AqEtubxr-MPn>zifdc{cqtT;! zOt=nkRywWYh>W15KRN5Dmh&=*H(GiN3aYlx=i z_V;7J+ShRD7>;UU&3M;6b=SWwLh7!;t#GgO{~wfk^uS(A>3@;8WA53hcAI#o_bF7g zbx3}PJ&ie)1uG=ySWBgYY75B#iPTCc7y)dB>v;R`E6sTTSKvN=snbt<2@;;)fE(wTbOY?OO1@_lB8kH=p zyoxhxF}T?15kW*KTM*R-iJKl`Tl$sV`nHaB?biU6m_g%%ps=iU*5y#CzzGv9EWf_c zWf!HF2DfLa_i8}S9jm;N$;c*Bk79rn=#f@c5~&8P94$vFz5JD3v=8nb_AG&wli4Lj zKtm1As|i?k%BVukVYgMc7MI^W>Gh0*4zRQ}gW$*^AVNe%^@>g6MQD4`YL>UOlD!B6 zB+x+{F(XY-nF?4G5z>-dUkjr}LDGtqftL`d-Of@=@!%9(}ZA znMawFO3zA|Mj#ODwD1A~M*un7*F)QBxgO2_&&C~fV&I;p_E|nUF(n2;7#D4%p@AV= zN^01ai~X3DX6&b5!}R#N0e!i>&TTKB{k6OA-J99${WkbJ>*n=08+z?=de52k^*Zw2 zd@Y5(3|5v?Z%jgnE0AiC)OX~<(qf5Ya0W$!0kBMiP2OSLcI5v`ud_r1p-rfCv%*}Y zx7qQydGNOhcBxD_wixudr=6~$_EcXLUB&scS zJE&9<6|{Ils|8X`J+C9vij`42=AB)}9WKUs3t|{_KqT5r*ZA1*Frb1*2fq%xdxL%V zw?m~9fo&;FF)4-=NfN}8eb?fSz_)s{c87mm-$-Z@npPOcG;`L0W-#FB;KhhaPFe3; z0ATAoY1&8r)D1rW?!@1>uj!-t{rE}uH(C1nf)4xbO9RNRcuvOt@2Fy;Vcc ze7m#Zc~+S|h=fFeK>`A)z+zmRb5LaLM@hEyDrA^?(lQ!cB%MboPD{b179-}-pdKngnM8TU^~Fu_*d|T_jOKdBq+=z zNO+>fh^)sP)Sb1bufp&5w5sfpVMO=VfuOcKAec2c=xW!xw}G8<=&@D5wPCe^>@v@9 zfy`lq5mZvesSIPKv|EiKx8WOQa}D4*DFD>@lQk9~@gUQ!T6+=k08UiIB|7+Sl|25d zcex;TqE%K|O2=AdR(0ksMWAc1Pf2WDnm%o-%!zPdQ7q$Aj)WG|fcH*^v|>~J@}_)S zGHdE*WZrTeAPg=2kNf!3oz2U{z~f~ggYU$t6N6__W0}|!59bkvDQG_bTwaAnudq~B z^6)JLQ4vcDgCIhvYHAD?m+u?pTgS|z)DtNNh9*LgY8CiQW=91cLpYQs+n2-8b=|q9 zUgLI>&0l(Ga!x-PcpP@E87ku1^o_g*t%;?TTQ^%(a26v zH99BN>ayqOQ4g}TJwK1gb++d{hpD!==eq_cc3dVBO;^*hAOHX}07NqYRtrW_ZHAbV>T~r;{}93;d@0gsm9?2wS0V-} z)Pn~<5cNlwKH6F8P7VEM4UhTi&ZfKmJXOD?<9_t-hox-a_44#D{m9kk<){9>_4kK; zu%0Zub{qd1`d@$Rt(f+@`lo+7PwlI%tN8oRyJ!2}?{2nbPOL1a&z(!9%*@Sm=ya)K ze=nDrD_s7QNgkqmz%2`ln3&m$!WZEak~1$fZhy=d z4CS!VG9g-CSu7o9T(XJB^xB)GC=T09uqW@5p7oK4wz$U7JmrpMtURimtd6WJ&-F97 zq&p*%X`?1IpRiEFp=;K++zB(sFsPQ1KkVj17d9u6N+weThZe?bdC8eEqg@CqYrWNG z^UH)xny0Uul_%PYp_GBc|DH~xTHjP8I_=4v@4H~MJeO{xD@~d_^Zb;x8Z0u}GMNXM zStevBX={6)NT!Ki*2{;U+SXw&=A^O{LfJ-Co;}b!fjHxIlS{Py(9A4;j?=f~=t*R` zQZ7zB`Nc-Hra9Lx5-YSQo_alU;kk_be9nwrZhDB=9+tmLh0&p9=TpgdKD1_56_MnQ zNL1>XP$$OmeCj-I<9|{#+Xnk!0y~ z&c|`kdyhtbe{oX%sLk>>xX8t(po|1+PVW<;Xk|S4s8q^!qu4%TRlS z)nj0cAZGhY{r-eC(ao<{!%2o)#&Z!@cmfP!3{utA!wZX{$@Iw4*Q__!%3hi>sNA`A z{xOpKtuvAZ%9C$3)3p^O#!(TvMxl2d)B5wmo2apuh2WseplQ&{ z?*3`FH$h$1TzXHK5UqGvDi!OgII?g$?Q` zdk+(NPnxs>XKL~to|`E?Pb!@cdwjF1lwl8C8$o!rGp)HKP52O2g?IO-6HbTsxaw!= z)ArJBXCiCArBDF`J~d*NX{UNeLU`~C%G9LqTV=Ro+H2sGr5pa%EN%P^T=65i71mcv z8^P_L)>ca@0XU^9@j?|!hj>}5QSd-r*l4$3mR$Oa{{+ektn}isTP$@0MJ|dUz2I*K zwZ5|Z6BfTbP|>@kx8=(J)}3F?o9U(HWbN`*%=hn@f+{9oA@({}eSS>i5m8+Wm7#du z2-iO0;_(*%a&y;mZFCqSC`L8=>jYQ!?_48qkoTN$@!)`YB<{S$Uk>C-K>syvt&J)j zfOmDb2uE}^0e|86YKOAAzf0TWy>i-rlECTkOc*@`v-rltM&-J6qt`X{%RQ)C*tR!2fp%zk>=6kygNv+#m#AG_Dd(ROlJQi?JTwvOGUk~p2FAar1B8l2U1@8y4^nmbXL-MOKxBL!u|nC@<7WdG6ynHQG2G!puLQ*{{)gz}tN_@

      zr+|C8&)UUIruDQEK8F7>11FW>VNzx=;SUtX0n_MM}gEuA5i@Qy;H(*)<(+(5LsyeZv@Kkl37D0L6Q zgf?mA{_X$kU)q2D`%;Yt{y)d*V`R&Ex?OtHaLfBQ?L6+Epc4-WwfoXdx(`DsYBNU_ zS%ItJ!s9jIUgKQ$?_SM_s|3fvvS&*P4M#Rgv=$Z+H z?_y)VYBKJpY&O8Q7}lP5Dld61*K!Bd4ktuEva{%rF2cE1t2ro{gKv=n#CoYAv%kK*GX_ zdY9d4u^uo-bGca5<~H9>&PJ1c-*<@H&3FqT>o#@_gg^Szh2_UR zp2)XN6K^XxI2v#-WEE->D0~?W54!6Gq2as__bOZ#q$chw>==Gd9P2J)`E@g*h1&H zrLtm`I;?qaxQdxq2t*{WLPCv*?Y>-hi4~zgLG3IW?pZOmF=lFYotu*b4+Xb(4WkJ* z8TFXtEET2K@la*d(KW8rxOpZITr1HNf@eGs+o0LKvz?={^aHcjybbF_7+ zVRM~6#CD9jb}s52U`m5rkObTL&|(kPay6sL_+#Mrh)?=$Z#(X}u}rEJl4%{3Q`LzZHHT%YL$XIjCzRxU@x;o*Q@^R!^)cwqGTk zDTUu!d%3?14hp?57|A78)@XZ7z+*Q+xUssA9#*h9y*t{7Zl0&GCd_;WLFKjRWxsZB z6h59+p=7^^j%a~4nX);Y; zlU@amO)wsFt{Li{SBoF9^6UJh>IvZi>-Xo_4bssn^*Q}AHo?vW9*mBn2G&sTh@-Yu z7&O%6Pn%D8mhbzarC~7GD``V?rzW(M|AXUDJu0G!S>`*RO=mu%@Fet#*IK4W3&aE& zN06pb6pPJH#-jIoJj1Q=6ou6j^KYi99Q0cAyxO`uf9`kc#+Ppw77H9bV0SYU>T0L? ztuPFl2-Q6x6rjYqR~PinHiy@LkZ!D+wD{9P#5JtmOb!YW_nQ5g41oQL+T*zs-GU2|@4(w+dHbD1DhbdsYNaE`p;d?RG8AxZM#oy0=cmVmev@76iYoWN#d- zH4x)Fb}js|0*(>F3mDsO!bW(N$GG{VvJ=muC7EczQ*LI1X)neT>el3&>$lKN2vmA0 z^fy}$)>Hbb_z#0?cAqFkCh)FD*Cn2=OG}OIyq~&hgB{&ycIvsOLQsjW`uqtvjETB$ z;ED+DbQYWXZPF4?n_x#FoFuudhgSYUQIB;)B_~0)HwgDN!JjoZg6WOfc(~SUou4oq zug*Z?3%rez{ur)bac4vB8*S^q0zm|8kGrHXj83q~`#vJ|;%&SXh{>=We#U<1lrp*R z;i$QjdYkr7RAF4)s+}_zWV84pKtf~s9bp2~YoBo~4=^ImB zW0Dz4`E?8ybH_YFyNY(MwW(yLc)F=+S_X#g)S&@A0w;esaIs>2LiwapZo^cYplGx>u zXG*z^`^t3`GmB(Q>onAF1Zc1U+Ys}kJ_?mBmOAp)#9Hy|1QoQ!!BGpU? zxJf8wsH%rqSh?L!h}}M{xe$p+eID{8Hoo`U@0K^moF5-D){ADf*~aNg2aSb85#mhK z9fRNyZuppScAcRE9&~=ld$+52DxLa$K}5NU@ZRlCldzvAfn30bCvnV<6~z6#vj?>p zw3e!=*LwWEph*LRUhr*riE=AEZx_@zeq0{|YzzZotU~8%O@{8VgE+4zQA%NP=AX(w z#kbv6A^gEcaU@KJA$UsUV>@h-!yG3uzE;tI74*O$cnqa#y_-W&coX(Lkt6AzhCJHz z@g4v88MW05hHj2$JmdBb0)OnFlz^C69&dNaBQ}#lHqJzEe4Z%*B2D|%E1&ULi|B1~ zJCkq8Hzt0N`j^tT-!I<$Xy2L(^XYU`7QvBVr!#cJA1x-RxjTRAn2T@RStQR3K*79J zyDKF;Im@@U1_OwJfpFKMsh5sBTnUjULw>Lm)kl~n%Us|G6c`%(8Ej+Dy3H9OX-(vl zxJTHEYA!U#82E1I&kr?B7zTF0xgrk*Z~KM{;9rNF`Z`mg5*O-5OSfh#AI2~EPhUDc z8UU?%nI67|80kpEdho)2HqX%zl|5kaOHeqzJ6i5TtLVBVT#S2HF9CeVRLttn_9jx( z@E42lVaoq;x+}#4HrvMV82o`x3{Mqr&1Uk((w5WH)a|9dRoA9{ytlr*55E0Jx3}1L z>}cEGXWy1V%unyIZ|_fUMK0jF`tLM9)LFF^G!AbJHXI|4@IV9N=?QDT)cv};7w2gUPI?eOn(9A6Xz(T-`~+l?QqD8Nqp6rWBqLsQiJad7f>vf{t187Lj{PNN-> z+>}Q}e=~OST2QEfa1rJq_O?9Y9W<-7+116Rr?jr)EPgUs?M(k!-O1(s4=69)9HjG( z)Z}*|oijezc#Z3Dd$0c|ohF5(zg9m_tGRpN65*Ft6ro}}QDn*jwrT{xAe?9=LGP@+ z2p>IkQ1~Qt6pbuQEG+n1&6Wtp5ub`;THKn#Ly*0~@91=nX_@FqiBW|`L=at+Ng+1k z10;jAS^d+0TouPSE1%7Md$XQ!(4)FoQo9s3?e46lR6By&K7h8<>^{d2ebRB5uBj|n zJe3nC78I-_u2|s7Inh#3!`{S;wp0#dZ}yveTTP-1`=#qf^};e2mTXlG77{^$1hXQf zICvGn$`qrwR~1LU50zCV9tpALT8kL9jv(>TkBzkJ1NUOU!POuMuyG4}7FV?cQxcrT zNGk_dk?HX%h)a=*m=??}WVR;W1yt?nVFWthK(OSWUU~}EV%1&p*5t*EO0Y|$Y-w=k z>74ew;=>l?#F8TgZuA&(4Jsrx+DIO?Vnw@NU00vOd;2SIX^mLH!6k%My5pc&qT&#~ zWYwhyffk&-h~oe_HZ_Fpd!bx1VEiXx*NKTJ6k+UEk{mQWwE;%QTk{ZSmqbEWx-1o9 zi}8dWi$;wO!96%~tI3b>5}i7SIYgzAJ!U$o#HHw4rB39_AQVgjcm~lS zi-h?SIohD5$oM_~$1B$}_NSqd)CfbcxCBE}=wwy~u?TC5QUn6gOE!Ghq0-W=@Q5uu zkwsK{FN#16jHE?Ui3pwbFpI&E=OEb<>2Syd!Hio~s0@}2d4h2*c+@fQq7#Jf43FNI zPV5q|%(THxg~l%n)GI=yU@@Y>NlC2a4FisxVtegk&g{5#Jn`9EwPmNq1ZXVDlvHtg z&;?14s7YLF`NRR19cL=NM=K6Dr*-F=g{gmlQiu-FL2V^Mt|Rrl1G8Sfq^Wp6A7?w= zo;EKl*0$YRJNDSIEPzKy*_AM1)iTFJmh2`xmt7-s^NA!4%Z+@!DrICWu@K6)FKmVhB}5 zxOa8V%l-e=53D=XTe@cPBopWJ5H3aJ;9X-;jH?g@S$7JzSdxJ|u!{f+Vr3!{45!vp zSV4v0Ja`W7r}Lh_nB`t))vZ_DPKh?saXh7Ch!Wciy;>wO3BuT2j33Ee|u zBkM?H^7=?6EqFOGcNioomLrkU7iFmtUVGQ>@VrD+R~kVA7fGPRc6aCCIcni3Ivk~| z=bYK+q-T|Yv85%c245p`4{{M>LeX(cdI|BOWr=@O-^zR(~73EHGY-z<8 zq;aI;SY(QWkKtvmra}yiouXF3N=twUWF=w|4+vF6NM!r8M}&$Qlv6dt2clJTz2S@S zqT;1j2)oVp@S|<*Yll0iAYXj#wL@?F*;=R8p4Q$zkJN44ZtZngL;^2PQ2Q#ey*}~w zA6;pd`y|=%nYihu#ZsNV-OFfyd*?a1N#dH{!A|gB197gs+<`o^4@TA_k$R$GnTN$o zPZu$}VIy9>yT{g(?e$Peudb@;R9s8zaS*Is_Vk^}pPp2&;wkiBG5d4-SZ@jgVOcSP znuHRK0#T_&ap$rcD*=RY0R_MWD(mvRH`Yt5ovG^6ZgL(kqga%Jrt;Mwj4XwLK#8!L z!FPHjLjR!`P28u1Na`x!rr4%MPD6>d1xb!Hnp=ao&Ki^|skZiMO>q(;5yhsMg@O{t z6#(&WDw~&14mwz2xZSfruW57tmj&PB-m=-#XVwwI>yZA^mDT0XjfMEib}W&i{4v57 zE%ybdA{a2VHjdLE&~C27>YA_DemqBNEtFzh!S{utVFgMBRbLTcGOB>yAx6O`GO+H0 zR6G(PpD=S~LAW9=AVMtmZL31jPHd>uJ`7U+wXO*jL}k}pi$NkGv~;iKX#uMeNfdt5 zCsU9#G$_MjhMCQW@77dGDoE8j5_)-%t2K{9(@V5qN28YHypa^rE)tQbXp1?&S{y{S+NI(l&{6OH9~M!--$o}%_9j8M>+#4 zs@W?Y3`{YW0wxB6_W(bO4MN;a%x=#=llxSlvlJXaHAJl;NQ4+euI>(nUX2ez^+h~K zyR)W~3R}Tr)+|noxatbQ8DR|`TBbmpcHww?6*R>j%h zownKkD@0Yw?p%Ggw4M4_{ssPVIq}jt_ct*`wS%lNT8lWwQ%vYW zL+I;AmkwY0Ge}O|GFld6OK=FwwmX>gYN;R8-ZB8jK(76j?}@JGp}mHvKB`bI=8auTRUzjEqu_)Q66)2Sg;dkA-QQtnjWnP>te~xpbsbGw#y+wf6 ziXaYDOkmRUhWHLxSN;d#LmSYiTp{?Usp7xy|nbOW^$L)-}SJf*o(V@)9$js}kFWD(bA1()Y_lmEBB*+FV708|jzq*h1mQW3@8jI7psBaWTe`N|oYt36ZG&CYV? za=68w#kruZ-zQdGt?THNO}#o>Ue# zEdzRIs7w{qDDLDrp@)Pol9eaTBQqtV1H)K^6_{|PVmXDS;d)qW5wjlUp(D$k89G~1 zI?r`tCXz})t#~0XU|7vlIuz)wgGZWsIXb?1>ei)~0DHZEGCC{>fVC2`B+<@Ti@U_1k&x!TK2Z;Esj~>{-8;F4)AxZ>Meh`lZ_Q1@{OwX#IZSP~CgSg$M z4gpTZ5IgBK@nGrF_B0x_%5+boLrj#8ou;QSm`S2hnyrN*0FVIynV|rpr~>g?+{osb z;3e7AwN48{oYsW~102avJ7}-8E)&d*Lt~YhlNz4L7{{`UxfH*NQ2O&$Xig_ib z8{_qdSATu$ea3s%Q(s%{`af2Gw70I$Fa7q||C;r?r+(S>-}>FL|HJ+ZpQidtbCrIr z^slErx%Rd`ZH4}s^#{K__r3i)zwLeY)W3iI6SG&~|J*)4e(C%Z|JJHPsO#`VS9fcx zI#+$A`dk&dojsLa+)w((Y#(eta{vA)wa2TgU-tg5S4{rc*q8nG)~}2HCJqfTMrrJ2 zf|%tIyfx5bI9Fukn$W(^cXnZ{6HI%8yQLD4qh?2MAGm=mMm%c^JQ1JyQa_f)Pp>{h zlwiQJ9l}gvi%Ciapz0#B(tchv(c%a zPB4^JfQ@U8on}5q`TQlEiULo?Jmaw(890rQ_ z1Nnre%F}DJoux`JE{FzKl6Eq8B*s-P%kRjfvJ}GW`&#Co=BU{T$Sh?)a$v$ezl=&I zho`6bL&-O@$r%aQB;sx*?^;Zgo}G7_mnb7pH&6{)jGOG`tOUcTf|DwDW{Xtzd@#Qa z$4sP|f#BaCKA)PkEuFIprUioEnUlW=mMAHOHUrKF5bE8le#tx-{XTlOy0rs*F)`6l z3W`s@C1DPPv~hH&!1GulFnp}*EA^9V*a+R_E}vl476nhH3_*bJH42xfxSU zQGdYyg!6Wfwgf{BDW39OQxF6e%5qbD5L4k&w}V;l>Fm)|gss<4?J$VknIs`*2%n)} z2AxC`Tnl>xw)?Hs?4|Hj;ai6qE!R~5l?meZgj`;^5G3lU!l|Et7KXV`1YfG;bq`qb zR!>4ON}h6%dM390eb1iC@8w5}O}mz=inq(?i=faY=NcQ6TP}O{$8+0nKpqeNmWj8e zwpy-z`K<)Ulcjh4aJv*GbjRmCD|DTFJqs#8X8K9Hxpaf4xZcPy8{$DGgrbF}TOXWjAEO|DAUi1;}1I--F# ziP+H8Cw?Zy;FjlIyc}3F#_Q@z53cZOIT5|eCOh{1}4VxyU`rxz9I|WSwaD3jXP7t5`=%AqbhH5bTmrm{3`H*%`Qy4LzNI{NSN8e|3zJ{1 zje06gzP?SR4hepqhNiCFt*CPrfGZ&|yA`IQ%PaS3=B1Zb7V` zNenjUoqJUDTfXe>d>Ba%lg*1S@LpWyZOu!8Pro^LO)LQMRF}kGumKQhbKy4Uer$C; zziuN5zYnB(*Qc?&yNy;|MBk&!T!N{%a*H-N&8CgU9$j9Q7%`D5QXvb}jKl-MftIGr z5h!mlbay*%y>1mtbu_wjHMRI`s~M$J?57TI7`eMvlpC-V9#VB1Mc;TKP1V1?Cy0h4 z*sPwdhPGRu3bY=<2E*uPu!6hWGD^+mMk6YPqWjf!if(i=*_bc}FG!bai`C3E9x{}H=f0ZwPU7apEuRrcuYvi!bE37<@Q zo^nVm@&u}&g)0d(h>S=iMWhbc3qLQtgEX@D^3UD+wJNwX6G$8($z3qGJJ(RXw}grS zCwUu)j#3XCx!Lfr&O)|Hddj2A7%StGy z^gS9y{3(X*q?SdQ3CIm~^-0tQvtqXJ@Eo7X)lx-H4EJPxzK(8Qi@-S@xyH`r81-V_ zabAH7-=%#F6+4tKx%#tAr>jlMI*Vh&_&Yr1Xz@l(uiS8K&yj+R%UUTktI@9Tv05e= zf7>KwG9Ya=v1&wcA5$j?97li_klttRJQ z7K`t!Tv2axHNLjkri;E~MOtcpc064zPTr+dmrvQJXZU}U_Uahl7*H(9em=pW3TvPc zP%&A{)5zgj)s7i$5tpe7p5EJ&wUt{Dl=4&VwemrnI`H7I%}6e77sW;3BwQw@Ls2Nk z^|tbbFG2Cfl;t*W*O#-?fvdH%Ph(p`eKm^|U#l(Al6=*+`rksd04iP7yL@%KE(Rec z!?(r_UEhwk7ESRCN6_5JMim0>SCl+m9}B=1u?x|2w(;Lj)rz1_^7EEV7))!V5x-%J z+&pk}T-tA11HjRKTbRwpH5Hzwz;whheJUIHPfreG55s!J3p-2)_{KZiZf7A+%G*sp zNJ^$5u6XU%iid?aW&ryXv-B{=Tey44S&-|i56pqCf#q+lj-rV&+I`Py$(F3icPXL$wP z(?;f-)WU2U+E{D$bn98FB;_9SlUMwfGiB>4zIjk)7li(7Bp^Q#t!|gwHVu67_1~4TK)b=*E{iNCHLKaX)w3ypf4(+O2Z@zC)wCc> z{`sbAgr@klAS0!#6Umr1%rdwpXK~VF@r>xWg-l<$-3BUOyiy67@^Z76U3Rfb+-}IJ z0-@iO7#>-4GP5*%{<&e$D?yk2GnI_6C=H0YJel34yg#90(R1l(yv$Y!k}WrS|B}J( zXp%q_7^Hsvs8`mcK`^7v;6v$8ePhL{8oD8u8V z&($$8)A*Xx7K{fcug9l5Exlwm!A|L*mQ3bF^+cKn*f4>#S8np2 z-!RQnRTT8}i!cmdK3P*(B`*J>{NDE^*iGyCLUv8U*v$J_RrBG}xg7Dk?Fzutz~xia zJ}yanOH8TE^aRj2%??`})Y3zwLfiXR8FAv0(TvNLSq*S-qlj}k1tIx;mv_xfy!VT& z_dvU9veg`|A_SO8^DI8x(iZ`qj`FW5pCv1140~46Fdcr(zJ4>RC*MsY#jVoEM1<`SttCKpSR&j zf}eKR7{tpaZ{H1}wbguRPB5Y0lp^ zKa?+-?~PYcVue-ymJ8wrvAZ*@{A{uY%kQu$z>K$NMix)O9lbtl7hG|S9Mu#r??NC! z+s^pQXg|s=W70VU)1>&qN{7gs>gh~rx-y$q!a$SVVA+94_|98-7LTwKh6kiZhR@|+ zPHtY6s1<|xtNxs{#Ri)-j`E*(%kQ?iC02o7ALMRwjXBq0f!hG^&8AHKJ6J2d%p~WP zQDwzE;pHEG&0f^ypUUw#`4Q5YLu@`3BkR>N1?uglA#1+yAVr2v8*m6Ul}|I}B7Yv= zU24bp@uYI_9AhvXcKpNU3qXkI;@Rm_PuYO=I915E^X_oLl#enL3O0)7Ijly&1yWKQ z=N(9z@msH%>X6<*cv!Kjkoj}9K1I11d9mhUJ!R~{=QbQc(oB6!aPm8_=H|_8iY6yq zuFsJhno*l8jgO+6qNac~L%q9pzINb7r+mC_Za)i-^&F}w+!F_&lZq(3s$*wo8E!y) zzt_w*(Q@ zw~M4m1*hz+MR}i>v35(wt}%eRoTY#<;->Sucy}*6QWP{%eX^ zUD`c8NL@VZmSe7|?Q+rDEOFX@IrB~bd=E~SCT?wB-K*xiuO0e+U6~-e6}#CX(McR^ za(wMtvWsi1*lkPQ1HS>CH;eqz7$S7z9WFULcDskjonpU6UzGZ&RQh8|vzhD?f_Oi0FX~c;3 zFSs=MX19UITe$a28#4>Axyo@@mzfuZIh(L?$jz&KRpdzezU-q$vpJ4jdcc8Vs% z9}~Y}>22O3ZobR7?-(B1(IlwpGof$%StH%V^B6-<=7s+GH9xqF0=plE5<*<_xI~nz z8Z+f=5V6{NG8M1Iqpjqat<{H1clylhju7>Ln2M_1{%FI3m%Lce&wwPqxDs(}$EJM^ zuHr|<$BY1Gk@}`tviby~OFnP|8ALaDfepCln*VwPSyz^!dMUGMF1G**Q^s$HXYGA2W-%hx#)GF$TY zg;zbhmRjd3`s#Vr;)V2Mf6ji??N8^2W-x3^MYIbbtm!S^hoD35u>4!)(?jgBp6(T| z;+%SVY?a0MZTAGy8lPwz!DY=nT|KSvi88&Epl8>6rcGzb(k#B$>h}zYQ&RNV5En?j zz6Q!oc*UlBGw;R^L;r+bEEY-d;J-Vi_oZ~l(cJXe z*ZJo(^z#5f1MOo*E{zIiQ|&5{k?NNpUC2rl3Spz(QK88Pf{})1FQH4b7H*Aa~cGoxs@IOdQ5oLGwH1 zX9$qNpY7X@+7q$o*jt^cOn3o|E2-Tvz)<0-uHMT{uN}8qRA3d=)*_vHp#*yg8WIBA z#J%Au-{agPX8G#<=) z0_)2_L~^Lafvnu(I%R!VL|#-!;f z3>g6j!NxF;mEc5(h)bb#u2t#v1swbkyRrG!#W^Vt!~{a69wUZN7s~}Q)6ga8uG1hWg2sgnj(Dn< z%OqqM0|XKT*a+BhHA1v^ux(UiMic`X&|wKdgX@&e1vXA;b~vUwRsCPvLsQoKs%q2l zfbP55VXUZJSOP^fs-*1laR&>=yE0QGD0wpp_jcy>@$Zb|HZ&vlG8S#Uvt}Aw7$Ilr zqd9GYeSVp#oaw=%(LiXq*m)f2T;o7dYE8|#opz?ma%VOX=p+~_Hqz!6Lu}R1EDf7j zM8}%%_OAA??`CWCk!dj+gq;j4gOo!=D-94BdYu1KWoKw=*It_5S~&i|t+uzfe)ihm zwhzVYGVbt}Ab}{ib8V=B1RR1lg#=rH;n;Tanm^I4`8g{6tDHHIcDh(%(a5kcj6xSV zIe2Vnyns1C=Dh0%aG#~T7bF=JBg`PinL4EgV1pGH(HtpjgT>G=_ig7j(A6mDZuJQ$ z$U`XlS+Isk1A9$ zYa)SQM3jVL2_|1pk0F&S$%~mQP+T1m`RQq(XD#9qApoHaID;dl%sF>v11q7QW7rAM z$Sb`>P>TYeVLzD!IM5!6K0J@ef$y87KkU!*C6CI$qd&RX3fTUR9F!oXr0%dL)m{a4fL-age-(W*Ab8Mgf<=GAz zvVr-m$U&P>4lFa3UWZe9~6KDI7NA;V55QnI^?my z@y|TMLVKLepM-StY~3A5*kZN_a^OawkTYx6mI7XdjraR)vHvydZ*1X*&K!Z_F_CF# zr%pzLp(Q`+1#KQF!Y_}Ho!IF9pFaOrjzKMSThbt%0*7aa5?mRCfh2~;&7quFG7L02 zrS7NN&pvZwmCnYL&Nv9>Os_h7E5w*_buaWj<}MFYgHE3L5q>5c`AH zbpep$lA&%-4}RjWpyv3WCnkd^#dX^PptvzGMU+59IjTqyM{AYVWar0Pb9a4K-0KKtus*7|ZMp9f2SR;P2;0 z3cxbg3&kM4%m^6e1+BiHLO@70Pa;O;C;@R#vpJ@bfZ`i9QktbRg@E0*2+>@D_yA8O z-|_4F|J?%9Fje}qT3e_h*oUaJ&QcX*A&>}*yyD|%MD_sRY%A*gpr2mhSBb+_{3QuT zASMqj&RK)<=ZbELj7SJl$eU{q@fSbB%A^MRCQw8|jYW^>8YG;Ni0B?_b8ZYAebpJA zpLvbXvCxndS-0`fOsW23wRp)X@*`D!Z5~-)>dw#Az0~-#dr+4SWSN92pko`UkNlF5 zA=2K-&v%Fa!VBrcQ7C8}je-QHp~gOdH1kb?asy+SsNBU5#rg9;AG7pZR;&dMJVEG( z3!0QjfmA1r99S7hWYC~9KkZ1lc%0CeIpj_SWcZxEi7f`1CZSNM zf?$&lzcI_Cxi1e$Gy!kDEr1oPfxh%F$}KX?Y5~kriKG8XEchsif!2(WUTbnF<9p#R z=)raXM1L`&$T&ndKi8685iwe@e$+_z_nPA&T6@N~#is)7P6!hNd1UW~b zI4*I6(UPN}gz{vjTuWcTsW1LEulW7v7k9%bEVey>2ogh~Y_p{|Go_MDNS=?^{-C*( zZAknd!IodA6^K`ASmklJO~{Nu)Oh&}veK}_TceZ22t+4EsyXLMo^W!}%}7%SUXP?s zgsc}ky#bgVr8T-`pfLMqs>1tca1~AL;?kk5Stnv1hq!q>Mj#@QMrngSa<%a1)f$#s z$1bt3DlZ@caYBXGLYka3L9mb(2w@u}C4or&nW;|exs?NF;K4kiH6XGxIb#_mG&%)= zrrcx46lxO??t8swJmsi`oMWCxDh-m?H1WZ&3bbQ=LY#U`Czv9jfe65~B1bm_O)!K^1LUAX zRpzgn|9V%XnYATeQbYoQq;fbZLUA;dX+q*4d==2fwQ0!tM8dCg@>oY9!6oxIk&R68gZzh^) zz}MlRTa*YEc}%CyyMk9J{xRn!6Yj&0B$W{3HpoPn#8PpvrJ(6G#YxEm68ZidG>zw~ zIsf@~8A^3;$^>iC#=&b`17W;^8G-fA!VCfzKSvLEDg6dVyU34-i=8-P3Cm;}La*+@ zfh-aV5&7sKsnt?vTg5@%fN@pY2bwel7{{gD;x{220#rFi0*mtJ_abb7N=>c@6tyy} zC#2RBhqwe5B@igw{}2wWO}2=N!J-EyZ4e%8!9zC!Y0W~X^c;p{XQS`*8Zv4Q-{Y_Y z{YIvtazx}IAXK77i5xu)U@%hkoS$EG)x(sH5oRP^*D&4^2>*`aQ9Di+nPbX*^?-8i zqWK;h4pX1pED*?*_V5TLcy7exA{WjwtgU%IRtXvqph3p;P#hUBA*;jMh&;R-6=)6O z0sJ&JcyjB3_mCceV_gl2@$ci*J29mNPsxKh<#y~LnOPp5_&|ugmEKL2#2_t1e}@8n zUJZp5bTnjZr({4y5v`F9%OMdQ^BUrdSp)$cUUGUtHrX0FAD=7knyb6$n6M9TVl_kT)sxwdbKq}PalXpn-n1Wy^1_W~5;xP>UjU$QkR{wq^_ za)&|;P#vH#K<5T>NQe|S+ftu81hagU}5?-<%6Yt6EJ$LG;*YUnRyu37`qtTL-q#KB)G5HDC~vGlR&g$uNC(7{ zP&6+hTO{HAmAan3e)zL|hdWemy|yu`wGs{#>z7~)7IElCuM{TzrS`|lUgt^t_R!;{ zYaHm%4D|2Ml7Ko`Xb5`QCGi-IFRfLjaoie|d)zoum5e~a81oQ@9OE|eXbFebd4l!5 z{*lJvho%LH@_m;+f;X5WB=Q+#)?zqOz-%AMjU+2N2}8yC-FCvtJuQQg&>b z?1+imTU}0RcAcI>9mFDgT^$aVmYs3c)!3a@$8wNMDhx1$NDu%(2mokC0F1#3wPgsk zB(WRAAlm@~UIe%Mdv|@WO?vE(5|VGJ%XQ#`z%!_4>g`t#dud};j0z%<0|E#7XUId8 zp+Cfzwf>w8o&WWtLA|g3(a)`7N%e5{@ShyA*9 zzkcM*a%9k`;>zODXJ^S#q03R|5HZ?MoV<*V2P<0bsb8bdnn#vB#Sj)Pe|q%PdGzo6 zxaqQBtwBV2LfUb;sp^YwEt;5fGpP?EMHH!(t40cfePfJZcL5M?w?FxM&t8z8y7Kyb zq0M&t{=0U0=-=9XTmN7B`#XM@BafykA)WlP8T#zBzRx>5wI?$3ax*hIe5?iwS0i9* zzN)YW2xUpBU|`S#c?YZ~4}CsEPmUu~m5J=8M*oL(PKr8nAdpw}CfQJBSTxmB+Bzvs ztmh{`x-X9gFBg%M%9UcBXb==e)Be+7L1ZFH>7^9aRGB>!IAR&u|Jh%NH$R=Jj$m9? z80=Af2P<2>#vl+>>4ZuSC6?bIgMms@L4dW~{4vt%f&oz7Hcjm26ZQdUaC zw9IB!9YCq1jml3jUs*$h?&J9kS(#Mw_GCO5cGFm`c6tKFSa|v#;C`vNDg^4(>#6S- z=#5|hl`nNdTY}I~`(mx%Wd>RbTBM!4vNJou;{#7qEm(3g+PqUT1FTZq1Xa5Cuva~= z@PO)y#hUMF2!3Zu1Jn!QnR&i>pKLmrslv4o>lU)qQk3NO9x>+IC6cy z%pAPjx%>#$-Fx{VDgi^o4x7zJ0O?<8S+VV{GFJ z(dWs?BKSPYxvV!H@T1&>uFQWfd>$O2?vhnV{8It}m6puyhi*h*CpRoCu~}Y-M|yJS zEpscH0H2C8ust$R6l40N*-?KlC*d{wXY~X4)y&ojdtZC!dtVaV0v2YekXSnG8{H3! z4sg%=6AK61my^dy&d6xCe5M=%(^K8M@*?D_ZN4EfQ+H)GR0$n}#6M0(RCWaGQgE1p zfln$WE-F9TVsMb{q=vk#-T35Ym0#79&CGJ4yF57NtkbxDPzppE@x+H*WM`{!$xUxX zow)ef=fwv9zAk-;KUKw1ZhUWOtb`0~9o05;^PYUuL;J%vi##`qN1;NE{=mN^oy`e^ zZQum9yG62r*EpR^b*(0QOR!yQN9AkFK2iOUJZk9SQceMB_c`PObnnPk!FQT2)hRC# zg++CSiM^Zm(L>0iC843rzL`&F3^vl-klZmKo4X;{r%t{13NS@w<{Gxh!th{w?29^| z|G^f1f(bPa-1f^9HtLi)Mzyu8pLhLUdB8R~m&`!UvNqeG9Rl`sDY-A{O3GFHH644X z4TS)U{IjXt1lV8wm$I4tS7WqpSYxgwU=8~%eKvrvMGpQ8le?3V!a7Nl{1H(g*18nx zCfMMv48=976SSbT)jg_#)!$O1fqM7Tp23fnN2i`l<)i^Y&wi|ptb|WlI$=u3cY>L| zut)C--DrgQsPcYxAK*~{$jK=5a^yI3y1d)wasV%H{9Q`VS;6~^P3k1Oal6K-rU5~V zVFJO0K4p^NcB*I!{wBYfpXxGTSJ+OatgIxp_TQA&&O1}i3hp-m0vn0DHFQ*4KUr0*I&^BxT6?SgxQ1>TTKKe$0`T=gJBni5mK8Zn3cZp)(qHha zdZ&R?s>HCo*Sgwb-}-vgSEU9|-Bmt{-76<34FKB zWiD<1RDVxO*AeU_w$ltTkk2S_KAFg>ptK9eiRSdO53;R=tV%+%*s}v6+D~>mzzrpu z@cJOZHJ7Qrfr&7{)Hl|;VdMK&Y@MU~I!maFEi<)g%m3Nf++5aT@GwNMH-_qxr6xg4%MO$;h4qU(g-0UsvermY8o17Vx!4hI!f##qkQ#>N!aP#u{je^1N$hg3Q5o_KuVFUhYz&&&AZ-F6rpgg@)a z2RS3i6Kn`ePGIW8+>@%Er0qAbjs!QP^WJbj7JuJ|$QkpI#_&_0Q;_UyF<@HBf{!eP z6a}GRu>-n5HNqDj*Pko6Ix9~~sVAY!KSu*EcnF_P!Jn!a5l^~np7?+b?!d5lAuvfc zvVA2nURkN~`Wbjjx6PfG20Mu5203#NDr^7ihED+WX!Gp-S3|@t2qd(MUR(( z`#MC8oWA5+M+FB4Lcns{wejzK5!{bQ+fDJX=d&1D?IH}_6-%axdJKNQb_cS~*sZ|` z*mG1zu1D1QrF(O*A4hY>9JwaE&18?Lep5;btX@}7jDQ*0yAA%8ScyvMFHC(C4b;+1~ye*E+p5kf!TW|zhh{SQ2fB#4*>}|SZ+%S z%>lU@;NT5d5{IT^zox~HB}7!XTzQ7Cl9v;_cH5>arX;W2onm5^+*@T!i&U5I$@S{C zZsGR>D<>2u6;EO%ZeJ@jyoW`Lt+e)a$VDTzTyB0zo&+gYPWLRFjP#${71}(v zraX#KF#d@x1P7MUVg5kH8vJ8N2lwQEdKwBJd+Q!HF)8L26EML`+E)ldVnp4b;2?V# zp#lN1_>Zp2`4IG3TRYJFF`s@AcL1`$wWc=26z*)SEIGg<`}c!nS#N*doY}bF=nmQW z0DNPq4DQU%Zk2} z2)9-kTKsC>-OT;L9fHEUr=elmX$_8sPKUg{OaH^4bcn_$O_?`usrx4^wy#wssE#VV z34Up*)x%rmNEakC@~E?O34hsCwRu)2E-l9}Mqh=NQnZ$9de!yTsABFjoxX%WW=4>0 z&K4#?D{Ni!;&nw(&YgNx;=jC~IIe9lU!Ht8>ZbxnhhYH0lpth04+H$sf5=7OSvIDi+`Ptq9 zF}I*F=N9oGSL#FRo@5dj*e&0-z5%abaO`dT3-a;0bYFyjdw4!&hgy%`PI8VxLX{f) z_$ZU*)dQI0up~YbZXlSBfG66_nICxCZ!W&~`T)q;88h2*p;an^ReV&pPT^+^Y0!sh zw?zDTbZ2yDj1P8;KS^QU2RmNeixDEFcvkJmt{57-8Mkg!-I+_nyf8c8|Dz-D;D7u< zUx3Jw9>O_8LJ6Aa6W1Wum><_Jzun7AD zH$}cyj5qE|&F;amfmhCAgKBZ)x<>2oZFWhPIlkPPB;FumsL~W;P74D0gtFu+u0|6&hNa#m3q=3C!ThxVnI5-N4 z7;-;8I^6v19M?5Xb&<#X7LO`nu6+*krj*{@S~oXo8gu%B0!&FX0^|7PpQB*r+^r`r z%qK3QDHnZ?oZ{|W}HzScN%eoo#j^aklCb4?@OW=i{aEm?xYD=PP+8`u#kWxe1z+@v9A91K`pzOm%r?WW80AyV%W ztC_F31~a>z>(c74H5jJusjbi4( zyV%VgMnAl^vPu0C7N~GfjHh^*CL_oRlIz}=)}rD2!JiY?%8vyfs}kjKxTp9( z+Y8KD8Ie?IMz?&hd&CXLxvEdDw2C;eN;?Ohf4!e{;PI*MpIld(bGBnq1*-jOhXp)+ zsE0LWt~<9|fYE`dHxX)!N`K~XXY$JndHUsKt? zbY4*DH&eR^JY%`MMoyV;i+TNQ#By@xlo+bTz&j91$1vCQXY|}r!YdyALv88N*XW_o zI-;;0>6Hkt(P1l07;`m*VF$3bh;SwGcoyK!@%t{ z2t*V`mV!vIkXXnB0BAs$zn)Va?m9RI_muwS?5J_bZ>Q6kAdn(a>KnvLOwVcP{7GUJ zPbWV5vbZn(Ct0F$IV6wbkPz&Q)SP))5f_V$B*9QtpzWBSDaFIvlj1z_+DE%XNB){z zozAB2QPMib$RH1?8L0#YE#;w5S-r%Qx8`)OneFrsSz%1Q^jzqH#aJ=Kl#ym#B#SE< z14?e94kfh|E?l+1(=HvP&gia_S4N`)I_C5SEuKrfgws})3k4KlF~Qb-3ZEci3Tc{; z=<27j@fU0?#f%~s#ozG2kWqn`)+;(m-q`unc$dmkq|k= zm?Mx43Wth_$z2ltY0)9YqXOQIF#%|j(yO>zrPE#$)0`KCAbY{Z=~6S(@9XGj(x&rA zEYNy!S;tJEyd8FMGD2ifE=d%SylTSEVnO##>Y0}ZDH=eGf)Z5{2{cCrTZET+PoLIz z)602)yd8uRL_!Z^-j~xT|Jt!bz<7{&6xT;mGj!}cI_dCOObAhm3$ds=EEi)EEhHOCS>(*eYAR*FgD&ONy_8U?eQ&GOI#$I|w=-?xzLt2ktR5L7f8VWidA$f)J1#;8)ySmE_BTOh2S!dcEh=S1r5na6ySE;my*7@gp2UF94 zCg|vHeNwT@L!+FkvA%yo4@$@-Q=|6q8MxwMJLMkTzENIWVHxLN2J8mDL#ipBoiIQ z6*?&L25E>>ll=#(9?|BH-Yd5bA_zJtNZuq0vNBdGOwj<=Hkqf#t@6@?2hf0lP(kTx zOrln-rS&1Qp(!E^@@D5trnJ$C5rY=-lo&Kbwn(F+?qZznDU^Q@Ntc>>x}QE!s-a+V zF%orPYBy#?QeLc=4#%l=_kFtNm>B0NzD8_B3aAZ-|E>)Xn~+dJo{Zz~+>lw{vEDu* z<4Ua{kTaK9vW_*DD)3W+il*jtAxt+*7f|J~UVleWXCB|JYTjC_`&O1OiD08bm`xglTDst-Tq>u58DkZ8>~lkceBE=(m6u>iSy}k4nA+%Fjto_{mjKO9B%D46QLK zmSqBOsR0fdzjvp0#8jBX&Bqos?75$qwS~uL&3@wvNb4c z%7IwmDR_kvAre)^t>yeKC}Hy|T=%R@trS@mq}J!(Ra%2Fv8bH62o3w+pAnhS9S|sQ z;(B^u>gU1Hf}$5Q4rOCcvz@vb9*;R$8530~64+5B!)&az97a8@fKmPup0Q)R%~2DI zD@B$EhdxfHyLZyO{F9>8A)kJS?5e2$3yi#kd-a=F$gav=~ zvcbba#wvmUhqS<2#~|uWqk{4+$)!+eCE%&0lTw5(A`TyOL`W2G-uqbSiv84;4!oHb zsga~!EH$NEWN2cAz$I+CV30?tcO5db`Un-m8;+?XQ6~a{Vz&YZ#XxD5$+ho%&Oc63 zY}t72fgp_lwKbz7FsHOkQJ<%1QVlOMQO5t>C($x2uZ21tA(599>{EB*l2<0N2U}&dY^X<{t5PwXY754fo(I7^5(mawD5ds8sBP8X zul@E@*`}y|iHE_Vb5q%LP+rqLcu5U;nJ%uX4wt?OM`fW}21h|H2+;s8U`#9}AgMu= zB5&Eh19X9%2kJ*dbH;okRD$9s7@9&QvonZ7SW%QB0E=E2&3v2RfAqKoZ*(g54i31P zuKpM%hG~YC8`=esv5#iHY?h<9^jdG z2Sx0hs)I1-N++i6GW@lC{&pOSBiur@!gO&_RE#-_zSzlIW4)8F|)!dLeAKiyS+fZ19Y-;Sb+|1g-Ul8<9f`kNf;Ztyt+ z-=w;*z{O}YhXxEvY^9eVDl{tJsbiozn3 zE06Lsql_g8C_vP4#6X;_fHcR*l7TR&B3`g4|L3R~GH&VkBb*}%B&QY#^^(=61Ovp` zzYZj;vN+02JAQQ^t(#AJ>DzS`ycG16r-L!FR17dmEYt+N!$%VJuYw9;6RKXgbO->p z%364kajnx*qM8CNM_kRuV9K+;CMI@S>9hxx4D7%bffU5bL`x8wTAo5o8Z$LZ|8E(i z;cTIA9Rmy=TN$_*u!RvNEC!$k2`wq!vZ78svJMDJ2fydvfF(epYbeKigtrJzJThie zJvD1MTth}3^MB6LsYKqF1}YuMQ$2<&v9i#xMUF`n#^YkN?|x{NH={{eN3+ggOGfxH z54j>7XyR5>5m<~snRGRlx!r1U}2;gOu{lsD|HqiD9!5}d{72N z0yyizB(DdTNMDI#*HFwI0=gk5)m_VAyR3?Q>629CshC=|XlhWo3Q9zlEo6lr;rsF~(iLC-*(JJ-0 z>cSlLvx*C8y>q(e6l}GrKr;+S;?R*0(pUyS<~UY+Y8`274$hx7-N>2CQbP@Qjv~r7 zQb7u+%^KTL9((A#<l|F-~G}5lYJVjr76=K4oiI0_-Tr{ONwujVobe7d_k`eLVoa(r4`2rmqht*$cOl2 zg4Vh!qF94P0J680q=GVvAjAXY;mXjLyM-?OW0;l%@C!(x6+s6lyEPU>J)%H8X5h&4 z7bEOmLt|3+wB|L5Y<3=}l@^LH!{Hq))i$K0!-e)Du3{xdQVYSFLp|ttjs^*K0yehO z(}_+0uUin_F$qFN8W5RcbaXMWq1a)ul7h#D+kG@1G8WpQV>_m8qC;l|2^|pvbfHXF zdl3#tvQH1a$$p_DFY{{i-99&c((I+9ebCX9s%A_H;8JR4%A&wyKoQYML(ABf&UmdQ zMF_iT_PGk%F-~(NO%w%rz<8dlokDzZQcntiE`Hn7-IE>1H6bWCFb<*8BMbB-H6B_& z>5C@+IW_%`iNWYGM3SD-L}O#261M<=sl7&?a;&l?;|%|fcUXEWPhs8qDaC(;}wL(ERI1>BOGET>1Z7` z1G(RsgQqU$!Dv`*CCF>3lz~e?ffIotI91kWoNXRCpPP5?XAfD^``GVD6Rc(L_~uvW zsB;PjA2B6C5+e<&#OU$^yV~sy;HC*{aey!nrc#TnR^Sz3-ftNwW#I!)ONYz@I^v_g z4acBaF>nCi-PgXhjAY}ak$;!<-vD8m0h+0RJ1_uX1<-<85D$>> zWuFUk!cO=AjrercPctF-qvZ{b5=g&`1rX#0EBypW*6;rgAO!6+mSY$U2sCfr7%^fb z)z-1c0U=-6@#CQptYVFtQY^widN?RW*%0smfD8c5%m5UF88l6RuprEkpKTZ{9p%PJ@qHIzjoHTb0eRi zHdlY+L%wyiz~={i=>Du%mF~a$w?}a3BkZ60SEnmUpY{1H9rf5~Y5soa3}N*jr{=!s z=XGbH;UDi$*1fL&=DF9@q08x{)G58h{bsZ;`+{_rP>%YhfGsKPq(yw0wjq?H23e7D z9HU*_2rB7QdLl5O2v0nGHg~OlOdx%Oc4?`fmMBW* z-f0zTW2>6l>76!svN2Lao=yQ>NmL((Bng*O&~t|5TwW_qSWU}1%_VkOS;P(HlwAw% zY+{u{A39Ocnai*&E$w`}PFZY)JX-8dd&GpUcFu7n+a^lpp3S_Gs+0CczdH+C|8G@ua&Ls6dBH8 ziB+X7XEC8uh4pW{;IV8S1(mGrtvZt)I-=xiaZrH<5O*duZ9%qfM`>-TeRP}F1t?S6 z+=g4Og8=jL{{MC{{U?QI024}Kwdy6SMm!RG#X@&ziDsK(8Mvc*W@z6#Umm3|l`i13 z->2)kyu3U7ODm!HxB1S1|CHs~HdJUwi*xYC83^H2} zoBhuBX=AGwbs5Ac+Fv3;q+e&Jf`&Wxvv%F2dpoT;Xz|$PH*STq)Jom8QJ+)~;G{l3?e#6|^VaU4>4V{|$$fhH zEZ;~3k2bY}+bTh3;^AA7X(8PJb1dEUiM^xiC}!#A>2`ND%e<>nWTmo6gn3Q6uYY`v z%(ei){Q0uETiJ$1FVY3|vcNjd42B`XgxDnditCa8RO)2=k7lD zETBKIxU|Nz(TT7H*G~ZNM293sZ5jb=gRBjqvO|r8Nq;w|w3}1ymrmwG?Qt>YhNg2a0i}RWrD1*)w;>*vHs-IiO~+?$3!E zYUNt%cY57U^FSEHm&1P|JB&|syKl-Se4o`wasXuG!@?Sk=+!c{7brtSq<)`0 z(kjr?kSRq2wdi&IzHf@&APd3fYJ-<1=!)TJu#3Iwe009S*USstvxJLC`fy;chS0+T@yYT>9cptjYgwyMhJA4O<}bP1?s#Y{CEhx zYAjMOPkE#49K*dqNy0E!K>a&w)>dN6>+rHKyI=xmid_zSuH0B}>@NGm=frsMJd*djuvthqOP*i-u|D35SbL`>$A# z2X}-e?7-zu_MJP~C$PP7ZjNj1-=UVWYr*0T{=&@thPuar?{?B!!&YXWDc>`VEBoLZ$JNuAgU{;%IfL|N|p9O7u@_-fxF1ui~>{1?Yd85&h177jcc7GW3EXSOqr3qP$3N09=ZhE zy-eru*5aY8Db18*Y_^M*p40Jo;0A5{MLHH+Ys@-}>LpQlW4`p%+loEj9-{dR9CRuK zry1O*ed!Vj9p0<^tQcgl-%0N|#c}j6yPJ{dx1elBT8$7m;I%WsswxYI8MQ-AualAM zbS=xxrM|dMKW|M{%qKkMOzoWMDekT)+0{v9Xzt}r7(J?)v-5*Bn6TbhINgIvX=1Nh z_PJ~OYpw1&VNhE$D9m;-OgSTnvwdqDm`scsnSQh&nX_NZb$WeqG!3`F(T*gOg`ID^ zvZnOac+Knc#!7mth^@ADKRk*|+>DHmY?oT0GjK;6@V}T(h`7U00(aGIaa>53C%@$1 z%`>$p{xNfjC4Gw_Gi;=gEwGf7);_ie4MSca;5bAKMn=l4Jw2*koYq`R@GiFNy`DS? z$?IKk+lh#KFCxBa_hV&rG-oOGf8Zs<{qPK#gZ`E^#Likt!a;d`kD9eli@hrn`zOxY z0X`k(kPy$`{4Ctl8-jn=&m@-|-LLMgU&BlGSAA*eff#D^nEta}<~J8I0vR_z1!M*0 zHDk(dO*}A*V(YT&9lsf$#pL^+_o!Cp!_CQG38!6NE&b z5+ZpwKHD-SmIT;v#C?l}*Kiv|5MaE*Cx$%*%Y1Es z2ilZ1gP#Cn$@CB1$<}e~H4(#1)YyLh*=Z$L72%v_X>&&^ z?D*O?6Q-)XCNQ17z4t<*S$A&DI^983Z^^Hw$n^^1 zHPyxA%0cB}n9e4IBCYK`VvkO1Qzx7Vj;^p7)^02V6|{A}k?@1aai0;_t8i;SPLHj6 zg}gmCtVXv_j+QnLT}ke{TZau{cY*N1b%8G?E%lnc6A*;%k+pBLIU2-Oj)#@PV7qN9 z7yjJKJ$_|Fr1H%@tiiNG{1*NXXa}gUW05yx&8nX`Y_FbtA_0Er*;Zfk*!%|LhL&Q) zcYkc~0l30e0lBSf7~gN(0KsA~m6#?SYSuM&?1Xn^<=6LOL*Jmj9(|VD?>phbBkr>< z##0GuDB>QXBG$8F8?lgVJkDCM)d*wU9taV816;Pe+qu&e=d+G|K$t*mn9Ay~!Dlb{ znJ=oJ$uV$g+rS-M|MM<6ii9}qzYowe6CNAD%J;l#0$R=FGvXF;cFpsscU28Kk-|xi zFaXWzaPrseL@cao`N9X-F`ivqr}PRjaT)%KA9^i)6Mm_I%LIRAdsbjHel9*Z$O!P} z8f4&#k^;SKUL1QBBhc&?2bzWIf${fJ?tznYSF1$TBKJj<0G5B%Gtp7J@ z(5c6Ll%ISK<1+k}D`M?j$=*5gY0YK)Br{`q2GfaZyhOude(!M$e_dRImwNMa6mc?f z@i8;3EO1mFC#Oebuc*{+uJ|V-Vn+zHV3Is<{d5Y~?!QorTTBqWZO9MKAS=;*81({z zH*&1ov7(3O6@b?oUie&pAV3wUk~HLaRkJp3U~l}!!H|(AsfC$bS5hB0vP16pKhi(h z>U6ca?gzuXY%R>{;W6^?u3mCZ9~b6=ZsC7guEF_dmDimkNs`iY69+N#xspe z;%+PARI&WwB@Q(nS8;xJxm%ogZ$rWXjv{$qCQ5v{yu;HT_n%poGA3ROWm;@;v8?1> zd~f@gEE?X?AjqkT?4AB8ETrY*s zvIIa`(<5N^YMFKz-i~ZP*ws(vx(Y7&7ciGnZsj5ZmBlXhKhL(l{deoA%Afh1)J$n$ z#Je3jbNA`mQs~*M0)RABxb<#)Z~VpQWj!*})R*Zm;zuXPTWtFQuu=P)E+cw{Q_h8V z-yNdV#}W!sPK9^?mE|tRFFV}Nd|WMh1vRf~25bO)Z?iTdySK5d^uV%)K5AUk?vEKZ zpyQ5bz8%-b-=zyFcjh60${m>zmL@oQFf0cw%oQ}?R5Mww^~e{t1b1=8aX^=HpXHZ( z!}1G#PgAcnWEPdm?&toG4K$p|2QGt5@Z_R`Tm%D8`F0Pp!U@2Y9bCc7 zi7UWb3wmwbgONY-aE!0h`_p$~BdDx<5^F098|G&b>~Xq7$hYeMjH2cg%ceN(jfBThW38^19~o z_`f*-w!!zZGfKWjxb7BVqcUtTeEj(L0Ht@Q5C2~OkAm-IZ)b6-B1>ywntcDKJOAbQ zA@S=FyFsrWyG1}`-(3bMe-rX|dH0X(B0hQ2N-uIML=9svE_Ulw|Le292N1|cpw%tl z+n`2g1sP~L5X4sTc)KeEfzcSHl&O6#F5 zh%rMbVCnUE5M`-bJ<4-k3_$j2?8Zn`1(M*BO`TH{VX7h3f&R+|1pvPj6Q z;?Wv4%=-IFW7Ve$-eK&)5;?{iUy`9H)uydsCrk*N4xFMjOLh@Yf19QI`p?;Gg0T#1 zO!iO)o=U0r2pE8I9NP3*z;8KpL?k~1mQFoa31TFd<|0;Ph(*Ln=c<+s!>tBWY@?%x z^E+R2INNHur_v%My;^iNf*2+sApy6V%t71+$HjT{uMBi+_E1O1qUEHKAgTh;s~hjM z+E@cOaM7kq5uAnu+2G`i)&a2=nTEl_b85v@jG%M59Zz~Z!#HjNe`#aUGzdE=crMn? zaSEo_NQ=EtYsb>LmH(aQ5BKKrYrirIZ608N3#llOB8;-E#&}0J`aZSxa%gGsx17@R zI@RlV>Zy}OBQKKH`z@NvF{}=U9R)FZh-ZTHvHQ$jnxvCjE40K|hM*8Zq*fr}MVN&+ z$Al*wWOtS4jC|{$>os*z&c{Szggu6G=Jm=?EKxCDi1s3AS*^#dpL87#0+yIT2PUgk zt*er)6rUn$B^BbASdO}USFnGWoKirvWn78~4w!3*MX4$Ef}3@{bNWwf0H4nAEu6!V zReYz@A|MhRr3%KHgklM@8otXozTWVv11JTAJ?jOVNm(5eLyxGK0%8n^@Rkz)i8_Gl z&^GnGBpq830K^Aft4>gSSS1S0!B#pU?pc6;PY?Bb%Y1*z{v!dw22+bIAPOo%59*#^ z*+cR(mgv~&<}_Scd$7YXSOJ27P%S1Bbj9i`S*9b2pq8-d{k3a-x4@2?TX80pQZ+mS zT`-XfNaO+5X>wNOlb+>BUf;qpWEcbsRt41^kpyHL?_N z2iStal%_Xnnu2S_lT)h}D)5VItl zZ!0&NTK-SJjGVz+B=8v=Kue3O*)PHrD>Z|{KtjbyPjePFM|IQ@uMTQ1XGN|Hp{rpA z0j9vQ7@L0md7>wC;8Wj76g^b}BnUPfbE0QnV;4gF@Ap}x z=|>`py%|tQEUCuVP|l8RylF)0YFqk&5G&NydJ9v6!J~u;w6+6L zWEAxhO<2=U58>i2z0j@GJFEl8U=2Vh7Ej{p8Q22lH25-0n{%@63BQ~qp@Uehpx=oh z0|kb#!O}Ub_z42zG4p=?2^sz?hoK09v9uZvxpLG`#j5*tQUv1)XO&-7 zpHXc8ug=%~faSZt2`y{Rb#-W;dXj6Z-)aBrx4)0eL-9Ox=>vRnY}O}$;Hc!rOlDd=VE9H%c%dc<*;I*XujaJ;N(Kb$DJRhu?FEF zH<^#*&zI}k#=NY4PQi$FKoOD{M5*`}pNUZHs%t^2(>nT-lz|+nxM0v_r4=f?7Fb%X zQ)E@Uw|$Gc6>musA5!MI{Ki|$sw5oTigX4{Y)TH4%#cJY5$;6-Tn74zPN;I@WqM^c z^gI)l_IJY3AY?6cB2KYMVF(fdvJC39>@r8xLJJoBDcDf*2Q1u^AlB6ZVelQ~#$rvx zQfc;`QDXlXL+iaoV+baU);)C>NJ22IqT(+G17ni;^;Ow&6k@wSf>pGr9SDR)Xd{eL zRU%YJsDg5&y62cHdm)>`ff1#vD;zX6Vsi%u7wx#7D&0dr13gE`9wo6T7elTXS%|y< zA=eB}l`X2?F*mgFk2aOyLMWv=h3i0*juc(EM=A=n9$p!hpthqJ8T;7u&W&XW*p(Ex zRQ3*?GFH_~wfqPBR}9j-8YemT;PrpE&Sv-C+^u)@>bbYVt?FnTL&VJhu*#`-Z89fH9QqJrjeOna9&Rm_!Og_erEDp>i z&2OD-V_7{xOfh6u77zx#G%E_m$apIfRDYg%44!x|)pm}> z{%8$EB?!TYf<5C>^}WD>gYn2}WFkFT*e*@CU;Sy!$;Zfo-1A7!8H`HqK+P0jWIF_f zPQ)#36Z2l{i*oa1sd?pc0Vs(@Ad-ghuNg3{5lh8VTdtDTE$4?pMp#OJJ*Ojs)mc0{ zGE~SxOdeai*mlU2zPw^7R0?@GU-W8wri~^Wrz`Lf1VB3@r&nWKd6`$43QR@cYZdCH z^)xdvZrxa+vpMYsnM9#{a-nMlp@JMzDY#IqUub>i?`39Ke-dHKJ3)kj$8}VKI2E-b z5EYfpwI~GZ*IlVUzKhQu$;dw@WJi%H04j#e8Ysq8GCH8d(Itjdm$`J5n7MI1vKTGZ z6eTh3QH)VNQJrRFZqpe0h4jZXz0KlL=z`b)$uwBU6a;}Q$YM++9Z+#8*z@U-fZ6u_ z@#fQVdx<=M6QMreTS53*(9?!6nm|!!=LHf>u8)$PeY*@Hu*M*V#R^(eAS#)@S~Q8) z27gG(P$v7COGk;3*eK(VnNc%L+(RC*JTwAe>oLA@eSE#2E-N1gYKhik($KjSEQ>)D z-{m+gc!`XI_~lahGRj^jI|WNYhC+@fDHO5g5UMgP)HCNnz0^isr;}a9w2XT!0uWOj zWI@q~P%9%51LR##wP#|b)&)SHQgAL@{tC@Ts zKSP1+3ckRtk6bME!0L`0RzAtfzgLJIaWiYv^EUMH148OriG^ zqjfoS2!E@E2WoBR2fb)L5!iz~!$9fH6~I^;PpH?)Io07n;n!dF;ZJy6 zsb4=z2j7>)g?i>z*?*5MPUaF-51Iiz@)RiWnF16-h)k*CIVr$);kL3bPw@Y8A7*6Y z9_l6GYQY#0bqYHi)iH;F&MvN2*5*m9J-*RJX6+DK*a|w0^@1y0>pOaNwIboFCquzidKv; zc#{;M({QG`p2L~Ga-O_vWBVF{MLlIVhl6u9U=~AvtT^fwkNcaMC-&MrumA@d~)&*HiPyMu@u!a zP}2&?3$m0e3xWvGFDlxz{~JduA48w-Z~(V4p@CRaqRS+>DE3(WMOcBj-+yIO(aX8~ z&;D(O6zP-cb$N7;cydqxGHM1Vm@olg0xGzcW+9;k>B?+&S#tXvDXN#En0KU<8tx(B zQ9}za5ZjBex&Lz#g(^i3&MYcJGzT@pum~QC1_D`&q}klx_EB|Ek(N_*BvTCO3#Zs+ zC8k>C9|Uk+@t!#hwK0#_jCjLj?ZdRN@W>nx1d+zb0&b$I_xF`PDDLV9rkkb63f~Qb z(Yg9RV#YtKJ1@>{+wSYWFHzp&=QMl8JdLSk=GL9}4@+p65jA&dWEdAG!k!|Pa$*Hq zAI=~DDh1L?tteQh`4d+c7hEo&@btpUoZM?6R|Anwy@+yD1nEmn3gY(Y_RG@Dp~=bp z%rX(=WVn4%=q#g0ljy=(1fU0V>c&uk_D#@6a*T2`h5vGAQ!zAN@5u{V>xd}DaqyzO z0+xbDMQbXjNLp$}v2Dk<9!U&%WO7mvoWrt4?-d0W1Hw5}vw*S8UAw0G56E;+!g^VI zlnYqDlwEy-5l@l8UsB3aRH!{tc{FES!w6qz=WR%QeO`>WXIN(eQ8ffKw!H=pF~rbW zuToN14Sq4~zOcM~5@9_G*2BTIjL# zWGpih>!Wyi;KQ%oyxifo40^bQh%?*%iA9*5{c`@#4nQafYQ0jLshj|WiU}PI zfvrYb!HB+R!AnRzY+#*uUWlPyMK}zUi$c~jtwbd0)lC0+WvzVa`P?}N_bE+i4#-(7 zDhgtehp<1dm21NSABLGZn4}+DCs&ft&pp#*3Cv~EL#R{34w(phl#KzRd`Yj;?(K!n*JdI##l@>?>$G(4Eb)WlvCa=H0`>&6G=>N!lw%@<-`m;X^{~wj#%%idX*8J!F z)$Fe?eO>fD`_JCJ`)7~jL*}37kA9c*1fM^z@n7}}Hm3wmeosSs z-C}U`pBkM}U_!;;04LxqJP{0@JETU*2n?QLX(Fi^Y6?&n2FL_J>^e!I%!|rs8#PI% z6es_=J5JVfpI1XaOV!*r|&)8(Ao%~c333HUY&*pAJjRd%Lt_ARTeIQQ4uJ*r?J zERds4#=^8Dbxn0~+$w@nb-2OuX>+fJPN_8Pg0k^Us+?tY?Q9##1`3u^L%X)><*$78 zrF(VS8Pu7T!HCp)Xjy^OB&3al@;T%2ziR^LLd&O`Iso}a9p})zKy$-bgsNh0m2JL& z;k#44I?sNl)Qkpx1x^p%q*^$N8R_J6DPo`yjWH@Jm8Nc%rdx-pyQ`n4p(N$=&QOzr zcvRGOD$tf?bA;ZS-k~8Sj`c@1wBa=eDgvkk8xXEVAw@|XmA3J~CusWgWj(3xd}HTR zKd)D^+xOEwv_;EkGJx2xLZtyhK{5EGCJv@Wo1-%E2Tv-eukWk&Xc~J3zWG~pQG)3s z)kNV%#qNCXbNmNHZd|5B{;OHu<#YvdQ>DyR6@uUrXf(=F729h@WJDt&DESUPRizd1 z6qLLGbO z-ia0pi5Su^MD!tw)=-wl!n-TYAp@50zH6Ii@dueiP=8xtY1bV@fvLL}dEZkvL!M5h zRyq~?1uDi~rs{VZbgAQ!r>s@QmD=%FczlAAitvPzqx63%C`c`1T=0DtMu`525gk%^ z#ZI#yE+{(x(;kS0lPZ$pYEeV@eH0!V_l<|R#ZIy`)UT{GyNny*sS`*=UH;fHT@ayoT{y(6m4tU(>OVXb+hU$N&6-gQAHX4)Zm*{pIUBVrF z5*<70tb38&+1jE)Dy0 zAH>{BQR>7pLaDI~bsJM))86oI*wpAuws{PSvQM%?NO!56 z4_25WB^x)<vM&X#;nvk3%iy}a* zMZoa|=(ZURpW}Snen~X7^$0jvbL@-N1U-ht@oX(JygFfq9s-0f@3buL-o2ltqXWtR zwKqj8{m1|)LHK@Q@ehvt4HpW|{pTv^X~FlsL*k7Ja_CgljKayPFjWhRg&-=+mFp%c za;6S*_x1GiKim)+I#OO;ZnA>FDkP~K<${N^^cr@I%9~yaeze4M^tVIT*Z+lBC0gOa zT|>gS!IM`)Y;;(ZYrmzB%(N5_8Si~h4l79&Ryn$iFjq)=apjBNdubMR>FM`D3kVtb zTS-_(RRwaE+!GY zuT-zo$a_{=x@cbHU*L$;F)%9x_5PfF6_W9DZgqHXH?Z$G#sabGvVGliS{q-iUsc8A zt;b`rM`r7k;a2yt+Wwo{J=GPv_iiiSLsn8eEn+#4!z?e_M#+F%%wu~3> zcNGY^H@E(~fH*4<xrf-T~x!r?xwzRz7XGRyT;ICmjYcf`YF3Z`r{&@u*Knl zSQRp(M*>XR3d%bvixR2Ea2WA=U1L}xx~;O$0WydA=vjGm^Aq%6r}0?TmEiL=5wof~ z@m}{agS7a@SW-c9m*O}3r&DK_TvLT4oJ!aGg1OhV&{pAfhR&wHJ4cAzRAtV141S-7qRY<`bUWNKMHhNwDpu(`O zv@Q`t4?bOY#;;?O!2*+f`Mk7L~lz1QccyJTb(?SJOY-SclUr1*z!SZ>)pZHf5!I5WvI{5s0`joGvsU=-)bHtn8u6%D ztYP_^#!KYEN}h^VwytkmQC%9yPmuZIBZW-NQso2is@FmK(p!)|XqWIe*UGEB&fIIt z{p}L}XOUEBa|BAOe%+?7OobKqY0uz#ET(`1C_~2-xzmwcgOb@Fn~>mz1C%)^km#GQ z*6@^rub5n^$`)AL?3ZVQY+6RHlJe^9^hT!1iiV!2uf{H`Hhv6GR<><+ISR;v+Bc>A z(c3WuGC1rwe&|shHfr*6P}VO7r?ffDC6H!PH-yH(GD_`myyrs5&^eC-QrrR-KiM4o z5?!`sj2x$-6(Q-N(rOHNJ(^0b8@PGr)`Qd892Jw);AH{kmxO4;9jS(9C`LX)VhvHp z3r&qU1*(a-Y2|Le{ zvDokXqCERkU8??{yY{`Kxhw|9tRge*IDd)%4WS;|L!7*II}>L-DfUeL zdVP(18(F6>AH!Ha@*%T^_#Iisucz$A;krLRT*~0Q>vUT8`u@!>*GJ*VmnjygYh(D#jnC@nls&V9DUyXe2Qz&pyh{)NE}1&RL^z zD*8Q~n=1N0qp7z+^zwdfK1AV!*UElAM)$LS%&bvrWK*Yy+!K@3U?t;oG&C!P&@**f ze4f7b-m~|#9C&Y)neaKH0gj$&eoE<%L(Kra7gf+V2M{5AzgyvvYi7(Jd*XOKcEdM3 z_w1;x8HJl?U@{JG^om2FuyE>xaP|D*ChNgU)E!xk05IpE59)nZdQxOK-d zeU00_yIVcr|K(Q6h@9qVvKk-scwDU^i|#zGvu(GMP82y)lD~`jL~3x|O^stvs%GY8 z_x@Rm5F|h3=+&%%QR-8U9F*P}Z-u6A1y#DUN&F07&I>*XjJ?ikTK%`(N`h}ylE-C} z_G=e@nl|(7`sC3Fbs6R8(kyL^({39fbJm-VO`rAZ<{WQ6iF7z>oE>XH=3ZorJn4_l zy%U7xBxsSrOFZ-Wio-%5$M$={Isi^UvA@V^S;5kRem#L1=RQhnZaKPEz19*SIxH|F zc$==_i%dlxl#;LBUgaR2(lPQZyq#5>elC;q-OUX!~|TR z=km?0cPK9|Z{|7P!u312+^ns<+p6M;C!=-aoNbdGe(<|gtm^me@D#V1~@lbo3)^CNAz752(A zSADb(b8mLcm`p9Z4#CPNExb(qt^Y2Ax$TcC7N^HgT?1rXTj1-kYlC~yl-+n>-4AH) z>S%lCE|i5FkM&z1uGvbgEcf$U`C8=16~6j%xi>g1%cnXWnGd@h5bs9c^WBLlsS7~1 zyUJ5xp76a0v6V%AO99rSui`%YC3{$kdVP%vz@+J??*rjNW zRISzPoWVF@FKvU;=WE6ZMi{T6jrJ3TNuj&?7=IeOgVv{+oEqd(OO;m5QP1-ki^!hy z@#D&vU6>6^eC5PWzv*3tEDeECOsYlOW(waOVy*Ypui2~q)^K<*B?6ANTZdjh%Lw5! z9bTwCtn>z2>de;I9${I-NnZiE@bikJTPXpv8UwF1xD0Y@rt=xg|Xy~9Dfje} zTr2y>tpWBDk)%DjiB-<}JHC0Y$ZBglZ|V2N{)FVe_Bvknya|87qLd<^P=2vNYzlRb zyZulUXZ*jm$y_oAVXz2$>QkxCwOkFX^m(UlG~vT*0R@=5-4H?_?zk$Iz#zJlP^fKV#i@W;Bb#h-`8F z4<|8N5#ezmnX~V5d~v*4o8>c=gTgP@8TE#~LEjkjwkpXx>~Vq<_s(yHT>OhE4oyZI z(;5>o`^J{f{2*?O-}PKJcg$8Owrv}+MdG{b_4`(aZ`Y>u2wXjj5vtW^f0~V1mTj-TQ@pSXbJV>E zz0r3A#1XV_O}9BXyXlN96&a1#3~{|xKaZip*V5eB5ld@{cXiLzn@n?C76u6a-XVJy zz&sdN|KJCM0D$|~v2~UpnSf@*w1@YWer(VPE!MawToMY+iQ7TqEG-K;ew<2R0?7xE z&n2Z%AZeC|oydxBv1YzuGbKepUCU6kMu`}1%LAgN_nEbM;e-%`qU4$}D#k+#4dz-R z&{Fh(#I+bVg2Z523+Jefd6!8M5H=o5eAaaC-da~H*g6ul>(DJ0laEXg*(e~J)Xg=Y zu%#V$_q`TdTVhO7I5$uY-eMpwgs^kbnhl%<4R&n3gk3$fOzYVq!IZIO~Pvc zSvuRlVvQ{^(Hb-+5uGfP5Eg<&(&?7;4)aqkqPWE+7I987IT%&3-q*Sisz~P7auFR_ zV(gZPal@v?CTq#eG-}3u2_&KhFn>KXakQ2gCk+Wnm5dS;bYHrrly4CuBS@Q}P2FJ0 zSB-=;qgaYuqQU(uTq_}XL=1&s%2T8`o+S(Eu_^otWxrEz$bbW7@4T! zeOnLBMsqNjj7vG;+7zgVC=|SjSuQBXA4zOW?vLs6XxLa}fP$J6^zK5=R4CI2_R5$; zU1=>hsi)Q5 zj9Tf~lU#%ZxBA);kDJrglB5uX?1avW0>yDc*L5eM!7d(64mVO4PvvWeZk8dDk&}tM zbc_>ih)EGPQ;)48N8+)$J$T8XbrfX*DS&(lQV^G7SpZJPy1E*AR0gNw1ZSsE&J>m; z?76;R{4g2>2Tdfvq8zSro2gw7$`XvKl^jH^oW+Zh!zr`o);SF5p2q1?{gWi+MF?CB zn4paVWvLd(TrJESLIE^{5cpOm!2}9poHC2p(n{R+_rOIVywQBz;3#&}R%|F6U4jZJ zLz35KaG_c$shB(SUEiBmH#(quE|n9?$aE13&O~X{AWO%FhN z&Bd`W1wsSx%O{n-?!XdX*QlB~HKT8(yf}vvb}pXV15<-ym1B>|s>ITDOGyb`P#{Z8 zne`Z9!KgHnrAPm^Uh(EStk=#02`*)%g&mU>2+fpCOSaaH-Iuvm$-O;OoH8wqY+=^C z%!EiJgFBh2rgvBMbFP$ZJeYy3vvM>v7gu1LrpC}C83(N3fP|EA{FFl{VaAbXk~8}wW=Nru#m zLD!7y(%Ur0Hva@IK%zxSxF=}hnv}t)wSj{<`sP=7TTf`pT=N;-Qz@oFMBb|Qy9u#L zlxkeLJDB}hT&;KS(%nDf32tU|5SZ4Q8P)AMiJLj>P8>lTbt8*kE>zQI+i=AmO}ves zape+5Ok*8+?StK|H~01A5fy(eY=0bT*p~#QrKbeJxlFKxC+_asxAykUkqHMmS7@yM z!`Y+sY+Xo%GR^PAiT8Joa$d0{EeJlABYQw~qNrW+;j%vS$(T5E-Ip0>x zDhCtnMKPX=+=g&+CY*1(%a)W{arb*Fq|n%cI`^^)5NdC2%zUf`3Fy%R>(h$rQ+iVG zvL#tE7!(wfL8KtjfrFha@tNDdcJ8~oQPf5#3_|~UWkrS-Y))$c<2;YbB%o~r}Z z5Mc2iXlk=|g7hbtffIquN~&+$Rh*O-t%zvJT&4NJxv7ahEjxi~ji?x^pusCaZjb|J z3dS4g+DG6|=j{1*6H>U?NXAKlf3K6H=E)oP2?Dx-zzuB#Wjy+uuu_m9y(A`=do0m} zej}pFShl8;JSfo*Sa|o*^z-e%N(X2<-hvaggw&2HQbI%$H?9~Q=)v+5l>3W4Nnia* zz9Z#AOR%-{#)vQmrekN|Hz? zn?_F69K3{bB$HMHdY52y2EGJFkTV!L&4pe3sh^eXBgie54U*cEnuw!Xo>M)Rat~5P zAvye;?LCpIgx4n7=_XW53az?DN+9lnToK3C@Ne4pFyJcqhEbx!Ob;#^ri1*Xq+n}E z1NyGJ(x+i>oRXSM#HQd2&Y6-nNsMD@)MkpO4#}m)Niqg;x4o1=)#lblI}?(TE+pzt z!QT?E%2+gyptc65$gM54U~iZtleuh|l2hn&t{5fpil<^J6F@^DAf4=!{E>~I0hzZE zC!p%eS$10bJsO0MQHceF2x>?rSeR-4Y*xh=cx0o6p0wjcB;`aj6zrO(ph+2~ge~7j9!GRlZv_`dd-hs{8xt14^>j^zG!$NHWc-9eVU& zlB8k*GT?|=!uRlLEyhADa;(OW$?Yc6dRVd`nxPq{ytm&>Ue zMA9SSHSZGU)?8fB!cY)MsY6_x_NJb@1n&aId=a`E%*xY5*YJCGp$v$Xs4 zoxMX&LxU112Uu(oNvtN5l!X{m#vLAf8e#pJ=B_dFib+L*7cpzPf_2xV=FF<-QT>SNq~OarT52NqwGtL8sJ9mZ zdRJC4+6L-NqVg;$g_grPlr0%JQfx8;QetxQ%f}_kJAQS71pI4>&4Fz1os5udF)5^Z zc7*wNx_aure+W;4AOVE24+4mhTdYYIh!Zg;by#LK-t;lgE1KEZk}#o(tz#FnP^g-b z;a~ykZR4q>n&oDSEX27QF2+TXAQJ_eQp8)EVLrY(eigthGvm~RCKhwDv6ezFw>DWb zB0auK{1s8O5Mn0}tR;}ys!3f!=4YFO?%D@oCZ39EQAQz^Il)rXE1#AbA)2ZZKE|n(}VBM^>8@`NwXO3%9E3U~(kqdCf;zLC9 z%VcPhg57mI^kHQ$_t}2+Yp?V}(r0#)cup<06@luHnM*1{Q&fxw4(ApweZQ2yU^;QL z6GZcMb=D@l%6bxehiofI)U`GE6d9e~O4FfGbE}XRBw~!Fj}5<*Ok4NKXnmta<=tCA zJ!5<=GgA?niJCV9AUTqT-QpnrG_||4etMQ%3uZ4i5?Cr!1ts8nHQ(*)|A0U zTn~&=h)*x=vb{|9N=hx1(N-dwN)8Z^G#K$-0qR{VJ853jF6d$_I1%upH?Lo%*Lvt7 zhLo;++u`p^y=+DEirLZ@_{8w1y^bRrl3`ZHgbJ7z=)EKuO2H>u zC(^V>_P*xJU6tNBkezzu!Bt+1iPb5&^B9u{(z>X(i@nTbQ^EyPwN1i>rMH;S;-WBz z4Mq2*U$$d(hC+cq(ronvajFtFvd}t$x`A5v^{jB8iN?&;fyjCK1bi6)`h*9@I@bTt~ntldoqPSlXR?ZxVOq3KO=o< zm+cI_UQ%OnI}@a3je!P2a!4-j_O06h25WqGV$PYO#K~*pQDQDj6a!o~##Po}VGW|BY6_qXCfO$kGPSIU#9ACV#8vNLK?Vg; zPL!=X(41USFzC82K`tJutXkG!dJ71rSA;qrv%IX8N0u>gK`NlnGGnlXf_EjQP9Ysy zz9(c1x0XqnL=Q&PuinbfAleWR0sv$HL_-8H06=e4_bEaE%KPp_|85D)2btYgIMv%t zZMah108q@#$;}B;LQAbzxv-hf8OmC^L_m1 z-tW|ZU;Foib~XDo*a>RvJ9qn9x*Fde`0+(kNvvkN9Z5=HTKs(?f?D% zzw>v;>FoDtrPi%ELa*LBrsjQ?WiasUn0iV@Q5Do2CWi%L3_})jL9@)#@~UJlqsrO} z(2z$p8fQM1!=;5AV?cduEju-PL!~Kos&Nk#)KQ>=lz@QuC7H`vjp#WyX zP3i}st<<3o!q?&`-jkiiy_VOSC`3y|F}g^ukt#M?uaLC`RWcz=t9r6qGLL%VUlp&@XYP3bao_Z4ZJ9n zv6vWC*o~dJD)l0mg{V?Z;?dB0eeDRh!6Dp9jjfWx^sO#dg{K{Re61V=vg0NiA2hXX zW!=X!7!htz(iF%e@78?^T)mh56k{(zr)z?^17&qesTz@TbW_q)8H|%n=tXiQqp^kS z&Cxb>WDAbUw^Q6T&im z1ifsFTU;9AxKgC95i-@BjNP2AifK-G((@A+4KfH3Q_u&OhE!FFOIgHlj@_o>rpXfY z!9Owb5WQIQbF5gIJ9t_9aPQ=z+v`rG7tF;#+q$7jcsZ6S_7FsVr7clbXb4=vBic)U$V)nA=obN0psSjTmN)FOQe1#=$_x9}Ad3O1q02|GhmmW$(B7+)gN07V77({Gq z3{;sry4rc+HxyEZa;Th5h}KC$NNs)u^Q{|>bwzI24!)^TPD z;No|iogFq*b|<1^Rp|vYo;h8vf%R3(NergK8o&C-p zF{LPCBVa2ES&$36j^bq~AGg(T7KN`-h>!M-q&Zqs@@q0Mbhkj)ky$4+?Ig!AaRrHCwF!mA@HfMTJtp)I?Q{%|%S_{=JLNIvBEvQ!bLjJIJ z+F?|wP&inVBHClfj*{p#8{tBwg>5-aBB(69{c4XLhI(ZD1^<0izU@XO<4$0ZyMnZ` zbbq|0Kpg3{wTf>T5gt-0jaQ&RC3hY4n~}RBoCNAs)i)$YSWKziw7y++K5NGoS~>a_ z?wzVY%acDvjDaRv>L$h?p`&S_{R?`#w@zH@=Xlksor(jOvba}F=2CMd#srbP(uUHL z^5Dug9Nc_TV$=(qMB;(QU1KG6n_BgS$}ekOm$KByk3;9?@1$ekX%+*BJE-OzqZOF? ziesoCGhF1UsVF!C8#u{ggE5VfKU63@&+`(><{Bz;jAkZzSwql@F*=xJY=nPC?;^aP z?&O>e+?ttW(WXjN!51&YlN1yh=f`je$g2MWGzWt=Xs7O5!zH?z0uPbcn=y9sx$P8> zs#Atv`3>7f!47pBYUg8k2^OJ>%!Xl<{uYWgZ)MfuSCcy=9qh%>z=tWWB_`ZsEl{v_ zd0nlcP{w% z6jBvTn+nxe4Ue|Qd)&p}TfUAglPu#9I=^pen+h!A7n`rh5Jd&UuI`2|-m&ooVf93M!O>>6v4dm{>!Y_2)Et}Iy`D5hoM1yhtg6*)U(G^W)$=QcSJd|ZyU5(g_L zEwh|ZwJ(N!ziYA*pj*+l5_NhEbt)GAzCBiQc^LNJ9UIuCc@A?a+pwvq6S+t1YyPVx z{ir|p5%a`b$fBNir)V!7z1miO2Vsi@qexP9xfGpgdDRDZ3m_-%lTYyN^y19{c=x8Sl)J% z3uY@4_)P~8)}wn<9)))HzK*{LQCZ(AFSDVE1crrm-2SjO_hcT|uS17}z3)k{Wg|lI zZosCMSixfj-n`oOnCz5V{H-6hWeZp*E}zRgJFJ$vAU`H8D%hBtlwX^}nsmBcpARyG zw_cZ(6Z{HoGS?Rwd|1CGOPjIua7@ZO2x9hFZwOnBv*vQxX)C2zT>2h8pxN-_`)yO_-#MU z@zvHo;e-e1B%~_6g&E2v&IeZAXko^##a*;yC9xH)xH@$a`dTk+{Eey@TF<0ME_)2+ zOjZ;NX{|nZ9{7p zwtLy~PEt%HgF;&w;UQT+A7;i&wnkw=&l-%4Egf9QVhl0S=f{cU;1`5>WbZ)U9liNb zyF)dYM>Jy5PBBa*qee!SI85xH+qG>EPMK9OMcqabIg3H;i4zhNBP$$FF=Pt#DB9F_ zSwX!NwIxmy3=4}>#WZk!LM!9(Z&yYwBac`jZEi}MT@-80omL-|wjx}1V$YliCRxKPRBmW~OyOpfHU|Ih9%n-_&9#TIpfz?X3~{<5lQ;g$tdm<_ zgL2-4ubhyfOBHyRIL$GUF>ai-ekYdgmVCZAueoL9NXugM;Ft^INs7XV3^V7oRF-Qc z>Q0{Qv~#zvP&h;7++m_iD6r zn!CjuC!epB>YuJo;YQkA9)1CW{*HO6zRPy}_<8;KFO54Hla0I=A#~!9LFQ&wVVo02 z0P2PdF4=inC0_J2jd_+Mwh%8gb7AD=k=!^4l3VekZ-(!{(|$g3P}W68bOW(GT{~W! zp=K9(t0MXpwfL#{Z(*gWovG!YHNjJf1|?opVb7>UGj}rUZ}|%pzOa|-3pIs*$A0qA zSCadulp%w6-O}L*a#cCx;Y&SC%=KO~=7^O#=n7Kj{6SvpCSV#!nWoW%uR#P zs>q2Oe|R2=b=H9-dgTD>S#}ywS)td}Tf^S&B`T&TVxrAvdzA+~79hdi7z3 zSSDWH%%|ayH+SxWeSs3c_8tc!RbtHIP^k1ky8PkvshaXk-z7{9iILku{--}m)iS-a zF0DI5U*FVA+F2F1rhf*1li1?(2PPmo7E`Spm5X?mA=|T&v1Xb)o*Q*nF95&cZJkTYw>N-SLKZm(h(y%B=v1T$qf1eGB z9(_6AxAeGWXRKt170u7A`$vMtd6NG#n1Zfz(R0|;=j~@~b#|D8I-?D$hUgNWwXwU) zPM3!~`__TrQ@04hH|U^_25Z6M46j#b@1j}q)jF)g+Z+2tP0MJ=ymRla`jFRzuj!HK zc?1m0Tz&GkyC4qA(f38>eP?C4%>;)w_bA8XN4D7G-Zen1*cl5#`L0y`a#f?B5;NMm|Ka&6=8IQ`f%dnQXnAvK`sJR|_lB0P7Du92w$+e~v z+EYAP_#}pF#m|kNi72S86lc;H(NC2MU1v8vcbdS`OrLr(?6V`UnUGzX3SEi{$3S5?J#+ zmOHq!D&J|FGj=`p9IbBciin+cuU18y#YWp{XR>Yb#9ZBGSzLU8i+ra=I>G&wvu|U} zDb;nt^kitbNKZ>KD=3v%3N~)`^fRf0<)%CJ9a>JEuI9PFY1BSezbA;AVcR8GtH-!9 zmyyEN4Z|{*>gut1XYO`s33-(b=z~^XSdW_-zFy@CkC%x?K~}G*AC&VHrCK~173Oj5 zz#QA?=fc!_yS0z>9?aY93y^bJgN0w>x$}<(r9o;9d6#!V@?Cl?)McIc9nb1f=QdYR z`u>f*G+qd%PziyoE?-%~Ho0Y+mZ8im?s#lDd#o6^bxYnp%zk_o9{;%?h@%+_vijKB$u93y$$sev}bcK4`~J~zm3Oz2_}5zAJ{q~-X~^ToPeS3knXU}qauT!BjW2B)oURS@ zr@tC;t0;~UbKMtb7M{A$+8tkKZaLv&+mMmcMT*vx^>00Q?%c;^kXg-9zorHD39*oeM0T zBDy!M-sD)>e2F1Zg6qRKR{5vYox!6YuSq29S60Ki$6)>~MR6SZ&$sMXf5ALk#5z0- z;!E?%HQ_w{f3{37@^kt!7HI>v2{f!DZ!^BcJ}L8VF_ovvsebP|s~#|9{_!5BaZ^2W&2>hhG1JUlz@v{BxWm&JGU{qu>x4i0u@-EeR(|sgzmyHWS z`tC8cYG%#mkM)zsC+AHXVfv-AsNjJ!*%C2!)d3%r7g*LYId<1cD~LRl;B=|G!c;D?|Lk1(aN7_N5cWvtaLca(MxL{LVtF*tOemFwK!a=oo$2`+ayt z$dy9Vap@sE_y84{3cKsVMe~j`>xb8;N*&OnpujTSgC0h*FfYAT8D{LBwlE7+p6ag$ ztyPfBaeg$7Puq{c0NVH20wI#KOjy7|CIxf|BobtxN7hGq^!A(k-yR`v?OW(;>S{ap zF@5(L;2@;76c=Zk00N|IIOoBx^aVu*-?}9KOv!}Zf1tQ2N@@gGb}Yftpi^TC(4X%G za=m6YV<}_FL?yW42~ZZbz4l2nvo%`i)nw?_vE&-sN8ORmWs;;lCP7AKvV~(U1)1l? zu?{vS_R3Vqk+@qRP!k44*u9cD3ULBDU0^>m?%I)ZX#8&_Odc3Rt=VCZloVA+ zD8p33-O!gkYR!S0v2-}aL(VPT;!GHFE8LY(-lIV=ZTeP(sY8!84I&w~c zm#+BK$?iR>$=XY#M~dKWCa1J6<3Oj#rQ08U*Bj`Xptu^;X@)jXk}}fJnoNq&<=0Q4 z+0v$aK7<1^Dp`naO3seBHsoG!#4VPsW49zb&~?$(*w6RY1u~V)UTbKQmLMIuK-b75 zff^Shk}X>kzgD;!XKQfb?mhnBZ*8$-T&L7Ty7$Qpp^`L7ERi?=9G^{;xn$2Z-6PJ6kDU=6**Gz@C4oLrNG z#Z8a|+nDGHQ|RA1u~VU?tDO`2h!aP*q)1XOg5YFBz}VPcKqhIRy1*iV)i=7s=9)Eo7C-D;tGp#U%QCo&^Fa3p4{ z&FgjDlIjwlnmXiMr|wAIVU(0P@t)z95~9#s2$noD9LpsBFLRX7S*wLDBquqQU;{ao zAWUsr5ihWJK?fo6p{;ISW;=j~~Ywq;gvoub+ zM&vAJToHrbAe=CnOeQ5DQ@B+Q_kQfyYU(uhKQ_wT9qgZGAtsUy31@^%AWR3~W=LAo zT!u`_8u-rD(9?pwl-Z2{g43j!UL--egzf~FXf{xnjXtY4&%!%TebmN&rmmH5@@jb! z6|xDs8f%KNYUG&|5U@F@PcfZ9eQN5k7r6CuhQ7j6bocagjXH_YVqz$xsR2x4fKu}z7IEFaU@toY*2Lt!Qew$MgeIz` zz)&crA-gt2GQmw8%0i)?}@>gR{0`peYb(9%H#{c_)9Dr0T_#nrIjk zR=S*|=U~-M-&cKEYLQ<(goJy$%j#_|n z(FW48WiG})*gFo+K|{#^axw!+aNiub7QjY5rJfH@*4&EfSl@=jF!r`dYBF$wxM7i; zCQ3Fq{(#pn(%0tDeU=j#zf2CELUYj~MSSK4$vGo%qm?O~zE{tFV4g5I%}DM?nnL8y=xx?MI3rVyMGf!$t&FC|kF9GZ%S z)&zv*>52?j23|OY9NeMJPiQ%fE1Nx;Pp-~ic1k%>nlQ$Rlr!lbY$^%_$ZnVQx>&?t zzRr)X?YDj5vNSidL@CCkxPZu%=8A4c#$!S-=Nu1$4ygBcrukxC#l?xxv&mI*lr=(H z6ox|v=@W4dx4?GremiyMOyWtT2I<#I6QqqA+p0JI(8-Z4p_z@7^dW#3Jv5HliuDO76-T)zCdLC&`n| z+io>uraT5HlpOBjYpXm1#`3Rr%Q3h_sZ^j%5^8jJwB=GTq|mXN9}0B-|JtA%*Sz?sqlVIADrVh)JY8BD`CiFCJ`7a|2##z=DteZX&k_TB2g zVVP><+GlC*p7UC;Xo4h)1850Vs6QVpeeUV)aVX@Z zFirtlVzY(RnOdR^iUh%W{H^~={qDgOn1DqzbLlwWAOfk!R1Mcy%RyLohx`BcOQSIR zfYr^9N@{Zuwk~U{YNZ1g5tzADp(>~U({G6@%@mk`0~xv@-JdCuX%bw(bcVt-|LJW< zqw zkj)vEpv_O{EarPjh@6z&2A4sw>hg;K!qZZd=k?JaWv^pLxnP0MNPSnItZL?@R5jm-pEz*-brxu(g$0Il^v z0(-Q)z23cuiR{v{wG{clWX&~|l91)v2Sq3|eK>}JeZA*S+++W*wRS$WPcbh{Gc{b2 zMy14Nk;o-CwBoG+1dpgY{yzqvI&CRkaFx=FoW~}Pxuyw@jX@Ox+%lJ;jXLF?b8Phf z(Tn7ZBdC}n-nfeMD3?|&FvSd5%PCW2uhG2rl=0rP7sKc|l$uG&_!e-c&6+UL9_ie3 z_Uz?4wuPiB|6biage}Jo^tI`=O(;oeEja+( zsd&39tsDK20z~vD=PTt?_6l)uDoJ39yZzNvm}@Zr84oD33p}SHBBU`J3xCMBW%rm8 z#Ept_fLPF+OZW|}pAJ(f5wltoZi=96D!JY++aQuRs(a4}WtI1ic9WE12{om2dl4W2 zLMsIKBotADG7lcZLifx@Mox#}&z%#zNdbtl%#YOBVNeHqRNRO3gvXZhAQ0nU;(Vcz z4iZrsH$+Tm2gkYm!sAK1Z7v=D;Ei(gM+y$W|&k+&xdXp^y|8OU?@G;79~(6XG!s zmU0e4ylq{|6V@b`56XCXiS^9Zy;hBVQ{PwCL^KYNvEG>ka5*(_XcvncT(4afsz(Fy zBzwr7;tu4TyGUrPQ%2lO7B3Lax{4%$+PB%)M9>)5M`7kv!1Y?bGz@ua|A5qL9aXjwwPV^=2qFFd6dV1@?Q8S(;&} z-LbyRHOzl*&Us2qno;rMi#EGuqJyQ!fz!T4Bf*6S-d0> zJt#h_$&m6i-AmM@6o6vXoDF}Za)Aoe>@JT9uxlG?9{v)%=k8HBI1n+3r@Ph6jVoc& z3(7!;`e;*cKT}A`0q3dR7$_aAL?i{{>aBL4cqwag`($aH8GkvtKyFYyBpAuw54FHt zL=r>6&zm5w_Wr)MZ>M@-iO*n*(v%>Dgw`%LDc?6i!Mq^7Jo0NPg5ISVreZ6~p^HKw zn@nrGmK+qgV9!rNKKzpQajAsub7Hb^RxNMokXpRx^%`z4U?1lZdc<7zw7G_+_Dy_% zP1de_HDm~+dW_Wdh`((1rnwaP#-IlwJs5b=CeDHDEnqp5Mt~Onxa>eu$?1u4|EEz5 z)^#$z6-4wVS%4q$8p$v*JWX68`G~m03#A-dB`zK;VE?0hS4STE#{T-hoLBqom*$g@ za012_Bi$!#DYXYQwxZCfnEqaRn#q6-J()QQgOCZA2*P1xFx2}OYv1Cm+-JT?d!RE427(q!UWAYN|EClNf>NK zZhUmHK_@%}u;PApzt@8we)qq(Yj6*IJoxUXu;+yL3aLksDij4J9}}6l{lT5@^**gG z(%duu@29dq=}qy|@_o!N(p4CUHby3}3%X567%uq=lO}kkVRZCmul$l^v9@_rBpf6$ zZtuATazIOatf%e1#rOPMjen6ZfP*`X0EhRB6Q~%7hPRZedEvmd@zSyXQvazn!u&4u zz-Bmk*^VEzj;eJ;mDbT9iz*^(*tg{U`q(45zVvv1@peZ zsjjBG|9HYyO+Wwsf4(VD>Getg&f(S1#e!H{JzNB?u^6wvIYjNLHqxbgkc@+=ZZ=Jt z$!yfX$}I{+>vIL__ukoIn)OTKkd#FBEL?6vHba`s-Y@lZdd_rvJzEUoj4^J7Rf?M= z*|kc*|!Wkzo#XTpo&hlhDid@;zfKe6hODttFQYWp5Cw4TXUXX?)wJ6 zkSQlyh%mn0ViR`WIp)#FUN(ECkLc+qHi41EL^Ez#I5DOI?u3AtB9!lJKYajX5D)_Z z1OPKc1SSArURAy-I)TJ@Z&mZ%D|JY$B!uK;6mrJ|fNxvA@4q1XfUta6@;3gvs{a5) zW(10e0KmWipd9TU570quM>{?614Mq-u?HSf2*nV4um?I&1h$sjZbp-3mnF|40&VvF zm)N%L?=gXF>o{`)L$zXGjt>vYwjHl82W(_t$5Rh#$etai9h8`Tjz=BQp%nl@0Hy!{ zL}&nO&j8;B9_68M{@%{^BOkJ?DcPQ#rCijZXt(TwV{fzwbmFco137ns@b;4QrBh}2 zOOj3W8NN%>?{94Wx$h|Kck*sq-thH7xTBAGYYwolZQO>Fnps zC;opvCqvxupst#{PK^jtOc0>LOQ~8-q%quKDTrF7mP{FFghhlBg^)@e3?iRb>GclF zJiX=N^yfJqufKw^<(JvK#xcXh%AJ_TQ~FvisAC%AQr=2SYH-xaFcb=4-$Xn;5xP7D z)34ZQ>(ERZIR)6D0(G{a_0^k^p_9PO`IyVpJy89Og@}4^gOW*g^zxRYsK!M0^G%J< zB0?G#(~M=bEbNzAciGmKq564R)TpJIo6n1ZN{$u>yXlw}rI%Qd1Q~5TYFMc%w_Lcd ze~g)_9cW3a_8j!->?_1&{Q3?^7}gdMQ&~JCXMP7apv%R0GN*Z~#bM1fZrl(GqD>q{bP_>olTYMS$px zwR|O1h_IuHELO+JV;-&Gb041&c}VT$Y|Zjnip7iSU5=VaF0XFk~pTXs%H2a zV*^!UhE(j@7|V-PSV)@TOWfKf8;|T4drWbl^@6%36@FK0wE*=N80mg|?_`-Tv5l%0 z_1Ng`VH%fBwDlfoCXuG#RkUMa$lT7~o3Rfc;s<@qdaANuF2#vkBAn4`Is0|VML38W zl{&jL<6?_jL`yQU_MPTbW$o45U%s8F(9v4GyRjKrad7N>4oxm+wrJ!gq7#m4DZduu z!BepmH9Jfpv}N3BR*p3Wmblc;?d3;~It?s~5ZG(`p%Ta2*C{?1b7}L$vpE+ZJkXJm|jI;R+2fg7v|RA%eDr{f)G&KheSwW1=ZlH1($dU3xQrZgPE z3#DRRYESA4QOg+%mUi~kb2C5|-el`>{?7B`Y?>|*idQ5i6CZAmt!pO%#A3Y_QqlWc zKkjf-`@v?948@~jk6fk-wp8u*+ZBwPZn<(^cg3v{JpbH;**AJLJIA7M+UX@(yZP?@ zQvYpUCeajZ?lTdzM!Wl-`D=d=sCKpPO~D1=VGX zJ1)&?#lv{BO9>RFKWIO1*b!S7V~2r}%7^2^%FLpjW$pJPdsrK6ZdeUmwb|^|H!M4< zKJH=j8&iXug@cWaDl-&;xU)+Fu%@|jG<>k!e?a6^%c>7ct z2ThsEd&oY5F1MM@V5e~1O+)^C^S9k=C^J1NM6~+>lgv?q%6|J&r)e?jvDfK3p|6#Z zvpL)1Z=u$>WA1(d;_-O&m9 ztEZ~e#4=6rY>*`1wJOZ-X`f)Qz$0HpK~BkDmeK4O;?r%qs&}6DQ(@COq(Cml4)AWW zH=ZwCQcz?j zp60T_3Pm>WG6sR#Wjj?S>CvzczJE3+CUeqcbEoV@UmvBEnwyKN(yj@+-8Fu9FQEiE zaHfXcx0%9x0d8(q&H0JjlvwtIb*3Zm4m)#QO(Fb%=a0<{vLoGIinS`0*^b(v3Y6c? za|hQVwxevLTw136EsX^gVSc!-D`e}ykoqNjlR|_* z@A|MS&blDc7YRyiwAH530N`NVPOiM%4OVbr#B7f#zzs)5!rwEkJ7DQ*u%`?HItVJE z0w;OF2KLXQDLR z09PV&08Bu$zgiae@d|-MuD7&o0Nbl`7Vkc7ur`rO3*4Sj--L38yX|IeeeRa9n)2>9 zBS+NnYRkMk-ot%XA#4iU%UD?6E9E&GO1##*Cn@FWvj;xJpJ7InCZOEmHMTb~PV+Waf4T|fcMUJ z0&JjMiVZ{-$;-sw7Au9`dUTL+XRxq7JvVldGc%9ebCJVVxw;9r_)3~!8A!}u z*ni-5heXV3_U%L4(q0Q5lm|v_05^UQGdq`smwK_@pMc)H?Nu(=AI-+DW`m1xkJ;)* z_7>i6YTRsPt|m6JEPBm`By`9rrrH;~oxP%8^*~jiyQ0!^Ta%d=B~1DlSXi5kA@ldP z94;S97U1l)&9{UsOIvrkG?CcowdN*aWo*gw8|GjMlqrtf9x74MTjeFu5)*<1Id zu>>#h6kj92g`1O`^R>+~>;3y>hKaypPj?qrEErjt#%#; z7BeR^m6dQxPcFFOo)0E-er)axYt#K@{20|*8<@m6*t;AydD#7A;Tp%thO(R|y6~yl zKkgGbyoP=mw!^=FaD8epO1WXZ{tH2UT2 zb1iN=-=K@9W)`V15X6b%#t3Jf#`Gz~NZ8lcW~Zs!3v(11QrJ4j7CJWOR(dz)R=POQR{C>T6#Ck}Y@0T7$VT$IjW@>!TQ7-^(L?hGc(-J) zKdjxI2KXyoS#)o2-9YTB2e5V|ORwQJFLXyryKqK(~Zvm=|&I#^rM@9dePVCy*>Ol3Oz4B)_$`2T^nb|nY!~{UYS3o{jU5o zKi;b*c99qI(m63{yuo8U^5vgi`5sn37NH`?$N%G1a=9>1ejm*hoh%GL4)5yk`cLV( zRwI8mGqWzA&F+y;|C+*lir!d<$pM}jX^IkdLC7q!ee98}e7;{2q z;-tymE$n=*jBB^(iKoekAcNO4i7B1}`+)d-qg)k)P4i7kCiq=QV5w~B=t|=Et>1In z-ocI4^)lx)_&qhxd(D5E^;=}5FPePuZ{Y%`DEDoJY%h3%<>@yR2F0VER&vi5NHWJY zO_EpI`j5DO&A0Pm<+WY<7V6-3p* zk&Ea-bVB{Z_vh(k<=FOQ^<%xhs|gB?Ur8-`Jf36qJ!D6`^%xr_Jq#H1aiZZPW+&kz7?Lj(E!N zh~6ls<5^4e&oXlX{gc>l6rAmPop!3dM8=#GS9Kd8#4ApC>lus(bh1n3v#qQA?77_^ zdJaHNlEep;HJ3a?=*6~WFAS#2;0a#8^Xe!_{Tat@BlJLoc)s%NsCePWj)8u&r!9}h z@yfBlH)#OB3*Dn@JL>5)DP87&oTU@?wb>zk!v+1+*>d&_aev%Xdo*C#wmfNPbHLVZ zrQNX%PE!elxP76#Uxyup!9)Dm=KBnVTJV8;nKNv-Mta1z{6vV**SAHM(I&QG!1`rh z8PRFPZtVi_+KSs0v$|^jxS`2^xwl<2v!i ziZ>=nLNjJ*O}aqm6s4;%^+0SR$O*_@7dZ)gWg3w8y=2975id-hVa3#1j&~r$ zC=@Ef)0s^^>JrG))q{Ldz6^$Z21Zt&U;&Mv#poym0dI!!4-d)H*cehEHQ>2Gfr^61J2&`z8)Qy>>Fhxk+(Y4o~%`GQ7 zo`5!vimayAV8Em(3&xbhNYhP%ijW84veLVwI`PNPLbO4_tR3SrD*S*mDsiD0?UFQMUMQRFpHdNV0ezz_veg>#sY#la~RvVq^+ zDK~x-Cmt6Tb}TOHnTUJ$mzY!+#GxKm*yN~=IYD%dU@#_p`CpBi+JcxQEf#E>x>PdgH((l z#VGPAuk``&fqCXpmZX{BDkB z4*X2V8tx^J55p&fr3gt%2^GZ}%owV#k86d6drm~&l8j!VWYhM4{v@hSpi-zZcuv^) z-q)!`E3jp6zK@rQj|MwfxV&79eG=J!SYiJH>Jc?pQyl~}?Q~))I1mt_Xb>|lAN+i4 z%#hIu$yB*9_&G$>QX;8aKoQQGL;r<`5l^Dmue(R!ro!bPPoxeDIV1TVpgCe~aSBEH zF?ooAHj2rSKl;<-2E^ zu_CF!!l3mBy_i8;lr=8wi0|w#Lt{5oMmd|Yk(x`XxE5~ADbgd#k0&9}VWI}P8IOMQ z$n)}Otw|wISA>$MQV9bb6HyINIt$|gNi6%N|{{!BK{{M|^~M^3qRIRw{nzDIQh z=fJ$4ggmAV8WH2-IslS=gls)iC@(djf@xR#5xX1iD+qEh5A)iR4)`|aD% z_5qSsUNA0*Nnj}kX=wG_wi0 zDir`I1bL{M6iTBwWL1JrHAXW)G%Yjx!cb9ZhvLB z7qzuhRPlivXo0IzpSfT`)hzER;IK~gd5D~STaq+0mcI5h>L2?3y!o#_Gy8|vK0^PU zl4|e}%cZCT%PNrxO1T4x$pRb__92ON(-f`rX+bOV)2G#4WXhm#(m zBP(_$H-yznQ7mM#;KH0nmw7N$g-g&ZOc|m(qS(B4a(uI=#1B<{ZQvh!Q|0<0Ns42)-U# z3D%B*koI6-0=xr<4v;_*1{M&psMKq3vl5lgc{b}n-v}xV`k`l%N(+jPF3!iKZY;1KU~(SdZUiafGk%5Rid7U_#&~J&rmFW`vYP z6|!A(fqeA?E|0d@|7x)vb4e@p2w;ITEl%E5nb@F_ zG=+50w$}dxthN#g2?>MbPT~oncZDyFAu#HZZl59SKBhnRO0gJ|F`NfN(F93TQpLbU zXthFkXuwK+Uj5FiqvEOq*=D`eiXl@|DpK7Cgp>OApt8#5W$#)o2Xw3l5x_Viz(f>I znNdYz%Ua!$j`J-t?Xg!{F&Z0OiBtiBUnfXDww zp-ujMR3AFt&q-eCM84GOQ)G}ui!g9dn7zbW%+p;#A!&^fA12ap_2GLk1necArLb=u zCyg;LVAhm znKg|bGBNTiMd%tL9U^^sLp(+IF_jz#t}D9Ial}~b1Yko!lvzmi3ds*A(d)25;19Q| z50a(LDbgcSLCU@g#C3`>CE#0VBTTp9s)gHMyXVNH1lA7M}87JE~)c0e$?jh&6z|7QrQKED%+dBCCWn|FSfpS|hs4Ci+B zFCjxEf*Pa`m)b)9&r%S00csS3fqKtK$yR!Vvh({vFD zu>-*2nVxueHD)rqWDex=ZCJM-whQ`g&B{^S`WbjuSF)#?xugvad%=iUVo($~#{!DX zHFTN6$NKTG&F-(*gU+M1_*YJM%3_dK)I22PPRk$_?c^cYUhT;FnOa}%&)I(O!pe`1I4fq;GKuZdcoD_3?5B~ykA$R2DAO2!_*h!VZ{xiCNvi&A_FEMNH*DO!8 zR{`P7L8+63(bh_JQ{WZ{T35aULwyGX<4o93Yjx-Q^OJ_N`)0naekxCkgBAsaq|>(o z4g%)};?Mg>NWN5=d;DiWDSF-AIj0ZZF#;V-9MYGly7M5>^q?1J94N%DD{l89G%`qN z_F`XHdw%zl8YlJC6}5VnNx~u~s!$}cqe+I)Sk!VD^=}326e}(z!SE0x^pKpfZ#CeT zBkEDI+GzW(Me2jotl<@uX9?VnH-9O^AvK z)C%gIQ^WT575o@?j<7pE@DxqJA!Jd&PF9SIy7UOAtyP6fN?id>I52cm@HwkFqhIYBM2ZAe0|9O7C;rl7$^c!I3Lj9?jRm#^8>W8nWjNZdDV zMr*viNm~3scGOOeu?TP-VCUWq`kV2Qcn-bPg0xM*K zRoB=g!2M%SUVoo%f59J<_xNWi6lWgpLY!4v)udL8+qKST+4_-Xt;n=?{I#L{$WZ1c zK3Hom)p;)#-4LKCwkWGc6|K78CM%4obnGlz5JFhXoXR7(xY$&wy%~TSXUhb0jNXPv zJ)yXPuw~dvgFJ}iTA7KM6p~hNMQA$u6G+a$@78C$w`xn`3LeywI%Uxd zW?ItLez!Dbf9GH0*R%Fu5HNI95URzVadKdFA|W(6S&xg{3N6U!s6R65hdw3VePeDc zCC+I{=o1HYkGB8*M34NlxWQ`I%dx-XZoBca9;LJ*XP_Fi1}ewuo)pe{tA>i)xPLZn zK3k1BG986Gav#NN$yg)#;EFZsDjGRPQ&KNA+|-GPdH!G7f984P z&28_~4q4jQAt?1?({C;-wsgaM5;r`q_xIyw$P414{W{Fh9*BOKJHPDgV9e3AzIhM& ztDC^zm=D$sw7f0};e@&I^^YdMKB?~g6+>yEx3C!?NK|!NAjYiN6D=mMj z%95tD(%i{cZU-~k;ycH3lY-Y{BGo;m15{%4K|9TEK`K+JLbn#<50*&|ug2Qzke(u) zWowVflCfxuFs;SC5=Gnc^ocly$*GPjJ5Fm6MIaE#oCRaG!klP!92iw;Wyx+(*>tT# z#!Aabx~Q4Ni7ALxiZz}U8Jnxd%dW(Zq~qD??Vo%Xm1vWf83X^5lO+8rt`=Dd#TMfR zJzz5&ht(cOxdL@U5eu z76Sv<&Yo2Yk(8O~R2~M!FUG_F#>V!%6hy8!?++IXA0}fyci5xg0{<d3M>gu}1Bu!=Pj-6|$pWO6TX+JaF-E8_@(7I`|) zkn^282SkTv(jGX=%~K36nTn5 z25QVR8JwMTAA8gPcP+tB-irvKkwg&iO2}EZLQ^fE#GUqKX*vSZ+uNtI5A1rk*Z$)W z3XHe$PL?`!c(m$6ro_a`d5mF|H9OmK8^S`U$L{?x^n5V}dEtwbq+-m&VyLtdX}D?~ zQl=uHB6LD|)OQQt81w%Zmy-*PJ8h$WJcgaF|0?)JQL-pccQ-|zX`WtOd=-jWm$0j!X_h5y+<+bi2E+g5p% z_1Wfy(Cj-TkOT-PBq-4L6IB0W;+Q!jpXR*eQuK#MzRQaY)GnFeI{r*%ZUNPq! z3G@sqBli?7DIzV5D3CN)>ApwkM~40~JIfg{@7;O$F+o1q=L3h{i;t7x#pBGraL!B~ zF9&Dyjq|@Q{QCDUd?OEk^xmPLcf_I9;pkuFJ#PNbKjAs&@_hcZ>093XG57V<6u@?0 zvdAJFd9BoIiwGUdGfE3rMajn-SM&PrJ0k}jfe1EPLDbmDrb*y6m;%VOnk?CK()@$tl! zKCKPJL|7UT9YQn4N~kj{Me6G0+I5+i!tGYB=}#`m$;rl<$H|<}lvDD0XIHh{74lw( zlP)@372B(JQ3{hLWe>#i_<50arr!*%je_m{%IXG&`fC(5pgau zm|!^9I;Wxf>=wWpS2}vTbcEHNv(QQ0IbE-MDC3*gKP6jBzp;^$sV{lyD7ah~qr}?j!aX@^w`qCcW^wWA>1rC1Y&@JL?ZAk%|jPHypDyheObYt>7Mdak% z$?I3*!;OFcm(UMbA7EV&{Xcb5J}fEDM!pQFz6EGaOOFM9$#-Viw7E4EJum+w`z8?- zT98tDQYiBy+FqB64*EAe=&*$#h4%7;E5KE9&o(PBX3~u0J(AUjiRe^HT7(xm|YI_JLfITR@vlw^N|A)_Vsbp>wKQXthO>^LL1vn_1`v} zm`vnwA*Ym6q1R%v$D zt7%IkvL_T~`Jq-%>&obl-O-b?f9|o_B%0DQ|4L^~y&EkQ?t*PC+-er`MJxlfkfwtv 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

      AU6m&Iy0aseBf8=^Ss4;GNqX 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

      3#AgitgAT5Npx8 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≷~&vU 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

      Oc361ZOd{ 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%0A%J$aF~3?kpZf4;eN#4V3Ke6tB@kkjvtcC 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

      4wEErCAf&s&qGs6PF{foTnBdPIthS`&Bl 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 z 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 z�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

      0G!AYC?@zW&Bkv1@g5Ivtr&u7t!xm%~G!W>c23+ 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⪻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%0DPG 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, if zero, only 1 times */ + u16 scan_type; + u16 scan_times; /**< Scan times, >=0, if zero, only 1 times */ u16 scan_chanlist; /**< Scan channel list ,[0,3FFF],per bit is one channel,if zero or above 0x3FFF, scan all channel*/ u16 scan_chinterval; /**< Scan channel switch time,>=0, if zero, use default value, unit:ms */ }; @@ -632,6 +678,24 @@ void tls_wifi_scan_result_cb_register(void (*callback)(void)); int tls_wifi_get_scan_rslt(u8* buf, u32 buffer_size); +/*************************************************************************** +* Function: tls_wifi_get_scan_rslt_format2 +* +* Description: get result of last scan for format2 result +* +* Input: buffer: address to store returned BSS info +* buffer_size: the length of the buffer +* Output: BSS info got by last scan +* +* Return: WM_SUCCESS: return ok; +* WM_FAILED: failed to get result; +* Note: user need to memalloc a buffer in advance. size for one item of scan result is @ref struct tls_bss_info_format2_t +* the buffer size depends how many items user wants. +* Date : 2022-6-07 +****************************************************************************/ +int tls_wifi_get_scan_rslt_format2(u8* buf, u32 buffer_size); + + /** * @brief This function is used to create soft ap * @@ -1014,20 +1078,6 @@ int tls_wifi_send_mgmt(enum tls_wifi_mgmt_type type, struct tls_wifi_hdr_mac_t * */ int tls_wifi_send_data(struct tls_wifi_hdr_mac_t *mac, u8 *data, u16 data_len, struct tls_wifi_tx_rate_t *tx); -#if TLS_CONFIG_AP -/** - * @brief This function is used to get authed sta list - * - * @param[out] *sta_num authed's station number - * @param[out] *buf address to store returned station list info, tls_sta_info_t - * @param[in] buf_size buffer size - * - * @return None - * - * @note None - */ -void tls_wifi_get_authed_sta_info(u32 *sta_num, u8 *buf, u32 buf_size); -#endif /** * @brief This function is used to get current Wi-Fi State * @@ -1114,6 +1164,43 @@ int tls_wifi_softap_set_sta_num(unsigned char ap_sta_num); */ int tls_wifi_softap_del_station(unsigned char* hwaddr); +/** + * @brief This function used to add sta to black list for softap + * + * @param[out] hwaddr: sta's mac address to forbid + * + * @return None + * + * @note None + */ +int tls_wifi_softap_add_blacksta(unsigned char *hwaddr); + + +/** + * @brief This function used to accept sta joining softap that sta in balck list + * + * @param[out] hwaddr: mac address to delete from black list + * + * @return None + * + * @note None + */ +int tls_wifi_softap_del_blacksta(unsigned char *hwaddr); + +/** + * @brief This function used to get stations from blacklist + * + * @param[out] sta_num: station's number in blacklist + * @param[out] buf: store stations to get from blacklist + * @param[in] buf_size: memory size to store stations in blacklist + * + * @return None + * + * @note None + */ +int tls_wifi_softap_get_blackinfo(u32 *sta_num, u8 *buf, u32 buf_size); + + /** * @brief This function is used to set some information display in the process of wifi networking * @@ -1147,6 +1234,109 @@ void tls_wifi_set_tempcomp_flag(int flag); */ u8 tls_wifi_get_tempcomp_flag(void); +/** + * @brief This function is used to get temperature compensation flag + * + * @param[in] fixrateindex: 11b:0-3, 11g:4-11, 11n-ht20:12-19, 11n-ht40:20-27 + * @param[in] retrycnt: retry count, range[1,15] + * + * @return None + * + * @note When use this function, data to be transfered will use fix rate. + */ +void tls_wifi_set_fixed_rate(u32 fixrateindex, u32 retrycnt); + + +/** + * @brief This function is used to set listen_interval (dummy interface) + * + * @param[in] listen_interval: >=1 + * + * @return None + * + * @note this is dummy interface. this value can used only in sta mode. + */ +int tls_wifi_cfg_listen_interval(u16 listen_interval); + +/** + * @brief This function is used to set connect timeout + * + * @param[in] timeout: to connect ap's time, >=5s + * + * @return None + * + * @note valid only when scan AP failed. + */ +int tls_wifi_cfg_connect_timeout(u16 timeout); + +/** + * @brief This function is used to configure scan mode + * + * @param[in] mode:0-find max RSSI AP, 1-find AP and immediately stop scan to start join + * + * @return None + * + * @note only used in STA mode. + */ +int tls_wifi_cfg_connect_scan_mode(u32 mode); + +/** + * @brief This function is used to set pci flag + * + * @param[in] pci flag:0-can join any supported AP(open,wep,wpa,wpa2) + * 1-only join AP(WPA/WPA2 that supported) + * + * @return None + * + * @note none. + */ +int tls_wifi_cfg_connect_pci(u32 pci_en); + +/** + * @brief This function is used to set 11b's digital gain + * + * @param[in] value:gain value, <0x40 + * + * @return 0:if value is valid,-1:if value is invalid + * + * @note none. + */ +int tls_wifi_set_11b_digital_gain(u8 value); + +/** + * @brief This function is used to get 11b's gain value + * + * @param[in] None + * + * @return gain value + * + * @note none. + */ +u8 tls_wifi_get_11b_digital_gain(void); + +/** + * @brief This function is used to set 11n's digital gain + * + * @param[in] value:gain value, <0x40 + * + * @return 0:if value is valid,-1:if value is invalid + * + * @note none. + */ +int tls_wifi_set_11n_digital_gain(u8 value); + +/** + * @brief This function is used to get 11n's gain value + * + * @param[in] None + * + * @return gain value + * + * @note none. + */ +u8 tls_wifi_get_11n_digital_gain(void); + + /** * @} diff --git a/src/W800_SDK_v1.00.10/include/wm_type_def.h b/src/W800_SDK_v1.00.10/include/wm_type_def.h index 2313422..eddb91c 100644 --- a/src/W800_SDK_v1.00.10/include/wm_type_def.h +++ b/src/W800_SDK_v1.00.10/include/wm_type_def.h @@ -9,10 +9,8 @@ */ #ifndef __WM_TYPE_DEF_H__ #define __WM_TYPE_DEF_H__ +#include -#ifdef bool -#undef bool -#endif #ifdef u8 #undef u8 #endif @@ -53,7 +51,6 @@ typedef unsigned char INT8U; #endif typedef signed char INT8S; -typedef unsigned char bool; typedef unsigned char u8; typedef signed char s8; typedef unsigned short u16; diff --git a/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld b/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld index d6516f8..90732bf 100644 --- a/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld +++ b/src/W800_SDK_v1.00.10/ld/w800/gcc_csky_bt.ld @@ -22,7 +22,7 @@ ******************************************************************************/ MEMORY { - I-SRAM : ORIGIN = 0x080d0400 , LENGTH = 0x138000 /* I-SRAM 1M+128KB */ + I-SRAM : ORIGIN = 0x080d0400 , LENGTH = 0x128000 /* I-SRAM 1M+160KB */ D-SRAM : ORIGIN = 0x20000100 , LENGTH = 0x47EFC /* D-SRAM 288KB */ V-SRAM : ORIGIN = 0x20000000 , LENGTH = 0x100 /* off-chip SRAM 8MB */ } diff --git a/src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c b/src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c index 9c09bb2..9c81779 100644 --- a/src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c +++ b/src/W800_SDK_v1.00.10/platform/common/mem/wm_mem.c @@ -443,7 +443,7 @@ void tls_mem_alloc_info(void) i = 1; dl_list_for_each(pos, &memory_used_list, MEMORY_BLOCK, list){ printf("Block(%2d): addr<%p>, file<%s>, line<%d>, length<%d>\r\n", - i, pos->header_pattern, pos->file, pos->line, pos->length); + i, (void *)pos->header_pattern, pos->file, pos->line, pos->length); i++; } tls_os_release_critical(cpu_sr); @@ -470,7 +470,7 @@ int is_safe_addr_debug(void* p, u32 len, char* file, int line) if(((u32)p) + len > ((u32)(pos->header_pattern + sizeof(MEMORY_PATTERN) + PRE_OVERSIZE + pos->length))) { printf("==>Memory oversize. Block(%2d): addr<%p>, file<%s>, line<%d>, length<%d>\r\n", - i, pos->header_pattern, pos->file, pos->line, pos->length); + i, (void *)pos->header_pattern, pos->file, pos->line, pos->length); break; } else @@ -508,7 +508,7 @@ u32 alloc_heap_mem_max_size = 0; extern u32 total_mem_size; void * mem_alloc_debug(u32 size) { -// u32 cpu_sr = 0; + u32 cpu_sr = 0; u32 *buffer = NULL; u32 length = size; @@ -516,6 +516,8 @@ void * mem_alloc_debug(u32 size) //printf("size:%d\n", size); if (!memory_manager_initialized) { tls_os_status_t os_status; + + cpu_sr = tls_os_set_critical(); memory_manager_initialized = true; // // NOTE: If two thread allocate the very first allocation simultaneously @@ -525,6 +527,7 @@ void * mem_alloc_debug(u32 size) os_status = tls_os_sem_create(&mem_sem, 1); if(os_status != TLS_OS_SUCCESS) printf("mem_alloc_debug: tls_os_sem_create mem_sem error\r\n"); + tls_os_release_critical(cpu_sr); } #if USING_ADD_HEADER @@ -545,7 +548,7 @@ void * mem_alloc_debug(u32 size) else { tls_os_sem_acquire(mem_sem, 0); - //cpu_sr = tls_os_set_critical(); + cpu_sr = tls_os_set_critical(); buffer = (u32*)malloc(length); if(buffer) { @@ -555,11 +558,8 @@ void * mem_alloc_debug(u32 size) buffer++; total_mem_size -= length; } - //if(tls_get_isr_count() == 0) - // { - // tls_os_release_critical(cpu_sr); - tls_os_sem_release(mem_sem); - // } + tls_os_release_critical(cpu_sr); + tls_os_sem_release(mem_sem); } #else tls_os_sem_acquire(mem_sem, 0); @@ -574,7 +574,7 @@ void * mem_alloc_debug(u32 size) void mem_free_debug(void *p) { -// u32 cpu_sr = 0; + u32 cpu_sr = 0; // u32 len = 0; #if USING_ADD_HEADER u32* intMemPtr = NULL; @@ -584,7 +584,7 @@ void mem_free_debug(void *p) if(isrstatus == 0) { tls_os_sem_acquire(mem_sem, 0); - // cpu_sr = tls_os_set_critical(); + cpu_sr = tls_os_set_critical(); } intMemPtr = (u32*)p; @@ -611,7 +611,7 @@ void mem_free_debug(void *p) if(isrstatus == 0) { - // tls_os_release_critical(cpu_sr); + tls_os_release_critical(cpu_sr); tls_os_sem_release(mem_sem); } #else //UCOSII @@ -627,7 +627,7 @@ void mem_free_debug(void *p) void * mem_realloc_debug(void *mem_address, u32 size) { u32 * mem_re_addr = NULL; -// u32 cpu_sr = 0; + u32 cpu_sr = 0; u32 length = size; #if USING_ADD_HEADER @@ -665,7 +665,7 @@ void * mem_realloc_debug(void *mem_address, u32 size) else { tls_os_sem_acquire(mem_sem, 0); - // cpu_sr = tls_os_set_critical(); + cpu_sr = tls_os_set_critical(); mem_re_addr = (u32*)malloc(length); if(mem_re_addr && mem_address) { @@ -683,7 +683,7 @@ void * mem_realloc_debug(void *mem_address, u32 size) mem_re_addr ++; total_mem_size -= length; } - // tls_os_release_critical(cpu_sr); + tls_os_release_critical(cpu_sr); tls_os_sem_release(mem_sem); mem_free_debug(mem_address); @@ -704,7 +704,7 @@ void * mem_realloc_debug(void *mem_address, u32 size) void *mem_calloc_debug(u32 n, u32 size) { -// u32 cpu_sr = 0; + u32 cpu_sr = 0; u32 *buffer = NULL; u32 length = 0; @@ -728,7 +728,7 @@ void *mem_calloc_debug(u32 n, u32 size) else { tls_os_sem_acquire(mem_sem, 0); - // cpu_sr = tls_os_set_critical(); + cpu_sr = tls_os_set_critical(); buffer = (u32*)malloc(length); if(buffer) { @@ -740,7 +740,7 @@ void *mem_calloc_debug(u32 n, u32 size) total_mem_size -= length; } - // tls_os_release_critical(cpu_sr); + tls_os_release_critical(cpu_sr); tls_os_sem_release(mem_sem); } #else //UCOSII @@ -765,15 +765,15 @@ u32 tls_mem_get_avail_heapsize(void) { #if USING_ADD_HEADER u32 availablemem = 0; -// u32 cpu_sr; + u32 cpu_sr; tls_os_sem_acquire(mem_sem, 0); - //cpu_sr = tls_os_set_critical(); + cpu_sr = tls_os_set_critical(); availablemem = total_mem_size; - // tls_os_release_critical(cpu_sr); + tls_os_release_critical(cpu_sr); tls_os_sem_release(mem_sem); - return availablemem/*&0xFFFFF000*/; + return availablemem; #else u8 *p = NULL; u32 startpos = 0; diff --git a/src/W800_SDK_v1.00.10/platform/common/utils/utils.c b/src/W800_SDK_v1.00.10/platform/common/utils/utils.c index 7ef40b0..7b20aa9 100644 --- a/src/W800_SDK_v1.00.10/platform/common/utils/utils.c +++ b/src/W800_SDK_v1.00.10/platform/common/utils/utils.c @@ -17,7 +17,7 @@ #include "wm_mem.h" #include "tls_common.h" #include "wm_debug.h" -//#include "wm_sockets.h" +#include "wm_sockets.h" #include "utils.h" @@ -454,8 +454,8 @@ char * strndup(const char *s, size_t len) memcpy(ret, s, len); return ret; } -#if 0 -int gettimeofday(struct timeval *tv, void *tz) +#if 1 +int gettimeofday(struct timeval *tv, struct timezone *tz) { int ret = 0; u32 current_tick; diff --git a/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c index 62ae709..41c313a 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc.c @@ -31,10 +31,14 @@ typedef struct double a[3]; }ST_ADC_POLYFIT_PARAM; +/*f(x) = kx + b*/ +//#define ADC_CAL_K_POS (6) +//#define ADC_CAL_B_POS (7) + + ST_ADC_POLYFIT_PARAM _polyfit_param = {0}; extern void polyfit(int n,double x[],double y[],int poly_n,double a[]); -//TODO -#define HR_SD_ADC_CONFIG_REG 0 + static int adc_offset = 0; static int *adc_dma_buffer = NULL; volatile ST_ADC gst_adc; @@ -79,28 +83,45 @@ static void adc_dma_isr_callbk(void) } int adc_polyfit_init(ST_ADC_POLYFIT_PARAM *polyfit_param) { - FT_ADC_CAL_ST adc_st; - double x[16] = {0}; - double y[16] = {0}; - int n = 4, poly_n = 1; // or = 2 - + FT_ADC_CAL_ST adc_cal; + /*function f(x) = ax + b*/ + float a = 0.0; + float b = 0.0; int i; - + double x[8] = {0.0}; + double y[8] = {0.0}; polyfit_param->poly_n = 0; - memset(&adc_st, 0, sizeof(adc_st)); - tls_get_adc_cal_param(&adc_st); - //dumpBuffer("adc_st",(char *)&adc_st, sizeof(adc_st)); - n = adc_st.valid_cnt; - if(n >= 4 && n <= 8) + memset(&adc_cal, 0, sizeof(adc_cal)); + tls_get_adc_cal_param(&adc_cal); + if ((adc_cal.valid_cnt == 4) + ||(adc_cal.valid_cnt == 2) + || (adc_cal.valid_cnt == 3)) { - for(i = 0; i < n; i++) + //memcpy((char *)&a, (char *)&adc_cal.units[ADC_CAL_K_POS], 4); + //memcpy((char *)&b, (char *)&adc_cal.units[ADC_CAL_B_POS], 4); + a = adc_cal.a; + b = adc_cal.b; + if ((a > 1.0) && (a < 1.3) && (b < -1000.0)) /*new calibration*/ { - x[i] = (double)adc_st.units[i].real_val; - y[i] = (double)adc_st.units[i].ref_val; + polyfit_param->poly_n = 1; + polyfit_param->a[1] = a; + polyfit_param->a[0] = b; + } + else /*old calibration*/ + { + for(i = 0; i < adc_cal.valid_cnt; i++) + { + x[i] = (double)adc_cal.units[i].real_val; + y[i] = (double)adc_cal.units[i].ref_val; + } + polyfit_param->poly_n = 1; + polyfit(adc_cal.valid_cnt,x,y,1, polyfit_param->a); + if (b < -1000.0) + { + polyfit_param->a[0] = b; + } } - polyfit_param->poly_n = poly_n; - polyfit(n,x,y,poly_n,polyfit_param->a); } return 0; @@ -472,26 +493,11 @@ static void waitForAdcDone(void) int cal_voltage(double vol) { double y1, voltage; - - double vol_30mV; int average = ((int)vol >> 2) & 0xFFFF; - if(_polyfit_param.poly_n == 2) - { - y1 = _polyfit_param.a[2]*average*average + _polyfit_param.a[1]*average + _polyfit_param.a[0]; - } - else if(_polyfit_param.poly_n == 1) + if(_polyfit_param.poly_n == 1) { y1 = _polyfit_param.a[1]*average + _polyfit_param.a[0]; - vol_30mV = ((double)300.0L - _polyfit_param.a[0]) / _polyfit_param.a[1]; - if(average + 170 < vol_30mV) - { - return 0; - } - else if(average < vol_30mV) - { - y1 = 300.0L - 200.0L*(vol_30mV - average) / 170.0L; - } } else { diff --git a/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc_cal.c b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc_cal.c new file mode 100644 index 0000000..49faf97 --- /dev/null +++ b/src/W800_SDK_v1.00.10/platform/drivers/adc/wm_adc_cal.c @@ -0,0 +1,187 @@ + +/***************************************************************************** +* +* File Name : wm_adc_cal.c +* +* Description: adc calibration +* +* Copyright (c) 2014 Winner Microelectronics Co., Ltd. +* All rights reserved. +* +* Author : +* +* Date : 2022-10-10 +*****************************************************************************/ +#include +#include +#include +#include "wm_include.h" +#include "wm_regs.h" +#include "wm_adc.h" +#include "wm_io.h" +#include "wm_gpio_afsel.h" +#include "wm_efuse.h" + +#define ZERO_CAL_MAX_NUM (10) +/*f(x) = kx + b*/ +//#define ADC_CAL_B_POS (7) +//#define ADC_CAL_K_POS (6) +#define ADC_CAL_REF_VOLTAGE_POS (5) +extern void polyfit(int n,double x[],double y[],int poly_n,double a[]); + +/** + * @brief This function can used to calibrate adc coefficient if not calibrated, + * or adc offset after FT or multipoint calibration. + * + * @param[in] chanused: bitmap, specified calibration channel,only bit0-3 can be used + * @param[in] refvoltage[]: array, calibration reference voltage to be used, unit:mV + * refvoltage keep the same position with chan bitmap + * real range[100,2300)mV, suggest reference voltage[500,2000]mV + * + * @return 0: success, < 0: failure + * + * @note 1)Adc curve is y=ax+b,y is real voltage(unit:mV), x is adc sample data. + * After calibration, we can get a and b, or only update b. + * 2) Only used single-end adc + * 3) For example, use chan 0,1,3, and refvoltage 500,1000,2000, + * then chanused is 0xB, refvoltage[] value is {500,1000,0, 2000}; + */ +int adc_multipoint_calibration(int chanused, int refvoltage[]) +{ + #define MAX_ADC_CAL_CHAN (4) + #define MAX_ADC_REF_VOLTAGE (2300) + #define MIN_ADC_REF_VOLTAGE (100) + if (((chanused &((1<= MAX_ADC_REF_VOLTAGE)) + { + return -1; + } + /*config adc chan for calibration*/ + wm_adc_config(j); + + /*config adc and start capture data*/ + tls_adc_init(0, 0); + tls_adc_reference_sel(ADC_REFERENCE_INTERNAL); + tls_adc_set_pga(1,1); + tls_adc_set_clk(40); + tls_adc_start_with_cpu(j); + + tls_os_time_delay(1); + sum_value = 0; + for (int i = 1; i <= ZERO_CAL_MAX_NUM; i++) + { + tls_os_time_delay(1); + average = *(TLS_REG *)(HR_SD_ADC_RESULT_REG); + average = ADC_RESULT_VAL(average); + signedToUnsignedData(&average); + sum_value += average; + } + + adc_cal.units[chancnt].ref_val = prefvoltage[j]*10; + adc_cal.units[chancnt].real_val = sum_value/ZERO_CAL_MAX_NUM/4; + chancnt++; + tls_adc_stop(0); + } + + if (chancnt >= 2) + { + float k = 0.0; + double a[4] = {0.0}; + double x[8] = {0.0}; + double y[8] = {0.0}; + + for(int i = 0; i < chancnt; i++) + { + x[i] = (double)adc_cal.units[i].real_val; + y[i] = (double)adc_cal.units[i].ref_val; + } + + polyfit(chancnt, x, y, 1, a); + + k = (float)a[1]; + b = (float)a[0]; + //memcpy((char *)&adc_cal.units[ADC_CAL_K_POS], (char *)&k, 4); + //memcpy((char *)&adc_cal.units[ADC_CAL_B_POS], (char *)&b, 4); + adc_cal.a = k; + adc_cal.b = b; + adc_cal.valid_cnt = chancnt; + return tls_set_adc_cal_param(&adc_cal); + } + else /*only one reference voltage*/ + { + /*update calibration parameter*/ + int currentvalue = cal_voltage((double)adc_cal.units[0].real_val*4); + int ret = tls_get_adc_cal_param(&adc_cal); + if ((ret == 0) && (adc_cal.valid_cnt >= 2) && (adc_cal.valid_cnt <= 4)) + { + /*reference voltage by user settings*/ + for (int i = 0; i < MAX_ADC_CAL_CHAN; i++) + { + if (chanused&(1<= 0 && chan < 4) + { + int refvol[4] = {0, 0, 0, 0}; + refvol[chan] = refvoltage; + return adc_multipoint_calibration((1<version_no, pft->ext_param_len); + if (pft->version_no > 0 && pft->version_no < 0xFFFF && pft->ext_param_len >= sizeof(FT_PARAM_ST_EXT_1) && + pft->ext_param_len <= (sizeof(FT_PARAM_ST_EXT_1) + FT_PARAM_EXT_REVERSED_LEN)) + { + return TRUE; + } + return FALSE; +} +static int _ft_param_init(u32 ft_addr, FT_PARAM_ST *pft) { u32 crcvalue = 0; psCrcContext_t ctx; FT_PARAM_ST_VER1 *pft_ver1 = NULL; - FT_PARAM_ST *pft = NULL; - if (gftParam->magic_no == SIGNATURE_WORD) - { - return TRUE; - } - - pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1)); - if (pft == NULL) - { - return FALSE; - } - - memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); - memset(gftParam, 0xFF, sizeof(FT_PARAM_ST_VER1)); - - tls_fls_read(FT_MAGICNUM_ADDR, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1)); + tls_fls_read(ft_addr, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1)); if (pft->magic_no == SIGNATURE_WORD) { tls_crypto_init(); @@ -100,14 +96,13 @@ int tls_ft_param_init(void) tls_crypto_crc_final(&ctx, &crcvalue); if (pft->checksum != crcvalue) { - tls_mem_free(pft); + //tls_mem_free(pft); return FALSE; } do { - if (pft->version_no > 0 && pft->version_no < 0xFFFF && pft->ext_param_len >= sizeof(FT_PARAM_ST_EXT_1) && - pft->ext_param_len <= (sizeof(FT_PARAM_ST_EXT_1) + FT_PARAM_EXT_REVERSED_LEN)) + if (_ft_ext1_valid(pft)) { pft_ver1 = (FT_PARAM_ST_VER1 *)pft; tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); @@ -115,31 +110,100 @@ int tls_ft_param_init(void) tls_crypto_crc_final(&ctx, &crcvalue); if(pft_ver1->ext_checksum == crcvalue) { - memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1)); - break; + return 1; + } + else + { + return FALSE; } } pft->version_no = 0xFFFF; pft->ext_param_len = 0xFFFF; - memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST)); }while(0); + return 2; + } + return FALSE; +} +int tls_ft_param_init(void) +{ + int ret = 0; + FT_PARAM_ST *pft = NULL; + + if (gftParam->magic_no == SIGNATURE_WORD) + { + return TRUE; + } + memset(gftParam, 0xFF, sizeof(FT_PARAM_ST_VER1)); + + pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1)); + if (pft == NULL) + { + return FALSE; + } + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft); + if(FALSE == ret) + { + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_MAGICNUM_ADDR, pft); + } + if(1 == ret) + { + memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST_VER1)); + } + else if(2 == ret) + { + memcpy((unsigned char *)gftParam, (unsigned char *)pft, sizeof(FT_PARAM_ST)); } tls_mem_free(pft); /*lock parameter*/ tls_flash_unlock(); - return TRUE; + return ret; } int tls_ft_param_get(unsigned int opnum, void *data, unsigned int rdlen) { + int ret = 0; switch (opnum) { + case CMD_FREQ_ERR: + if(_ft_ext1_valid(gftParam)) + { + memcpy(data, (char *)&gftParamVer1.ft_ext1.rf_freq_err, FREQERR_LEN); + } + else + { + ret = tls_fls_read(FREQERR_ADDR, data, FREQERR_LEN); + if(ret) + { + return -1; + } + } + break; + case CMD_RF_CAL_FLAG: + if(_ft_ext1_valid(gftParam)) + { + memcpy(data, (char *)&gftParamVer1.ft_ext1.rf_cal_flag, CAL_FLAG_LEN); + } + else + { + ret = tls_fls_read(CAL_FLAG_ADDR, data, CAL_FLAG_LEN); + if(ret) + { + return -1; + } + } + break; case CMD_TX_ADC_CAL: - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) + if(_ft_ext1_valid(gftParam)) { memcpy(data, (unsigned char *)&gftParamVer1.ft_ext1.adc_cal_param, rdlen); } + else + { + return -1; + } break; case CMD_WIFI_MAC: /*MAC*/ if ((gftParam->wifi_mac_addr[0]&0x1) @@ -217,13 +281,57 @@ int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len) { psCrcContext_t ctx; unsigned int writelen = 0; + FT_PARAM_ST *pft = NULL; + int ret = 0; if (!data || !len) { return -1; } + + pft = tls_mem_alloc(sizeof(FT_PARAM_ST_VER1)); + if (pft == NULL) + { + return -1; + } + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft); + if(ret) + { + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_MAGICNUM_ADDR, pft); + if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1))) + { + tls_flash_unlock(); + tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1)); + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_MAGICNUM_ADDR, pft); + if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1))) + { + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + tls_mem_free(pft); + return -1; + } + } + } + if(!_ft_ext1_valid(gftParam)) + { + gftParam->version_no = 1; + gftParam->ext_param_len = sizeof(FT_PARAM_ST_EXT_1); + memset((char *)&gftParamVer1.ft_ext1, 0xFF, gftParam->ext_param_len); + } switch (opnum) { + case CMD_FREQ_ERR: + memcpy((char *)&gftParamVer1.ft_ext1.rf_freq_err, (char *)data, FREQERR_LEN); + break; + case CMD_RF_CAL_FLAG: + memcpy((char *)&gftParamVer1.ft_ext1.rf_cal_flag, (char *)data, CAL_FLAG_LEN); + break; + case CMD_TX_ADC_CAL: + memcpy((unsigned char *)&gftParamVer1.ft_ext1.adc_cal_param, data, len); + break; + case CMD_WIFI_MAC: /*MAC*/ memcpy(gftParam->wifi_mac_addr, (unsigned char *)data, len); break; @@ -269,25 +377,44 @@ int tls_ft_param_set(unsigned int opnum, void *data, unsigned int len) break; default: - return -1; + tls_mem_free(pft); + return -1; } tls_crypto_init(); + /*len to write to flash*/ + writelen = sizeof(FT_PARAM_ST_VER1); tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); + tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len); + tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum); + gftParam->magic_no = SIGNATURE_WORD; + tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); tls_crypto_crc_update(&ctx, (unsigned char *)gftParam + 8, sizeof(FT_PARAM_ST) -8); tls_crypto_crc_final(&ctx, &gftParam->checksum); - writelen = sizeof(FT_PARAM_ST); - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) - { - writelen = sizeof(FT_PARAM_ST_VER1); - tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); - tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len); - tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum); - } + tls_flash_unlock(); + tls_fls_write(FT_PARAM_RUNTIME_ADDR, (unsigned char *)gftParam, writelen); + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_PARAM_RUNTIME_ADDR, pft); + if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1))) + { + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + tls_mem_free(pft); + return -1; + } tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, writelen); - tls_flash_lock(); + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + ret = _ft_param_init(FT_MAGICNUM_ADDR, pft); + if(!ret || memcmp(pft, gftParam, sizeof(FT_PARAM_ST_VER1))) + { + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + tls_mem_free(pft); + return -1; + } + memset(pft, 0xFF, sizeof(FT_PARAM_ST_VER1)); + tls_mem_free(pft); + //tls_flash_lock(); return 0; } @@ -479,45 +606,26 @@ int tls_set_rx_iq_phase(u8 *rxPhase) int tls_freq_err_op(u8 *freqerr, u8 flag) { int ret = 0; - psCrcContext_t ctx; int value = 0; if (flag){ - tls_flash_unlock(); - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) - { - memcpy((char *)&gftParamVer1.ft_ext1.rf_freq_err, (char *)freqerr, FREQERR_LEN); - tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); - tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len); - tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum); - ret = tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1)); - } - else - { - ret = tls_fls_write(FREQERR_ADDR, freqerr, FREQERR_LEN); - } - tls_flash_lock(); + ret = tls_ft_param_set(CMD_FREQ_ERR, freqerr, FREQERR_LEN); } else { - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) + ret = tls_ft_param_get(CMD_FREQ_ERR, freqerr, FREQERR_LEN); + if(!ret) { - memcpy((char *)freqerr, (char *)&gftParamVer1.ft_ext1.rf_freq_err, FREQERR_LEN); - } - else - { - ret = tls_fls_read(FREQERR_ADDR, freqerr, FREQERR_LEN); - } - - memcpy(&value, freqerr, FREQERR_LEN); - if (value > 200000) /*when freq offset is out of range (-200KHz, 200KHz),do not use it*/ - { - value = 200000; - memcpy((char *)freqerr, (char *)&value, FREQERR_LEN); - } - else if (value < -200000) - { - value = -200000; - memcpy((char *)freqerr, (char *)&value, FREQERR_LEN); + memcpy(&value, freqerr, FREQERR_LEN); + if (value > 200000) /*when freq offset is out of range (-200KHz, 200KHz),do not use it*/ + { + value = 200000; + memcpy((char *)freqerr, (char *)&value, FREQERR_LEN); + } + else if (value < -200000) + { + value = -200000; + memcpy((char *)freqerr, (char *)&value, FREQERR_LEN); + } } } if (ret == 0) @@ -533,33 +641,12 @@ int tls_freq_err_op(u8 *freqerr, u8 flag) int tls_rf_cal_finish_op(u8 *calflag, u8 flag) { int ret = 0; - psCrcContext_t ctx; if (flag){ - tls_flash_unlock(); - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) - { - memcpy((char *)&gftParamVer1.ft_ext1.rf_cal_flag, (char *)calflag, CAL_FLAG_LEN); - tls_crypto_crc_init(&ctx, 0xFFFFFFFF, CRYPTO_CRC_TYPE_32, INPUT_REFLECT | OUTPUT_REFLECT); - tls_crypto_crc_update(&ctx, (unsigned char *)&gftParamVer1.ft_ext1, gftParam->ext_param_len); - tls_crypto_crc_final(&ctx, &gftParamVer1.ext_checksum); - ret = tls_fls_write(FT_MAGICNUM_ADDR, (unsigned char *)gftParam, sizeof(FT_PARAM_ST_VER1)); - } - else - { - ret = tls_fls_write(CAL_FLAG_ADDR, calflag, CAL_FLAG_LEN); - } - tls_flash_lock(); + ret = tls_ft_param_set(CMD_RF_CAL_FLAG, calflag, CAL_FLAG_LEN); } else { - if(gftParam->version_no > 0 && gftParam->version_no < 0xFFFF) - { - memcpy((char *)calflag, (char *)&gftParamVer1.ft_ext1.rf_cal_flag, CAL_FLAG_LEN); - } - else - { - ret = tls_fls_read(CAL_FLAG_ADDR, calflag, CAL_FLAG_LEN); - } + ret = tls_ft_param_get(CMD_RF_CAL_FLAG, calflag, CAL_FLAG_LEN); } if (ret == 0) @@ -600,11 +687,31 @@ int tls_set_tx_gain(u8 *txgain) } + +/** +* @brief This function is used to get adc cal param +* +* @param[out] adc_cal adc cal param +* +* @retval TLS_EFUSE_STATUS_OK get success +* @retval TLS_EFUSE_STATUS_EIO get failed +*/ int tls_get_adc_cal_param(FT_ADC_CAL_ST *adc_cal) { return tls_ft_param_get(CMD_TX_ADC_CAL, adc_cal, sizeof(FT_ADC_CAL_ST)); } - +/** +* @brief This function is used to set adc cal param +* +* @param[out] adc_cal adc cal param +* +* @retval TLS_EFUSE_STATUS_OK get success +* @retval TLS_EFUSE_STATUS_EIO get failed +*/ +int tls_set_adc_cal_param(FT_ADC_CAL_ST *adc_cal) +{ + return tls_ft_param_set(CMD_TX_ADC_CAL, adc_cal, sizeof(FT_ADC_CAL_ST)); +} diff --git a/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c b/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c index bd547af..66daea9 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/gpio/wm_gpio_afsel.c @@ -206,7 +206,7 @@ void wm_psram_config(uint8_t numsel) { switch(numsel) { - case 0: + case 0://W800 or w801 tls_io_cfg_set(WM_IO_PB_00, WM_IO_OPTION4);/*CK*/ tls_io_cfg_set(WM_IO_PB_01, WM_IO_OPTION4);/*CS*/ tls_io_cfg_set(WM_IO_PB_02, WM_IO_OPTION4);/*D0*/ @@ -217,6 +217,16 @@ void wm_psram_config(uint8_t numsel) break; case 1://w801 + tls_io_cfg_set(WM_IO_PA_15, WM_IO_OPTION1);/*CK*/ + tls_io_cfg_set(WM_IO_PB_27, WM_IO_OPTION1);/*CS*/ + tls_io_cfg_set(WM_IO_PB_02, WM_IO_OPTION4);/*D0*/ + tls_io_cfg_set(WM_IO_PB_03, WM_IO_OPTION4);/*D1*/ + tls_io_cfg_set(WM_IO_PB_04, WM_IO_OPTION4);/*D2*/ + tls_io_cfg_set(WM_IO_PB_05, WM_IO_OPTION4);/*D3*/ + tls_open_peripheral_clock(TLS_PERIPHERAL_TYPE_PSRAM); + break; + + case 2://w861 tls_io_cfg_set(WM_IO_PA_15, WM_IO_OPTION1);/*CK*/ tls_io_cfg_set(WM_IO_PB_27, WM_IO_OPTION1);/*CS*/ tls_io_cfg_set(WM_IO_PB_28, WM_IO_OPTION1);/*D0*/ @@ -1089,7 +1099,7 @@ void wm_gpio_af_disable(void) #endif tls_reg_write32(HR_GPIOB_AFSEL, 0x0); - tls_reg_write32(HR_GPIOA_DATA_PULLEN, 0xffff); - tls_reg_write32(HR_GPIOB_DATA_PULLEN, 0xffffffff); + tls_reg_write32(HR_GPIOA_DATA_PULLEN, 0x0); + tls_reg_write32(HR_GPIOB_DATA_PULLEN, 0x0); } diff --git a/src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c b/src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c index 3a52bd1..6c3ae1e 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/internalflash/wm_internal_fls.c @@ -59,17 +59,18 @@ static void writeBpBit_for_1wreg(char cmp, char bp4, char bp3, char bp2, char bp M32(HR_FLASH_CMD_ADDR) = 0x0C035; M32(HR_FLASH_CMD_START) = CMD_START_Msk; status |= (read_first_value() & 0xFF) << 8; - - /*Write Enable*/ - M32(HR_FLASH_CMD_ADDR) = 0x6; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; - bpstatus = (bp4 << 6) | (bp3 << 5) | (bp2 << 4) | (bp1 << 3) | (bp0 << 2); - status = (status & 0xBF83) | bpstatus | (cmp << 14); + if ((status & 0x407C) != (bpstatus|(cmp<<14))) + { + status = (status & 0xBF83) | bpstatus | (cmp << 14); + /*Write Enable*/ + M32(HR_FLASH_CMD_ADDR) = 0x6; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; - M32(RSA_BASE_ADDRESS) = status; - M32(HR_FLASH_CMD_ADDR) = 0x1A001; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; + M32(RSA_BASE_ADDRESS) = status; + M32(HR_FLASH_CMD_ADDR) = 0x1A001; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; + } } static void writeBpBit_for_2wreg(char cmp, char bp4, char bp3, char bp2, char bp1, char bp0) @@ -86,24 +87,29 @@ static void writeBpBit_for_2wreg(char cmp, char bp4, char bp3, char bp2, char bp status |= (read_first_value() & 0xFF) << 8; /*Write Enable*/ - M32(HR_FLASH_CMD_ADDR) = 0x6; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; - bpstatus = (bp4 << 6) | (bp3 << 5) | (bp2 << 4) | (bp1 << 3) | (bp0 << 2); - bpstatus = (status & 0x83) | bpstatus; + if ((bpstatus != (status & 0x7C))) + { + bpstatus = (status & 0x83) | bpstatus; - M32(RSA_BASE_ADDRESS) = bpstatus; - M32(HR_FLASH_CMD_ADDR) = 0xA001; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; + M32(HR_FLASH_CMD_ADDR) = 0x6; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; + M32(RSA_BASE_ADDRESS) = bpstatus; + M32(HR_FLASH_CMD_ADDR) = 0xA001; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; + } - M32(HR_FLASH_CMD_ADDR) = 0x6; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; + if (((status & 0x4000)>>8) != (cmp << 6)) + { + M32(HR_FLASH_CMD_ADDR) = 0x6; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; - status = ((status>>8) & 0xBF) | (cmp << 6); - M32(RSA_BASE_ADDRESS) = status; - M32(HR_FLASH_CMD_ADDR) = 0xA031; - M32(HR_FLASH_CMD_START) = CMD_START_Msk; + status = ((status>>8) & 0xBF) | (cmp << 6); + M32(RSA_BASE_ADDRESS) = status; + M32(HR_FLASH_CMD_ADDR) = 0xA031; + M32(HR_FLASH_CMD_START) = CMD_START_Msk; + } } @@ -150,10 +156,10 @@ static int flashunlock(void) { case SPIFLASH_MID_GD: case SPIFLASH_MID_TSINGTENG: - case SPIFLASH_MID_TSINGTENG_1MB: writeBpBit_for_1wreg(0, 0, 0, 0, 0, 0); break; case SPIFLASH_MID_PUYA: + case SPIFLASH_MID_TSINGTENG_1MB_4MB: if (inside_fls->density == 0x100000)/*PUYA 1M Flash use 1 register to set lock/unlock*/ { writeBpBit_for_1wreg(0, 0, 0, 0, 0, 0); @@ -184,10 +190,10 @@ static int flashlock(void) { case SPIFLASH_MID_GD: case SPIFLASH_MID_TSINGTENG: - case SPIFLASH_MID_TSINGTENG_1MB: writeBpBit_for_1wreg(0, 1, 1, 0, 1, 0); break; case SPIFLASH_MID_PUYA: + case SPIFLASH_MID_TSINGTENG_1MB_4MB: if (inside_fls->density == 0x100000) /*PUYA 1M Flash use 1 register to set lock/unlock*/ { writeBpBit_for_1wreg(0, 1, 1, 0, 1, 0); @@ -655,7 +661,7 @@ int tls_fls_read_unique_id(unsigned char *uuid) case SPIFLASH_MID_GD: case SPIFLASH_MID_PUYA: case SPIFLASH_MID_TSINGTENG: - case SPIFLASH_MID_TSINGTENG_1MB: + case SPIFLASH_MID_TSINGTENG_1MB_4MB: dumy_bytes = 4; uni_bytes = 16; break; @@ -870,7 +876,7 @@ int tls_fls_otp_lock(void) case SPIFLASH_MID_TSINGTENG: writeLbBit_for_1wreg((1<<10)); break; - case SPIFLASH_MID_TSINGTENG_1MB: + case SPIFLASH_MID_TSINGTENG_1MB_4MB: writeLbBit_for_1wreg((7<<11)); break; case SPIFLASH_MID_FUDANMICRO: @@ -1460,8 +1466,21 @@ int tls_fls_init(void) fls->OTPWRParam.pageSize = 256; switch(fls->flashid) { + case SPIFLASH_MID_TSINGTENG_1MB_4MB: + if (fls->density == 0x100000) + { + fls->OTPWRParam.eraseSize = 1024; + } + else if (fls->density == 0x400000) + { + fls->OTPWRParam.eraseSize = 2048; + } + else + { + fls->OTPWRParam.eraseSize = 256; + } + break; case SPIFLASH_MID_GD: - case SPIFLASH_MID_TSINGTENG_1MB: fls->OTPWRParam.eraseSize = 1024; break; case SPIFLASH_MID_FUDANMICRO: diff --git a/src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c b/src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c index 04164da..0d7b8d9 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/io/wm_io.c @@ -33,6 +33,8 @@ static void io_cfg_option1(enum tls_io_name name) tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) | BIT(pin)); /* gpio function */ tls_reg_write32(HR_GPIO_AF_S1 + offset, tls_reg_read32(HR_GPIO_AF_S1 + offset) & (~BIT(pin))); tls_reg_write32(HR_GPIO_AF_S0 + offset, tls_reg_read32(HR_GPIO_AF_S0 + offset) & (~BIT(pin))); + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static void io_cfg_option2(enum tls_io_name name) @@ -54,6 +56,8 @@ static void io_cfg_option2(enum tls_io_name name) tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) | BIT(pin)); /* gpio function */ tls_reg_write32(HR_GPIO_AF_S1 + offset, tls_reg_read32(HR_GPIO_AF_S1 + offset) & (~BIT(pin))); tls_reg_write32(HR_GPIO_AF_S0 + offset, tls_reg_read32(HR_GPIO_AF_S0 + offset) | BIT(pin)); + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static void io_cfg_option3(enum tls_io_name name) @@ -75,6 +79,8 @@ static void io_cfg_option3(enum tls_io_name name) tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) | BIT(pin)); /* gpio function */ tls_reg_write32(HR_GPIO_AF_S1 + offset, tls_reg_read32(HR_GPIO_AF_S1 + offset) | BIT(pin)); tls_reg_write32(HR_GPIO_AF_S0 + offset, tls_reg_read32(HR_GPIO_AF_S0 + offset) & (~BIT(pin))); + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static void io_cfg_option4(enum tls_io_name name) @@ -96,6 +102,8 @@ static void io_cfg_option4(enum tls_io_name name) tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) | BIT(pin)); /* gpio function */ tls_reg_write32(HR_GPIO_AF_S1 + offset, tls_reg_read32(HR_GPIO_AF_S1 + offset) | BIT(pin)); tls_reg_write32(HR_GPIO_AF_S0 + offset, tls_reg_read32(HR_GPIO_AF_S0 + offset) | BIT(pin)); + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static void io_cfg_option5(enum tls_io_name name) @@ -115,6 +123,8 @@ static void io_cfg_option5(enum tls_io_name name) } tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) & (~BIT(pin))); /* disable gpio function */ + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static u32 io_pa_option67 = 0; @@ -139,8 +149,8 @@ static void io_cfg_option6(enum tls_io_name name) tls_reg_write32(HR_GPIO_AF_SEL + offset, tls_reg_read32(HR_GPIO_AF_SEL + offset) & (~BIT(pin))); /* disable gpio function */ tls_reg_write32(HR_GPIO_DIR + offset, tls_reg_read32(HR_GPIO_DIR + offset) & (~BIT(pin))); - tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); - tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); + tls_reg_write32(HR_GPIO_PULLUP_EN + offset, tls_reg_read32(HR_GPIO_PULLUP_EN + offset) | (BIT(pin))); /*disable pullup*/ + tls_reg_write32(HR_GPIO_PULLDOWN_EN + offset, tls_reg_read32(HR_GPIO_PULLDOWN_EN + offset) & (~BIT(pin))); /*disable pulldown*/ } static void io_cfg_option7(enum tls_io_name name) diff --git a/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c b/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c index 6ffe123..25f225f 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/sdio_host/wm_sdio_host.c @@ -88,10 +88,11 @@ int wm_sdh_config(void) tls_sys_clk_get(&sysclk); SDIO_HOST->MMC_CARDSEL = 0xC0 | (sysclk.cpuclk / 2 - 1);//0xd3; //enable module, enable mmcclk - SDIO_HOST->MMC_CTL = 0xD3;//0xC3; //4bits, low speed, 1/4 divider, auto transfer, mmc mode. + SDIO_HOST->MMC_CTL = 0x13;//0xC3; //4bits, low speed, 1/4 divider, auto transfer, mmc mode. SDIO_HOST->MMC_INT_MASK = 0x100; //unmask sdio data interrupt. SDIO_HOST->MMC_CRCCTL = 0xC0; // SDIO_HOST->MMC_TIMEOUTCNT = 0xff; + SDIO_HOST->MMC_IO_MBCTL |= 0xf0; return 0; } @@ -113,10 +114,14 @@ int wm_sd_card_initialize(uint32_t *rca) // CMD 3 Get RCA. //====================================================== begin: - wm_sdh_send_cmd(0, 0, 0x04); //Send CMD0 - sm_sdh_wait_interrupt(0, -1); + //Send CMD0 + 8 null clock to reset and stablize + for (int i = 0; i < 7 - recnt; i++) + { + wm_sdh_send_cmd(0, 0, 0x84); + sm_sdh_wait_interrupt(0, -1); + } delay_cnt(1000); - wm_sdh_send_cmd(8, 0x1AA, 0x44); //Send CMD8 + wm_sdh_send_cmd(8, 0x1AA, 0xC4); //Send CMD8 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD8 respCmd", (char *)respCmd, 5); @@ -129,14 +134,14 @@ begin: } while(1) { - wm_sdh_send_cmd(55, 0, 0x44); //Send CMD55 + wm_sdh_send_cmd(55, 0, 0xC4); //Send CMD55 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD55 respCmd", (char *)respCmd, 5); if((respCmd[1] & 0xFF) != 55) goto end; - wm_sdh_send_cmd(41, 0xC0100000, 0x44); //Send ACMD41 + wm_sdh_send_cmd(41, 0xC0100000, 0xC4); //Send ACMD41 sm_sdh_wait_interrupt(0, -1); sm_sdh_wait_interrupt(3, 1000); //ÓÉÓÚsd¹æ·¶ÖУ¬Acmd41·µ»ØµÄcrcÓÀÔ¶ÊÇ11111£¬Ò²¾ÍÊÇÓ¦¸ÃºöÂÔcrc;ÕâÀïµÄcrc´íÎóÓ¦¸ÃºöÂÔ¡£ wm_sdh_get_response(respCmd, 2); @@ -150,14 +155,14 @@ begin: } } - wm_sdh_send_cmd(2, 0, 0x54); //Send CMD2 + wm_sdh_send_cmd(2, 0, 0xD4); //Send CMD2 sm_sdh_wait_interrupt(0, -1); sm_sdh_wait_interrupt(3, 1000); wm_sdh_get_response(respCmd, 4); sh_dumpBuffer("CMD2 respCmd", (char *)respCmd, 16); if((respCmd[3] >> 24 & 0xFF) != 0x3F) //sd¹æ·¶¶¨Òå¹Ì¶¨Îª0x3F,ËùÒÔµ¼ÖÂcrc´íÎó goto end; - wm_sdh_send_cmd(3, 0, 0x44); //Send CMD3 + wm_sdh_send_cmd(3, 0, 0xC4); //Send CMD3 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD3 respCmd", (char *)respCmd, 5); @@ -179,6 +184,7 @@ static uint32_t SD_GetCapacity(uint8_t *csd, SD_CardInfo_t *SDCardInfo) if((csd[0]&0xC0)==0x40)//ÅжÏbit126ÊÇ·ñΪ1 { + SDCardInfo->CSDVer = 2; csize = csd[9] + ((uint32_t)csd[8] << 8) + ((uint32_t)(csd[7] & 63) << 16) + 1; Capacity = csize << 9; SDCardInfo->CardCapacity = (long long)Capacity*1024; @@ -186,6 +192,7 @@ static uint32_t SD_GetCapacity(uint8_t *csd, SD_CardInfo_t *SDCardInfo) } else { + SDCardInfo->CSDVer = 1; n = (csd[5] & 0x0F) + ((csd[10] & 0x80) >> 7) + ((csd[9] & 0x03) << 1) + 2; csize = (csd[8] >> 6) + ((uint16_t)csd[7] << 2) + ((uint16_t)(csd[6] & 0x03) << 10) + 1; Capacity = (uint32_t)csize << (n - 10); @@ -219,7 +226,7 @@ int wm_sd_card_set_blocklen(uint32_t blocklen) { int ret = -1; uint32_t respCmd[2]; - wm_sdh_send_cmd(16, blocklen, 0x44); //Send CMD16 + wm_sdh_send_cmd(16, blocklen, 0xC4); //Send CMD16 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD16 respCmd", (char *)respCmd, 5); @@ -234,7 +241,7 @@ int wm_sd_card_select(uint32_t rca) { int ret = -1; uint32_t respCmd[2]; - wm_sdh_send_cmd(7, rca<<16, 0x44); //Send CMD7 + wm_sdh_send_cmd(7, rca<<16, 0xC4); //Send CMD7 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD7 respCmd", (char *)respCmd, 5); @@ -247,7 +254,7 @@ end: void wm_sd_card_deselect() { - wm_sdh_send_cmd(7, 0, 0x04); //Send CMD7 + wm_sdh_send_cmd(7, 0, 0x84); //Send CMD7 sm_sdh_wait_interrupt(0, -1); } @@ -259,7 +266,7 @@ int wm_sd_card_query_status(uint32_t rca, uint32_t *respCmd0) uint8_t error_state = 0; #endif uint32_t respCmd[2]; - wm_sdh_send_cmd(13, rca<<16, 0x44); //Send CMD13 + wm_sdh_send_cmd(13, rca<<16, 0xC4); //Send CMD13 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD13 respCmd", (char *)respCmd, 5); @@ -288,7 +295,7 @@ int wm_sd_card_switch_func(uint8_t speed_mode) int i; uint32_t respCmd[2]; - wm_sdh_send_cmd(6, 0x00fffff1, 0x44); //Send CMD6 + wm_sdh_send_cmd(6, 0x00fffff1, 0xC4); //Send CMD6 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD6 respCmd", (char *)respCmd, 5); @@ -296,7 +303,7 @@ int wm_sd_card_switch_func(uint8_t speed_mode) goto end; SDIO_HOST->BUF_CTL = 0x4020; //disable dma, read sd card SDIO_HOST->MMC_INT_SRC |= 0x7ff; // clear all firstly - SDIO_HOST->MMC_IO = 0x3; //!!!read data, auto transfer + SDIO_HOST->MMC_IO = 0x83; //!!!read data, auto transfer sm_sdh_wait_interrupt(1, -1); TEST_DEBUG("read complete\n"); for(i = 0; i < 128; i++) @@ -315,7 +322,7 @@ int wm_sd_card_switch_func(uint8_t speed_mode) TEST_DEBUG("the value of byte 17~20 is 0x%x\n", respCmd[1]); if(respCmd[1] & 0xF) //support high speed { - wm_sdh_send_cmd(6, 0x80fffff0 | speed_mode, 0x44); //Send CMD6 + wm_sdh_send_cmd(6, 0x80fffff0 | speed_mode, 0xC4); //Send CMD6 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD6 respCmd", (char *)respCmd, 5); @@ -323,7 +330,7 @@ int wm_sd_card_switch_func(uint8_t speed_mode) goto end; SDIO_HOST->BUF_CTL = 0x4020; //disable dma, read sd card SDIO_HOST->MMC_INT_SRC |= 0x7ff; // clear all firstly - SDIO_HOST->MMC_IO = 0x3; //!!!read data, auto transfer + SDIO_HOST->MMC_IO = 0x83; //!!!read data, auto transfer sm_sdh_wait_interrupt(1, -1); TEST_DEBUG("read complete\n"); for(i = 0; i < 128; i++) @@ -378,13 +385,13 @@ int wm_sd_card_set_bus_width(uint32_t rca, uint8_t bus_width) { SDIO_HOST->MMC_CTL &= ~(1 << 7); } - wm_sdh_send_cmd(55, rca<<16, 0x44); //Send CMD55 + wm_sdh_send_cmd(55, rca<<16, 0xC4); //Send CMD55 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("CMD55 respCmd", (char *)respCmd, 5); if((respCmd[1] & 0xFF) != 55) goto end; - wm_sdh_send_cmd(6, bus_width, 0x44); //Send ACMD6 + wm_sdh_send_cmd(6, bus_width, 0xC4); //Send ACMD6 sm_sdh_wait_interrupt(0, -1); wm_sdh_get_response(respCmd, 2); sh_dumpBuffer("ACMD6 respCmd", (char *)respCmd, 5); @@ -399,7 +406,7 @@ int wm_sd_card_stop_trans(void) { int ret = -1; uint32_t respCmd[2]; - wm_sdh_send_cmd(12, 0, 0x44); //Send CMD12 + wm_sdh_send_cmd(12, 0, 0xC4); //Send CMD12 ret = sm_sdh_wait_interrupt(0, -1); if(ret) goto end; @@ -415,7 +422,7 @@ end: static void sdio_host_reset(void) { tls_bitband_write(HR_CLK_RST_CTL, 27, 0); - + delay_cnt(1000); tls_bitband_write(HR_CLK_RST_CTL, 27, 1); while(tls_bitband_read(HR_CLK_RST_CTL, 27) == 0); } @@ -431,6 +438,7 @@ int sdh_card_init(uint32_t *rca_ref) ret = wm_sd_card_initialize(&rca); if(ret) goto end; + SDCardInfo.RCA = (u16)(rca & 0xFFFF); ret = wm_sd_card_query_csd(rca); if(ret) goto end; @@ -444,6 +452,8 @@ int sdh_card_init(uint32_t *rca_ref) if(ret) goto end; *rca_ref = rca; + + SDIO_HOST->MMC_CTL = 0xD3; ret = 0; end: TEST_DEBUG("ret %d\n", ret); diff --git a/src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c b/src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c index 1ca6620..cc9d019 100644 --- a/src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c +++ b/src/W800_SDK_v1.00.10/platform/drivers/uart/wm_uart.c @@ -606,7 +606,7 @@ ATTRIBUTE_ISR void UART0_IRQHandler(void) port->rx_callback(1, port->priv_data); } } - if (port->rx_callback != NULL && !rx_byte_cb_flag) + if (rxlen && port->rx_callback != NULL && !rx_byte_cb_flag) { port->rx_callback(rxlen, port->priv_data); } @@ -693,6 +693,10 @@ ATTRIBUTE_ISR void UART1_IRQHandler(void) ch = (u8) port->regs->UR_RXW; recv->buf[recv->head] = ch; recv->head = (recv->head + 1) & (TLS_UART_RX_BUF_SIZE - 1); + if(port->rx_callback != NULL && rx_byte_cb_flag) + { + port->rx_callback(1, port->priv_data); + } } } @@ -713,10 +717,6 @@ ATTRIBUTE_ISR void UART1_IRQHandler(void) port->plus_char_cnt = 3; break; } - if(rxlen && port->rx_callback != NULL && rx_byte_cb_flag) - { - port->rx_callback(1, port->priv_data); - } } if (rxlen && port->rx_callback!=NULL && !rx_byte_cb_flag) { @@ -798,6 +798,10 @@ ATTRIBUTE_ISR void UART2_4_IRQHandler(void) } recv->buf[recv->head] = ch; recv->head = (recv->head + 1) & (TLS_UART_RX_BUF_SIZE - 1); + if(port->rx_callback != NULL && rx_byte_cb_flag) + { + port->rx_callback(1, port->priv_data); + } } if( escapefifocnt==3 && ch=='+') @@ -817,12 +821,8 @@ ATTRIBUTE_ISR void UART2_4_IRQHandler(void) port->plus_char_cnt = 3; break; } - if(port->rx_callback != NULL && rx_byte_cb_flag) - { - port->rx_callback(1, port->priv_data); - } } - if (port->rx_callback!=NULL && !rx_byte_cb_flag) + if (rxlen && port->rx_callback!=NULL && !rx_byte_cb_flag) { port->rx_callback(rxlen, port->priv_data); } diff --git a/src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h b/src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h index 3671a46..4e05d54 100644 --- a/src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h +++ b/src/W800_SDK_v1.00.10/platform/inc/tls_wireless.h @@ -419,6 +419,7 @@ int tls_wl_if_sta_add(struct tls_wif *wif, int tls_wl_if_sta_remove(struct tls_wif *wif, u8 *addr); int tls_wl_if_get_inact_sec(struct tls_wif *wif, const u8 *addr); int tls_wl_if_get_scan_res(struct tls_wif *wif, u8 *buf, u32 buf_size); +int tls_wl_if_get_scan_res_format2(struct tls_wif *wif, u8 *buf, u32 buf_size); int tls_wl_if_disconnect(struct tls_wif *wif); int tls_wl_if_tx(struct tls_wif *wif, u8 *buf, u32 buflen, bool last_packet, bool is_apsta, bool not_delay); diff --git a/src/W800_SDK_v1.00.10/platform/inc/utils.h b/src/W800_SDK_v1.00.10/platform/inc/utils.h index 1a26802..c23c73e 100644 --- a/src/W800_SDK_v1.00.10/platform/inc/utils.h +++ b/src/W800_SDK_v1.00.10/platform/inc/utils.h @@ -35,6 +35,8 @@ char * strdup(const char *s); char * strndup(const char *s, size_t len); int sendchar(int ch); +void dumpBuffer(char *name, char* buffer, int len); +void dumpUint32(char *name, u32* buffer, int len); int sendchar_debug_uart(int ch); #endif /* UTILS_H */ diff --git a/src/W800_SDK_v1.00.10/platform/sys/wm_main.c b/src/W800_SDK_v1.00.10/platform/sys/wm_main.c index 379563a..1f3fe0d 100644 --- a/src/W800_SDK_v1.00.10/platform/sys/wm_main.c +++ b/src/W800_SDK_v1.00.10/platform/sys/wm_main.c @@ -47,7 +47,7 @@ #include "wm_watchdog.h" #include "wm_wifi.h" #if TLS_CONFIG_ONLY_FACTORY_ATCMD -#include "factory_atcmd.h" +#include "../../src/app/factorycmd/factory_atcmd.h" #endif /* c librayr mutex */ @@ -101,7 +101,7 @@ tls_os_task_t tstusermainhdl = NULL; #define FW_MAJOR_VER 0x1 #define FW_MINOR_VER 0x0 -#define FW_PATCH_VER 0x8 +#define FW_PATCH_VER 0x10 const char FirmWareVer[4] = { diff --git a/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c index 4ce3419..cb82d81 100644 --- a/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c +++ b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_server_wifi_app.c @@ -168,7 +168,7 @@ static int bt_aes_decrypt(uint8_t *key, uint8_t *src_ptr, int length, uint8_t *d psCipherContext_t ctx; uint8_t *buf = NULL; TLS_DBGPRT_INFO("original data:"); - TLS_DBGPRT_DUMP(src_ptr, length); + TLS_DBGPRT_DUMP((char *)src_ptr, length); if(key == NULL || src_ptr == NULL || length % 16 != 0) { goto out; @@ -182,7 +182,7 @@ static int bt_aes_decrypt(uint8_t *key, uint8_t *src_ptr, int length, uint8_t *d MEMCPY(buf, src_ptr, length); TLS_DBGPRT_INFO("aes key:"); - TLS_DBGPRT_DUMP(key, 16); + TLS_DBGPRT_DUMP((char *)key, 16); if(tls_crypto_aes_init(&ctx, key, key, 16, CRYPTO_MODE_ECB) != 0) { goto out; @@ -194,7 +194,7 @@ static int bt_aes_decrypt(uint8_t *key, uint8_t *src_ptr, int length, uint8_t *d MEMCPY(dest_ptr, buf, length); TLS_DBGPRT_INFO("decrypt data:"); - TLS_DBGPRT_DUMP(dest_ptr, length); + TLS_DBGPRT_DUMP((char *)dest_ptr, length); ret = DePKCS7Padding(dest_ptr, length); out: @@ -244,7 +244,7 @@ static int bt_aes_encrypt(uint8_t *key, uint8_t *src_ptr, int length, uint8_t *d psCipherContext_t ctx; unsigned char *aes_encode_temp = NULL; TLS_DBGPRT_INFO("original data:"); - TLS_DBGPRT_DUMP(src_ptr, length); + TLS_DBGPRT_DUMP((char *)src_ptr, length); aes_encode_temp = tls_mem_alloc(length + 16); if(aes_encode_temp == NULL) { @@ -264,7 +264,7 @@ static int bt_aes_encrypt(uint8_t *key, uint8_t *src_ptr, int length, uint8_t *d } //TLS_DBGPRT_INFO("encrypt data:"); - TLS_DBGPRT_DUMP(dest_ptr, len); + TLS_DBGPRT_DUMP((char *)dest_ptr, len); ret = len; out: diff --git a/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c index 8bd2121..0cacc3f 100644 --- a/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c +++ b/src/W800_SDK_v1.00.10/src/app/bleapp/wm_ble_uart_if.c @@ -327,7 +327,7 @@ static int ble_uart_init(int8_t uart_idx, int bandrate, int parity, int stopbits wm_uart_task, (void *) wm_uart, (void *) wm_uart_task_stk, /** ä»»åŠ¡æ ˆçš„èµ·å§‹åœ°å€ */ - WM_UART_TAST_STK_SIZE, /** ä»»åŠ¡æ ˆçš„å¤§å° */ + WM_UART_TAST_STK_SIZE*4, /** ä»»åŠ¡æ ˆçš„å¤§å° */ WM_UART_TASK_PRIO, 0); assert(status == 0); status = tls_os_queue_create(&(wm_uart->wm_queue_msg_available), 6); @@ -336,7 +336,7 @@ static int ble_uart_init(int8_t uart_idx, int bandrate, int parity, int stopbits wm_dispatch_task, (void *) wm_uart, (void *) wm_disp_task_stk, /** ä»»åŠ¡æ ˆçš„èµ·å§‹åœ°å€ */ - WM_DISP_TAST_STK_SIZE, /** ä»»åŠ¡æ ˆçš„å¤§å° */ + WM_DISP_TAST_STK_SIZE*4, /** ä»»åŠ¡æ ˆçš„å¤§å° */ WM_UART_TASK_PRIO+1, 0); assert(status == 0); } diff --git a/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c b/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c index 157f96c..d095bda 100644 --- a/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c +++ b/src/W800_SDK_v1.00.10/src/app/dhcpserver/dhcp_server.c @@ -14,7 +14,6 @@ #include #include -#include "tls_common.h" #include "wm_mem.h" #include "wm_debug.h" #include "lwip/stats.h" @@ -25,6 +24,8 @@ #include "lwip/prot/dhcp.h" #include "netif/ethernetif.h" #include "dhcp_server.h" +#include "tls_common.h" +#include "wm_wifi.h" #if TLS_CONFIG_AP @@ -36,7 +37,7 @@ extern u8 *wpa_supplicant_get_mac(void); -/* ÊÇ·ñ¸ù¾Ý¿Í»§¶Ëdhcp±¨ÎÄÖеÄbroadcast±êÖ¾À´»ØÓ¦£¬²»Ê¹ÓÃÔòͳһʹÓù㲥»Ø¸´ */ +/* æ˜¯å¦æ ¹æ®å®¢æˆ·ç«¯dhcp报文中的broadcast标志æ¥å›žåº”,ä¸ä½¿ç”¨åˆ™ç»Ÿä¸€ä½¿ç”¨å¹¿æ’­å›žå¤ */ #define DHCPS_CHECK_BROADCAST_FLAG #ifdef DHCPS_CHECK_BROADCAST_FLAG #define IS_BROADCAST_SEND(x) (((x) >> 15) == 1 ? TRUE : FALSE) @@ -158,7 +159,7 @@ static bool _CheckMacIsValid(u8 *mac) sta_buf = tls_mem_alloc(STA_MAC_BUF_LEN); if (!sta_buf) - return FALSE;/* ϵͳ×ÊÔ´²»×㣬ÎÞÐèÔÙÈÃclient½ÓÈë */ + return FALSE;/* 系统资æºä¸è¶³ï¼Œæ— éœ€å†è®©client接入 */ memset(sta_buf, 0, STA_MAC_BUF_LEN); tls_wifi_get_authed_sta_info(&sta_num, sta_buf, STA_MAC_BUF_LEN); @@ -167,7 +168,7 @@ static bool _CheckMacIsValid(u8 *mac) { if (!compare_ether_addr(mac, sta->mac_addr)) { - ret = TRUE;/* ±¾SOFTAPϵÄclient²ÅÓèÒÔ·ÖÅäIP */ + ret = TRUE;/* 本SOFTAP下的clientæ‰äºˆä»¥åˆ†é…IP */ break; } sta++; @@ -1134,7 +1135,8 @@ INT8S DHCPS_Start(struct netif *Netif) udp_bind(DhcpServer->Socket, IP_ADDR_ANY, DHCP_SERVER_UDP_PORT); /* bind multicast&broadcast netif */ - udp_bind_multicast_netif(DhcpServer->Socket, &Netif->ip_addr); + //udp_bind_multicast_netif(DhcpServer->Socket, &Netif->ip_addr); + udp_set_multicast_netif_addr(DhcpServer->Socket, &Netif->ip_addr); /* Set up the recv callback and argument. */ udp_recv(DhcpServer->Socket, (udp_recv_fn)DHCPS_RecvCb, Netif); diff --git a/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c b/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c index 978be12..ac2db68 100644 --- a/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c +++ b/src/W800_SDK_v1.00.10/src/app/factorycmd/factory_atcmd.c @@ -11,6 +11,8 @@ #include "wm_internal_flash.h" #include "litepoint.h" #include "wm_ram_config.h" +#include "wm_adc.h" +#include "wm_gpio_afsel.h" #define FACTORY_ATCMD_MAX_ARG 10 #define FACTORY_ATCMD_NAME_MAX_LEN 10 @@ -523,7 +525,7 @@ static int factory_atcmd_txgi_proc( struct factory_atcmd_token_t *tok, char *res } } else{ - /*Èçʵ·´Ó³flash²ÎÊýÇøµÄʵ¼Ê´æ´¢Çé¿ö*/ + /*å¦‚å®žåæ˜ flash傿•°åŒºçš„实际存储情况*/ ret = tls_get_tx_gain(tx_gain); if (ret == 0) { @@ -842,6 +844,102 @@ static int factory_atcmd_qver_proc( struct factory_atcmd_token_t *tok, char *res __DATE__, __TIME__); return 0; } +static int factory_atcmd_test_mode_proc( struct factory_atcmd_token_t *tok, char *res_resp, u32 *res_len) +{ + wm_adc_config(0); + wm_adc_config(1); + wm_adc_config(2); + wm_adc_config(3); + *res_len = factory_atcmd_ok_resp(res_resp); + return 0; +} +static int factory_atcmd_adc_cal_proc( struct factory_atcmd_token_t *tok, char *res_resp, u32 *res_len) +{ + int ret = 0; + int val = 0; + int i = 0; + int refvoltage[4] = {0}; + FT_ADC_CAL_ST adc_cal; + + if (tok->arg_found) + { + if (tok->arg_found < 5) + { + *res_len = factory_atcmd_err_resp(res_resp, FACTORY_ATCMD_ERR_INV_PARAMS); + return 0; + } + ret = strtodec(&val, tok->arg[0]); + if (ret < 0 || val > 15 || val < 1) + { + *res_len = factory_atcmd_err_resp(res_resp, FACTORY_ATCMD_ERR_INV_PARAMS); + return 0; + } + for(i = 0; i < 4; i++) + { + ret = strtodec(&refvoltage[i], tok->arg[i + 1]); + if (ret < 0 ) + { + *res_len = factory_atcmd_err_resp(res_resp, FACTORY_ATCMD_ERR_INV_PARAMS); + return 0; + } + } + + ret = adc_multipoint_calibration(val, refvoltage); + if (ret == 0) + { + *res_len = factory_atcmd_ok_resp(res_resp); + } + else + { + *res_len = factory_atcmd_err_resp(res_resp, FACTORY_ATCMD_ERR_FLASH); + } + return 0; + } + else + { + ret = tls_get_adc_cal_param(&adc_cal); + //dumpBuffer("&adc_cal", &adc_cal, sizeof(adc_cal)); + if (ret == 0) + { + *res_len = sprintf(res_resp, "+OK=%lf,%lf\r\n", adc_cal.a, adc_cal.b); + } + else + { + *res_len = factory_atcmd_err_resp(res_resp,FACTORY_ATCMD_ERR_FLASH); + } + + return 0; + } +} + +static int factory_atcmd_adc_vol_proc( struct factory_atcmd_token_t *tok, char *res_resp, u32 *res_len) +{ + int ret = 0; + int val = 0xF; + int i = 0; + int voltage[4] = {0}; + + if (tok->arg_found) + { + ret = strtodec(&val, tok->arg[0]); + if (ret < 0 || val > 15 || val < 1) + { + *res_len = factory_atcmd_err_resp(res_resp, FACTORY_ATCMD_ERR_INV_PARAMS); + return 0; + } + } + + for(i = 0; i < 4; i++) + { + if (val & (1 << i)) + { + wm_adc_config(i); + voltage[i] = adc_get_inputVolt(i, 1, 1); + } + } + *res_len = sprintf(res_resp, "+OK=%d,%d,%d,%d\r\n", voltage[0], voltage[1], voltage[2], voltage[3]); + return 0; +} static struct factory_atcmd_t factory_atcmd_tbl[] = @@ -869,6 +967,9 @@ static struct factory_atcmd_t factory_atcmd_tbl[] = { "&LPRSTT", factory_atcmd_lprstt_proc}, { "&CALFIN", factory_atcmd_calfinish_proc}, { "FREQ", factory_atcmd_freq_err_proc}, + { "&TESTM", factory_atcmd_test_mode_proc}, + { "&ADCCAL", factory_atcmd_adc_cal_proc}, + { "&ADCVOL", factory_atcmd_adc_vol_proc}, { NULL, NULL }, }; diff --git a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c index 3eaa93b..81c4268 100644 --- a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c +++ b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClient.c @@ -1859,7 +1859,10 @@ static UINT32 HTTPIntrnConnectionOpen (P_HTTP_SESSION pHTTPSession) (HTTP_SOCKADDR*)&ServerAddress, // Server address sizeof(HTTP_SOCKADDR)); // Length of server address structure // The socket was set to be asyn so we should check the error being returned from connect() - nRetCode = SocketGetErr(pHTTPSession->HttpConnection.HttpSocket); + if(nRetCode) + { + nRetCode = SocketGetErr(pHTTPSession->HttpConnection.HttpSocket); + } } if(nRetCode == 0 || nRetCode == HTTP_EWOULDBLOCK || nRetCode == HTTP_EINPROGRESS) @@ -1876,6 +1879,7 @@ static UINT32 HTTPIntrnConnectionOpen (P_HTTP_SESSION pHTTPSession) } else { + //printf("%s: nRetCode %d\n", __func__, nRetCode); // Socket connection problem nRetCode = HTTP_CLIENT_ERROR_SOCKET_CONNECT; break; diff --git a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c index adcde61..0a2ee5f 100644 --- a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c +++ b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.c @@ -1,5 +1,4 @@ -#include "lwip/arch.h" #include "HTTPClientWrapper.h" #include "random.h" #include "wm_osal.h" @@ -908,6 +907,7 @@ int HTTPWrapperSSLConnect(tls_ssl_t **ssl_p,int fd,const struct sockaddr *name,i /* OPTIONAL is not optimal for security, * but makes interop easier in this simplified example */ mbedtls_ssl_conf_authmode( &ssl->conf, MBEDTLS_SSL_VERIFY_NONE ); + //mbedtls_ssl_conf_authmode( &ssl->conf, MBEDTLS_SSL_VERIFY_REQUIRED); #if MBEDTLS_DEMO_USE_CERT mbedtls_ssl_conf_ca_chain( &ssl->conf, &ssl->cacert, NULL ); #endif @@ -917,6 +917,8 @@ int HTTPWrapperSSLConnect(tls_ssl_t **ssl_p,int fd,const struct sockaddr *name,i mbedtls_ssl_conf_dbg( &ssl->conf, ssl_client_debug, stdout ); #endif + mbedtls_ssl_conf_read_timeout( &ssl->conf, 5000 ); + if( ( ret = mbedtls_ssl_setup( &ssl->ssl, &ssl->conf ) ) != 0 ) { mbedtls_printf( " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret ); @@ -929,7 +931,8 @@ int HTTPWrapperSSLConnect(tls_ssl_t **ssl_p,int fd,const struct sockaddr *name,i goto exit; } - mbedtls_ssl_set_bio( &ssl->ssl, &ssl->server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); + //mbedtls_ssl_set_bio( &ssl->ssl, &ssl->server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); + mbedtls_ssl_set_bio( &ssl->ssl, &ssl->server_fd, mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout); /* * 4. Handshake diff --git a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h index 0fb313a..a18e457 100644 --- a/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h +++ b/src/W800_SDK_v1.00.10/src/app/httpclient/HTTPClientWrapper.h @@ -3,6 +3,7 @@ #define HTTP_CLIENT_WRAPPER #include "wm_config.h" +#include "lwip/opt.h" #include "lwip/arch.h" #if TLS_CONFIG_HTTP_CLIENT_SECURE diff --git a/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c index bc022cb..78a0705 100644 --- a/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c +++ b/src/W800_SDK_v1.00.10/src/app/iperf/iperf_api.c @@ -2210,17 +2210,15 @@ iperf_init_stream(struct iperf_stream *sp, struct iperf_test *test) } /* Set IP TOS */ if ((opt = test->settings->tos)!=0) { - if (test->settings->domain == AF_INET6) { #ifdef IPV6_TCLASS + if (test->settings->domain == AF_INET6) { if (setsockopt(sp->socket, IPPROTO_IPV6, IPV6_TCLASS, &opt, sizeof(opt)) < 0) { i_errno = IESETCOS; return (-1); } -#else - i_errno = IESETCOS; - return (-1); + } else #endif - } else { + { if (setsockopt(sp->socket, IPPROTO_IP, IP_TOS, &opt, sizeof(opt)) < 0) { i_errno = IESETTOS; return (-1); diff --git a/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c index 8b8546c..be726e3 100644 --- a/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c +++ b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/lws-plat-wm.c @@ -4,7 +4,7 @@ #include #include "random.h" -static int poll ( struct lws_pollfd * fds, unsigned int nfds, int timeout) +static int _poll ( struct lws_pollfd * fds, unsigned int nfds, int timeout) { int ret, i, max_fd=0; fd_set readset, writeset; @@ -70,7 +70,7 @@ LWS_VISIBLE int lws_send_pipe_choked(struct lws *wsi) fds.events = POLLOUT; fds.revents = 0; - if (poll(&fds, 1, 0) != 1) + if (_poll(&fds, 1, 0) != 1) return 1; if ((fds.revents & POLLOUT) == 0) @@ -84,7 +84,7 @@ LWS_VISIBLE int lws_send_pipe_choked(struct lws *wsi) LWS_VISIBLE int lws_poll_listen_fd(struct lws_pollfd *fd) { - return poll(fd, 1, 0); + return _poll(fd, 1, 0); } int @@ -129,7 +129,7 @@ lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi) timeout_ms = 0; } - n = poll(pt->fds, pt->fds_count, timeout_ms); + n = _poll(pt->fds, pt->fds_count, timeout_ms); #if 0//def LWS_OPENSSL_SUPPORT if (!pt->rx_draining_ext_list && diff --git a/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h index 8fdb02b..3454a3f 100644 --- a/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h +++ b/src/W800_SDK_v1.00.10/src/app/libwebsockets-2.1-stable/private-libwebsockets.h @@ -35,6 +35,7 @@ #include #include #include +#include "lwip/opt.h" #include "lwip/arch.h" #include "wm_osal.h" //#include diff --git a/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c index 5d7f97c..6528aac 100644 --- a/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c +++ b/src/W800_SDK_v1.00.10/src/app/mDNS/mDNSPosix/mDNSPosix.c @@ -149,6 +149,7 @@ #include "APSCommonServices.h" #include "lwip/sockets.h" #include "wm_sockets.h" +#include "wm_netif.h" #include "lwip/inet.h" #include "lwip/igmp.h" #include // platform support for UTC time diff --git a/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h index edabc2c..0b5ec9e 100644 --- a/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h +++ b/src/W800_SDK_v1.00.10/src/app/mbedtls/include/mbedtls/config.h @@ -2733,6 +2733,10 @@ /* Platform options */ //#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ +#if WM_MEM_DEBUG +#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ +#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ +#else #ifdef tls_mem_calloc #define MBEDTLS_PLATFORM_STD_CALLOC tls_mem_calloc /**< Default allocator to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_FREE tls_mem_free /**< Default free to use, can be undefined */ @@ -2740,6 +2744,7 @@ #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ #define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ #endif +#endif //#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_TIME tls_os_get_time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ diff --git a/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c b/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c index d92f680..0c4ff7e 100644 --- a/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c +++ b/src/W800_SDK_v1.00.10/src/app/mqtt/libemqtt.c @@ -292,7 +292,7 @@ int mqtt_connect(mqtt_broker_handle_t* broker) memcpy(packet+offset, broker->password, passwordlen); offset += passwordlen; } - + //dumpBuffer("conn packet", packet, packetLen); ret = broker->mqttsend(broker->socketid, packet, packetLen); if(ret < packetLen) { tls_mem_free(fixed_header); @@ -475,6 +475,24 @@ int mqtt_pubrel(mqtt_broker_handle_t* broker, uint16_t message_id) { return 1; } +int encode_length(int length, uint8_t *buf) +{ + int ret = 0; + do + { + buf[ret] = (uint8_t)(length % 0x80); + length /= 0x80; + if(length > 0) + { + buf[ret] |= 0x80; + } + ret++; + }while(length > 0); + + //dumpBuffer("encode_length", buf, ret); + return ret; +} + int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* message_id) { uint16_t topiclen = strlen(topic); @@ -483,7 +501,8 @@ int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* me uint8_t *packet=NULL; int utf_topicLen; int packetLen; - uint8_t fixed_header[2]; + uint8_t fixed_header[6]; + int fixed_header_len; /*************************************************/ @@ -514,11 +533,13 @@ int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* me /********************add by alex***********************/ // Fixed header fixed_header[0] = MQTT_MSG_SUBSCRIBE | MQTT_QOS1_FLAG; - fixed_header[1] = sizeof(var_header)+utf_topicLen; + //fixed_header[1] = sizeof(var_header)+utf_topicLen; + fixed_header_len = encode_length(sizeof(var_header)+utf_topicLen, &fixed_header[1]); + fixed_header_len += 1; /******************************************************/ /***********************add by alex********************/ - packetLen = sizeof(var_header)+sizeof(fixed_header)+utf_topicLen; + packetLen = sizeof(var_header)+fixed_header_len+utf_topicLen; packet = (uint8_t*)tls_mem_alloc( packetLen ); if( packet==NULL ) { @@ -526,9 +547,11 @@ int mqtt_subscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* me return -1; } memset(packet, 0, packetLen); - memcpy(packet, fixed_header, sizeof(fixed_header)); - memcpy(packet+sizeof(fixed_header), var_header, sizeof(var_header)); - memcpy(packet+sizeof(fixed_header)+sizeof(var_header), utf_topic, utf_topicLen); + memcpy(packet, fixed_header, fixed_header_len); + memcpy(packet+fixed_header_len, var_header, sizeof(var_header)); + memcpy(packet+fixed_header_len+sizeof(var_header), utf_topic, utf_topicLen); + + //dumpBuffer("subscribe packet", packet, packetLen); // Send the packet if(broker->mqttsend(broker->socketid, packet, packetLen) < packetLen) { @@ -549,7 +572,8 @@ int mqtt_unsubscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* /******************add by alex*******************/ uint8_t *utf_topic=NULL; int utf_topicLen; - uint8_t fixed_header[2]; + uint8_t fixed_header[6]; + int fixed_header_len; uint8_t *packet = NULL; int packetLen; @@ -579,9 +603,11 @@ int mqtt_unsubscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* /*************************add by alex*******************************/ // Fixed header fixed_header[0] = MQTT_MSG_UNSUBSCRIBE | MQTT_QOS1_FLAG; - fixed_header[1] = sizeof(var_header)+utf_topicLen; + //fixed_header[1] = sizeof(var_header)+utf_topicLen; + fixed_header_len = encode_length(sizeof(var_header)+utf_topicLen, &fixed_header[1]); + fixed_header_len += 1; - packetLen = sizeof(var_header)+sizeof(fixed_header)+utf_topicLen; + packetLen = sizeof(var_header)+fixed_header_len+utf_topicLen; packet = (uint8_t*)tls_mem_alloc( packetLen ); if( packet==NULL ) { @@ -589,9 +615,9 @@ int mqtt_unsubscribe(mqtt_broker_handle_t* broker, const char* topic, uint16_t* return -1; } memset(packet, 0, packetLen); - memcpy(packet, fixed_header, sizeof(fixed_header)); - memcpy(packet+sizeof(fixed_header), var_header, sizeof(var_header)); - memcpy(packet+sizeof(fixed_header)+sizeof(var_header), utf_topic, utf_topicLen); + memcpy(packet, fixed_header, fixed_header_len); + memcpy(packet+fixed_header_len, var_header, sizeof(var_header)); + memcpy(packet+fixed_header_len+sizeof(var_header), utf_topic, utf_topicLen); // Send the packet if(broker->mqttsend(broker->socketid, packet, packetLen) < packetLen) { diff --git a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c index 99403c1..4f87d88 100644 --- a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c +++ b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.c @@ -38,20 +38,24 @@ lsd_printf_fn lsd_printf = NULL; static u8 *lsd_scan_bss; +#define LSD_SRC_CNT (3) + const u8 lsd_dst_addr[3] = {0x01,0x00,0x5e}; -u8 lsd_last_num[2] = {0,0}; -u16 lsd_head[2][4] = {{0,0,0,0},{0,0,0,0}}; -u16 lsd_byte[2][4] = {{0,0,0,0},{0,0,0,0}}; -u8 lsd_state = 0; -u16 lsd_data_datum = 0; -u8 lsd_head_cnt[2] = {0,0}; -u8 lsd_byte_cnt[2] = {0,0}; -u8 lsd_sync_cnt = 0; -u8 lsd_src_mac[6] = {0}; -u8 lsd_data_cnt = 0; -u16 lsd_last_seq[2] = {0,0}; -u16 lsd_last_len = 0; -u8 lsd_temp_lock = 0; +u8 lsd_last_num[LSD_SRC_CNT] = {0, 0, 0}; +u16 lsd_head[LSD_SRC_CNT][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}}; +u16 lsd_byte[LSD_SRC_CNT][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}}; +u8 lsd_state[LSD_SRC_CNT] = {0, 0, 0}; +u16 lsd_data_datum[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_head_cnt[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_head_bw20[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_byte_cnt[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_sync_cnt[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_src_mac[LSD_SRC_CNT][6] = {{0}, {0}, {0}}; +u8 lsd_data_cnt[LSD_SRC_CNT] = {0, 0, 0}; +u16 lsd_last_seq[LSD_SRC_CNT] = {0, 0, 0}; +u16 lsd_last_len[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_temp_lock[LSD_SRC_CNT] = {0, 0, 0}; +u8 lsd_lock_chan_cnt = 0; struct lsd_data_t *lsd_data = NULL; @@ -196,12 +200,24 @@ int tls_lsd_recv(u8 *buf, u16 data_len) { return -1; } + if(hdr->duration_id == 0) //normal mode stbc ²»´¦Àí + { + tods = 2; + } + else + { + if(1 == ieee80211_has_tods(hdr->frame_control)) + { + tods = 1; + } + else + { + tods = 0; + } + } multicast = ieee80211_get_DA(hdr); - if(0 == ieee80211_has_tods(hdr->frame_control)) - { - return LSD_ONESHOT_CONTINUE; - } + //for LSD only tods if (ieee80211_is_data_qos(hdr->frame_control)) { @@ -212,15 +228,15 @@ int tls_lsd_recv(u8 *buf, u16 data_len) frm_len = data_len; } - tods = ieee80211_has_tods(hdr->frame_control); + //tods = ieee80211_has_tods(hdr->frame_control); SrcMac = ieee80211_get_SA(hdr); - if(memcmp(multicast, lsd_dst_addr, 3)) + if(memcmp(multicast, lsd_dst_addr, 3) && hdr->duration_id) { return LSD_ONESHOT_CONTINUE; } - switch(lsd_state) + switch(lsd_state[tods]) { case 0: if ((frm_len < 60) || (frm_len > 86)) @@ -228,24 +244,26 @@ int tls_lsd_recv(u8 *buf, u16 data_len) return LSD_ONESHOT_CONTINUE; } - if(is_zero_ether_addr(lsd_src_mac)) + if(is_zero_ether_addr(lsd_src_mac[tods])) { - memcpy(lsd_src_mac, SrcMac, 6); - lsd_head_cnt[0] = lsd_head_cnt[1] = 0; - lsd_sync_cnt = 0; - lsd_last_seq[0] = lsd_last_seq[1] = 0; - lsd_temp_lock = 0; - memset(lsd_head, 0, sizeof(lsd_head)); + memcpy(lsd_src_mac[tods], SrcMac, 6); + lsd_head_cnt[tods] = 0; + lsd_head_bw20[tods] = 0; + lsd_sync_cnt[tods] = 0; + lsd_last_seq[tods] = 0; + lsd_temp_lock[tods] = 0; + memset(lsd_head[tods], 0, sizeof(lsd_head)/LSD_SRC_CNT); } else { - if(memcmp(lsd_src_mac, SrcMac, 6)) + if(memcmp(lsd_src_mac[tods], SrcMac, 6)) { - memcpy(lsd_src_mac, SrcMac, 6); - lsd_head_cnt[0] = lsd_head_cnt[1] = 0; - lsd_sync_cnt = 0; - lsd_last_seq[0] = lsd_last_seq[1] = 0; - memset(lsd_head, 0, sizeof(lsd_head)); + memcpy(lsd_src_mac[tods], SrcMac, 6); + lsd_head_cnt[tods] = 0; + lsd_head_bw20[tods] = 0; + lsd_sync_cnt[tods] = 0; + lsd_last_seq[tods] = 0; + memset(lsd_head[tods], 0, sizeof(lsd_head)/LSD_SRC_CNT); }else{ if(lsd_printf) lsd_printf("tods:%d,%d,"MACSTR"\n", tods, frm_len, MAC2STR(SrcMac)); @@ -265,22 +283,27 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(((lsd_head[tods][lsd_head_cnt[tods]]+1) != lsd_head[tods][lsd_head_cnt[tods]-1]) && ((lsd_head[tods][lsd_head_cnt[tods]]-3) != lsd_head[tods][lsd_head_cnt[tods]-1])) { - lsd_temp_lock = 0; + lsd_temp_lock[tods] = 0; lsd_head_cnt[tods] = 0; + lsd_head_bw20[tods] = 0; lsd_head[tods][0] = frm_len; }else{ - lsd_temp_lock = 1; + lsd_temp_lock[tods] = 1; } } lsd_head_cnt[tods] ++; + if(0 == (hdr->duration_id&0x01)) + { + lsd_head_bw20[tods] ++; + } if(lsd_head_cnt[tods] >= 4) { - lsd_sync_cnt ++; + lsd_sync_cnt[tods] ++; lsd_head_cnt[tods] = 0; } - if(lsd_sync_cnt >= 1) + if(lsd_sync_cnt[tods] >= 1) { guide_len = lsd_head[tods][0]; for(i=1; i<=3; i++) @@ -288,28 +311,48 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(guide_len > lsd_head[tods][i]) guide_len = lsd_head[tods][i]; //È¡³öͬ²½Í·ÖÐ×îСֵ } - lsd_state = 1; //ͬ²½Íê³É, Ëø¶¨Ô´MACºÍÐŵÀ - lsd_data_datum = guide_len - LSD_GUIDE_DATUM + LSD_DATA_OFFSET; //»ñÈ¡µ½»ù×¼³¤¶È + lsd_state[tods] = 1; //ͬ²½Íê³É, Ëø¶¨Ô´MACºÍÐŵÀ + lsd_data_datum[tods] = guide_len - LSD_GUIDE_DATUM + LSD_DATA_OFFSET; //»ñÈ¡µ½»ù×¼³¤¶È if(lsd_printf) lsd_printf("lsd lock:%d\n", lsd_data_datum); - - printf("SRC MAC:%02X:%02X:%02X:%02X:%02X:%02X\n", - lsd_src_mac[0],lsd_src_mac[1],lsd_src_mac[2],lsd_src_mac[3],lsd_src_mac[4],lsd_src_mac[5]); - return LSD_ONESHOT_CHAN_LOCKED; + if (lsd_printf) + lsd_printf("SRC MAC:%02X:%02X:%02X:%02X:%02X:%02X\n", + lsd_src_mac[tods][0],lsd_src_mac[tods][1],lsd_src_mac[tods][2],lsd_src_mac[tods][3],lsd_src_mac[tods][4],lsd_src_mac[tods][5]); + if(lsd_head_bw20[tods] >= 4) + { + lsd_head_bw20[tods] = 0; + if (lsd_lock_chan_cnt == 1) + { + lsd_lock_chan_cnt = 2; + return LSD_ONESHOT_CHAN_LOCKED_BW20; + } + } + else + { + if (lsd_lock_chan_cnt == 1) + { + lsd_lock_chan_cnt = 2; + return LSD_ONESHOT_CHAN_LOCKED_BW40; + } + } } - if(lsd_temp_lock == 1) + if(lsd_temp_lock[tods] == 1) { - return LSD_ONESHOT_CHAN_TEMP_LOCKED; + if (lsd_lock_chan_cnt == 0) + { + lsd_lock_chan_cnt = 1; + return LSD_ONESHOT_CHAN_TEMP_LOCKED; + } } break; case 1: - if((frm_len >= 1024) || (frm_len < lsd_data_datum)) + if((frm_len >= 1024) || (frm_len < lsd_data_datum[tods])) { return LSD_ONESHOT_CONTINUE; } - if(memcmp(lsd_src_mac, SrcMac, 6)) + if(memcmp(lsd_src_mac[tods], SrcMac, 6)) { return LSD_ONESHOT_CONTINUE; } @@ -327,7 +370,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) lsd_last_num[tods] = multicast[5]; } - lsd_byte[tods][lsd_byte_cnt[tods]] = frm_len - lsd_data_datum; + lsd_byte[tods][lsd_byte_cnt[tods]] = frm_len - lsd_data_datum[tods]; if((lsd_byte_cnt[tods]==0) && (lsd_byte[tods][0]>=256)) { lsd_byte_cnt[tods] = 0; @@ -361,16 +404,16 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(data_coding.crc == (u8)crcValue) { if(lsd_printf) - lsd_printf("%d\n", data_coding.seq); + lsd_printf("[%d]%d\n", tods, data_coding.seq); lsd_data->data[data_coding.seq<<1] = data_coding.data1; lsd_data->used[data_coding.seq<<1] = 1; - lsd_data_cnt ++; + lsd_data_cnt[tods] ++; lsd_data->data[(data_coding.seq<<1)+1] = data_coding.data2; lsd_data->used[(data_coding.seq<<1)+1] = 1; - lsd_data_cnt ++; - if(lsd_data_cnt >= LSD_DATA_MAX) + lsd_data_cnt[tods] ++; + if(lsd_data_cnt[tods] >= LSD_DATA_MAX) { - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_ERR; } @@ -386,7 +429,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) ssidLen = lsd_data->data[2]; if((ssidLen > 32) || (pwdLen > 64)) { - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_ERR; } @@ -395,7 +438,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } @@ -406,7 +449,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } @@ -418,7 +461,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("totalLen:%d, ssidLen:%d, pwdLen:%d, err\n", totalLen, ssidLen, pwdLen); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } @@ -428,7 +471,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("ssidLen:%d, pwdLen:%d, err\n", ssidLen, pwdLen); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } @@ -437,12 +480,12 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("ssidLen:%d, pwdLen:%d, err\n", ssidLen, pwdLen); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } - if(lsd_data_cnt >= totalLen + 2) + if(lsd_data_cnt[tods] >= totalLen + 2) { if(lsd_printf) lsd_printf("get all\n"); @@ -452,7 +495,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) if(lsd_printf) lsd_printf("totalCrc err\n"); - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_CONTINUE; } @@ -464,7 +507,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) lsd_param->user_len = totalLen - 2; if(lsd_param->user_len > 128) { - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_ERR; } @@ -477,17 +520,17 @@ int tls_lsd_recv(u8 *buf, u16 data_len) bssidCrc = lsd_data->data[3]; if(pwdLen > 0) { - memcpy(lsd_param->pwd, &lsd_data->data[4], pwdLen); - memcpy(lsd_param->ssid, &lsd_data->data[5+pwdLen], ssidLen); + memcpy(&lsd_param->pwd, &lsd_data->data[4], pwdLen); + memcpy(&lsd_param->ssid, &lsd_data->data[5+pwdLen], ssidLen); ssidCrc = lsd_data->data[5+ssidLen+pwdLen]; lsd_param->user_len = totalLen - pwdLen - ssidLen - 5; if(lsd_param->user_len > 128) { - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_ERR; } - memcpy(lsd_param->user_data, &lsd_data->data[6+ssidLen+pwdLen], lsd_param->user_len); + memcpy(&lsd_param->user_data, &lsd_data->data[6+ssidLen+pwdLen], lsd_param->user_len); } else { @@ -496,7 +539,7 @@ int tls_lsd_recv(u8 *buf, u16 data_len) lsd_param->user_len = totalLen - ssidLen - 4; if(lsd_param->user_len > 128) { - lsd_data_cnt = 0; + lsd_data_cnt[tods] = 0; memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); return LSD_ONESHOT_ERR; } @@ -569,8 +612,11 @@ int tls_lsd_recv(u8 *buf, u16 data_len) { if(lsd_printf) lsd_printf("pwdCrc err\n"); - lsd_data_cnt = 0; - memset((u8 *)lsd_data, 0, sizeof(struct lsd_data_t)); + memset((u8 *)&lsd_data->data[4], 0, pwdLen); + memset((u8 *)&lsd_data->used[4], 0, pwdLen); + lsd_data->used[1] = 0; + lsd_data->data[1] = 0; + lsd_data_cnt[tods] = lsd_data_cnt[tods] - pwdLen; memset(lsd_param->pwd, 0, 65); return LSD_ONESHOT_CONTINUE; } @@ -634,18 +680,20 @@ void tls_lsd_init(u8 *scanBss) memset(lsd_head, 0, sizeof(lsd_head)); memset(lsd_byte, 0, sizeof(lsd_byte)); - memset(lsd_src_mac, 0, 6); + memset(lsd_src_mac, 0, sizeof(lsd_src_mac)); memset(lsd_last_num, 0, sizeof(lsd_last_num)); - lsd_temp_lock = 0; - lsd_state = 0; - lsd_data_datum = 0; + memset(lsd_temp_lock, 0, sizeof(lsd_temp_lock)); + memset(lsd_state, 0, sizeof(lsd_state)); + memset(lsd_data_datum, 0, sizeof(lsd_data_datum)); + memset(lsd_head_bw20, 0, sizeof(lsd_head_bw20)); memset(lsd_head_cnt, 0, sizeof(lsd_head_cnt)); memset(lsd_byte_cnt, 0, sizeof(lsd_byte_cnt)); - lsd_sync_cnt = 0; - lsd_data_cnt = 0; + memset(lsd_sync_cnt, 0, sizeof(lsd_sync_cnt)); + memset(lsd_data_cnt, 0, sizeof(lsd_data_cnt)); memset(lsd_last_seq, 0, sizeof(lsd_last_seq)); lsd_scan_bss = scanBss; + lsd_lock_chan_cnt = 0; if(lsd_printf) lsd_printf("tls_lsd_init\n"); diff --git a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h index 1ed1850..09358db 100644 --- a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h +++ b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_oneshot_lsd.h @@ -24,11 +24,14 @@ typedef enum LSD_ONESHOT_CHAN_TEMP_LOCKED = 1, - LSD_ONESHOT_CHAN_LOCKED = 2, + LSD_ONESHOT_CHAN_LOCKED_BW20 = 2, - LSD_ONESHOT_COMPLETE = 3, + LSD_ONESHOT_CHAN_LOCKED_BW40 = 3, + + LSD_ONESHOT_COMPLETE = 4, + + LSD_ONESHOT_ERR = 5 - LSD_ONESHOT_ERR = 4 } lsd_oneshot_status_t; diff --git a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c index bc18f36..46efd49 100644 --- a/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c +++ b/src/W800_SDK_v1.00.10/src/app/oneshotconfig/wm_wifi_oneshot.c @@ -107,6 +107,11 @@ static u8 scanChanErr = 0; static tls_os_sem_t *gWifiRecvSem = NULL; +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL +#define ONESHOT_SPECIAL_DELAY_TIME (8 * HZ) +static u32 g_oneshot_dur_time = 0; +#endif + #endif #if TLS_CONFIG_AP_MODE_ONESHOT @@ -451,7 +456,7 @@ int tls_filter_module_srcmac(u8 *mac){ static void wifi_change_chanel(u32 chanid, u8 bandwidth) { - tls_wl_change_channel_info(chanid, 0);//bandwidth); + tls_wl_change_channel_info(chanid, bandwidth); } #if TLS_CONFIG_UDP_LSD_SPECIAL @@ -489,7 +494,8 @@ static void oneshot_lsd_finish(void) int tls_wifi_lsd_oneshot_special(u8 *data, u16 data_len) { int ret; - + struct ieee80211_hdr *hdr = (struct ieee80211_hdr*)data; + ret = tls_lsd_recv(data, data_len); if(ret == LSD_ONESHOT_ERR) { @@ -501,9 +507,14 @@ int tls_wifi_lsd_oneshot_special(u8 *data, u16 data_len) ONESHOT_DBG("LSD_ONESHOT_CHAN_TEMP_LOCKED:%d\r\n", tls_os_get_time()); tls_oneshot_switch_channel_tim_temp_stop(); } - else if(ret == LSD_ONESHOT_CHAN_LOCKED) + else if(ret == LSD_ONESHOT_CHAN_LOCKED_BW20) { - ONESHOT_DBG("LSD_ONESHOT_CHAN_LOCKED:%d\r\n", tls_os_get_time()); + ONESHOT_DBG("LSD_ONESHOT_CHAN_LOCKED_BW20:%d,%x\r\n", tls_os_get_time(), hdr->duration_id); + tls_oneshot_switch_channel_tim_stop((struct ieee80211_hdr *)data); + } + else if(ret == LSD_ONESHOT_CHAN_LOCKED_BW40) + { + hdr->duration_id |= 0x0001; ////force change to bw40 tls_oneshot_switch_channel_tim_stop((struct ieee80211_hdr *)data); } else if(ret == LSD_ONESHOT_COMPLETE) @@ -554,7 +565,7 @@ int soft_ap_create(void) apinfo.encrypt = 0; /*0:open, 1:wep64, 2:wep128*/ apinfo.channel = 5; /*channel random*/ - /*ip information: ip address?¨º?netmask?¨º?dns*/ + /*ip information: ip address?ê?netmask?ê?dns*/ ipinfo.ip_addr[0] = 192; ipinfo.ip_addr[1] = 168; ipinfo.ip_addr[2] = 1; @@ -695,7 +706,11 @@ void tls_oneshot_callback_start(void) tls_airkiss_start(); #endif -#if TLS_CONFIG_UDP_LSD_SPECIAL +#if TLS_CONFIG_UDP_LSD_SPECIAL +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + tls_wl_plcp_stop(); +#endif + #if LSD_ONESHOT_DEBUG lsd_printf = printf; #endif @@ -1099,6 +1114,10 @@ void tls_oneshot_switch_channel_tim_stop(struct ieee80211_hdr *hdr) ONESHOT_DBG("change to BW20 ch:%d\n", ch); tls_wifi_change_chanel(ch); } + else if(hdr->duration_id == 0) + { + ONESHOT_DBG("special frame!!!!!!!!!!!!!!\n"); + } } void tls_oneshot_switch_channel_tim_temp_stop(void) @@ -1249,6 +1268,9 @@ void tls_oneshot_task_handle(void *arg) void *msg; #if TLS_CONFIG_UDP_ONE_SHOT static int chanCnt = 0; +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + static int chanRepeat = 0; +#endif #endif for(;;) { @@ -1274,6 +1296,10 @@ void tls_oneshot_task_handle(void *arg) tls_oneshot_scan_result_deal(); chanCnt = 0; +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + chanRepeat = 0; + g_oneshot_dur_time = tls_os_get_time(); +#endif wifi_change_chanel(airwifichan[chanCnt], airchantype[chanCnt]); tls_oneshot_callback_start(); @@ -1305,9 +1331,33 @@ void tls_oneshot_task_handle(void *arg) { chanCnt = 0; } +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + if (chanRepeat) { + if((tls_os_get_time() - g_oneshot_dur_time) >= ONESHOT_SPECIAL_DELAY_TIME) + { + ONESHOT_DBG("plcp stop\r\n"); + tls_wl_plcp_stop(); + chanRepeat = 0; + g_oneshot_dur_time = tls_os_get_time(); + } + wifi_change_chanel(airwifichan[chanCnt], 0); + ONESHOT_DBG("@chan:%d,bandwidth:%d,%d\n", airwifichan[chanCnt], 0, tls_os_get_time()); + } + else +#endif + { +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + if((tls_os_get_time() - g_oneshot_dur_time) >= ONESHOT_SPECIAL_DELAY_TIME) + { + ONESHOT_DBG("plcp start\r\n"); + tls_wl_plcp_start(); + chanRepeat = 1; + g_oneshot_dur_time = tls_os_get_time(); + } +#endif wifi_change_chanel(airwifichan[chanCnt], airchantype[chanCnt]); - ONESHOT_DBG("chan:%d,bandwidth:%d\n", airwifichan[chanCnt], airchantype[chanCnt]); + ONESHOT_DBG("chan:%d,bandwidth:%d,%d\n", airwifichan[chanCnt], airchantype[chanCnt], tls_os_get_time()); } #if TLS_CONFIG_AIRKISS_MODE_ONESHOT @@ -1342,6 +1392,9 @@ void tls_oneshot_task_handle(void *arg) case ONESHOT_STOP_CHAN_SWITCH: gchanLock = 1; +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL + tls_wl_plcp_start(); +#endif ONESHOT_DBG("stop channel ch:%d time:%d\n",airwifichan[chanCnt], (tls_os_get_time()-oneshottime)*1000/HZ); if (gWifiSwitchChanTim) { @@ -1357,9 +1410,7 @@ void tls_oneshot_task_handle(void *arg) { tls_os_timer_stop(gWifiRecvTimOut); tls_os_timer_change(gWifiRecvTimOut, TLS_ONESHOT_RECV_TIME); - } - - + } break; case ONESHOT_HANDSHAKE_TIMEOUT: @@ -1520,8 +1571,8 @@ void tls_oneshot_task_create(void) err = tls_os_task_create(NULL, NULL, tls_oneshot_task_handle, NULL, - (void *)OneshotTaskStk, /* ÈÎÎñÕ»µÄÆðʼµØÖ· */ - ONESHOT_TASK_SIZE * sizeof(u32), /* ÈÎÎñÕ»µÄ´óС */ + (void *)OneshotTaskStk, /* ä»»åŠ¡æ ˆçš„èµ·å§‹åœ°å€ */ + ONESHOT_TASK_SIZE * sizeof(u32), /* ä»»åŠ¡æ ˆçš„å¤§å° */ TLS_ONESHOT_TASK_PRIO, 0); if (err != TLS_OS_SUCCESS) @@ -1661,7 +1712,11 @@ int tls_wifi_set_oneshot_flag(u8 flag) else /*udp mode*/ { tls_wifi_set_listen_mode(1); +#if TLS_CONFIG_ONESHOT_DELAY_SPECIAL +#else tls_wl_plcp_start(); +#endif + } tls_wifi_start_oneshot(); } diff --git a/src/W800_SDK_v1.00.10/src/app/ping/ping.c b/src/W800_SDK_v1.00.10/src/app/ping/ping.c index 1966d9d..cef0ff5 100644 --- a/src/W800_SDK_v1.00.10/src/app/ping/ping.c +++ b/src/W800_SDK_v1.00.10/src/app/ping/ping.c @@ -542,7 +542,7 @@ int ping_test_sync(struct ping_param *para) if (ret > 0) { //memset(icmppacket, 0, PACKET_SIZE); - ret = recvfrom(socketid, icmppacket, sizeof(icmppacket), 0, NULL, NULL); + ret = recvfrom(socketid, icmppacket, PACKET_SIZE, 0, NULL, NULL); if (ret > 0) { ret = ping_test_unpack(icmppacket, ret, tls_os_get_time(), NULL); diff --git a/src/W800_SDK_v1.00.10/src/app/web/httpd.c b/src/W800_SDK_v1.00.10/src/app/web/httpd.c index 64b3dce..a019e6a 100644 --- a/src/W800_SDK_v1.00.10/src/app/web/httpd.c +++ b/src/W800_SDK_v1.00.10/src/app/web/httpd.c @@ -84,6 +84,7 @@ #include "lwip/tcp.h" #include "lwip/memp.h" #include "httpd.h" +#include "wm_wifi.h" #include "wm_fwup.h" #include "wm_watchdog.h" #include "wm_params.h" diff --git a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c index 17e4d99..8aaf3d5 100644 --- a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c +++ b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.c @@ -347,7 +347,7 @@ int tls_cmd_scan( enum tls_cmd_mode mode) return CMD_ERR_OK; } -int tls_cmd_scan_by_param( enum tls_cmd_mode mode, u16 channellist, u32 times, u16 switchinterval) +int tls_cmd_scan_by_param( enum tls_cmd_mode mode, u16 channellist, u32 times, u16 switchinterval, u16 scantype) { int ret=0; @@ -365,6 +365,7 @@ int tls_cmd_scan_by_param( enum tls_cmd_mode mode, u16 channellist, u32 times, u tls_wifi_scan_result_cb_register(hostif_wscan_cmplt); /* trigger the scan */ + scan_param.scan_type = scantype; scan_param.scan_chanlist = channellist; scan_param.scan_chinterval = switchinterval; scan_param.scan_times = times; diff --git a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h index ba69734..a7b06fa 100644 --- a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h +++ b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp.h @@ -188,7 +188,7 @@ int tls_cmd_pmtf(void); void tls_cmd_reset_sys(void); int tls_cmd_get_ver( struct tls_cmd_ver_t *ver); int tls_cmd_scan( enum tls_cmd_mode mode); -int tls_cmd_scan_by_param( enum tls_cmd_mode mode, u16 channellist, u32 times, u16 switchinterval); +int tls_cmd_scan_by_param( enum tls_cmd_mode mode, u16 channellist, u32 times, u16 switchinterval, u16 scantype); int tls_cmd_join( enum tls_cmd_mode mode,struct tls_cmd_connect_t *conn); int tls_cmd_disconnect_network(u8 mode); int tls_cmd_get_link_status(struct tls_cmd_link_status_t *lks); diff --git a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c index 3879e7b..e74d8fd 100644 --- a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c +++ b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif.c @@ -2433,7 +2433,7 @@ int wscan_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd, struct tls_hostif *hif = tls_get_hostif(); hif->uart_atcmd_bits &= ~(1 << UART_ATCMD_BIT_WSCAN); - ret = tls_cmd_scan_by_param(cmd->scanparam.mode, cmd->scanparam.chlist, cmd->scanparam.scantimes, cmd->scanparam.switchinterval); + ret = tls_cmd_scan_by_param(cmd->scanparam.mode, cmd->scanparam.chlist, cmd->scanparam.scantimes, cmd->scanparam.switchinterval, cmd->scanparam.scantype); if(ret){ return -ret; } @@ -3800,7 +3800,7 @@ int txg_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd, un if(set_opt){ memcpy(tx_gain, cmd->txg.tx_gain, TX_GAIN_LEN); TLS_DBGPRT_INFO("save tx gain!\r\n"); - tls_set_tx_gain(tx_gain); + return tls_set_tx_gain(tx_gain); }else{ MEMCPY(cmdrsp->txg.tx_gain, tx_gain, TX_GAIN_LEN); } @@ -3867,7 +3867,7 @@ int txg_rate_set_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION tx_gain[cmd->txgr.tx_rate] = cmd->txgr.txr_gain[0]; tx_gain[cmd->txgr.tx_rate+TX_GAIN_LEN/3] = cmd->txgr.txr_gain[1]; tx_gain[cmd->txgr.tx_rate+TX_GAIN_LEN*2/3] = cmd->txgr.txr_gain[2]; - tls_set_tx_gain(tx_gain); + return tls_set_tx_gain(tx_gain); } return 0; } @@ -3890,7 +3890,7 @@ int mac_proc(u8 set_opt, u8 update_flash, union HOSTIF_CMD_PARAMS_UNION *cmd, un return -CMD_ERR_INV_PARAMS; } wpa_supplicant_set_mac(cmd->mac.macaddr); - tls_set_mac_addr(cmd->mac.macaddr); + return tls_set_mac_addr(cmd->mac.macaddr); }else{ u8 *mac = NULL; mac = wpa_supplicant_get_mac(); @@ -7889,9 +7889,16 @@ int at_parse_func(char *at_name, struct tls_atcmd_token_t *tok, union HOSTIF_CMD cmd->scanparam.switchinterval = 0; cmd->scanparam.scantimes = 0; cmd->scanparam.chlist = 0; + cmd->scanparam.scantype = 0; switch(tok->arg_found) { + case 4: + ret = string_to_uint(tok->arg[3], &value); + if(ret) + return -CMD_ERR_INV_PARAMS; + cmd->scanparam.scantype = value; + case 3: ret = string_to_uint(tok->arg[2], &value); if(ret) @@ -7912,6 +7919,7 @@ int at_parse_func(char *at_name, struct tls_atcmd_token_t *tok, union HOSTIF_CMD cmd->scanparam.switchinterval = 0; cmd->scanparam.scantimes = 0; cmd->scanparam.chlist = 0; + cmd->scanparam.scantype = 0; break; } } diff --git a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h index c4191d6..ba70adf 100644 --- a/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h +++ b/src/W800_SDK_v1.00.10/src/app/wm_atcmd/wm_cmdp_hostif_gcc.h @@ -856,9 +856,10 @@ typedef struct HOSTIF_CMD_PARAMS_TXGR{ typedef struct _HOSTIF_CMD_PARAMS_SCANPARAM{ enum tls_cmd_mode mode; - u32 scantimes; + u16 scantimes; u16 chlist; u16 switchinterval; + u16 scantype; }__attribute__((packed))HOSTIF_CMD_PARAMS_SCANPARAM; diff --git a/src/W800_SDK_v1.00.10/src/network/Makefile b/src/W800_SDK_v1.00.10/src/network/Makefile index 8c4c022..3a596d5 100644 --- a/src/W800_SDK_v1.00.10/src/network/Makefile +++ b/src/W800_SDK_v1.00.10/src/network/Makefile @@ -3,8 +3,8 @@ sinclude $(TOP_DIR)/tools/w800/conf.mk ifndef PDIR GEN_LIBS = libnetwork$(LIB_EXT) -COMPONENTS_libnetwork = api2.0.3/liblwipapi$(LIB_EXT) \ - lwip2.0.3/liblwip$(LIB_EXT) +COMPONENTS_libnetwork = api_wm/liblwipapi$(LIB_EXT) \ + lwip2.1.3/liblwip$(LIB_EXT) endif #DEFINES += @@ -13,4 +13,4 @@ sinclude $(TOP_DIR)/tools/w800/rules.mk INCLUDES := $(INCLUDES) -I $(PDIR)include PDIR := ../$(PDIR) -sinclude $(PDIR)Makefile \ No newline at end of file +sinclude $(PDIR)Makefile diff --git a/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h index 996b805..a266768 100644 --- a/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h +++ b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOS.h @@ -407,7 +407,7 @@ #endif #ifndef configCHECK_FOR_STACK_OVERFLOW - #define configCHECK_FOR_STACK_OVERFLOW 0 + #define configCHECK_FOR_STACK_OVERFLOW 1 #endif #ifndef configRECORD_STACK_HIGH_ADDRESS diff --git a/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h index d08c582..f8dbe86 100644 --- a/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h +++ b/src/W800_SDK_v1.00.10/src/os/rtos/include/FreeRTOSConfig.h @@ -112,6 +112,9 @@ to exclude the API function. */ #define configUSE_STATS_FORMATTING_FUNCTIONS (1) #define INCLUDE_xTaskGetCurrentTaskHandle (1) +#define configUSE_APPLICATION_TASK_TAG 1 +#define INCLUDE_xQueueGetMutexHolder 1 + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 #define configUSE_RECURSIVE_MUTEXES 1 diff --git a/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c b/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c index 90fa5e6..7fe1991 100644 --- a/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c +++ b/src/W800_SDK_v1.00.10/src/os/rtos/ports/xt804/port.c @@ -260,11 +260,6 @@ void cpu_intrpt_restore( void ) /*-----------------------------------------------------------*/ -void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName, signed char prio ) -{ - printf("\ntask[%s] priority[%d] stack over flow\n",pcTaskName, prio); - for(;;); -} /* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an implementation of vApplicationGetIdleTaskMemory() to provide the memory that is diff --git a/src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c b/src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c index bde2332..57a602e 100644 --- a/src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c +++ b/src/W800_SDK_v1.00.10/src/os/rtos/source/tasks.c @@ -5597,3 +5597,11 @@ static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, #endif #endif /* if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) */ + +#if ( configCHECK_FOR_STACK_OVERFLOW == 1 ) +void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName ) +{ + printf("\ntask[%s] priority[%d] stack over flow\n",pcTaskName, configMAX_PRIORITIES - (int)(xTask->uxPriority)); + for(;;); +} +#endif /* if ( configCHECK_FOR_STACK_OVERFLOW == 1 )*/ diff --git a/src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c b/src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c index 1075c1d..2c5273c 100644 --- a/src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c +++ b/src/W800_SDK_v1.00.10/src/os/rtos/wm_osal_rtos.c @@ -93,15 +93,18 @@ tls_os_status_t tls_os_task_create(tls_os_task_t *task, xTaskHandle xHandle; BaseType_t xreturn; - pTask = tls_mem_alloc(sizeof(StaticTask_t)); - if(pTask == NULL) - { - return TLS_OS_ERROR; - } - stk_size /= sizeof(StackType_t); if (stk_start) { + pTask = tls_mem_alloc(sizeof(StaticTask_t)); + if(pTask == NULL) + { + return TLS_OS_ERROR; + } + if (task) + { + *task = pTask; + } xHandle = xTaskCreateStatic(entry, name, stk_size, param, configMAX_PRIORITIES - prio, (StackType_t *)stk_start, pTask); xreturn = (xHandle==NULL) ? pdFALSE:pdTRUE; @@ -109,19 +112,25 @@ tls_os_status_t tls_os_task_create(tls_os_task_t *task, else { xreturn = xTaskCreate( entry, name, stk_size, param, - configMAX_PRIORITIES - prio, (TaskHandle_t * const)pTask); + configMAX_PRIORITIES - prio, (TaskHandle_t * const)task); } //printf("configMAX_PRIORITIES - prio:%d\n", configMAX_PRIORITIES - prio); if (xreturn == pdTRUE) { - *task = pTask; os_status = TLS_OS_SUCCESS; } else { - tls_mem_free(pTask); - pTask = NULL; + if (pTask) + { + tls_mem_free(pTask); + pTask = NULL; + } + if (task) + { + *task = NULL; + } os_status = TLS_OS_ERROR; } diff --git a/src/W800_SDK_v1.00.10/tools/w800/conf.mk b/src/W800_SDK_v1.00.10/tools/w800/conf.mk index d1aea7e..9b73dea 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/conf.mk +++ b/src/W800_SDK_v1.00.10/tools/w800/conf.mk @@ -111,12 +111,27 @@ LIB_EXT = .a CCFLAGS := -Wall \ -DTLS_CONFIG_CPU_XT804=1 \ -DGCC_COMPILE=1 \ + -DNO_PERSISTENCE=1 \ + -DUSE_SELECT=1 \ + -DHIGH_PERFORMANCE=1 \ + -DUSE_MBEDTLS=1 \ -mcpu=ck804ef \ $(optimization) \ -std=gnu99 \ -c \ -mhard-float \ - -Wall \ + -fdata-sections \ + -ffunction-sections + +CXXFLAGS := -Wall \ + -DTLS_CONFIG_CPU_XT804=1 \ + -DGCC_COMPILE=1 \ + -mcpu=ck804ef \ + $(optimization) \ + -c \ + -MMD \ + -MP \ + -mhard-float \ -fdata-sections \ -ffunction-sections diff --git a/src/W800_SDK_v1.00.10/tools/w800/inc.mk b/src/W800_SDK_v1.00.10/tools/w800/inc.mk index 07f33a2..9e1841b 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/inc.mk +++ b/src/W800_SDK_v1.00.10/tools/w800/inc.mk @@ -37,8 +37,8 @@ INCLUDES += -I $(TOP_DIR)/src/app/libwebsockets-2.1-stable INCLUDES += -I $(TOP_DIR)/src/app/fatfs INCLUDES += -I $(TOP_DIR)/src/app/mbedtls/include INCLUDES += -I $(TOP_DIR)/src/app/mbedtls/ports -INCLUDES += -I $(TOP_DIR)/src/network/api2.0.3 -INCLUDES += -I $(TOP_DIR)/src/network/lwip2.0.3/include +INCLUDES += -I $(TOP_DIR)/src/network/api_wm +INCLUDES += -I $(TOP_DIR)/src/network/lwip2.1.3/include INCLUDES += -I $(TOP_DIR)/src/os/rtos/include INCLUDES += -I $(TOP_DIR)/src/app/factorycmd diff --git a/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj index ae58613..a8a12d0 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj +++ b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK/W800_SDK.cdkproj @@ -6,45 +6,109 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + @@ -1111,612 +1175,588 @@ - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - - - - - - - - - - - + - + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - + - + - - - - - - - + - + + + + + + + + + @@ -2638,6 +2678,9 @@ + + + @@ -2975,13 +3018,13 @@ - + - + @@ -3004,7 +3047,7 @@ - + @@ -3180,16 +3223,6 @@ - - - - - - - - - - NULL @@ -3289,11 +3322,11 @@ - GCC_COMPILE=1;TLS_CONFIG_CPU_XT804=1;NIMBLE_FTR=1 + GCC_COMPILE=1;TLS_CONFIG_CPU_XT804=1;NIMBLE_FTR=1;NO_PERSISTENCE=1;USE_SELECT=1;HIGH_PERFORMANCE=1;USE_MBEDTLS=1 Optimize more (-O2) Maximum (-g3) - $(CDKPath)/CSKY/MinGW/csky-abiv2-elf-toolchain/csky-elfabiv2/include;$(ProjectPath);$(ProjectPath)/../../../../../../../demo;$(ProjectPath)/../../../../../../../include;$(ProjectPath)/../../../../../../../include/app;$(ProjectPath)/../../../../../../../include/arch/xt804;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_core;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_dsp;$(ProjectPath)/../../../../../../../include/bt;$(ProjectPath)/../../../../../../../include/driver;$(ProjectPath)/../../../../../../../include/net;$(ProjectPath)/../../../../../../../include/os;$(ProjectPath)/../../../../../../../include/platform;$(ProjectPath)/../../../../../../../include/wifi;$(ProjectPath)/../../../../../../../platform/common/params;$(ProjectPath)/../../../../../../../platform/drivers/spi;$(ProjectPath)/../../../../../../../platform/inc;$(ProjectPath)/../../../../../../../platform/sys;$(ProjectPath)/../../../../../../../src/app;$(ProjectPath)/../../../../../../../src/app/bleapp;$(ProjectPath)/../../../../../../../src/app/btapp;$(ProjectPath)/../../../../../../../src/app/cJSON;$(ProjectPath)/../../../../../../../src/app/dhcpserver;$(ProjectPath)/../../../../../../../src/app/dnsserver;$(ProjectPath)/../../../../../../../src/app/fatfs;$(ProjectPath)/../../../../../../../src/app/httpclient;$(ProjectPath)/../../../../../../../src/app/iperf;$(ProjectPath)/../../../../../../../src/app/libcoap/include;$(ProjectPath)/../../../../../../../src/app/libwebsockets-2.1-stable;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSCore;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSPosix;$(ProjectPath)/../../../../../../../src/app/mbedtls/include;$(ProjectPath)/../../../../../../../src/app/mbedtls/include/mbedtls;$(ProjectPath)/../../../../../../../src/app/mbedtls/ports;$(ProjectPath)/../../../../../../../src/app/mqtt;$(ProjectPath)/../../../../../../../src/app/oneshotconfig;$(ProjectPath)/../../../../../../../src/app/ota;$(ProjectPath)/../../../../../../../src/app/ping;$(ProjectPath)/../../../../../../../src/app/polarssl/include;$(ProjectPath)/../../../../../../../src/app/web;$(ProjectPath)/../../../../../../../src/app/wm_atcmd;$(ProjectPath)/../../../../../../../src/bt/blehost/ext/tinycrypt/include;$(ProjectPath)/../../../../../../../src/bt/blehost/ext/tinycrypt/include/tinycrypt;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/include/host;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/mesh/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/mesh/include/mesh;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/mesh/src;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/porting/w800/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gap/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gap/include/services/gap;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gatt/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gatt/include/services/gatt;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/src;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/include/store/config;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/src;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/ram/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/ram/include/store/ram;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/util/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/util/include/host/util;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/include/nimble;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/transport/uart/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/transport/uart/include/transport/uart;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/hal;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/log;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/log_common;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/logcfg;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/mem;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/modlog;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/nimble;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/os;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/stats;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/syscfg;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/sysflash;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/sysinit;$(ProjectPath)/../../../../../../../src/network/api2.0.3;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/apps/httpd;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/apps/snmp;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include/arch;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include/lwip;$(ProjectPath)/../../../../../../../src/os/rtos/include + $(CDKPath)/CSKY/MinGW/csky-abiv2-elf-toolchain/csky-elfabiv2/include;$(ProjectPath);$(ProjectPath)/../../../../../../../demo;$(ProjectPath)/../../../../../../../include;$(ProjectPath)/../../../../../../../include/app;$(ProjectPath)/../../../../../../../include/arch/xt804;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_core;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_dsp;$(ProjectPath)/../../../../../../../include/bt;$(ProjectPath)/../../../../../../../include/driver;$(ProjectPath)/../../../../../../../include/net;$(ProjectPath)/../../../../../../../include/os;$(ProjectPath)/../../../../../../../include/platform;$(ProjectPath)/../../../../../../../include/wifi;$(ProjectPath)/../../../../../../../platform/common/params;$(ProjectPath)/../../../../../../../platform/drivers/spi;$(ProjectPath)/../../../../../../../platform/inc;$(ProjectPath)/../../../../../../../platform/sys;$(ProjectPath)/../../../../../../../src/app;$(ProjectPath)/../../../../../../../src/app/bleapp;$(ProjectPath)/../../../../../../../src/app/btapp;$(ProjectPath)/../../../../../../../src/app/cJSON;$(ProjectPath)/../../../../../../../src/app/dhcpserver;$(ProjectPath)/../../../../../../../src/app/dnsserver;$(ProjectPath)/../../../../../../../src/app/fatfs;$(ProjectPath)/../../../../../../../src/app/httpclient;$(ProjectPath)/../../../../../../../src/app/iperf;$(ProjectPath)/../../../../../../../src/app/libcoap/include;$(ProjectPath)/../../../../../../../src/app/libwebsockets-2.1-stable;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSCore;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSPosix;$(ProjectPath)/../../../../../../../src/app/mbedtls/include;$(ProjectPath)/../../../../../../../src/app/mbedtls/include/mbedtls;$(ProjectPath)/../../../../../../../src/app/mbedtls/ports;$(ProjectPath)/../../../../../../../src/app/mqtt;$(ProjectPath)/../../../../../../../src/app/oneshotconfig;$(ProjectPath)/../../../../../../../src/app/ota;$(ProjectPath)/../../../../../../../src/app/ping;$(ProjectPath)/../../../../../../../src/app/polarssl/include;$(ProjectPath)/../../../../../../../src/app/web;$(ProjectPath)/../../../../../../../src/app/wm_atcmd;$(ProjectPath)/../../../../../../../src/bt/blehost/ext/tinycrypt/include;$(ProjectPath)/../../../../../../../src/bt/blehost/ext/tinycrypt/include/tinycrypt;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/include/host;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/mesh/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/mesh/include/mesh;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/porting/w800/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gap/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gap/include/services/gap;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gatt/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/services/gatt/include/services/gatt;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/src;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/include/store/config;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/config/src;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/ram/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/store/ram/include/store/ram;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/util/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/host/util/include/host/util;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/include/nimble;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/transport/uart/include;$(ProjectPath)/../../../../../../../src/bt/blehost/nimble/transport/uart/include/transport/uart;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/hal;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/log;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/log_common;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/logcfg;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/mem;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/modlog;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/nimble;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/os;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/stats;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/syscfg;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/sysflash;$(ProjectPath)/../../../../../../../src/bt/blehost/porting/w800/include/sysinit;$(ProjectPath)/../../../../../../../src/network/api_wm;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/apps/httpd;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/apps/snmp;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/include;$(ProjectPath)/../../../../../../../src/os/rtos/include;$(ProjectPath)/../../../../../../../src/app/POSIX/include;$(ProjectPath)/../../../../../../../src/app/POSIX/FreeRTOS-Plus-POSIX/include;$(ProjectPath)/../../../../../../../src/app/POSIX/FreeRTOS-Plus-POSIX/include/portable -fdata-sections -c no no @@ -3390,4 +3423,14 @@ + + + + + + + + + + diff --git a/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj index c3a14ec..0239750 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj +++ b/src/W800_SDK_v1.00.10/tools/w800/projects/SDK_Project/project/CDK_WS/W800_SDK_BT/W800_SDK_BT.cdkproj @@ -1185,612 +1185,588 @@ - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - - - - - - - - - - - - + - + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - + - + - - - - - - - + - + + + + + + + + + @@ -3616,6 +3592,9 @@ + + + @@ -3953,13 +3932,13 @@ - + - + @@ -3982,7 +3961,7 @@ - + @@ -4151,15 +4130,15 @@ + + + - - - @@ -4269,11 +4248,11 @@ - GCC_COMPILE=1;TLS_CONFIG_CPU_XT804=1 + GCC_COMPILE=1;TLS_CONFIG_CPU_XT804=1;NO_PERSISTENCE=1;USE_SELECT=1;HIGH_PERFORMANCE=1;USE_MBEDTLS=1 Optimize more (-O2) Maximum (-g3) - $(CDKPath)/CSKY/MinGW/csky-abiv2-elf-toolchain/csky-elfabiv2/include;$(ProjectPath);$(ProjectPath)/../../../../../../../demo;$(ProjectPath)/../../../../../../../include;$(ProjectPath)/../../../../../../../include/app;$(ProjectPath)/../../../../../../../include/arch/xt804;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_core;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_dsp;$(ProjectPath)/../../../../../../../include/bt;$(ProjectPath)/../../../../../../../include/driver;$(ProjectPath)/../../../../../../../include/net;$(ProjectPath)/../../../../../../../include/os;$(ProjectPath)/../../../../../../../include/platform;$(ProjectPath)/../../../../../../../include/wifi;$(ProjectPath)/../../../../../../../platform/common/params;$(ProjectPath)/../../../../../../../platform/drivers/spi;$(ProjectPath)/../../../../../../../platform/inc;$(ProjectPath)/../../../../../../../platform/sys;$(ProjectPath)/../../../../../../../src/app;$(ProjectPath)/../../../../../../../src/app/btapp;$(ProjectPath)/../../../../../../../src/app/cJSON;$(ProjectPath)/../../../../../../../src/app/dhcpserver;$(ProjectPath)/../../../../../../../src/app/dnsserver;$(ProjectPath)/../../../../../../../src/app/fatfs;$(ProjectPath)/../../../../../../../src/app/httpclient;$(ProjectPath)/../../../../../../../src/app/iperf;$(ProjectPath)/../../../../../../../src/app/libcoap/include;$(ProjectPath)/../../../../../../../src/app/libwebsockets-2.1-stable;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSCore;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSPosix;$(ProjectPath)/../../../../../../../src/app/mbedtls/include;$(ProjectPath)/../../../../../../../src/app/mbedtls/include/mbedtls;$(ProjectPath)/../../../../../../../src/app/mbedtls/ports;$(ProjectPath)/../../../../../../../src/app/mqtt;$(ProjectPath)/../../../../../../../src/app/oneshotconfig;$(ProjectPath)/../../../../../../../src/app/ota;$(ProjectPath)/../../../../../../../src/app/ping;$(ProjectPath)/../../../../../../../src/app/polarssl/include;$(ProjectPath)/../../../../../../../src/app/web;$(ProjectPath)/../../../../../../../src/app/wm_atcmd;$(ProjectPath)/../../../../../../../src/bt/host/;$(ProjectPath)/../../../../../../../src/bt/host/bta/include;$(ProjectPath)/../../../../../../../src/bt/host/btcore/include;$(ProjectPath)/../../../../../../../src/bt/host/btif/include;$(ProjectPath)/../../../../../../../src/bt/host/embdrv/sbc/decoder/include;$(ProjectPath)/../../../../../../../src/bt/host/embdrv/sbc/encoder/include;$(ProjectPath)/../../../../../../../src/bt/host/gki/common;$(ProjectPath)/../../../../../../../src/bt/host/gki/wm;$(ProjectPath)/../../../../../../../src/bt/host/hci/include;$(ProjectPath)/../../../../../../../src/bt/host/include;$(ProjectPath)/../../../../../../../src/bt/host/main;$(ProjectPath)/../../../../../../../src/bt/host/osi/include;$(ProjectPath)/../../../../../../../src/bt/host/osi/include/socket_utils;$(ProjectPath)/../../../../../../../src/bt/host/stack/;$(ProjectPath)/../../../../../../../src/bt/host/stack/bnep;$(ProjectPath)/../../../../../../../src/bt/host/stack/include;$(ProjectPath)/../../../../../../../src/bt/host/stack/smp;$(ProjectPath)/../../../../../../../src/bt/host/udrv/include;$(ProjectPath)/../../../../../../../src/bt/host/udrv/ulinux;$(ProjectPath)/../../../../../../../src/bt/host/vnd/ble;$(ProjectPath)/../../../../../../../src/bt/host/vnd/include;$(ProjectPath)/../../../../../../../src/network/api2.0.3;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/apps/httpd;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/apps/snmp;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include/arch;$(ProjectPath)/../../../../../../../src/network/lwip2.0.3/include/lwip;$(ProjectPath)/../../../../../../../src/os/rtos/include + $(CDKPath)/CSKY/MinGW/csky-abiv2-elf-toolchain/csky-elfabiv2/include;$(ProjectPath);$(ProjectPath)/../../../../../../../demo;$(ProjectPath)/../../../../../../../include;$(ProjectPath)/../../../../../../../include/app;$(ProjectPath)/../../../../../../../include/arch/xt804;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_core;$(ProjectPath)/../../../../../../../include/arch/xt804/csi_dsp;$(ProjectPath)/../../../../../../../include/bt;$(ProjectPath)/../../../../../../../include/driver;$(ProjectPath)/../../../../../../../include/net;$(ProjectPath)/../../../../../../../include/os;$(ProjectPath)/../../../../../../../include/platform;$(ProjectPath)/../../../../../../../include/wifi;$(ProjectPath)/../../../../../../../platform/common/params;$(ProjectPath)/../../../../../../../platform/drivers/spi;$(ProjectPath)/../../../../../../../platform/inc;$(ProjectPath)/../../../../../../../platform/sys;$(ProjectPath)/../../../../../../../src/app;$(ProjectPath)/../../../../../../../src/app/btapp;$(ProjectPath)/../../../../../../../src/app/cJSON;$(ProjectPath)/../../../../../../../src/app/dhcpserver;$(ProjectPath)/../../../../../../../src/app/dnsserver;$(ProjectPath)/../../../../../../../src/app/fatfs;$(ProjectPath)/../../../../../../../src/app/httpclient;$(ProjectPath)/../../../../../../../src/app/iperf;$(ProjectPath)/../../../../../../../src/app/libcoap/include;$(ProjectPath)/../../../../../../../src/app/libwebsockets-2.1-stable;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSCore;$(ProjectPath)/../../../../../../../src/app/mDNS/mDNSPosix;$(ProjectPath)/../../../../../../../src/app/mbedtls/include;$(ProjectPath)/../../../../../../../src/app/mbedtls/include/mbedtls;$(ProjectPath)/../../../../../../../src/app/mbedtls/ports;$(ProjectPath)/../../../../../../../src/app/mqtt;$(ProjectPath)/../../../../../../../src/app/oneshotconfig;$(ProjectPath)/../../../../../../../src/app/ota;$(ProjectPath)/../../../../../../../src/app/ping;$(ProjectPath)/../../../../../../../src/app/polarssl/include;$(ProjectPath)/../../../../../../../src/app/web;$(ProjectPath)/../../../../../../../src/app/wm_atcmd;$(ProjectPath)/../../../../../../../src/bt/host/;$(ProjectPath)/../../../../../../../src/bt/host/bta/include;$(ProjectPath)/../../../../../../../src/bt/host/btcore/include;$(ProjectPath)/../../../../../../../src/bt/host/btif/include;$(ProjectPath)/../../../../../../../src/bt/host/embdrv/sbc/decoder/include;$(ProjectPath)/../../../../../../../src/bt/host/embdrv/sbc/encoder/include;$(ProjectPath)/../../../../../../../src/bt/host/gki/common;$(ProjectPath)/../../../../../../../src/bt/host/gki/wm;$(ProjectPath)/../../../../../../../src/bt/host/hci/include;$(ProjectPath)/../../../../../../../src/bt/host/include;$(ProjectPath)/../../../../../../../src/bt/host/main;$(ProjectPath)/../../../../../../../src/bt/host/osi/include;$(ProjectPath)/../../../../../../../src/bt/host/osi/include/socket_utils;$(ProjectPath)/../../../../../../../src/bt/host/stack/;$(ProjectPath)/../../../../../../../src/bt/host/stack/bnep;$(ProjectPath)/../../../../../../../src/bt/host/stack/include;$(ProjectPath)/../../../../../../../src/bt/host/stack/smp;$(ProjectPath)/../../../../../../../src/bt/host/udrv/include;$(ProjectPath)/../../../../../../../src/bt/host/udrv/ulinux;$(ProjectPath)/../../../../../../../src/bt/host/vnd/ble;$(ProjectPath)/../../../../../../../src/bt/host/vnd/include;$(ProjectPath)/../../../../../../../src/network/api_wm;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/apps/httpd;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/apps/snmp;$(ProjectPath)/../../../../../../../src/network/lwip2.1.3/include;$(ProjectPath)/../../../../../../../src/os/rtos/include;$(ProjectPath)/../../../../../../../src/app/POSIX/include;$(ProjectPath)/../../../../../../../src/app/POSIX/FreeRTOS-Plus-POSIX/include;$(ProjectPath)/../../../../../../../src/app/POSIX/FreeRTOS-Plus-POSIX/include/portable -fdata-sections -c no no diff --git a/src/W800_SDK_v1.00.10/tools/w800/rules.mk b/src/W800_SDK_v1.00.10/tools/w800/rules.mk index f8faa80..a569ff3 100644 --- a/src/W800_SDK_v1.00.10/tools/w800/rules.mk +++ b/src/W800_SDK_v1.00.10/tools/w800/rules.mk @@ -18,14 +18,16 @@ ASRCS ?= $(wildcard *.S) subdir_path := $(subst $(abspath $(TOP_DIR))/,,$(shell pwd)) +CURRENT_DIR := $(notdir $(shell pwd)) + SUBDIRS ?= $(patsubst %/,%,$(dir $(wildcard */Makefile))) -OBJS := $(CSRCS:%.c=$(OBJODIR)/$(subdir_path)/%.o) \ - $(ASRCS:%.S=$(OBJODIR)/$(subdir_path)/%.o) \ - $(CPPSRCS:%.cpp=$(OBJODIR)/$(subdir_path)/%.o) +OBJS := $(CSRCS:%.c=$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o) \ + $(ASRCS:%.S=$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o) \ + $(CPPSRCS:%.cpp=$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o) -OBJS-DEPS := $(patsubst %.c, $(OBJODIR)/$(subdir_path)/%.o.d, $(CSRCS)) -OBJS-CPPDEPS := $(patsubst %.cpp, $(OBJODIR)/$(subdir_path)/%.o.d, $(CPPSRCS)) +OBJS-DEPS := $(patsubst %.c, $(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o.d, $(CSRCS)) +OBJS-CPPDEPS := $(patsubst %.cpp, $(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o.d, $(CPPSRCS)) OLIBS := $(GEN_LIBS:%=$(LIBODIR)/%) @@ -197,15 +199,15 @@ endif endif endif -$(OBJODIR)/$(subdir_path)/%.o: %.c +$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o: %.c @mkdir -p $(OBJODIR)/$(subdir_path) - $(CC) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) $(INCLUDES) $(CMACRO) -c "$<" -o "$@" -MMD -MD -MF "$(@:$(OBJODIR)/$(subdir_path)/%.o=$(OBJODIR)/$(subdir_path)/%.o.d)" -MT "$(@)" + $(CC) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) $(INCLUDES) $(CMACRO) -c "$<" -o "$@" -MMD -MD -MF "$(@:$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o=$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o.d)" -MT "$(@)" -$(OBJODIR)/$(subdir_path)/%.o: %.cpp +$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o: %.cpp @mkdir -p $(OBJODIR)/$(subdir_path) - $(CPP) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CFLAGS)) $(COPTS_$(*F)) $(INCLUDES) $(CMACRO) -c "$<" -o "$@" -MMD -MD -MF "$(@:$(OBJODIR)/$(subdir_path)/%.o=$(OBJODIR)/$(subdir_path)/%.o.d)" -MT "$(@)" + $(CPP) $(if $(findstring $<,$(DSRCS)),$(DFLAGS),$(CXXFLAGS)) $(COPTS_$(*F)) $(INCLUDES) $(CMACRO) -c "$<" -o "$@" -MMD -MD -MF "$(@:$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o=$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o.d)" -MT "$(@)" -$(OBJODIR)/$(subdir_path)/%.o: %.S +$(OBJODIR)/$(subdir_path)/$(CURRENT_DIR)_%.o: %.S @mkdir -p $(OBJODIR)/$(subdir_path) $(ASM) $(ASMFLAGS) $(INCLUDES) $(CMACRO) -c "$<" -o "$@" From a5f923bb8143341afb0dc2a02e40271a92caf76a Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 19 Feb 2023 17:05:13 +0100 Subject: [PATCH 4/5] Continued working on the altimeter app --- .../lv_port_win_codeblocks/LittlevGL.layout | 663 +++++++++--------- .../lv_port_win_codeblocks/altimeter_screen.h | 7 + .../lv_port_win_codeblocks/main.c | 2 +- .../lv_port_win_codeblocks/watch_face.c | 2 +- .../lv_port_win_codeblocks/watch_face.h | 2 +- 5 files changed, 353 insertions(+), 323 deletions(-) diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout b/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout index 15b6f74..60bf636 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/LittlevGL.layout @@ -2,152 +2,9 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -155,14 +12,9 @@ - + - - - - - - + @@ -170,115 +22,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -286,54 +67,30 @@ - + - + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -341,29 +98,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -375,9 +242,55 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -385,19 +298,9 @@ - + - - - - - - - - - - - + @@ -405,9 +308,59 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -415,14 +368,84 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h index c560192..ce6e373 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/altimeter_screen.h @@ -23,9 +23,14 @@ typedef struct MinMaxValue char value_unit_text[20]; } MinMaxValue_t; +typedef void(*MeasurementCb_t)(float * const temperature, float * const pressure, float * const altitude); + typedef struct AltimeterScreen { + MeasurementCb_t measurementCb; + lv_obj_t *display; + lv_timer_t *measurementUpdateTimer; MainValue_t mainValue; MinMaxValue_t minValue; MinMaxValue_t maxValue; @@ -37,6 +42,8 @@ void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen); void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen); +void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb); + void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen); #endif //ALTIMETER_SCREEN_H diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c index 4f1613b..17826ea 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/main.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/main.c @@ -88,7 +88,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi compass_screen_init(&compassScreen); settings_screen_init(&settingsScreen); - watch_face_register_cb(&watchFace, &(date_time_cb)); + watch_face_register_date_time_cb(&watchFace, &(date_time_cb)); watch_face_create(&watchFace); lv_scr_load(watchFace.display); diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c index be57ba4..99ccb08 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.c @@ -106,7 +106,7 @@ void watch_face_init(WatchFace_t * const watchFace) memset(watchFace, 0, sizeof(WatchFace_t)); } -void watch_face_register_cb(WatchFace_t * const watchFace, DateTimeCb_t dateTimeCb) +void watch_face_register_date_time_cb(WatchFace_t * const watchFace, DateTimeCb_t dateTimeCb) { if(!watchFace) { diff --git a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.h b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.h index ea1c599..8693a7d 100644 --- a/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.h +++ b/src/lvgl_win_sim/lv_port_win_codeblocks/watch_face.h @@ -47,7 +47,7 @@ typedef struct WatchFace void watch_face_init(WatchFace_t * const watchFace); /* Registers a call back function to retrieve the time and date */ -void watch_face_register_cb(WatchFace_t * const watchFace, DateTimeCb_t DateTimeCb); +void watch_face_register_date_time_cb(WatchFace_t * const watchFace, DateTimeCb_t DateTimeCb); /* Builds the watch face graphically */ void watch_face_create(WatchFace_t * const watchFace); From d2e15ac1774cae46ace6b583bfeaaf0aa85f57a4 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 19 Feb 2023 17:05:58 +0100 Subject: [PATCH 5/5] Minor changes --- .../watch_peripherals/watch_peripherals.c | 1 - src/W800_SDK_v1.00.10/app/gfx/gfx_task.c | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c b/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c index 2ccd709..bc45d1c 100644 --- a/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c +++ b/src/W800_SDK_v1.00.10/app/app_drivers/watch_peripherals/watch_peripherals.c @@ -13,7 +13,6 @@ static uint8_t _vibration_motor_timer_id = WM_TIMER_ID_INVALID; static void vibration_motor_timer_irq_cb(void *p) { (void)p; - //tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0); tls_pwm_stop(VIBRATION_MOTOR_PWM_CHANNEL); tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING); tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0); diff --git a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c index 8d90103..9cac928 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c +++ b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c @@ -156,12 +156,6 @@ void gfx_task(void *param) lv_scr_load(watchFace.display); - /* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */ - watch_peripherals_init(27); - /* Make the first battery voltage reading here */ - uint16_t battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV); - battery_percentage = battery_voltage_to_percentage(battery_voltage); - /* Let's init the I2C interface */ i2c_init(I2C_SDA, I2C_SCL, 100000); @@ -265,6 +259,13 @@ void gfx_task(void *param) else APP_LOG_INFO("BMA456 set pin conf failed"); + /* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */ + watch_peripherals_init(27); + /* Make the first battery voltage reading here */ + uint16_t battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV); + battery_percentage = battery_voltage_to_percentage(battery_voltage); + watch_face_set_battery_indicator(&watchFace, battery_percentage); + /* Once we are done with the initializing steps we don't forget to turn the backlight on ! */ setBrightness(persistency_get_settings()->display.brightness);

      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�?e^WUq{v7Mq+ zUd|?bx%|s*X{Od~Uh_diKgZ9l%c_|ixTtwBUqOnWWjgV`>OBb_`dBY^wlcJK`c(aQ zK)R7m^6B!v;&*mVp6NNxJj5QMZQe{jx5}lS4SuG-ZRu9??1y}8m}>!(v}N{d}!&vbu_P5v41#}$M;F^NhCNsJiMN?|ISSaf-Mdq zE4c9XpVKY2u9-#m1p0%w6YU~?w-P)Y4wlC>;+TNHkU&Aip%{`&7pne|Iqa`xcHDKJ zzJmy;wc6h{53|ND{(SS_nwRi8|GWSW znd?K-`J5)+0Jsl$aX2O#?x%tPj>}#@?DMk^h->an;y)>BI$SdDq2BrMBfZm)_Ru$3 zEzQ1vUYBkEbl+`2%!%LqR@ZLYW7h2T*LLfDEBnH~RoqwFq5t)JOx|9S-E243zZfRo zbuu8N6lG2>g*~W{i%Z!eAdoPF`>Ykm{vWf}U;4Li69@U5{Zl`Qa@3Fi+`c9K&;I-D zO-_yLGI{emsaF)(H8tIN?OysxM2xrTQ4)qRJoy~JL2C1TCX;i`z`F}Hyn&J@+VIi?*bj>Y8iqi?6I z{F4^M+#_7=jd<-@zVn7WdF4Zg;&#$pDmYiY$aHST%Q&$T@LP=qgmu&TtY>N$Od~BC z*RCIJQ}^uoHo4|>h4eS{2Hd=b+bAYZd5OC*EQ8u(uRJ90p+Brex7fPC()Pck$2z|I z#oPR(awiU81@AScRNBj#pmkyHQrR5FO(Mqb{+`;kq>%CbRF8#a0NyR>T-;E z{$Y8s+O!0{d0xWr72XNe_~a(>zz^+h>0jX=7v=orE?F+Bs5r)x?-u?b)l6CeZc_@j z-S65%J%i*lkft!$O92}!3OV^kcCanp$_Df#qEJ63oyP;v3_Wr&qEROmyZRj`v* zcUQNE_wr>^-3f2JT%$Tmn@(##sl@J!;7u+g`h_|0|H{nv>m54}pL;M+G4UdQq}uGo zx6vNFf&YtmE{88B_w24+d&kY21kN4sCJ_VF9{)+jZCI}ZVLK8P;3d*Oe$?0i=kwCz zheU1AVQK+bbN@8O1?xI{hGinmxiKy`4Y>d>W~a!DX_XwxkW7Tbcb!mLo3oGHwqOdy zCX8zoPg500Mr|QQ6m%&%0r1iwc|CbWLTC`kFrI7O*K+E16U$p zKq10GCsCBycxxF&1+-wyDNh;tKCQ6KPQv2EE-*J~wO+I{u#{jDh|IZ|h<}=fkR!w7 zc{dJl89CS#1uH(yIvA&sp$K!Ob5yP98Z5SoaPibEXjG`fcet0HkU&8$iFKEwAvS!o zb3U?Fp5APQww7*3UvH&=>@y;w*-JgiQA7eF#sb%8nWtg4?lEM|?L)uz;^wGNLZAp| zN)N`I2o4yCRc*nfoztd*AhV89!Bk|aq&WP}?Y9y9DUSRWuhz-*%PH}*Z9*FEw5vvI zng}vZ4&>TsZB@=6V>mdPwQ;T2dEi;g6m7G#gb0V`S3oZO2l z_+u-=pmN4?ySk;0b-&pXA-i&q;52S=jGTB!qPw_<;3wV`V**7f6m@x_kLR6xP-<$} zQN;7>`kW~jC=tv;{wU>>V$x#ly%{8l1A`t3A$Vh4hSBTNb6fRaB6lr68{^eKS25c} z?2qw)TPTt3rDAhT1u+^nKpMJl+wC{e{Y+5__vDCdghnThQq?3>Y+1LdNyWEs!3(N@gsqmgd*Zss*1gQnF#uAGNXEriJ z>2gn<<_7qOvLNA>8Rt3025XHD(5_v{n<-OXEJQw!UEW%9(_#l!7;r_oP4!JaGFPTI zLvK1a;hm?KpW~auxf-{NigJcTNE0qKVB8VkH%~CIuk+(opeZIo7|` z9E&U-f-zuYSJqtI5*vW%OO%6>6!D>~fl!ZOl{f_f_5?lLLLY$WOD3pNC*tBL!np;W z>fA5U=D!=aWdR_bq}mDt7lj}WyBQ zJc(mic7xSZkO!uOS)fcC@MTnRvLS)36`vo)%h_eraS=v~QF7wPB|s?&s|=!NRz$Jx z)XdLc-M9J3$vEb3DS7RolG`O1sDoUSn|GT`+jn5CB_K)0L^5{2CZ94gGJSGJ3Fm(Q zZEV36A;7)0bhdynInZm7(lTcTC9d9VeXi_oc86}{w&rI(^(+qlnZtx#!h@YGPC^%Q z1q;Pait$}u!!g7jLQ6QlY|(|U%n1LTN&KOC99fiiZ3f7_T`%HyzrJ^gOUZlv`*adR zu`vdF22s?EDTslHm|u$T0|!D#zNIVxyG9U;- z5LOfcQtyfnimx2G-8*|e`@79rgcZ?+oe>7J2DrWy=nt%&YRXjl7~{O2UPN9(f4REK z`^opq>fl@*7+mn8%UqDL82f%Ou5+I2DfH*1KlL*{ZgwjmVAzyx##8HHkKme&DlLVS z?RE9&bHcZ5q_Lif4wKq2A>1=HrfZHCe7u1mso0V1)18wfXS$%x|R>GV5B5G9dEQ z7|M)Fg`0-cqU;gtc%ebfN_FQjwE6Ul`+=bMlunf#G92aur*NgtKvRlaBq%6l=cV!Y z3x2oYTNt4hc^)JH44-qOFd`7yXef)!Ki7xI9d7$eb0@M!JtoZ@NA|$%DZ9( z7*2d4v|B5{ZFh#%tEA9vWV5^InBb))$ZN|*Pz*xP1o+?k?X69H29|DSZemSdnI8v5 zm7a7rtn1KV9kKK=HeQLP^I^qh_=${UT8Qd2V~`L~gSlmE$KX@x#=3^YoK5OdCl!7? zlE9P=heUg9g%iUQKDt;^QzvaF8Tb#U^dma(FNP~*?enB==0OmbPJH^*h zVh?EwdmS3i@h6l_Gq5faD;2f|Mf^b5Le(LSyR!M?v^px>E_KLbZ(Bw{AkvDohx6cC3F?{W%x*OdAg`thdlfq6 zX$wY)K1uB{6N?0xW+lgzr+F2xKW4{rvNE$;J(a{Q_zD5B=VOb7$i_89dSS)O5|*i3}Q}cnG$N-uO#3#7}m%7q)bk; zQiMFf_(GtT=$Rx=1!I+x7hzEKmH9GX`LT+;`43g9mbH-S}|pC zoDR@CEmg#9T?_sV!OFNufi-kc%UlAzCE&Aay0g+6bczt zG&x=3TF8GEhOQuDJX>R>A^g%W#bG+N0y9sd4Df_;Ma((~+gL-=hM)F+DjE2AECC{` z;s=Y1#GE1#NXWMIX`H>8bV?2YBMEQ@2#jgI#)ZglrJ-K30=TUU_2W#I0W(p=+N-Hc zYtm~FH4##-DCPgN{4)Qyi>iY4~+KFX8#Zn+40AV}ejE8ia zhp{P~10F%3V7vtwv63%H8?wY-a^y5>oovv+@eT ziHc`p7STXhJI%rjiV&Ap%{`(^DWIm&qDe|(5GqzUN{+0>%6_{L59#xNO@fOH{^zLB z)vfREi&0OwhH8zH6uLolD)J7?A(4r)Dj2Cx{~jFQHbBO;2nm9oi-PFjfHn4>P+Gy% zChFanQEh!ir2=q8STM$ldn3c&6Qp`?4J6Egitp*O;uh5DbR!uo}~ji>|7`EMY)Z5Fb;8tl^jXC)(y!oAzq6+ zCi>eX<~7vMrsvLN?nMaAv`UOeAb=UQauM#eh&YVqAo!GIZj%O_f*yyfyfgtZ=7c&& zN_MuYlwnhwp^>3DG0OY~Pr5<}1(qQgtPGe)?mKNN{~`b)V%=2Z$GV3(k5Fa{5*Tb) zCu_xc?Z&N@Y?qf#vBF*pm)0i0u_s4C}*{%R7+VErTMC*^_-2I zo=U+~3~Clz2@%tad!p`597P%5X0bY3G)MA4EM$$sPuz`yD5#DR8V(s#zau*=t5I)q z-hTv?3I$=TJq5514@2`+k~_*0`3*0~r+#4BH6hC8mJf`!7!1a(Yv@!Ku(p@-I?Rf@ zeN^DK?YpKW#vMtQYUV5)QhVe|xl~LN0;`r;;E+20jzcOKN$Mm)U?PrHoaii&fk<5% zxqK5*YHW=Q%YT+irSC(kKDdaDcqu+>@+7S%o2dQ^Dx(7jM%iPK!6b8Ej_H(#>Jbw{sd5pNXvu) zd#^4xp7vsdbj9SO&HM7bMx^W5immbYDF6a2%*9 zh;!`rA_&0OWRf^OM*Wmf8-iSC2q(4{QBWYEFk5Ov5|oM;bRJRslu(a(OJSds6$`@r z9TSC$mB>?zpqjzu)b!?avlsXn3lu69g8md*#3f`8ZHMZGB_v}$Tx^d(c*i!;kU?Wh z&|c9M&coG;6fDyL?5~l4@UCbOfpIIi+^r}lZ^1BlZ(gU8Wc-frASjnHYNjI30Zt($ zxFe0nT#3JDZwVt;OP!bTjA1D-zT?zU8O;<6ahB<}m?_tHlwoq8uR6~Kw^LXSiouq0 z57Mp#nMFwDl@@wGg)dqJ>TLspv=##xAh-evGL$upuaN@~Nu}1&+8=*gx|K)Yz+fE0 zz(=`GVleRwP8EBIFOfl<~d0!AWKkR zb1P37`H!=~EnG`xI*&TF6$ymBgifdstX)`lrI{cw6R{GCEW*G~wJ`xo z7Pvb}`Uwbi6plRQPi^8cZjqu96#zm?M0h($`Xcg^*mG)U%vOt@4{aSe5gE%ClD9-1 zkAcm%A|^S#1%ZhJSE!X5dWm#V+KG%Fcc2>~ctgZw9ArhMSZPso5{tn`D?Bf6i8~(0 zrp$sQE8|WmDXA8A^GdkKmTxgGk;CJ>b%-&`=6Em+MygOs4$c6cBb-zxq+gr<#vX<| zauF_&+ZJL=3BeBDDjxW85YNgacwp_i8FP`Gw3JvFpU0S-Tk>rrG7Tdy6|0dDz1#Mk zr5{^yUdr-8VdbD0@yYiK)Z%nWCxncQB;|s;u6nw%nLG_=U`g#RY5UPxDPq)B|(0@Q+;!ea9| z(1@oPbE4JLQsvQ~oCuiAX95e(yat052M;zx_qelLtaj8+pz@)AmUO(HuE)+ zf@mqXjg)B=tsogXVA z5^@g}nXMT}K_w45lH!sbeSpTKxTb}u6w0o+0PsAKGv_vIn`C2iN(}vwDpWj`;)0DV zAcrz3h1Qn9;0>A7!H-hiHc&uCA9ZQ&M_Ycf-a28b-WhJ#>ms>PEH0p)2g zo+2rLQV=*w3RlnuCQMWshcoV}WBXQ<4I{SK7Rf=3B9!-y<(`;vKq6+WY>QNrwb^ld zP4!q990J6pN-?3)aqx`KX$igW&{woEi|=_55BQWe)r$7`~g5w5g8ExfC3PK<2;$U3(SBE_Z)rn z4L9&D+(7h7ZTbZhI4>LuPg6Ql_UjJ{+?d?A8K%HRdZ4myTQ&w`payQFwtb65kjcKE zf`xBnw`Gf_)KrxoC54C(gaBX)0ET9uW`GEQhtNJm2To&uNo`|5BH&!abX&5OBgEtV zyU70QZ)<5qMN?pr#mUyuFwwNt;Z zt$%|3t-G&Z{{GtgEB>duPk;LUxz7uK+<)!v_zLmy zxsQ_D4Vcn64(TkvzQ^xhXWjd{O-4>iq?x8~#hQkNxPT{(VC6+*^;5@cY^krM)~PDW zr79~+sflswlr)}WFbv?7yb2>)6^;GouFvM)x0j^7izreacz~Q!rHb<+lU7Bl;cZb@ zC$i=#r8*P`38=2jD#B_vRfYjkJKygBJgsTZJ`7v0u9J;CyzWX~4PPvAns4>~J1_-c zJi(!KC>MK5ecE1Xo{^Ebbu-+OoW&zZ-mBh(k2Q8XlwEqAe#RQhIb(6MpJzDn$@o7a ztaEi+#gXtVPHg!bo269Oq8B5U=_56TDr)Ge*sHe;skth1SawpS@KqRbBX0YP8N<4W z0fyC08I(ejAMV08hp|&1Rkd&2wLPgsj+LZNQ=6-|hWv*$9lWVq8D58eFg-O;TK4dt z`ZjMB7D=5vB|?8`>=)(KlOVq1Mc%7~zpZK4-d}6nv-Z}pYNZs92H7M$dCBT;M4XaZ z;MrZyS4VnJh1XKP!OT5+7kVHU%2DO^hh zrMZD_*vW75m!imTIyF8i6)sk2*y5FEtGkAQIPizmFyC;0u{8ubl>W8nG{c1qPsKrk z$Ta{|Nn%(RM=8gW#eu0!Q0%WyW=%e$1t&cLhVWy{%lkvE`tw=qC-%iQhn{3P;wI-f zHezUWwL$61v++i@q?4@Wzg`ZJ6rwi)Mj!ICO!wq7ocFPP>bdwn%h%j{72*zoI?R~-AQSr<=X2aBa*vcYm9M;IBl zY;A(5Y-*BthqAP7s)_yadld7S71xB^BI0nphwj zpQn5aIy7^h!^um-$QEO|LT|3F%Bx^yxM6Owf#MX(jN#u>jmvW|DTWbA21#}TLJF_^ zb%bkzy4=i!;eL$0EM-h&CBW>8hrHF@f7bZvXkYQY{H?Ta`Kg>yMiTt|WjM4&0Hu{R zJdl?`4`qI*#UzG5yxF&13?VOkmh7pRHDmQwuqZ>!C%(AaS=+^watl|-)m72An0}SO zFOio)Q)M z#!vy8Pt@2VxD_=x?Yl~b16mdr14+lul3+5(#f)=}%df2~&MqpFy=n24${VS}%5#YZ zc2lnAK^Rvv5nzqTlDbMV!VG^*U_)9>0D|^oe>gK?$-2sa(uyIK-NPWLDw7+PzB<)& zF{7Y3GnB_SbmiiCKH7W@>kMugB~Z29L$upg!2oB*=g+1G1?wZq$j=CrQ9XVp0F zaHpWSGlR(-YkHY)d9qiM-IhqTSYCcejDm*D++pK$p`4Fd`B82qeJc7&M<-lv#_9**m(uG zyxqYYj_O3F+%80T8-!}Vk-1#Kp^&55=*E@mij089#+awhU@v$JN; zj1($xe%<42a zHd?nXJ|(y(D?D@htOlW@anJzG=NM-l_+njB#mqm3ew7%+SA+mK{=%vR&6U}*#`v2r zaQO_Yf)5C2eLB}&9p-?~NMp=p-mP)wF$WsyJ%G+QS05|1lsrHje~w?h8=76^sFQxo zuxqW;$@VH*o%mTPZ5BMgc3G|tzYEG;I;L*-wb$8u_N6q1p-%o0j7OgIZqV{zRc<(p zb8$w{Q|Mcm%35!-CoUf@HuzMn)m}(aeRowrXKyObUf0$tiCkS>B!$-ZMI1L9<`#(>iz0UbnSILrp~SXeD`C$nkEK&#lIZ@SbeRWh8c9Q|gCGCCFb>z|+ zb)Df#k|MN$*txMGWoK>UywU7)%bQrZIlC zx74vmOWIX@{xhs}Z=MlbtUh9q~Gxh^7nNtYF$Lx;xsj&lrlwFwNzC!f4Q*m@kweTym>sI?TJLi}>1m645 zF3!b@{;x_rM}?I>)@HppY_X%~b$00$zW!tPT}WP3D0S?wJx7+U<~#XaG=Gx1j9JN* zS>wtuUo}hiMnVtAt1fNcGjkgtTyn@F9d9wj^^r zv+FPE*jZktI=6IJ6>wizd04FdC{F6zpeJbxCl49o)xI=^-^I8juaecwI%%4dI;6I@ z{NCkLSw$D~N~4qebiOZ%dDD2E^xH}?T#+o>oW>n!o9goV!b%pijNqX<5ur|5+me-3 zPi1Z8mScC&TgLcSR%#r(O6sKAUQUQztAtwyvSr<7oHg#fg2((7&nHbbQ!CWZ)=9Nk z4L$qP`jIYHf7Tg14T3h4;2$O%dUMDqwLSRBJ%Ya3ykBu3UheSI5h(z}2THnKzJSw;%GY zc!V}K)#6dSvDLM?5mB`jS7=*s1BYQ}B)K^Ib>5n_*XOaYWv&YwxO`PTf5TCkAK)8G zR(O_*3agUq&Msr@7JoDN27gwR-18JXz^HTG1W*XuSAO<+J7BlOtCXkzZiS}`JZr7Y zaa@Fqf15JcQT6RL{$2THZn)HD(yWy{9I3>nmwxXKdES!XXu7bgO^s%fM8T1{ISs6+NJf`s@`kR zx%RVH=^|CyxdDs1)pspZf_q#&JLfKs(e%(Wt*&V7L(eNwFDZ*QVHH_T~~Np6wv`K!;t)T3T*y2h6N*Ea_up#fG~ zk$Ie)%I?;%j;HY-tqrF9lw~@UR;~GTJMGGLofn_;{QuQ@4J)AeO61qGlI8ucLSJjt zuk_eOB`q3i`Jvrc)hQ6@TF(;TLbJ@k5z0_UZ=J@t*u3KT6)+skAElgGSIWt+rgVl| zC@Kve6SUR&3{EQlI-a!j(FAA-}uFUQxF?pN227l=5orCo6RTShRd|+P1*s z&yOOZ2GUXO)|MuYr6#a$X>7|spN6|%a{!E7={Tok6{c47)V%dg=#eF47hX!LKZ&fh z7A31kg62?yBdO$RIt6NFGxJir&8#8vt)6-;v48m`G*ej$%A-1@Edc#W)tX zlq#J6sRAOVGRjh}P!*r2a@L^?+620l0jwsE?ca9P&}vPM(hyzvpU2PJTkGkF`%2-N zTYAUlpZQ`i=|{hg8dcTstVz$h=2e`z@S@(02R|!RowF}n7M4`1y6}B>>8J81yst}C z<1mfwO2s+9hDSUA(VjQTKBvicLyGM|{^UI2w6Sp(eR%qrBI>h^1UdR}y0Ig!TCq>|kh2VcjI zs-}MVG-gs!&=FlGrE}oV&{6-qP@O!QRmxUj!#Ryp>MqVAUip_l@{ncS&aqXeaovKd z`6qg$Ni3TFiJAbdLR6nR7F}0wjVnV#7rK>H316!`-~7!UJ7WqBdEZ`ER;pxu3t1iX zn+#-PQ>*5c?&8IX6PEip1x#7@I}VhScf+_8r8NdV71q}yE+Hh;AU0qwL4J_R`>!ID|6^%~iihB2NB3()M^iBsh ziMM*ue|iz$r4Mnjm5ZvpVAnVfyv~BZmNBI-LDQ^LdC#!p6@VF)C%rNd3;^+$&wRJ!`&rsaI;T zyphk(a_YUdnRy$`REPQQMUacV017!}ws_EZ|6Hh=AE5V7@Ahp!dG&I}HD860rz@-` zNmsi}orU_j>!oy~`p^F9eBP!`Q||dHA=*CE8k%3bW?~Iwz1m5h^RoRTDmlOh4EfoR z>t5I6Q7$;i2Za)C)EVsE-?rTkK6Avaz0QuIWCM=CS&ry;(cSE!x9x?V|CzERY6Kk} z`)*C5M9VEu3&En`;5f?%U+)j$eSJ7s!xCp{}4iAtl<*gW~la#~DY9VnqryOE0HU_L>L*SYlB@dDe6;)0&>!Y}?X zi1&MU=66%8L(Rn+E{;GgKL0~4om{sjx_5^FFI2Y zHM%C2ROeoyc;ekGwL(1y-XnB(6|SqZKNlN$RY&)yVSdKG-EP)Ub3>Q$RIL5>vX7Ru z6^t>)mYd+sDy;r~hfYd9hPjQDyKT0<3RahR z-K+Do#w**f;Gg;$9E%I`plGLO%0Ek+f^}%U^>ex%W7Vk%I;Gw{c}lr-VvcN7e6cE0 ziGNlr)iv~CzhALc4zAtM=lg@S2re?qDlF^KkBZ0N9pm?0)T2IJ5zS|ek)#Xd-=wRD z=l&M%4tL%Cq4q{#@o^pg();`<&(Ray$mq1vWu4dHO0V9tH0mG5Hx{+&%v$ajUpluM z=P9GCWSD9Y=+#-m?+Qhp&AGSt-1@pf|7ht{xpCduYoj=Ad4^o z#67?E#(#SpJEQ5rM55M|v+P)6|05Fa39cleKF~t3TiC7f*|%b?4N(}3>NN|-WuH~D zctNOIHr9Sfxx9RA5-hR#^h}XsuNZO`-I}?v_0qOq? z^>y`~s70SzxYRRmx1cOXuc-UlEIqP&b#6Ttol^hXl32OuuT@By%=cTkwgc{uAk#ix zNiQ73XNsFphF`t)Rf7jxPJdR|oLc52wHB{S7V`#<<&&Z$T=vDu-wgH!z zYgbZ*tIh1sJiNg-;(8Z`>LaXN%N;8=VQZgOsP}N7XH%50`kp`2qNSQfd%FUvOp_Yk zisV@ED!c7x^plqSk3cRQ8vp*+sNofMd%){L<%hE;yJ5Yp(u z>WmLpm-fQRN3v2sMQ5R?Hv?o$t4_z))ivmvuAx4|S(x3VW6M}-qi5?`SNHryqH@3W z-;unP6yfYRd*bWlm;I|yP+q>Ferc60@$XSbJK-2IWo<*Q;IHt1OnY)l6i7bCa5(H zm~96)$4o#d2BKTwaniu0K!dHn5t@212G||+<~#%lXDgzXk6Eww%DCkQ@IWM<=2sce z%_$EH2n|->lQITdOVZ7R2gb!_PjlP>dM%SaTEm3r>CY_%o&p-+z-dK9U0f=Oh zN{6rSx;ZtK0A{$lO-zb}*hD2{N-^6-?{2#k3QRdLa1gh>v|=&RqLl)#=#}(6d=uCE zUW)3ACZ*9CL*}_@Dc!97J98smxZ}G+8D_dI`A7|5UnJNR^`o>3e7;KS9+>@Uc1z0A zoJmW4hbJxz=v?r-RSF)D-Ck!pi4IT{L%!o>G=cBddQ%H6-pqVuHw+<7cCyZ^q$pv)ats?_z+Ac-c@guV#(-Wl*LwIwv%&qj(@hqBTcyaft$?Sc0; zMP|y9=qkbp0#XrnbUn6y2wBcqL=_F@5;+)H3&_Co&?cO^L4^YpXW^nw6z4qPd9_!m znCUl9F~%oHht3Kc6e(d3qR;X~Y%kOpiIfC8P3Yd*PMn(D*NBqQ7AArtL$7Iv@rcb1 zeHD(zoXW)+_!cpOMJ4&3Gc=3wm1PeK1zF*m09HV$zsd}Rh$3#L9b{u8Ay<=ozY{yP z-lvOK*uZ&+QhbVYiE}~4+%wcuv+cDViDMgAxPn|x1J92`gSW*hPRm0Hg`+~JO%G7i z#l@2?QRc6hfq!KGD0*Kg&I)?~gNb@05E9i|Mi==k6HtazL-U2BC}%Alt;BlK;t3nH zDI2OOP=cwbayxnSx29l|bBX2zxk#DqKdsh6p1{I~D>RmV!^tXmn=H;I2y8+^q11qA zuQ~8Y-D$Viv8|4@q!-APO9YU4_8Sd}5?cFv^c>4`wJE&4j_udB(o^Tn+4=8fqf9&` zyqpaNqLR(Kkk>;Or_1!$1$e8c1u6oJ~YlL!AU^ z!IUKfKmRcwFMQ%OHs4_!t~M$+;*5Xy1))T?0_1naBG$i?*{yi@(^?rLl%yM&4~0WL zxPOo_l#F|9$2K#knL^2&1P`FKnzYEAj5YKN7>KT^&w?{g8AaN_G=-U(M5Q?)F0o3H zY-=F~uS4Ihy5x|xoLa&54J3_h?<#W7%<&cOIwswMbx-T=(D{AfBL<2{ip46w7f#!n z1~D%rMX#+6wymTl`DW8aPmJk;SI$0$-U+yZP&f{%tXGK}5uu<45yh{2g5#8|EtI|M zf+ku=EetvAU2|u-GVyby_P-@*=)tlX-Y&}z$E6>bg3_>dgUX+0R}k> zvdAq|nw&h;Z;TWS6uR;jvF0cSC<%^JKP$||!5ZP6z>fl%3p#l@O{|>j>C}j)(Ir}A zDjz8FF_21q_y7(K+f9$17*HWLA;RotNuo>Z(?A5ObKkQ5i1LI!DW+M3|Tad*&p z%Uf9YEkT$LhP99gWIPpI0h3%eQD6)jbGZaq=`j%_MTA4~^IYUpI+>YFkYKZ*!*$Do zx2BAcC|9K!YOaIZC#4N67S#FjGOU;_+YF@zVbdxh;AFkVf)X}kf}->OaJ@dd4NwTO$IxZuYFZI8wNY&gpdXmosyLaU)0O@xEV>|_|2bQ3pCRCMdMbmQ;2Ei zLo*Ig+hUIpNH;Z67gWh+O;C`zm?)eu)>fg+gXMS{UNSc6%z~BNaSy^1;w<@rI{N6I5+=5@;Ido)A_z+OQ0=zU#O1j{1T9XbLwG-c&IdM?73TfjS0gH(* z?t2gX!fkeF$>s@9&%uE2-l(j_O_X;R=4QIV=AO)gl-yhK^pw$Wwk9+K*Fa1-J~Z#I zY(s4;^yJfm7ZOTJmQ;{P4=5_;uMN-#yITo{1F?D%fMm&8C*o<}MeiL`3d&%!LZ^nz z;1QUNI?Wa_lP+o!lL z7my>j13!oU7KqMroc%4Ju08x%e7k7N(Xg_YT2eIODHszb1fn# z!D%0t50L}_bkf!OWxfVL-*60JNn4t1#g!FXFwLey()aRI=yO>i1WKCW650)N1wt@6 za$L#<;(d1Ox^*mm>QMMEOE!x}4%zq$94tyb1`BbrC@$R!26?kBc+vyO$uF~LT2$sy&0BzL}DJ+f3HSTx-p1L za_G_e7=G8NF*!rZ%EwNHlN%~76bzu|3YB+X4VAUzLN>*TTkLTX6Nok&9!afHeKRH_ zgHZ-fd+Tl;k3?6?8Kd41oNZ>oI&@RMPnTw2dy9@YiwME)6en653j&i{ zHG*o$DWCecm=;$eN#mXK8&Cv-5lS3CHCR9P`@0n%Pz2#Q$t5PSYPP{=VERYa^@z~AY!noP}UNRgeC%{p$xT4+OMbEDvqT9#7vX_j*0+9`EuQ(;>#Fr z;wu~X#%B!5p<2fIVdmT$u)8o@-(`Z^@h8$$sXv|;^Sk%rYeG-l33VHS5->nfaLryO zswQ7T`CUTp2Yv+~#Dbwg<^a*Qnqw%`G@QPKbG+Erx5zgpEQbyLG!e7WTrS~F+x1tdbLbOn2qtQ53_Pen;M zc+yLff5@D`=)ULo-f^ynqxvAlJLbliMlm$!z!uJ%%=a*l(g^wzs_zUWN@RkWE*NBN zdyuMoh(jU??<&_rP>oVjt_d_uNK8;1;zERTE3`qZq>%L{sr69wj`vfCVU(#iauf6* zjdRE}C$JUL?|R;;Eb*Yo29aNCLdKI0xn8gvTM!v(7J2PBDakkIr_C|J|Le_}4lS_> z9Tq1eqb28&h<$%Uads3^6Q}3cc*X!O`1T>CvB;^&7xO=7!ubutbQp(K8r1+Nk_Kg(^KmY)t0$IWUp-I`Qkolu#~SQVCeXUx-td|WawJ<@JKx~twWdKtC5;m%A)QNCA7jRQ$*GW8 zDz!=`HjB*ygW?87&&ZHbS1mKxGlqS-uf52(Le#|- z$RxMDp{d{S4vtSmxbSZa6tre?)QF5Yp8A&ZJ)8}Uf8p_9`lZF|~Mz*Zt+{lp6g9zGFPPr76C`SXX@!kg4k5U9ewa4A( zeV_OSSGu&gEszLUny#-rHd+Ak9G2+0F<3|l0h%7r_Y?klBqpNx zt|a#u;DZ(1aCZt+4sIuUz7~&OO?~#*S$+5%$MC9vyA2Y9nP~==_OChn$NhQbh6Y-E!kJ#%CE1E>36xE2h-fYw;!u>6 zaFDh4dFgDbDHu<80a0cX=E72|fm#fB38N5F{q*0CA(=?MP{&d}Iyfgw%;#gmKlR%bnE}ktxL#Lhmu$;&mSf2pmW} z*ZRsuLxXI~(F&B`4VcMLM6J$PJ@k$5%x<3p8+W-BDYloK9)V>D^mcT$FV?oVfT+Q> zbloBmt$~;Vg}L)2-LT*7JsVdn_y0c=xlh%zkFUnql>XN@Riep4A(?XOvxU-BLrxSW zu(1|fwzypHRK^Q2F`BQ|B;b3ZPuqP-5 z;Yu|J2CfFPEj7AMz+m-h4X0+ZeU*p2FpCQpwO})){RqMNimwP5wD_q{zUJ{ILPQE| zpawb?PG*QZ&@5px_6=rEn(jaSH2(34L@@#{WHHIs4mdwe)tgOH%{N;gDNSqb*yE4> z`pW!z(zQyuT#`Vx4HRRO`wlW-&_aUKJB2^K`u|5&fy|&tG@WBjJ$tg`7$D;mk8}0pC-;VTCBN{~MIQN^QgDx_!o>P!1S#XXk)?-SSvyr)H#ntEgNl55EU+B&G zdr~0N5D)_ZbpS&%12+IrZ&dv#2%zN?-UPS&fVMz*IF2Fn$WbKuiFp7JE&jE)3FCO< zcw1bO@83Z69Doqb8O;E|0~7&4@GHL-YXJuY2|wZ4JUe119q>Si@Jx)GXaq(u(6*j8 z>l2ZfVE(-VXK;1v5TwMobycIZ(de<1M+vdf+f@;XaQ$@(5lM0V7bi$_nuQZ02y`F~ zCea`R001)sHbVsfO<+W%;$9nDZ@1gNtXrdtfm5#_Fvds_8i7am=4{uNv8~(nJ8MIt zC14QaLInT+*8e0%iVq3gm=n)n{Km?^9rkzC@~?Kf{RPHv`pe^ouYB&FvzL7JcJ6FV z>U^HwS7z)l|FkgI)9yOkq2%ZTs3gEpOjp3(nP#QFVsU` zVahK*KO43hKWEQAm67v}yJqoJMY&CpMieNCjnJub*o=erTw!>k!h~ktZe~S3+Hdx` znzf?u+(%7{?V?Jaodk}{md_*Zw7-HRlREPoxp5o0*BDE=?Pnzo#ex)`N>1+CCPZ8X zn7*?oJ!f`bH}5_hH@6=rGdIT7&B>a`qxKj?N13^ijDi~xnwx9eJ+y7j3$K%`*Q#AKT1&o9c@_1gXkyZ1Q|ibBc`3OQ*w#_h~Bv_nZ4 zjIgH;-dqNFd(o+5APYk72KUnotSWnhN_X{NZ2TjeT#KPcI;~G4%cCy4EW+A1zUu?n#}5mwB+?{lPedPnJDnik6PTm-p zb#nZSZl3-|0`>zdjf-{f61@0Ea$W9?iweYOwQfLrdd_jP^Rkz@Rx9S^?`6`kYm9Ko z<)XFRTy@@%5EA3w-qvl))6Nc`OXdr4#J^ANUhifjT`BGaQ8AZ|%5l4C!MWsacRd5f zM-1I_iW|JaqQY%+s}6^G?Kx!bBeq!W_rbC$Vi8A;+t$=jA)W3c51?C}&z0@Y>9f=B zcJ@GbuD8q?wV2K$aZ+j}*ecyj0M|d@~ zmbKKL+>zFVcM~!3%?Q-FUv6HzfcvyNnY&RY;$m(#fzlYZ06srk>wfoQWC&Lo(HWx% z1-#3ooWLiFSfm$Un``eHzL1+CoS2vnFUC?>7%gHhISEyT;la-yH+%;x_8ueL_TnZ0` ztzFjM8XoWsYi^_Me%?=R>7^}RvT{s43y=5!&JMr!17Fl6uiSKU1u1hO&ujJ*_dxdp z4Z}h4ogKNR@>&$4Noi7t$7$RTc2qgmHRfOB`GTI_*)%RZqEJFvy)sc;j#|~r zNj6kYpXjzTr_M7Fr?!?>Qr$ZR-eY_4s5+gFFxKapV*k@#jg@ceROEd$)+EAh-84Axn(dBIt`Oa6o<0bfJq*%&0&Xz@* z$qnLkU4B=}Hd!H+Is?BhL!X1QXi7GpN4AK4 zNuAz9rsT*CPjnkblH7f{O0E$v2M%XUdfzNpW(~LVL3{f5Uv5*m?{jizA}rW@=KJq9 zE4iKxymuvf{(2vnL@Fut_p6J&yVNsRzga86^q{~?KsjV7CfCBoyAV!5r_a{Y#%NAs z1pkz+PfHT=E2HVy>$Umpz_6{`DVtN27CpL5H)NfwIYvIYey76jK5i40-g`=9htwwM z;)!Tik~h2aZ?^f{*rf$4QvY_6@w0ezj-K~c6c?f*ukRNo9shX+xic?!&7bX>C4zQx zy1d;^Lh62s9twRd#{9nX@3CKkxtovu^vq_fdgNVG(=^jF2+n?XQeE=K-FRFhMZE$) zrdo&SpWPZi2e8ZJLx>bfJ(A$hpq9+jjhauZk`Qmsh62mT^quO)m7Wv_%4-K7PrKLH z3c)#9U8ABY?3{VrP~V^2^TCjkWboWa)$HxA=1NU_{^YA>nVZPV`0ZKxy`{kO?ni7z zcQ#IM+Ckj0#h}q#nRwTj^P9yucW&L(z0MY&EJK0~FP>IOePKBF5!^HOz8YhnmBu^D z&C*Gpw`)ul9SrU@H>wP(L{k4iCvrM!^Qb_~x32>fnrE?@JCSh$QwL(9XxneED)XVU1lTDv9dr;vim649KR89embScs`?2V&8zdX^72`DV=J^p#yu5hYCvtT<1rZPuT@4hZ#%P@ z%A!MxXZth@eE*x(E%ueri}(PE=-j9$w=egX8@dg*I*=XH&zbbc_xoJdMww*v(W~AF zLoTWU#Jb+9H1GHqO!(*WWn^aOLU*~AvZ`_i(%j8{E3B7mI za@0Mno;-YJ*Y8Pew@Ejaz28bZ1WUWtw~v6W9O52sNBR4F(chL`yX3)*;(xBb$)euJCh9ha<~Yy;N3b-=H z^VtXR{&ZUU@xHX<8XYau_NjAhFm{}x%PS2=&}DAiZF0+nmh6iT=q~5->uEjN z5{z*dt8H}lB`>@$uRh{ZAN-HHN4qCkX0I@ILA>v@z2Y^F-q6MZ4k5!1Z$?@a+2?Av z9NoJV@R#S$)7>Ds8$jCG;DWX{AX|QDHz0>k?&AG?}IqrJ3=R@Cg% zZ`a5XDPIh4gttLRbmH0IB#;(f^=ir6z%Ku2*K5vo+=Nce!P71@qG2vvir1UpuPTsw z#3N?5wwx*2N(t+wtJ2d{S5(E(ZAs91Xz%U<^ME@}5N)ERNnxM;++C{CT%Q&!Rv)+3 zHMC|()l=q=X5<<9XfQ$JqN|r`^YVsIG-O2;{LiyB`~c~60KdrRW8YCwQ>MP%Z`4K% zxe#vNLf*!`cC{LXj7-eJSMLM(-?K_hP0g$Rzon-Zp4`%AciJo$Vd}Z$IgPyg(18!S zR=E$5TvRkRsB`I?>Qh>_0+}b5%Q1*|2Rmnk-o3>z{uuW9jJ|gkc8c;|$yhs%LA(&y zb>ypDTdd@U<7-M?0PL!^N{#NVj$@GTMmk6EtI4<5Wf{c0jkR9|Av2K56~I7tL^z7d2WE*zvg%?>+TIoQ`C4{(7Ux8o~m3zWN-z{|DxHD z--Nk-|BuC*@0u&`3Zcq_^XgX!=o)ue=|9YbkE)4Q`Gt)A)BbiySuJ-J$$xI*yv1$8 z9pl{%8z2W0{9A`Pn%Hez@QD za0kFt9<=%P0uQ>(2mQi?W_~trMz)G?*W&7Nt<>NLTo%t#PRc?Dcd2hDnNObFLgM`_@L(5-~o?A+XJ|D3U#*nG&)7H&0D2(T&aDVgc}`!0_VUZn6DaI;u&65xvg-cOdxDQ|5UWpam`b;=&^r0^AXr!rtCmJt-y zQ1`J9s0Q1QIUgANP15nk?Y(i>%87UtsCQFTu}1e2?Jj8+wwgCbpPgmoa-mHfRTbfC z+kfbE!9#=~Pp^Jl6P1Bq?w!Pm?_CQpmEdJrzo!)dg z6!)Lr>a}OH&CG8`+sriILvCz0mhK1#dl$&G>ZXgm-1H>wQ##o+`Pu56Hr{U;_9EZ- z7+w~qt0oY82FrL0g~B;l%>;fv^2HVT0ud;_L2^~ecFTe$68Axp<;K2t_u0Anno3;c zj+h=ZCHPc#*gC}uf4xDX=BcOGq8au@&KA)lCQv+bbL-kskMO!G*i!Ue4g*b%4-$A` z;U1c=_lqaD2LG#3DU)GKfm92~4uWG5+4mb%9#{wVj`HZLZ0uJa3bz^7dzM@xsNe3o`;}7&Ru6e_8!q zuO3$CC;M{g!&y(~yZ5}ItL>#Luc50gXTCaeF5D~3s`k2qo)fqJ?^oG+4`?;39Nta< zPA~rs{&e&;&Ht;#sv>Hb1W|v{qhCg$S~Ohib=PeS>;&WY_eJm8CQ4?g0des*m+85r zyXx$zc1>aG?aW)NN9TW(!=_hrdz7*5{ER5|;{G~4vlQhaiHuG#m)I!rp9$KI(|FhEq>`BdYsqfD#S$&}z` z6uZk{YU{NZ$t&6^e}(p7M=NEcNPok>jn|D(Y(8$DmPM@b4>C)DQgUf^Fm1~{ z`CJvHh|8P0QuN=e80L$JO=%DFdv#zIp4(EtHzh^yQ2tyf$;JLooHHZjLoK38;WgYc zs=K$DONV~vN!N_S!cejC=A>~7q7#i6@m@t#P1(U=Bs%40Y8|H+$4G;ZsYzWeUj`qllpZpU38b|iNk*r$Fp>Jcvm*KFSFqB`T(;i(>& zd&B&=fSzOK@^kC6IdkoEV5ik?SnS_7@PakNPye{a=zehUCN{*#8f=5_|Eh;vw5c~W zLiAwSPj~#_O=n-P2G&bS_)rOi0EceoYQ5VvljTZA??sU(U*VNdr!A0Ey!?Wch`wjr z%~VIX{HbdLI-BTnH1tnj;6d?n=bf!VoyoI~H&VI}MyqyPC;dJ8fy&f7>1PbT?>d-iPJ|NsSMSOTd!NM z=+-^-ziE4IWfd~D?g|w>1sYXFfu-9a2DJnE2i&V)zx1sL zP3sN*ol>=-e2sFSkF4**Tf0{nkv>m_nb!EcpE&+-?1t1ZQBS5}hv>JK+iRdU8xm&H4I^)g?bO|&VC}~TN3Lu>|ea-f>-i1;wC-)K`tK` zb6@yu|3CWsNV@x6W`nQ~Gs({sL3I!`(L-HeA5R`TC8(--d*v5kNaSd+6If za!12IOWaL(D_W%lQN!};PqeIwzf1{`Y;qgj^CI{&PSjRC1?!#Jeyb z;M(k}_-Qv&e_dOn*WH6w9s0;VLalFIH=Tz6Dyq|u1V`l07LQm6yUX<2yo%E2_1gcL zX5Fp#QSEMxZ>5J@XxcoltBR`cZ=Jk=DDc8C80`lNKY{3e|M75S#`gWi11jJ7Q3<~F zs)G%t$;GE+fnqu;6Sg#pl1Ds)r-tj+;U6a}WplCSXUMsNhvXPfyUc9k16RH18@kua z$sW|!TSxu3!j7~8eraL&jaRNDxTC4TeJMKlqHWgRBkTURhYv8tE4;lmaceiX@ed(F zubA<&SI_GsPf&*O&mJq>9;5%hU3W+JN%l2JcBH!XD*o>bALyZiIsjkE6E8~txL z&Tn_lXK}mur=B-=Hv4P#9er&7+Htrr_xD?ni=U%_RbQsA*qSZxA>mBBhcmds9P1lV zO|i+#eqoCG1bfArMJRt{2_Qh}$eOJechcRv4P}V?RQo$SS&!0&en$_3+xHFf2>I^s z&oMtsfsb;1Eo3MqIeYCq3T5lhulF7eo z=TE&_UF*wIwY)XtE3-7|DBFcK-wc}~THg($vG%q{!P0y&)3Mz1%jXL|y<%futWk0X z{<#E&M)z8$39$XPCUsv}Q04&sl9)8S%z3sGm@HZOMc(!WMztpG+oNqeb(rH5zh#!T zQ(zL>|V zUK~ER1u`}r7E-#MUcx(HGdJ_n*=@B(u}MKmyak?<9Yq5K(IQzRiy@K1Ii`QxPWw8c zd{JhR5`-mSmeAVh0-o(acl zqXQLGvuW0o36qmzqxC4kUGXJk&E%P4x8yY)L8|*C+#!wNRhWv2oY)*)N#rKs1b3ge z+nqG@xaOxIQ7(@n*%J~ODnb%Ny~EM*QxDJ^V5C&*+hZnUNqeJSVIDL%7U#-wyeO<) zdM2E?uKX)sGb?u=NhVea ze>p|Q4pB+&C5BMx7CZ(JD28JQ)5@b>z@?w!pI4cgmy_PGQ%gEjc?T?ll3WqMu!VBF znK%<(j-xMs=$*;)WHB(MV1FA4 zGj>po)tGb#532f9%eyxD+XMDEpnNC_NJFU79RR_{5ER%l)@<(#CVJd6N#AMfJxfbmefSQNNN=idS>=~1Ciz2?=_e_ z+NZ?^Vot8X6M*UD>O(S0f$LlDZevaYTTd6!K`Jq~I&Zm{CtFhFnjaX|#PpDoMIj7w zF{Lx>)?5*qLII*zb2Pt~sFfq}4-)vVJnaz;2m=M2C~I=tiF<0RAQD4y?FE{8qvJso z;-w(F32W@!MbBw`s?jD2?8uZ#IrwU<<5JNe*h_?x{+#B(aO3^7gYCm9Yf)rUJ@->_ z8I#x(2QDPpe{1Ggiu^xQqeezbR6|+C+iOR}^`PPL1X6-nvOeSu7Bd95%r@W5h69?_ zEKxLDl1v5_5FirqX-OlSEr+a+Kx294NThvfo;tAg#^p~Kk^0@>8)Mv=jQ>$$nnEF$ zGNQO;NZ3-%@{Ywp(dv#LJVMXxObdGQWgduxpa1gjfUu%I$AeK2XqX(a?zBD6j4#d2z%aQP4`2wvlKe9!6$n83T2E4y4__p3|N~h>8mn^90LkQ5Mp@X z`^IJ89804tPBEeQ%SMz5bW{`q zL@R{+pr_DUo%QI`A$O(%D2^ohB;2ycB zV(BvEScI_f(fWIzU1XsqMw8U}O6!|CO7Yc1$2gcPd{VFUv)1}w((^JgnRL*#;DUlZ&sXdg0 zE+qtrp-j_^v!7!h@9pZ>>v(CNzxsIVDF5qV@pu`A?fpaEN`i%hi;I_Hg9Rq!6D4b2 z0&+R+WNVfAX`4dHvB47w)6NisM9F;e3 z^y8a2UGnrjTK}6siG#3kY10WlxwBPRIKu3NNeaG_Dq#|`88?D*a$Bj z@d}Zync9pXIFOyLHs1faqh zBh3mn36s;{w%8Lc&poZOn=?WRo4>wm9p^fR=%gH+HpbZk+8dC9lIL|42f<71{><%& zocVG#IPG?%tf3%M8MO#YJfRf?k|ti+Tzh88Vt2L=zM#-JUXrNjGVLBUJkS9XPH`n` zpAN-ejbqW+iBXg`^SPBo)n=x-&bd~M+jfF&_O0Be-WWMq8= zJE9(4a>2cG6&taeSkV#1A2Jgl?WK^mib)d<4MN>PG^4Jt>u#}>m}m_VnpwTWa|>n= z1~h>x1yfPj>j`5A4Nh|9SiPQcHQE zBiC0G3CFXMt%iT=o?!QmP7o7IY!Ri9zAj+R9*Oxn&|a5eI}%GK?LKadM`pIAgy7^E zCgEVM3Z*8~Hjs!IFWtZ6qiIGTYS+nV@g#!FPZ)?ZTIUMRy#(zwiDh#>lVg{e@XDgP zYT#Wb;E+7v3R+@Hhwp411zea;g;~6=D0bpJXtl*!lP`fqJ^_W$p~)Fw2XYJ zxKyS8_VsJ~%Vgt>>Es4IjP|v6UV%o*6$>Uca+#u_&gu&oC*AxVEoYGgVB={iz0Ly- zRkUBG&ek1_7ZnZ$8i-F1695crJBG-Qss5h{rw)J%VtTn`Scm8+B!h~Co*G*=9)PC= z%jj0?V{}*McaM<$F`$%BM-a$Kvl4MRk{ElC1w)!szrM@+_PvkSY8lH!1S!KoClp|V zUX;o9j42gn*>EOhN#dPS6w6PIiR)#7k`nFIaxALptiI0r=lv&8Le60R*r#Qr6t{%b?h7c$p;*xkebr?C}2>E{bV9!#buL7!P?wLnZfm#cCrTA$kSQxArJxv znmI_A^pMVqs&$zs@~c~ToUS5808$T(jcF(mDK%JJIpJoOrU|}VvrW$S1xpZup|_Y9 z_SFfP1LMfDyQYgtS(s+(_+-pm&4DJzc!>%!8bqwfQdZe$PJpo8^8@qj=$nG?5xq=6dCmKO=dq@vp>3%#GuH^r=_$49B;Zti62MncsYRIU42pyPN==fC29+;1{ zyNSNx>iUJ$&lvF-*9D}&xYc$X0VPYYcE6P0T!4(M@7&2xIci4FO2pPfdtewFKs{K?dE5 zNm4p*#G2bFyk!ymJ?!>V6Y|g; z6pSOm;FBA0)GDVFF&xxW_w^=V#gKf7@(31tXbuL+lt{KB=DAG=s(IrQB)H~f8P zc%vdB21Vl-oEJdmk^p`6nT)w7{8O!X{PWh9;zUUCj#5NuHO?G^SD3FI0zy*?X%M4n z&W?(&L;nf+p%=+ioSa%5#sI`LShvEt8IvbL=CKuo=p>S#yk(Lvi*TnT6gZR+wVEf& z7Gkl-7+=-noIc>T060@|-O#WHE0_bYz@>q-EUl+W&qnh7q7CZ~8+U{l20pzOlFkl+ zg=+^4NVNn9WtSYCzjP1Ju=D=+x5H2xoYqe~7Rhr<@c=`)NP>+(u3( z&P`|nh@cn|+Mo76LYRW^M}?!&_Sau}`}e$k^~gGU<2Xw;F_D8PlN1t?E!Zc9qUpcu z<9*QCJeZZ_DngiJ!Dl1|5uq$PL%Mgqw`LzZTa~@kV4XMJOzMC9c}~E5geY2`i%KyT z2w8~1u4u3ZpAhxuk8F*ZwdNiP6&<4ak@1c=p7!cO4DP2=Pch3fa(>544h0lrK#7-> z0fU2a>5$ko*p#e9G!f$At%Hw3HSHjeLAQj8C|DdrKMZWbKE@Z*olgAw&WtD_TD=*(wP(cf z;*&^+%WQrSPRH!;;CVbtleOc}juKmtY&Cx424aY-IowK&tEUWKwioF!&_YAem>}Yj zM2IBkB{*9V*jI}u%Z*8kF-W^Ghoit4(KWP5;~ZeE`OZ8`+`MS@hMax3F>%;KKoR0ar|;nk=ii>780l9H1#CRQiYID+T#F@r=|C)R*HKNK{$ zWDV3q%d{-GF1~SBY_Ch4Sacr82*TomDC0`Y?npLEcM<%;3u1m)`6-|HqCk3~B zj~@ZfgrZBTok8jcVAvN@{18M9j0kO+4xd)1V|OViILAyXKr(>GN}geC1Q{hEEv0ap zx~+584HmID_xj4jQ(_w{Ed;*0Z9r#R{|>RNR#VnI7e}YbK|hfvD5Ip}7lu3ooLf;T zfJeIXc?;IyO~QydDa`6YU{qS0)K0jkUx{%84ZE>MB$cs@xfv3fgeSZ!D-RYL8MW3e zzDm;1O&lqnG& zlv|tA98FyQfZM>VK+=<>-K)>37$-5!3O1yHG`;`O)S~&swltE%z2*>n;jvs1BM&TU z7%WFFt#D&>H~r&HUihT9P6RO$0$8F_HXF6Q%vlMTxsI35clB4qyu4I)H#GGX=H9i9y-zBJ2%WX&Eyr6wj(daYDkjO z)iJ&J&w<)Yoe$O*&Bu!K%U-&X#O7^81i_YrDaSiV2UR*527@e`(@Znh8!N^;%FsL{ z7#2N~L+=R~StW)@wN7y<^?d(p0lRtft$PD=Wp$dACoOCgjE<8Q9V9UUp&ek|RmO1_M{f=`{SYRP3}Q1(F*Dk|D{bi9aEr zu=R)`dYZ|xugoj?U$NMST5?2~T!6jr;n1R7nWjTF+rCXEW;|Tso{SwA#ROT;!^#Xw z1rhDYkUMa~WDB#s(d!Pia$|C`AGQ#z#Ahzn;c6Wjq1IDuBxKjBZYKYo>7VH9z4UiJ z&XLt*PO8*fK@nOEI|w$xL`hGSpJUfCn#FtznHIPzhT=N8Qb)*Z)8N)goI!5)>E=|7 z5(uayVd(R?%xnoBB~iphX}QwNi2iuL)Lo?{5yeh(V&g}1^(-XdK`lEqyJYpsUT&|~ z^78*Vb0uuaT6AzQbQMpkQ+k{R($9@N|KOoshAH|#&+MQ7^W$4Rl&-X*Y{}PPyr9Sk z-V$y5v@p}j{tdJ{#9-n*sR#7F4|1PLIuRt^QwsA?%b6lOvUXBQ68oOi@BF_n+Pg-- z4DKyX3|=jcY5&b7sD%{Lf)GsBpeM<6>7C_P72aIE6K_zgV7#g%qT}OI*7?X;YG17t z=tMEh=H^v@tbI#P*IMSlnmW37=l}qK5D)?Y1OP)*1U3L*UQ}AC3IV0Mb1%TmaOG|z z+g;qGl8i|^2T*3l_-7N_I&L+Rx_s~7K=lEDDxx!@000Llz-#c#wYO&A@LcCMwSj%% z;K|Qzcmvx(x$pyZNQx?#S4oh{%RX0C!uk7+Ln@RrXB-&=)?tS7f;W0&`xteiSoYZ0 zzD0-Iuv^}m9Nq15Tpj8}aG(Hy4FJpxz}-O^ZgWZ4a3EV3wyYcNx4OO<0zn)Q1OiqY z9M`v-()RXWW9_+l0TXSmbr1p$^ ze(&cv)70X3<9{jrckNayx7FA_YHPBRVuc4^`)8fq=WhFNK&&dA7|n-<>WKnOgwhlP zvosa)RO@F?H(TpB_QeY9t`bXRERg$t{;jYsydcp^t0qrO*l+2~X6ZV0evudt?r&vs z^NoXGMBpr2;4VA_z_~V|$+&liPg~ow>Wk2HQBDb-xK#Y_(rJ5E>&RMW)QH*~>hr(r z%YQRjr1@$%6q@j}tWkW!jMZ-OKjwf5>oas`db6LIFKWEBdlEwX#LF9ujsO0|B7tH- z-AJe;Zq0XosYB79!SS$Q*gO9%noZC}M*%c8Y`Sd2rx1Gy2ybvZy z)>v_<+AaGV8mhmLIuN5Ih(+y--Z)Lx5+144x2k-09J5Ihu{pvRqglN*?R>NzMXGQ2 zV)rZEWUT+VflTr_2H}C2ZV5GE>*n@WvoyH#R^iiZ@rj#s(gxXz8dzE0dLpS|+^6k}{dVx> zNK8)%FXuIHk2$D}MwoYH1Oj*rTY8h`K7$~i|YdJ2P z5!BbP5tY4`;%}eM<9qmr0!#d^iDmB6j$>fjvOp5hHS3^O83)lXI`&oiI<$RJy_YlR zS;jeB>C&BHRApYda99NmW1F8vLSwlvqVirQ0-!Y^T1x|$Bel06&UFL`-FEC8`{MoI zo;s@8bWJyo(1JYR)8)HW{Kc;(_w1kb?WbaQZ~J&CgeK`(vbIL(h0F%rP+RIA*EEf{ zr(e;Z(#+=Sd1x!MR43Dh6wST>K|sF0t@)@i6p&4Un{-Q5>x935PwcP$bZ5o|nznnj zg!^xZKpQ(5`@h(a0V6keylB9G&p%U`7 z8^$szRTO4Lf!aDtw363L7;h7MM!EMh+;Jtdk_U7Je&dx_4Cdg@Af21s<>K4(Yi8?u zbiFw)ZGMh)c9UOl#OOOyK`N?mdeSh#?fAB+_xFruOrgu4q0*V==L()`QE^9)X zXR+0DJ&-+I4F)f59W$1@V@q$q7Fs?Gx!q!#N2H&C{&yio@Y} zOPK^RL>Y}|X!P}Bvt|5nmKS2CZOB)+{C1jAqUETX3OVNL13QIbaPe z4@DQ3j0M$O>@J^-iv8Bye74@MWIKDg&;%<=@S)l!3i~}=Tx(46Tv)sDyCa!AHZ46x z)j?#t=E}e9TLE}TM;qgzIRLjVU|lnHo$QC;W);uf%G~RI3rZhH-zj%g3`s(y4)DLm zXgOT0*0c5fjy9@b;f&&=U& zJ2lt*s!N*yjSul=D@@OpL9ym%9Ow&l=X|^mn&v|B6z{trFBQwo{5~L-(Q%uOP`umP ze7PE$V7^bd5;e1h_qz`Pf)&t&T0K*@BOeciHuy^U!b5%Ln2E@6zro9Rw=!6M{LMI* zhU?lua=0{h3(|QbgH?7M*3r0Z6`X>6pXDt3I>W@z)a%bPbTc^_y$$=TmAAEfBHf2= zBGBu7&Ag4_(&n0LTD^1(eXP!TU!rC9bu()O$D)&rBQiYV>~7My{jRI|suzdcN(gG2AfV(|#E@-|SJ%stAVgeGhZi8;Z&@?CbZDv)~D{BsxeC4*5i9XZiUY zu1O4+X-QOj76rV;EN$YMGHLFfZJo@QepOnt^zm;WowsI3N1vm`?2Y@Fx8kglT;8F> zp+NXKv{2kliu~5!X*WluJJGKb<#}H&u2l?jQn7CXoM>uPq`{4T_+L4$$9UJZ)%!G! z@(=LQQKEhZWro@d13(b!=WV3aqf`EpZ;j%$iT>2aPpv9`U6iD3e;Ye{p|;gkyX&;y zOSgV~?*I8d18U%#dv_~Oy!lt`e#3H=CSXs)l{SPZa#CD%sNL^C7L284t^8q6qNa*4*mcuSy9KI z&x%H6w6;25XV^=n%~NP|MTy-p0F|O03R2>CbCJKmMn;7*Ya0 zhxkxwnnJcaZOHz@r}fl*T@T`?c&-U_^w&O0TXH3Ppf|3383qCWHPTfBe1Y5klH!4i ztm$r6=Wg6fx9g|$^kTHESs842=bEYAVu-P-Hu4QsSu`LU08>O(pZZ$mx;#ZEmJ1h_ z8*F!8_GM3^G*&99#oZD5UDY6&y3W2(Z!FP;)39L_t+v#{rF3gr!?KP`TYvWW}NydzcEJtEt6UgMFWdSlOC4y{duA`(W?6oWP}loH(Lj*w^;l;{;+za=1J=SO;*XApBz0EOSJk)BIgh|bd5CDmqD z1^G2++4^;VwtH`{E;ngWbG)poBS8}5_icxN|Dnh>dfq%P+j5^0~BwKcVT-x-18q?4rV+ zj74Ib9nNzVSYMMAoyDe}H?_riA@Af!biKyzu$kvKmGk6R_(PXSLr~u@=_2rH??O|g zB)4xziarc2ZgZiKu)9mH+DdYOWL)?@$zw7eD9zX*6$J zC)~B%L4tVsp|B?LGI+$7Eg!m*T0f$S$^PTs^kRvD6IkU#^oo-fJ93x}rrJ zZe0pdMCDh7;oDQ!6n43QhZ1#DG$n4<#O|)TA_oGwz!7kL%YA@Z+h^w?-`3)aBK$4Y zMAX*y(|zNq%<*AoZGq%_TM;u=-gsjQuhc-2C^p5l_QgN>TiX{rYrioIE=obn;f-YQ z{LMl3O*e6A*_Y(8-6%FE&*hUvM?PdyE)rK8Tyw$iiSO@E!4!LFEbbjEiq_Se_h6ND z)L~c)&{E-}$BGbJ+7jXXxjr&XV6^dBciyM~VNLT>{G+Dhy6xZzEerQi5i_UxKxt#o65rWA zW=~;c!tQ(At$5R3WX7o#J-9_scBh`E zv-rk}eQ19aILmRkLY@R;Y=g+9l0wa_VjX)>?d$wi#!Tb+(G$r>AIi!bAU)T&z#j$M zH})B3Bbq(bSpZAjqDs_FnUPTM!vUo0mgr7|dN|v%ozbqFH&=Gv@4uv$(AQjF{c3G3 z_>xK%x)Q{X2l#!J7RRfIR_Xow`SGF2{CkcBp+C?s{7`l-xi-$+U+eGSmC}@Ti$8rfXi4G*w_#FrQa)|iB;WVf-coii z1@q!S=v!l0isvE!d zG25c?%U^fH5(BS!sMoT4ePrgQ5Yei+#APf(>U*=UT#&er>UO?vQ{R&;=ljMYPV}O> zFbE&-ahuQ4f$bhTU*XZC!*LeX4cmGB>e=hrAw^pozro##5%1(`Z1HMCv;#@5gU5)< zXqT;z)lJ+zCqto`Y}UNe9+?`SRMyB$-Bc4^i?0t)&_0nYd_&me03E-gWo#r*&bLla zXW50zJkzD@$}cpY#wdwcVJL3M$1JBK?ylo)uXCTj1&+INA+0!8v;#ZcSPBlql4ZAv`94-KfqqBVBr_y?Zrj)~ z=g`zpW$1Hd2)S6hN)B-GJGm~wUHdvJFw&#)s_MKT9=inElLy?f5P0u2;Eh{>MS;PQ zi@7B!M)AGyqAlWo{Sz@%$V&uwQb;WPs7XJ2jxr%+)wGdIN9^CG63afUyt28aA zkRnX*jQ(=Ol1?>WFZa99|2Uu|Fsz(fOs7o0&c!ic8Trfkzzl8jE2%5LY3b)YlUGl4 zMQJF-ykIx-hY_p5*LE9D-JZrNaxFvAdusC2eWdY&DdRr_`m=qfiM~Xx;!ONVOT@L0 zPb|8Mk-#wE|MrVr?&X*ZBWC0~wN85E3JcxcHbu4IH}8M9-R-}fOP!>;t;!*+oNS`M zllU8Wx)V|_gAm+}p#6kcmYYy`3f%*LFP;b<{Xc&pkr}+!e!pewy`)QDPI=xAC{DTZ zO9iwUjEkZ_uwM2x0}kG_C6x1J@+v4}L)kAtG3HHC%nW{8zs@RDO1*ol6a_)2X}$>m zlkvoL=n4n$LHcD1g*JP5Q7kMjc&qL^mbNOSd@mSM zfOH!eB{@@KnG~giUF4VGCI6ZXNEXsMZ`yB;o)Wdtp2!v%Mf+eme)FqRo)t8a@QPj`uDO-3!| zUG2)Qi@Z#bJN$Dis8aZYFZb;lgUjRlRfF1JRvv^$YMA|gv zrZS+&QEsYncQ`!lltj*OM~_GxEWF(f`?puzkeBL zC0fw=r%rk~CckOa(H{2LZ3re|eHB9v`qqeGX(uJAQs4%{ux;OfyBc4ZSo$Iuxql#( z`fM$UQtTvUn$H9Cj{)57`MdutfIyt!J|`n100+2u$=n;{0VQYx+-T(2F9;d#95MkA zUI6zmdAbQD<6q%qT*Dv)xOmCjYvchsyo~FIme&9EuhGc36UYT8(K4=1G>q$tm%x2a z9>)R?a3PbpcgYOJcmdqtq#ejre*Z!zDyAd+n=S;+( zmvJ4BkiOnMIWABO;E*HWekL1dC>L<#lDJ360$bz;xW&ot8!`frU;%eAIeSUGfF+l} zT|yT7OH6>8gvNDFLgRWTA#vT5khnfd$XrJyWUe=0GIyzhKQuiII!wn65{?@JQIgQ@ zL4aa$P!5(X7vKB2!2N#iPt(=()NcR(jK7E<;^ zyYJl%{Cey`n09ogdCvKKjR6Y~a|0QXta?|S-PJ(p?Em(D_m)gg`%b6%Q&?xzKL}6% za_@>xr`C5UmS9dI&|m|ILOP_8mX5GgS=R)*k$!sSr5y<%QXJ;u3@4!+dnrd!qCjj) zy9i{NeNzL}Q!2!&<1AJXu<10&Q>;}u>Vcj%!Q*(tQIprq)@bUM`lfWr_O$>HDVRwF zz}N05INi8I2uK>4og*P&>Jb+!*RoK|7{qJ1GkVWr!5%VF2n1bTx1Ua(uc4n?o0+Yd zq0QCx(&91d2*tqOIYBgB&|?s6IgE0UPoph|Q1S}Qeg`^U>M>m@)%yRNTSb<388Ebi z6k{Be5=aeZEBsb zTY*+F(&jy2BWv`=n*cRbEG6{$L!?aJ8%a<>ilY$GGshDnyr?XoP<&+a&npoXFe+qk zh;DG0>{OcUe56;#bdEFq37F~Z7uJOgGjFj7t7>WdCkUYs7YS1ypNXP)vM89?s#uyV@a0ZVp`DrlX-jIdB8>Z3; z0F&8MTg$&FgE++v9lVbh!cs)ceUzZWw>twQ<64@29W7jfm9ZQty%_>42DDYY_ONWl zI<&WwWXQj;3Jh|%wIXn|kcF|iZ4qf@o)4np82M-_GC+(pvmnGyK%O9n=aTt@jl_Y( zW$e;8fig^*>@b*1s}4awN<&1)IeZ4^a>(TLs!g2^OTgj>YHy_-Bv)huu1-Okn2=pb z595dr70O}!;i9_0se*tqULw5qXaR6$DB4nqWkC>E*lIMv1-`%Q@-z{cTtJl(jpG5J zLapV2(0f#hSc$QNqZ3iiN${NsGfYQ3!qE^FFvKFt09bos5f5>+0OK1+m-Lwu!E;{p z7;F{RI<=A>0%j5ld?-+PqTjd~7t>5wsDNPw&&-)eLuw~hD({msOZ?2N{aj0}G3uWsOVvl>1AMSvwWxeGKp1v5&c)y&rU=m(Z@{3`C6Hn>t(U_hX;!4fue zW7gVHIlDx9!iLsv8D1iiO6^PL?TY7c>8MkK5|LfRj=2mI@(7rJ@vymKlFdKSFXf!7QYl@&)GCpzDJ!|O% zkrdc4O4XjH5z1&8MuI}f+P*ZXLHV2n9@-%j>BKe%t^%DUC>{Wvqy2aE1C4#yAJzTz zV|+TsWVN{=0m$46aUMjxB}9_W5EN))nAeno6#q3qDe#h^Wn3p%1j8g2yz=IsOO2{r(t%=PKq@lu!{0XhzcFB^Xv6(gU%#z<(6v(}hzHe_$phLPP2TQjB{Q z^mx$HCX6&H+_G)=;S*>C2S?jT_k}PZG9J}M5ro0KmO+?D1>UxSM&}kI5g;IQZNk_?xsU{UMF7Q}FjW-v-`2Anza4*0_eq$D zD2Pb`#8g;TtOz6BB(_1Y&KA9oRFiGEid4312!gCVM%x z$o|PnikU=crAEL$#!2mE2pFx1@kvS@-*?=5HLV;0xjJyD$^;Z8@*^Td5QG_Aay9ka z8)LCO{qJpiu9w0nEzEGCAt5bLOrHM8xOOcOOi!aQ*s8piX*i}@MJ3864NxJyF?(q6 z3S)Uq-D+li`%2$w`L7tjdD!igSxM$tq!vjK-crs7HBDUge>#Vq8J2!#hHRF_m{0!r zN*E7Hu>qB3G2l?Zv})%J!VFTvg;W4tqd7zDB4{_GIZ{zTSUZhj!}4h2^vY^iGhI{^ zbF^V&r#Dv2EW+?|3M~O3wm3nuk?`XS@CIZ8gfv#LjY)AyV1fqO^$|Vk+pym=>6U!iG=>s*X`Aw3oW;!X}Vb7FuyJ z@k&D!>;feK$s8$qi{3RnPD2>n5((2QhSRwXxG4WkEz=qq1&R+Su@;S#;6}I*NfqcN zNybD58PybK|HX1bj*n1pM-Yqc(d2$7lwx*jp1w;_(vOvJt& zY<;rUn#Dl?*p{)DP!IU_ZGyQeD3U1#YT8k(;_D*vh{q%=+SSAg6~Jpwr_ebe7#{GR z%z=MnwCx$vTHTv#e}cQ1`X_E-Tox>8 z+_99vl%zwGASL5nF0HHQ7DG1)L-R|2TmL$T8#zF?%1ks8S`hh0Q^A24!UzKvhhH?S z9266tQ8@>9O3W|~8kh%3XJ(f=)%v{eTAnMNwjl-Kg`jYVvT#l;1jtC~Lz$G%Je#lU z*X>m2a?q0bZj0*x>p^W2Bpb(++!R=Rh|d6;7^9K_B`Q+4Nx073yhp4S7!g-`sD}JN z;B)E5V9N*=wrpap)%dRg89S^c)h!5N%!W#YJf1SWc01M%G_|vzz5&8Q?ZjN?e@x;5 zl9(JoAQ*xJt4D*Oay51L|FA%c5?2VgC=#RF#s_;R4t>-Xbw3}+m~oS;(v$CI}Y zEh$)&fNP{cug~=Wnh+2J00jUuLM=4QSrHI>+y4C!tr-9znlPgR0BnF8@CjJYcDDg^#GUXbJV0X?9qoVuUf{X0Cz!fa{$&PAnB6YE@kVtmV8@4fEa)R0$Tu}(`~mui=@m*(|o>JIz%)Kc~A>|ee5@ZI_^ee2jR zDcDm!R%5VhxE2^CLufUQYnWZ+zplKtpC^Bx;QXc8Uc%bVq*`r0t@Oj+dOyOOv;63& z{Qb7@zaDz+hh=78*fHo=pe~l+-bN@}M1UyJdLSjVhen%~(vVS4U8<*P#u$AI{hV+V z6~z|h5sI{Ek9Y$p3<^X|yD@;jls{$+K{Pj03*i^85rHsOBh95BZLxuck%EkSYY{#= zn)-3D685=?$2$jFLjfw5X{|KY5fJN)mMM?lBV4%0mOT}rwQ_(6ZN6BH`)OqzNS1iU z#&toTJ40(tIjw3_i7mEJ4yzz-81R&Nn{113%)bkYXyhVnvA=I@(`@NX2rQC2Pi#-l zLC9#gCj4{K5Jy^TEXLSwWED~Fp5ZFcQ zBDN$qTHk~*w3DE!(FBrIzP70mg~7;1_>)S3ta;%tE3a`j0r3#!Bm=3kH)xWyyMU5! zHHHj@H)!8tV(rE^K;mbgG$^gxu{IDdpe+er4|#w4?E*vW%@lW|@({|dRk*m&LQ0of z{9+(xgduLrzYjV`|^m+fRR%4O@_k0by+lVuYZ>w52Ibt*xcPRFetWg zFTorh-b|)(ksx}}OT`t!xgVH0ID3tmtKPwKzFqZpsley|`j_p-2Jr`jj|$*)w@A$P zeZNIfAN3fw5_BYRqkeL{^}SmD!UU&JejvSCk7n-nj@3yJJTp6RS=+fTrNU~R!gTdBd06<;=`~v zqGlLL6m3Kgx(XsPb5|+?vZ}Ml_+f}Ik6|ki07^shDV}B@KDgcMv@&FU8Y|B-iIhwVO~Z_QkMBBh@WAcT$Y~Vc8c>n zWHm{@%qfF|WQ#4#J+bM-401S!aGP$X&4gbtGabPtj!hc87RG4D2^9CMdSAMU|@%oCp$E$mPuIpp}X_#pmV}`eiQGe|*f33pY!Zp(9HPI_t6*K#eZ}6UD8* zH)qW4-vve?p3Is@zdk>?2w|l)g_~sG*8+=zn`BW*^zpXk8KGP5nn$0&sl1S|Op){N zA-*<5_Q1C!-(4{&s$X^(4zX*9<(j=&TdJ&FOq4!h%N$B3vT((u8BlETTe)v`-8Bw3C1$8GqKf-vt4mXW5sTzGk}-N zdIHg<#k@Jm}mv?UX4hPVuD;sFdT|?-AFFvPe^<8y`r{-HTi^KSrB! z2F7BHjqti%v=XsseRMy8$K3b2=cg_R=NOYijN<^QmpT+sKl=buzf;3_{?w_0knIc~K@X!QG@;IabM z-kwPuPT*f@h1t{%ko$e5dZ5x7e$?8O)bVg2mK?3Nh@GL^XYDQ-(Ys#^#grO!4hS=J zH11gxGon*dfJn3IroXJMOmw#1GyiLuqzqYh*sCBup6}S!(^PFmPz%MI8Z*#C?=K|a zY2N+T^Srma_X@i&Dvu1-Hu?=;cGhWV4e|5=Z5?XW?lELE2lB;dPU%*EK~> zo={h|Vnl<-4_9ZIajI`f9BL{S`*l(I|vbTz31t9A|H>y2KlM)lM*OlbJ?!l<=dy4a`mN+ovLgytT0s{uJU!Q5LJk z6Kh3g-EKEjg8)n9tvgHS&~TWSZe9zW=(PJph7k6l0$c16T9$aHDOWXW>a3X=w{MoM zU)I<1;}-x7Tk|I8-F?yB+Iz#Qz73PsT=a?WIh+aYZ)$jZR$N*{cA7LY@qK8ZK_Fev zmYhI)kDh-*r$x0=3&zm zdpAY!m9INh|H=6+D7xab{22v$`vMPqwcqet+?-xErhO3DCcFm=r+argIngRNy?sJ2 zQNeRNngQP<%PQd)!{9f%>iGlAMZgo zcp^SaGAz^=uA|$T4jylw^g$Q9slTGz3qo zlmwPG_kqXq?!P{u3V&Rv zmCU`|ioh-Mr7>a-TGs}HTdT#QHDqd5tA6+9d{CW$Sd5e$n7ker2tJ-@QM%8%6-3k5 zRuV4Z#kpoTcSOs~nV<|fUAp;>A1E6ed++Kjc9y`5PcIbrE*Y}|vB&G{VlH=IwD2Na z@$|)5U)q&c3C=JlY6YH;zje)cxpho5Y3`Wjw&%^7BxtLjsHMq)BICOs16g~GL@ugE zT>@2jOn@gT?pdrnb>ltl0{y0UZ*IO1gDdz>fea!i>hh$EpbEW7A#L3u@DMfwYzRku zJoF6i@>^i-#Pr0YQ1T!xIaqRrk(GHDxpE)BbY&#P(S)JzxI0nu!|D+itzvm8(jom7v~UV$9&5&`*LJCelGlg-xcnw|@_g=yDEET4V+A-?I=m{aX8( zzc~NTZ0{#_*n0DK5gRcEMQB$}JoQkhmXkV@xtEp>^;tSl@wpQPjZHMoO(0 znHUTVWSu7}tl1DQiNGA1++C6|n|)Q8_vn?Mt**b|;JYL%2tP?<`rmnShQ>nCiVIC4Og*X5Qiw z8{DP~IXZWGP74G~lgSfbf_r$i^}gb!K7RL&@!mzFlof^);F;FhLys0|pY+R4-^k9I z`}N(Mi=6PQt$%Uz&TPbZsDkgr+(cmB!{$DHx38jQVJI=ijK`d zBydfPaqQVhbCb$ekwvJxQqg>&C{v7mZ3G=%t{v8j(akTz$P9fn@CSQi2$);pAMv=t zzsw!-O1e-6FY|SL6lKfe*!(8UUVxY{WB$aWyFJ;*)ew0?pH}#1zl^<3317-59~iT5Quzc*1M(SOqp;FA?FLq zy{})1BQ1Na_qr!C_x<4cS$p~F>B!)2xPcHwuL-U^o96qW`_eHCZM8#3TRp=5^XJ%> z0*p}utj4B6ZzFSE;^VVxZq7w4VsRheaBrMZl}72ug8q4Yp7YdRLndW&siKRLeZMV2 zc+j3HGr6m2&i@P(IN{F>ZMUGcAK$C2|IizrjpJf8QXu-XE+vC9L8XjnS?kMsYl$vC@~+j*_>^36_@PfEx>CC2k=( zg$BTonPVs~i9W}*)4&bye;=&*h-5Q5@^K$*_OJX?0i8!jFC#00C;i}jv=QKBWtsrt z#F|76@FzX^x~O%*&wm(|q4nZLOsC#5997g5e)pFT5fb0;Hgsu(0I6}GmxK7)@e#Me z9MYp_-ERl3!Wn$uaRb9#o?Cl$9=fx4k-?S4>jA@k)AS9cX(}fwJiRF2 z=5T3G5W>_B=Rn>w6iZj?(fsFVDZJ-qD4W26GBlYd`8taHvaY3e?F5EH!we!6t@JS3 z*@0k^I(+5xkqr^JVQxOYRmQpV`*v#fSo!+wW)C|GgoHOPZl&x*{JK3tA5)h@BQGmj zp?C<&QZ&W^lAX6(%d;U5Cxya|Y?})Q%y%T?<4EepUB~kbU+ry!4L`{+6PDbaH%AB~u&jA?D=^=SsaX zC;km>%7t}Y`fd?@1n)_N+$lNeG%@0Vrn@^)M%PODg0hRkd4*}VNwZ!1^~X?{)|PwE z%mSq_)4$X5F5juZ$kZ8XBhB6xi&Hr@@nR^B`q?r_doBvVTY1`+kd4U+VnO5_U3jWZ zuHMX{eMy^{E8>!gmZb0zn6Va5;Aor5u{5T7`sSEP(z|@4HM*|jjSjN+|9i;&k3Qsb zWIm{~( zSWZ;O4r6IbwQu0|)5|UZ4XYsO$aHst4wSO+G>@`Pt)%uGwFUWIUEasdUxh6t^7^jX zK!u|2_q0CR_qmXw+oSo<8A9NUeD~bs5Ql;79+O*m2+8Zb(4OXV{#z z!FMNK!R#C(!u64Ermy7-YR})5!5}~ARJjvsUg;Rw&URRa^Tbf8@qjjB?t~E`_7Q{7 z&^USfM{3GQGn2Y@pHx>ZcK~|V(fW=#gDM0-tUx$WD4_@OsgX*=J#8%961kB>;a?2x6Fxum>oY)OX6+d*A=is=JJpS4Z;HQz>q?l@|;2_Q)yt&yVPU&1?LJ&_gdX*+=%Fn7AR@4 zo~JBpLhs4YV3y3!BK*%!$#RjQn{?|s@_Jc4`Ke60ZXI1(4EjY5F+DV5YZBV;fl?tH zvKnE=P%c;*AlgkR^-6lWlPTe+R7(LL3o}$mp^Qqb0%K0cMnP`*s?6I>V946C5DxOVk~Sx= z3RY3PVRwsJzEey53}a^t(hEq4bzlx-04uFPS+0jczUrq5AjuQmOpF{4{TuF2p9dX) zZ7aJ&7D0sV?jZOelI9TwtUab8WDP`S-d1f=ccCumRvK%qkZETWiedx+JDGP|?NyGw zIsd|2@E)8)8v&t05sb5YZt_XS_fWaK5=mhLRn>9I&-s-$nLvaUK{rYpV6f?4O zvsNK$#3zUr)`ekkjBV?{VRBcCo$xDccgYy|!yKradnV>Q@f~xHii9QN(ukwY=~s)w z5V2|DYfbnqK0BPK3Ae@JhB!68zl<5h2!*ql<6fLA+$9)?i^d7!3WTc#V^gv5!5D(z zsbSiji5M4&B@>)6OyF<9cw9^tI9D)S6&MGKEdjp8k5zp9@9ce|ete_AP_};(zeHd) zFRnF0DHN9>Vn6v7GZQ?rNR_!5u^2qrZhaY3Pf0G3AJoHi=FMcw)Z@^^pWVV&c>|_c@#lA=(JQ|vq0~Kg2_`~k05ryndPzeF!M4dH`{{YVZGk&r@I$~sN3!9ebPk~MIq3rBA&Gi&i5V2GTUaG+o)EW%2U4U|C%_3kNb{rwG} z;+3iWq4*z!D@!aMSVeyNVz!g=wn>N_DJ9i>;cT+`1Q=DZSC^ zIOTrtPBIh6Fd6`u6d$-pG>kwbCI*en!1<>^-%ZP{y;3LC)t_e$Qn%Yy%x&~R=<3Fe zl2a`8N@cacBbl^!u)WXdHyiezNyxvS`AM7L$8P7!CzWzdu$x&jTXYDZ43q;`mww=1 z^tDUxs?$C*mpAoSS5F{SP@2l5RX%6SmBtSc<72@T^*w_-F5G&>1yOy0XyD{+r497%?ywnQ-paDU|mL${*R-f9=jKz;@EX`*eKWA$&y~f7VdTb1xXT~si#thSyYhYwGj{3G^ zm^xzw z90JQHoal&1A_4F?gQFgyDXdsHf40ob+5Yuj?f&T(hzfv$X7 z*v`AE|A!qYeYP@Sofq%Ktj7sqb#Zp(tFt$X6`Xr0 z^J}L|pzHg;MI9B+%Ab6IQ(yEHw4eTm%s}~#=NWD`j`gLH+HMgR5Q#8q&)B;&GBv+e zBDjA%7)QjX`IPpd1reHpx!Pf&m2zhg%B4Ki5)r^>#RYRO1g)u4OSMmefgj$vGgDH(l>LeDj_BkuSHBJv|14i<5`HINF`Mqt*;+W z2nhZ5F3%KLagk#OV1z8}IqE^7z;A(huGXwu_cpk7A>9jUVOa+>x z1^D)lJDaDWpV5~bhY{M!usM0$d}~NnSk4UU3btyP0zD524P-IK#7|coLIZdp7)=<; zKmia*B0&@-DUL~z(e9_2JLT%~?f@7;xq|5)8ZZTVjxXyQz<7%nzz=RqKh4n;`ZKa9 zGyd59HFe?!3D;USskWaiH-?FU*UHJpG53~pv*aP-NvZGcH+dZ zy@+xQyMJ(>Z^_V;%xgW7q57c$=MMHTZUC`u>OiK5;#)5oYz1u@5Ks{>NBA|~;w zvYx|`DMIE zlil4zm_oTkE1;nfVP45m01RR%xXGw}h6;YKiI^y`qf)6*f^~tr^plddkG$oEPqb~8 zJ0d(lQYlbVYSe6ZHrm+&_fB-{4yubO?g%Pi< zU?Klpir;qTW_BR^MAo7i{W8(?DMFzErSHUVG?nf}#Pf{iz@qX&Qg%j=(s z7!PCwP69R7D$JAAJ_v9`abX1pt~m<~!_Q*N#2}=@Yc9!41lsw~=4xzK@$&VTbL8ET zJ$~{!G#xA%MGclppyWefPHRp;dGX>?%VW$~RPOW&y7F8duFU7A0~{1r;v6jQ+5v$i zvBB?lXe^E^K*M!?vvXUbBPW@UQFY{o0<25`4DhntgJ9($8Uv`qghb9ex8d?R6exfL zTWnOS^7Qbf5{3bt@v}Hk-w%&l^p*~KYys&Q04k70X+u$jtppw*wsqkSEcnpRoV!_t zk0hGpGl61ID!E&AHS3Xpc}fR2|ASLDr~$5 zFcNXf(hAPkf%h=Zuw4SS&jtFA&vFC`ffi^ZQiz>}ov|zEKo~~2pjr4%Ir#)|_umho zPB{a1QzM*-)1N?_4Af8rwT90ZO_wj-HM_huZsebK zg=>PJ0FtnlwIMiY$jN^FLq9@7nbLvj^S1Qtb<1(gAf(7CnUhs69DS&VYX$+-A_*i! z|Ic07onvqsrgJYeL8unOYK=y!WDQILymeUx|Ddm5Fy#gG5Pxg7rO3;N39=FgMu3Q+ zP%0$X=bbzCd0rCqu7H3swPQNR&=D$$rT~^YEHZ$#B{6tMzS@0nLt;mV6GC%P zOu3RniT5(XfQ5Wq`ne2SZ+&hq&~vrVgb>X4LEiS?*$$K{D4I4)-f!jS!|^KRF>e)D;~bPR`-J|aq; zKmr6Q$|()i0ghD$)IHMichVMOaav<3QgI;G3#aI7j5#$kSr11Lo1VYFHunfx0uaC= z002S&02BZKGyotZpP&_5gF^59!orAFTD1Qg!umx&LWMyTa7fTnK}d(?C}<@ixuQaA z0nq~hMMMB+000g*+N6?Aa)Yvqa*KOVgK`(8gSZ=r9f<8o&%l0CCxfKk$o=g%!ldaO z;6nsYA<`;t$!`*)E2MkY-`nnDlUhMBcB z!*B;8f)a{|-5)^%K|>4@AQIkS9r!>15oE(+6oGJnj*=PNGrY4|@n=X1RX9QZv%zMN zAE)m6ZEc@y?Dq+uf3}~Mlk<}lYk4F|#^(IUAJzYQHnHj${@pNMpi}q5e+JfayBP}o z*8CsQ{|VTq7;xg=V<4|Mh~NMP;C0KkLoh|A7DRxA6)8{zBqZY?M7NI}1i3&2;6S3o z?V@9@2OJ|HZ*Bwv;9n2{jsXnGD0M>shz<}y{y~4xKoM|92Zk4KU;hd4L_&rT5rTdM z+HpY!_d;TTTn7b;SP1Z&>34>t&193yPO&SIO6hHwD5d{zkgzts?-u&}_O}N9g@bc#<1CZPbI_my^gt4F> z5PsYLzVD);9}4rM+i{<@!Iro~g@3S}Z(A9-xBiBqItUSJ&zi{t! z2SGkm2g(+@P7GYy@!#eDN07!A)^`2RaMcGMZuez|ghaV@MRE z06)4v`ydj+-3I^Y?Kq#k0Q}1Sn*Tuv3EKk12oeHwzff39z<)hZ_|U>2MF;&t$N(rv z?PHv6o9_5<1m-*cHvY|ET7ox)zxzM))cYU<526@=v3x@a4yiIeE+Ta2-a$2fId>r; zL*=#cRv5{QO|<{ttZZ4*#< zQTuy)^7DA0gFpoCI|4|6twY%Rh_Ld5LksyqklXzOfq>7pT_=CI!vAKiBKQAXSBN>< zE)V(Pf4X0;XPRW<{YXDSo*V4%{vhwG6v%&36uB=rJCTrSzORmLXur+35&xYtUd$Q) zX+iE&3Q(!aB;_Lf4{}oAp`uvKkpKE0NePiZA8IoHt#SJ(T8u#p9YPlem9`-}SCUVqoFvGTXR=^t#8Fq04j%S$uI4yD*-w>(GCr zp-Efnf-f5TNUO^r4iug@V{hx;ny_za)e4oa^%}SBQ#qy85bN|+$w-M6Y2}zTb`p&<{c;Dr zSUbs8+={w-YQL8juM=3}$=$PetGe9==A(PPN(%WKqP0SvaDRAt*|1Qkn5>vAcBM^k z4c$~>ohqJ6iEMJlzGm_s9opN0wZ$(>!Z$IOy(A`bMvS#$TPt{^>X3F^uZ85wBod?1*J&{kds8=W`;H4o*(zKPFtpPi>+NHc=vJXZ6`_Gf&Xbq5 z0w+!m#RzkW{eG5G*iA0vX-?X{?6}$5vcZfz9?`~4f~dnw(4{LQS;VKCr=M-aFH(V; zE0bSuBTYc1N%q(7g?Z{$V`HSOn{48I5lzC=C;HSeWnq;EH7a*v*VZwrz4pX3^}gd| z0x3&@0J^JzjRPiEbP>h(j+N}Y)avgm9F{viZ#JefdY-h{lyuYUoQ(*o3XFm$y50bE zI)VdGHN0Z^)rtG#!@gxF`fgSASurJWZ|`-h2F4KARYtDQ;O@ylu_-Oe2$05;@>>sX zEK4XlT_kA~3O#7U-Lc2i?!Ve#Xk?suneNTY`pFC;zyxSjdBFAS)-CI)$?YFKN+dFN z#1YCQqhYT&cGfpc9~!EGzDpsNg-_?R`rh8T_gCH++flVj3y(`aP>za4Kh5MLgKejB zNi#fud3et`gGl)-4GNcy5H)A@HkG;Jfiw=j_Kb!389nu&JA;D)K8u5KzYDL;(`N3x zAVeIV)t6KGzkkr)y)QC(?MkhyZE~(HkZ)-K6EzDw&7LIa2L2KsqE6LN=!fpu@JSz6 zBqf3iu=NL~+-s+8=<<#sBCe#|NRd64yfivTrWjm_BZjSyoE_jcVyZH(G1R<7s-F!K zShJ@U%0sR78C_493gVfV=;`r0Hs`suOO1o29B)BeYLZSd@2JnZC6W!$Z&wHp&+dz5 z#1p92Z6=G9j;>m#DT)R4#z=|0oC6h~wFE*^(DYzveMw8F#n_)5lA*Q12M9JTU*%44 zGWpxqm(qY4h5S+;=wqT`dUSWjhOEd=Kfgwo>7$KVLcbfjMSRON^Hi~T-7O$|h>%$} zP?c-kfFsk=Q#rnea>5=^iswQ0E-qd|11PBq|9jROc!3uxu$M8_s=`7GG1|`K@anjd zXF#NrRvzNZ5V{$inKuMd90TapC`6$D? zrBc}zSRsgeXvXwTxVivRqmsoEd~dr#%f$7|W}nSyr<&bqhl)H=gg8*U&}^LPU*jBp z{4$IWZf`85@|9$5sA3aM?V|tNzTMk*y zqv>?lNaXz15t8ipmnar|6z@f&Q5n`E0_A^!UGTL%AqMD zw@H(}-}?z3@Eop$@R0ih1C=nt92DZzX;rJ0s0+_U41mL0h-qOiTYQ+twGow6yj;@cjuLYWw`J0W}oO~*}M6e(<8={QdTVC zmm;~RcsVGu_!PjmI9efXi-{;AEwq3~q{E42KhN;fVWTKe zbDbB$QCa=yRXLZLU898i^u*w5)Zmf-j}#W2%f= zUL}$>>A~0AHjpkJ>7<)H0dT~`r>{)vuhts#KW0GI-;1LY_^~_9VsNZbw!0J?CUpkT znp}-(hXhN>uvL$4K!6gGhLF-Z*m8o;f_Lk#IC|SKOS3z5%eM@*ys*vaqXoXj5tsI2 zR6SzRZpDiUV}KS`_Z?Hqm6e7lMdRyrgi?d`ikLSw&iOx?e!$;*$~qbP#)BPVBsRLQ zPvzW>p5C+Y6FI|(Jw@cGbG;M*0VZhQQzK;-S0dSpYU+!#FC$19bh;MOhJ7x)en_f) zx-MP}<7A)%6%weWpx-WP#@2z?%CbpY#c&6{MTLp5!n2p+Rd|+cn8@}WPYX3$YHY^s z@o>n9+%ct8=t`1U1pWs?m2tUBO$gdE@rMhZIl7XaqrT0vNp!-b7{8q!s#>I0rh_I6 zfb*J?s7e8ooa=r7p&!*Hmt8aaSH0cU0@vd^6!(fwx^+L~b3@_~@1cfv;39Ndh6{0r z$*yczIH;|)_2dJ-GQaFZt*k`~=3Yt9aRdV*)eeakuAwcs9?>;rSvikdq_8sjAb4n+v&hlXS*Qm|?%-3+BE9&kMnN zWoq@9dt^4jX2VR>_SoP_j9&Z|)Cr}C|>6Lywm8$xnn{eJb`&9I9`t9|^5P(Ss!}-mx z0Grni2glvlEv*h^f!|dN`Ieqg(QBgxFICiAj&^$@^iIvb*CQ4_aRZn>68&;8Hl6z` zuXr65zy$)5B~}QTf{F5jH=-J?keFR>*`r5O9?sJVnB}NgIxHm!)=Qj8(^cdKx_h1w z%F41g&Mp}`K;_t?d-{+6vexY# z!NmF^nnyC?*>Cji^Xwg3jQgW6$H$+$EwWu(w1;T%>)7%++E+2~{7rho(>K-7TKL5K zoIMK73KMmBtF?#rmRBap*%axDlYEUbd6Zm<%$On)eFW8)tT`EQTRQ#`_oDFSQL(}?@bz34^u=Kff>eH!j@L6GyxQ$b? zR4+`=j~D$$^iGL;=L#1M`&G)O;c3hoBRwfA(#~ra>W%>>&)x#D70`MW)%BK{MYs|R z#x$cvinfo0iJclP2q*cAD%hv{GXAK(e6|kMYm`7(_0CX>9fMhIG(ysGgz%6Sj4Hcm*+4d z_`JJ4YQTMW0gTH_b17w3OCsruQR(dUA?My;MzeCBEI0D%ck8~CMr_c}u#`-g!N*Br zCphvh1{}Ff%{REX0dy9*hz8amX!Azyx|*nA;!O+zFNk)SWTuGo{iNqdSBo>Ce9MWQHh-g%0bE;Vv9~z7!CSHXzTThEwGl6WuBt=B5@cUzeBzgiaJVR^tdX!4fG3X;yF&E`VXIgR>!_aM^XKC=) zC0?JK^<%_W$8Qw5Pq)=tH&NN_`qeBNUZH){20aIqnVA`LyQmB~*lLuz52$xsByqKd z(ssjYG*D?`LIZE`Cxq@N|FoPsB2Cn%sG%ereu-HRA-d`>lRF16$g%W_C(Qb%#W_6o zfMA`-BN5r!QKP}rMkAD9COcQ)|0CAqzKs3_!78|y&l z3{%y5h4aLO%3{ml+WHLbtAirQJUsbjmKnS=OX7c0=VZGy{#{V2dFx8^qq1c%!6_tk z<+{13Nv5i*yXQ}vjDB9!%ksqP>;9s-o*S4%F{_)^tu#-AQY@vI+I|+7gKb+1?0E9P zn_;PAQ|2{dbb7GE$14|D8?m0eLxA(ZXx>w{yLU?d0uV|iVERaxXw_M@_^>FAxWzDV z-EkFxaIMAkkch-LH&t6~I~9)BdATAejM@`{G@R#pHyvvi*J9@`7b8%qg5fwijw&o1 zCDH??J{q^{%s&-Ko%&St-eXsC2lu09rg!h%N-z7=Vk?`u4WEKMm7L`)`!xr)uN{y| zQH#5)8LfrL>}H?mmSm=MS~H`~-%q|+djbd?TGlFEx!T%VO3(6Ic zjLF|PaI`^=J#ZeNc=PYC?1}#IWg1RS;*ZQH4Z|p&I(u}@N}Sov2lnSGjzpS>n*xB( z$L!Z{xK4B~tbr_|y6vPzX_qj1AZTtg3JGR)VP(7{Qv^}gtX`|;GX`Y*=NrGZ{7m)L zfHU=IKE1C<&)J6k{WBWnnmf9jI_H%a-B4St$$Q-!vQmDRmz^u_D=bT$msimb7W;~n zB}#XsJo7kS^6tjRwbJSDYG6sJbA zj<{_VI5Boks5w=laiRJGaAT=pXd#PK==yj{2z;svngRxFHZ$J}fFQ{P#)LbxnYTF!p-S4O~az%<_`40IA1s!Z z|EJ8eXy&DJ9(z@yD0Ey0v=V|JiTK^}&fsCqTXJH|#_jLqSNd4!_nh2_cfB$>%*za< zYXx5;qa@3l{;A@44TS&>VW48W{Sot>CmK)%W5b6QvsHx@d zu9|D+Z~OOw!ZOeG5KQ!@(mMFl3brQwy!FIJ_l4kFde~j7m;N05pEIm3iVO@*EtsCi zlz93%rbMqUAt3)uV@Pcpfdo9nS=v6^#XMb8$UPj%WhG)F&U%&PVy5*uYK#j|(BAMMXwo$1=^>KR zr8D3#B3l$%>x}oeO0i5v(|q--)r4w0SzbrH(I1Lm-_+nq?2`z~ND<-FJ-OY$I*}VG zm*+!nLIY5-nV26^$m|r>6**tO^tL`M^#&nuXn7gzS!jDG6Pw2Ax7Vu`wXjc-BS_5?>hYxNeh= zT(zn^CVG75yDnF;lngkJwPgGy-ITP|X1hcU1|1Qc)Ou6hQR`Ug4 zHfbZO-S=>nzfL(@AWhUYbd6FJd`bh;_#-2hsR?9MC3m_T-*Z84F}AL!ptQ<&TSpw` zFEH+xZ-8sF{`6XOZW@4(>0&fzYsOW8VF+V74HFYty{T^fNp@R&MS(T`fK(AqapvcX z6U7}mJLL#PyGX%4=K5E2&s;t~wQ!H#Y6CxFW&@%T?&WLMzN6+38?AxebGnUlD$6-U z*9k&=*%dc3FHqOx`0xFejTa+R0{{T1p#q|lUjGMODe3vgKb-B-M)>qw?al1GqJZ`U)2xPbS@340=JsM;C?R_@PWa`r!x;RA&cW3oL=0@&RBBV0d~6 zrEeH)6Zk7t+b<4HMfBJBK8pha3BvykS-=CRLBV&Sk=&_KEN3F#=s^@z_Oy+kaVp`t zwLxSfZD<&c(5M>SaWNQFourQ<4WR-Vjdb2D!6F3b9*Gzv@WhjLDXI&fna+vCNCZC948DGP8S3n^nR1Zf zji!V2^6O0&T{1>}0F{q00Z~jo;wwN(BNh$Y2S|`0e=m^U{2fS)k#i1*(Q!jG*kiIM zM#jukxHIZW{t2`vhd-S8-->-Akg#ZEB_hczK~k0gPul8*iU=}SaFCBMifZi5mYwCwUq+}557x(A@$whwoq`FSnwg}p6Z4{jtAIDqY&Qo2RxADM>#~T z*EoKUNDLCXQ4d@mPn7u3b1UCDNaiL%YLDIB7Pl*1Pk=3n>9dEcMN#Cc$g@ggYqs+O z*Z-Lnxv@9666nn%G71a2Ht~&l+oOn&F^$nJzG_L6-V{fdp#LnxK#+hy3_aSOA0Bvi z^=xD`KYaL25a@^-M^sh?y;<#rCb3Zh)rDrV$jr=W1ds(vQY{doaexr#Dt#%3u6*7jRVYA}GqlCos73 zBZ`3DN^1Dt2YOYPXvsiXZ7PaPL)6nur$vU#oZ|jj1T(4;gnf}D6&P+}GEd@4oMvOV z(b6wXAvyA;upfC*{9($yP!_(0!9H0MIntp7qcKUt*6u>RKSEgrpd(<|$X=07^g(Pp z(#UZL$42bQ8nI^(Erj}{9yGH}AGFbJ#QpvwqfF}i{YRj?4E+3{pj}u0e^ArEM1HL# z)2mgvnf;l=nV;r-keTl*OUl8&LraTT6WS14l&xZ>fU=J~SL zB*O)MxLeU4;>Kt?LeKUzcik*T*Dx_}4FF$zv}Xm-|d-M3>T~4*p6elRtk&A@u4qcuuU~Dfr<_&7gY9 z%6={hIpgb3lJ;?HRL{_TyKTlJ=%(KUXGBQ<%g;4+y)*N`PeG}?0Gi2TI|uR?62h7( zJX>;)I_BDL@uS?5%q+-@B#WH=Kh4W8&lnnGR~&emn_sI$L&_~W;mXZprH!R<&0045 z!cC-$nV`_tyl7bG(YVDNRz}MIico#n-GY@p{QOq-TD+>51(=OaZjGjifpYm3s8tqw~<&=-L z9~uQ8jgS3Xo8*};=k!W5+OgjKxz>i=G0XY??TRVftNw51`~G!!n88SR(hwASKuyXq zdhfN5xbG{gmbfY`+@t>e`bfenc@hn1?irHKNuMzgWWQnF(>G7YF3oy!8Z9O9@Hl9B*jDR*+WY`{Ls2s6~k(KgNm^TK}8U} z*rW*K%bVmiZk9LsY5p!#2ZDPOGx#t?nqrxkx!&o&>pUM|twSNOo+p9E@|8z|H=&)X z^Rk|e*vNMOj{%gb_{Rt};q(-gc!oJX^{P$zXsG{0%(H$XA^-Oi2>-yRA{0TM0zjaH zffaHJPi}}40rHD~eDOf0(L4o$rj`jJcMMC#cso!dl$W7{``jD_h?tb{a&>fOlTs)J z0|y_GJqqgG_6gtwpQ-3QW(`WQR`#AO|>t1cl8jfAe%0#jr4bB1Aa> zzdpgf-v&Z$omT{#;k121md`(4Lp?|y$6vf^in?ht`3|Q{EL_DrQ)$S34YK% ze>XvqnT1D6(NezO|8N8yQI*)$HJC>(_HWufq$<;eP&+(+pn}Q* zucy8cj%b(&;uOdK!fnvG0Z8CVJpU|;JMvcNXbP%Is5)?(DVEjEE+`YxV?xT@XQ#GI zc4RwNJIKm{U1b@wCkHAw!)gDWG)QKL1#;WjmM>uhqcVB2*la)}ItqM_hV05sV~1;= zYbf0v49lUZWyx|Kv<8;aE{=D(<0uInR>E%bQ`&5)Cvlc>-F9+Q|Kd(74Tp1*xXR?? z=MaGmK6`^hj&yP|bk~79R>%c3$Mx$j#~ggQQLf$D5Y0z!lXX`h!wj^K_s}tq%weaz-Bh zbJAIxI(Dp_Z>7wlQk8W#-!XCX3PYz8m`wf=WMygyW*aQ4a%{+0HFg3CXpW(a+SycK zwl(dFjVz?4UCw+ox~3EIMuU7ByS$;kAm0R#9g(?vC(!(O{|ckx?8%Z6yTos@u*hgm zF?oy_kx#^lX*FJ;pO*v(K@={uq_2k{Sja+A7(Y^ho{fWp7lFiyU-~KK4x;}>tP}Ge z&RmTJL2)3Cc#d-V5};)($^m;2`u2h(yev3@Qte(9JJwApF<%;lfz#312q7{to&D^@ zcZY?nf^i*0V&7I`{aQvM3EDV(o2?$LqiE!s(nn1rlmo907)@Q2p>`c%XxJTGtK5^x zx_N4&=4VP-UKT~C)5$&_Um+IrpeWgv0+%HYNVqJNHG<;6iT{8De2e@ZI7)L;CR@fs;QzHLZ zSR}Bxbivi!0WbAhBC^*qNi8JUJSK3@C?V~cx^hLzBxlinVno6|95$MnKCk>S0JSM7 z?k4j2#6NF#fZKw%g@Usehcm7)0|jZ7i8AC#Z}%rUNz@ej!z+lK2XjxB0Ke;zFjz!k zkwL)AiK45qJj-86edKfpz3`WC&1H`=Y<)dlE;bTZd)04m= z=4KQ;oStx z#hF(K7>Y^HtWi0_GNjU3G^x*1*bHVt8I`kh_*1KbAw}9}0+;j@6FVr`x2h0wqMdZA zAA;DO#3OJ0r6Ij|I*e9%BA5VO3|#V!^rUY6Yo_Nz!N~kY5er{_I#~**JZiElX|Du( zX5a&-k-n_Dv6S9};lPj)qI=lXNb|aRBc6_MAA~9`twkQisoLzZD{4k~A=Fl?h^QE* zBP&tOGc~4El;&i-yyP5J0#}Y0vtB@X;F=fOpLboIH^JkKO5&D*$IX4JaXK}&fx1p7 z?(J$LY<%@iAhc{O6coS*lp(DO)ML@9{s9%3TIrp$te|eCEJ83C``gQ-ghZsNES}%K z5}=^-e4s9NT5*0U%o+2LR+Pf<%mkZO=jv>0i|P@3SqiEzuzL-eXitp7BdKUgY*k1c@PRKd0n%l$g@?12S3i~Gkeh2E z<*qRHT&*4UGEdc3`l-;cQfthK?=-AMlO*t#fnb@_I}6}s>(ae=VfCN{Q}F5QQKOz3trpH5m61+SRd~ zmjf^un$>0!^oYKQnVgqs!iPa0`tR#Tq1Se3;#Rm$WUXxs3pu9I2JU52FP>gL)ey zn+ercMi|?S83W&RquZbk6V=q?6r8S%4%Mg}`6dWMG48{KHB8yHizJ%wxPiP_YK32~ z`xZ$+#r0hUS@VGZXzY3HiW~_q~&@xpD0%RH(sJu zzHI<1ii_V#mMTZrS>g>h5Dh}N@}3_YL8qSQCgI$hXa{BpiovzIK zp2WcT)dhf{+vT!ud=b=q3+&4PX+0&XCnOCNvPu-6$><3jJR9bQKX!tVeK@AqIT^=l z7}U5GBDV$l2>2TKP;X!R80FzyGgaKW_|kahEE)Rqc5*n$O{&C^+(!V%@OFV}6>9@A zE_sR6ZJ2iC#5>*L4(i4ZwI%g~g_1@+N!Be-MQ&%nLu@Q_QZo{Qq!$D`tMSrcuci;6D2#p}ab=T~=%!_5Y)d6Gy9WWOXsO#)Q%cdtgg*$!Et38a` z{0K{!m~cARR$r#|agM*Umhx`%HXJPK&3g`g(C#6B@DA5OtD><5ZzedS&!s#nY}3}R zi;gM%97&G7#2U!hdvN*($`UYIfr@bg37vY)E!|@yfS4R8K$~P?H_p5+jqNWYJGJ1m z6*M7bPNEK1Wu!Edeoo?gQ*7#h6p`O-qUq*R0{?n_6&s7oTTAqA9~Z6LS#X`4CrO?J z!5q5hnv(qO>p2I1M+J-gw!6$sG;>-LN~2jEMWSTIeXYB6y)|VXWK`0$_uCUOHYQCX zFvAKCKBy<6Dv-Ll(UE_JOPT!Z?oum~Q7AR$N@R^w=-l%ppKic7Z};M1P!~X!GU}$K z0YYvpZm-{;e_)(IN!Co&QcbaM*V^})tnTHKeGCwg-B9(_;c}u1D4G@X8 zsY{YRsK>fk1)f}afz2nWj0pU&*Y7ipf%_7lDUEacGo($E6NjQ0x^EucL0$l=7>Vf> zZ^I!_fs}Kjb(Oa;O>C;>*+J`Y)6=Ti{vO!|PQ|idk_pO+=HgG=u_9A!@D2}4 zvsCT2E^R=*+iu%ra&=|%UMxs<)GOz0eOS#M;I+=9XX&6=hTe=#)AuL5-1eVsZu*Du zZ#?;4A3Zgo_XtkF@5BCx?qgU)*m~Qb5#(*?=1IBKpVp9tZ+6*V3`~U?8kw4*@RIYV)n4m3X9ML8nLo|7oz-OG zLW6XscnE6{K<0MaSz^kW&e}%ItE;A2g0^goKn>03Q&APxeKAuDH2~e=q!M%Ok=y!B z%1z0HDi8auaF}A3#(dHX@`VHC84RXfm_D(FQ;CGi*4o8pG;M{X6bF4$ZB!}NZCM&^ zj#G%rEYT>I``Hwoy_CpbKpg5dG}<)C1#h{|iaFz{Gy@ao8d~7yu_d>v=?cF5%2Gq<*<$dfsPMa4W0Y!Y3g~#QuyI!2%t=e zmS`;;*2t3fI;iBqO0Ae!l<8q{A!}y1h3#ntn~ya#TbN0WUqrE)>gJB;DhXGRXFT57!&qLZaG#>Hi_yg!q~k&>f3TwJiM4fZKvyEYK!r+?$Z4Cgu{ntqgSXVL>Nf&|B$%1zYMzn zlzNoKL5>GSJ-tW(n3D5Z@hIGN<3Hx#D5X`aW1e{;RI9bEJPtz3<-;K-ceGB_KR2<( zrA5n;NR11Z{!u(tX*Qxss+=vWqF76oS^ftp z1%C1QSE#jSy9DD6d(KVmTo7$#xl^~6o`+i&`5amJ_Q>lqkGLV!j=duVGaEtTw%MVi zPzW_BCn`Ran&MGF^@(?X%qDBGu!CebFvCv9&2oBv*}1wz>rwS<%t@PzN3O5$lZ;~E zlX!FSNzmj2N#b&l^+jeL zG<+9uRVt?2B7YfO+Wh6cN-m$Z;S3oBh@Y$*#>dsqAhPI;oz!pWjFdXf#^aUUewF}@ z3j4*kewiGNqa-9XgJG-+CaU>>Xq&t+2$jqB)Zr6G1kIQOg%nyE0K8!G9Rmn~iE#rw zMTx$N-bJiN8nsy`YyCQ8q!^e!;q?tpJ>ubcZ?9NBQ6aCHj*0iuhbp8agtz3Fv2vP$ z;gK&@LDyQiE+El9qz@FtDTPoHM{&$EPp3?nV{y`v1#;yv={zya{Ml2DF)}!gN2YpA z4f%LutdAIfpYlye|B!o33^QAdwVohWd+QM-+Vn8|t%9lduBOX?@s;h@R~jvxIbi=` zWx(Goqcv)!B9i^9HWZiT)6x?%dSDU5uf|>+O5qs^zfQ#14wX9}tyY3dc*$YxV`jcB z2PgT6*yfpeMVBw_4buiC1x5kdMbbJg)$W1N=TEn?mE|cw=ej_t*L6fig~fI*rg-pMS!9_01W03}rAQx%26@bn*pD~!eT#xbreQB{_x&~TTU zQBzsrks!blzXxa$N=b48?s~Mw16bH#g?4vDGDq{xL8s&+y`H~_it2$~?c3Pr> zIuo1HbaNHPWBRUrdpo3yHDk0(-fV`X>H;RgYEz6j=tczb%*+TZ9aWh+Z`aOrMs2y6 zZhbsSaq2}n5E^mucxph2E{PjN#EEC6wOF}vC&qZG5UwtZYCxI08d?czda_lzK!or% zQd2l{lt!IaNE(a_S2wXiB-ERa$7jeR55&gE!*-j(=w;5OK0pKkCV5SMEur27ZS*B} zJ<}F~J~py84sK%x4OjK0qHU4T*yOLR3AP~eiCvV-iZ?lXL+LAEfmyHb z7sjmK?B3DoF%k-Y-m=N2IuPFWZ)MAJb)%*u`DwqQTPj{akfnd;j(Pu;qWK^s6H$ah zqb%^fxk||sowN_bR*2`&?0`-<+6lb0)8w{K7x>rP&P%3&WZ+S0GZiZW;(xXlB;|>B z2U*lh%^UJ0%(*9}wc@NXJMli?vIv{RwH5{Pnme@W>ym0;wDYL=jm(jH!;|}X^C_yq z2ze5j=ds#jUu@-as>nPx$mwy>D}R;%r;fr^og($DK7vDL9cmu>zv-F}$BiL8tg&hx zMbdF*=w2*u&4uuaRdYMIoM39(^7;W4Qo^-=i&6slF(-q!&FP+F%Uz+!pUXJGed{+4 z2a{Q+CX!?4uPUIAiVd4TwloLTmx<~CQA)5rI_>nL!)JGX)Z~PbkoeFk20#YZgFO~u zO;}$QTL|GO8_lA${<-n6ytX21pFYBg_H@1`!&z5`Lkt6#{9rnZ!Y|2dRstpscp03` z=sN8#fp3Ri1Vpn(DRCN%f+?nQ2akqE`1rP3Iw~|LXv-&7rchfi$FEmja0;mWOUq0| zrf3cN76xo-VU&jhieZdcDl1j(8aF{1I9U?6uY)5T!+zu8d;)W?BdGCkX#gPaE~F1I z&125}3%?d~yL~w5YMRGMU!B!dv)tB|r}wNlL`lBL4KpMW@+OJtGq@!B)fF6wN@u+R zG=||VvYLFZSpV}!CdrQt(oecC5iBOml)k?@64#lrmqJmVRl_vE7rpid3i~Sz4Fw*S z8A>ez!Q6e&W%u_lhh?blQa>7NLz#emy0_ZCjdlwLj7KVdJiRwg2N{!E;vC3*EO`9! z4LHPKmUN0x4iPK{$2u^ z=P->EF$R%^dkfN}004+7b(+u69#Usf)uPC1_7q1vM9tTvE?+rLS~lo*bhmO?<(N{x z?Zx}XLT|?zTcpOIgGxS{@kiM=T*;rI$zlX*CnCCr5G+m*@rQ<)+_K5Mis;Lnur zTSyL4*nol-?ZDgi-0`mucWx}%Z`5$D8z=QMMrEBQC)RMWZ*G@D*dXmBxS{eJU}WZ> z_DIewP%_`a-Ir=M3aEIW$e*7k0`hqo*@$@oBzpWxCad_iul`U5?LII8G55+JbM#99 z*YkISYp9oM{SsubyGmxGE*MAZsuHdW$uN36eXE+7Tzs8;g^tMv>}WVQFu%+tpySgD z^%@r_Bj0k{7XgMO_qYsovtXzW+SA=Zr&62rN4Ss*3yGb(BmE?ez4w%+HOjVokNB~3 zddvhKz0lZ^0o11%N;*}0Jq-gs<&QEtC16P&eAFaD1b0j&pNeMgdHHxFiOOIRixth z{zW;5JH;fe3SImqMgTTI$-hUu7H^X`gbqg>B(IUk>b+)}!v2n+C7K2f?L4C?uY2Pm zZ{s~Nf}G{jNkeJz6<`f3`9JG|m7an^ ztnB9(ZFWU7?gCZG^Ain08%6T{GREj=%Vjc(9h5pLcfgfgjRdBTyu)A0vcyK-f-!qe zzxWqfD51j-?@6-w1T(22hf}(`KVi3cmlKIb z0)X2nA1|Lw;ok*g&b{E=ga57x)^CUx z=2wz`)Vw6J;^p1SH-4X}9WZ%Feq-gTr?^L?XuC6%I+x<=`N^z<6!37Ek^(25$B)I` z+I&>IpbogNkbTb@wb+;^sqBXG^h@ao``R>#q19tF+h82;!ogI;eT^#gF{@^aXmV|h zrMkOT#fr4KjlrWsu6pd3gnMaJlI4X+c~UqOY1O(wl8(}HRHwb zBMUV~yIf`ldezG}?1?c&B7yyZ!4Ky(hiYOuTBe{#?d|jOHdHjM^(uDKl7L6%XL3y! z=*Cq(HO(;mqA|W5oiyekf3>E`XH%3;Uu5m5G6W)pGF(;{Yx?d})Fdw_?|`3II;Vc2 zWhVK{+_lp=)Rq8@Oy?N4w;c{cP~MT2y8+6Msr*a+$Ndq82-|H1Y{r`3;IXQxUHWxPxCzxB#akqHlAU%Z#K5_FNZhT;kR=K&m zwI&o8FsW+?wB3QuP(4Cn}rPCU`d7^@`yC%^W_O#Zd)?tH`DC=}a}MLPaLz?LA}w z?@6R4{BN9qO%_n44C&RoN){?MZceyUOLY(!A#<-3or{@;_>HC96A@cQ)dtOS{Aj$1 zluDFRJPU)}f{wev5l<+*ut^w;vJ5tPf3>#tq`U7LJ9zKo;?4eYaEVhtbw?S+2u>Ij zI;P|tpJ}7i%Zzatad(`JQi;%!*9}qX`Z+Cn1E>5cyF%Mu?hji~ZvLqt(f8les8LCK zhAaF-MtWj+K04HS=OkL2UC};20Ln)?aH*^E>^!6BB=>G(JInBv|`kA&l1UU&|8@wYs&MXNhqR=a%}(~8OmYlLSBz+86MV@ zVtX{?Vam|z{=vce^GxXuSIm&U4R~60BSg;K9)`ZEkYtXLv-kEHhyYUX(-YWBDG%5` zgR%6<0tsz`nsL{;GdZvRaTJ8R>er6@)_g;2gMs%leLMK-mOVoM9H0gNWAE^Sqm+;Q zR@RQG4G$pf5xnZ07fre3GV}d8&B|~~rX%7*FWk6trbcOs+ks`$MNOo&$cqy*cnTzc zw@^8ZWrcACol3UlHVs*o2_G)Kv7|qbXH;aD;E?P;0iCSxvjje`yBJ!(P&~3)bIq}6 zD{ghrbQe7-6Vj{`G4W`D!SaU`MLB7877(Wex)Q77ilS|M@aL;_A+O>aJe+<idT-vR0j&Qgx4U4dFwcx?}#Ck3Rnh(F>+=z=>a5YaUAp- z()5txu*S`bsU5j(&EYEQyDI_2KojA$V-#d75QkK4=4w=Vk>f7(woXvF7D%hyWZs;iYLcC}G|4WnxSSH=- zzN!c^P)_zomw6w^eGS>JU-qMXR^n@GHWXEbPQ;1ZHB^Hnzo-#=qxN zk8pDW(BIVa<5BEP5>#z4P2vF9Sio6aYRs(B3r~R1?b#AYDlQdmE^9{q<>_OaZW>S< zZ2Cy;mh$y;9eYwjE!wbBu1#gHhvf2TJ)YYN=Af>G>M0caH#0lxCR{S?8WAl`dSD5S zI26eJcC$!;C%0iL{#^Pp&wtM5z71&7M%?`}rz0j;fBeG^`rd7Ede49@4_h@Px2H%7 zT=BHx#u-r9q&={Sj;3=$TBRt?Llr2r7Pe$$6>>34UZf-FN8=!@`S2SV?c5=J=b`R| z`wd{fAd2aK(H)_b--6h+^VupuR(RuHEHrLfC;Q;Pk~Al2beNOsOKQ@Cp(pI?S#6;IP4~c-yLUxU2O$WK7IAMewjUtSU;R#Cv zXouyR`A7Da#qK!bt`C;od&Zg<$*D{M98!de`v*tJVN_3JqL*jT`V;N?8#B;lrM^Fj zscTNgM7XHUyHAD0e3aPq3TFR^ScuprXRCx%MrpNFqEro&0H9tYGi5_a1OB9~wS8qL zw33=8c3v?0(wccM?iz!B11^^A<~88= zF4qChKx>>kcqjy5F}Bn<01T5_(KFP8I8znL@RpPmVoE8~Or}HV<1+fkV%4CD&?q@% zL;av_M}N?=KAt6t=hTiY7fuyItyOj_Kp&gYc(PO&EDPtNw7(^w6A6;g9?YCWnO>riS5E?&kf zT02?-l2%*kv8^}v(ieu?73kTh>RqWQzGg#ee<+ylw<4~HOX-}}1i7umyGg}Gb$)r~0ooII6KkorO(565RGcg<5!z^#$g=bu~ zzNd=1D)0s(rN?vxHreA%qe&Z5YrO4>mRsde<8`({baMQXpaY1Nt2SJjtnYpT}z@EGr7#p3Y%edW=%gmnQt6)_a}g0>~BdWZ{g0~A~&d#95H zJl*h4me$QRblFnEfg|PpL+i;z zt1H+GR`6M>ij`}I^m5-n^I|J#=k-LjLL%S45jrVNKdLX5&f1^1Af+4^+{DKR@N_{m zMmso&v7WZgp>HqjtzLviw??jkwqWm{SK|!BTs@rT@FR~0*yRxB2av^arnSh-^79_@ zS?0;3iICTYrOBR3c-%ChC%!lzGOlW{5|_T)(3fzN7I1Jn<(;TJcz~^TpkrswbXoq+ zl>2$TET1ORYrueia-yzK{-xuizKo#Y0SFER@f0bb-1G(W(k{e~*PxZ(90kU2i1KVC8X!`MZkZ zs8gNUJnjr2-ViRiLvsO6LB;oJ7=mQ}fn{a%1Oq;U%i=$;vnmKMztc`Tt`b~l0%|k- zY8)^?fQTpn|FSuU1fVeV}JD1KW4RdNeDwV4KIi03Ne90*ekw?@e~O3l3Lm zXOG)jb_QGJOIsD~s>n5JKZuT!*q?jh4RPh^3=iaKAq$JB2k|RKNig2K(jDD2qX-xb zGFz*3eI$?96SqK4!Tx$5K5&O>SYH=FQ?}7mQX4h;znvDo-Hg!cry)dX7=TqYEWF!} zVf`YXs`aNNLd}XQx7PHbNa0mq$vSiU!H3%`sYciUtFPyD^L)6^O@s1GXPk$QVt`*v zgv4z5#>QPHj+He?to(e-IKIYdxbZ8!e$w4dBX-7^*YFK$vfW!)G}Q$uNwiU&%{9Gd>;%Nn;^UM3B>y3!*Pv?UesOYQ6c=9nt?aIMK&F7qf%8t z@OiIvwT5^!QZb}PcI9wYFJuU1e8lm;oD-XOXTD#*pysAquqy!%33AhnYr6p3Mn)R zlpe7$8o~iB4)s11*CWB0i0qiOvb*?zN-`pBC;Bewv$9Udvd9}3?p`b7Jt^v$gzU$Woxq+o8p(AH!a)`9jvQN?b$S91;9shm)%jwaT2!u07lZqkS6>Im)u0{j7HOFD zHPO?6u?AasE~eJC2!*aF38*JG;a>ITr4ZV`Zd5>>(2uc&650|Q2m!p{=v95n8XEU} z&KnqU1s4HX7ki`mp>7Ckc#;h^6<{qiw$&Od%5Tvm({SdO0sVDovAIhuFdF1TYmOL@ zBpfrAhZbn7CJdf9(7{EkzdEU8(+6#Gll|RNe0ftq(|%yH50Fwzj6FChFSz;yQ^Cx< z=Os;Q{alx-IRA)Ah`GUmI`5dY+(wN`Qe@_S$~rIsKe&BD_`mU?xP4Did%4+*-B8!B z%bA*0GHZz;oNf0ZOq^jTcU0a7=t{d0q9bAt!hf5Qzkaj- z;?kN4v;|)8i}_>AbWdzPzkI#zQ<4UQ3`Oz?5ic9rC}hYOAnCs|KHu#m9gR_q&6a1E zjiJI;aWTlZFh$gGs8Fa7(^*27wrDTB@~p48qnT0<2%PS7jz~B*D1g1lH3iA!7Xs*F zvNr%Vq|kCEBkafN*~oq2=&?G@O3$A2jOSLDC?acYJFGFM61mrfV;aG%)is-pZI;ut zs{i#8NNw^ilnsp_VlZb(+d>r-eS_C^&+8g zGbcw*n@Ka{r}C?GiX8rzAag(bIw&mqlQh%c<$fKvfEedojbIwPVk~*M z<;9*O+;BC4X-P~!v9#TT=V1|~z|vhyExSwQb9tx4g3DL_n}I()4@X}Wh9df_oEiRG zQ2Yt*XI>X8iP1}76T0r;UA^AhGEg9wW@e1+ZFYb0H(=wIE2i#19u%fsX_f|6b#GQp zu-P`nT(G%yk4Ml%m{W|847mpEM6j_426wt&gONIn3gm(X6Wwzhrq5k2c5ylMsr`qs zQWqNRQj?n^rJ*Wb_}n8Fj(ExZTqQT=$Fh>C}5{HWH1PCi|BPfv6d~%)7wNjr_`(75IOUKzO^ccyE&=v?PHb7LrJY29r^5ye*|7)jKut&=cmx;sBd7jhkx5jMD?zfR{g7= zZFK9=#>1t{EbmalN^Oux7`>LMyY~f6#@?Wgbiyl7WQpa=tuAloiXuMZH6eV4Bt+Wx z-5u{3K!Zhki>3Feax(%e?j5iz<3E^CyOy$B-rLv(b*`1V?L^X0@ydw+HUmU^#EC`~ zWNs9wyo>lJ081)p*e6Qgwd+re+l^xw|B||b)k#1I8T#d}w8NBnX22yAm9X0qCc`aeQmEFB1n@*h# z``0+4m&9vQcyL5{p#wz2EviUgnD%>0Fq&h|6$fh5X>LVWrcjb3f^jfLR_GbgjrEA* zVNx(lg&z{(3?J6Vj4mu6yDs0gnVeP#;Oa^iy2c1;Rt~Ozm&J2iaO6?C08-zGv%#bb z(KRLX3Q@JFca&<>vS)~q>LQ2z^bT&_LKz*b1Ww4jxFq0u-bFByythk3KKQPdnv+N3 zEn~{J1m*JX7%ThEPbz5X9DM`k-kmQRv#=WEtK+`v7O3Dc$0WEC z>|qHDOL)&d-nT+bu~@UZS#ua;oJ^g59MFDT=Mo;~#Hy`A7mH%BDu>UTB^45wPBqbKNlS&#HaS#9aUJ$mqCGfa zPy?Llsd_x8(Qv_&4ABi*g9TsD%PQ+iDBsj{iHnfL2Sp=_24iV}wvV<@KyKZ}I!g?@ zJZuaPPk%O0SpjP7ajj6xVvQxXCl`-GfSVuXQgZND7PJpa6tINB5Dal1a#=H1{VmUw zy3<{&=>r-purBoF7~4&?o9C}I8qo!W}7H0zU&9W%7B{R=~>&;46UB-IACj}@YJQQ3@R zGfx;W9(ETdF*>d6YbaMN=%4G+>LdWWEVdKko-Th5HRvX)=TZv#O;$ngEa^@D&oX7^G;JXi2IcjYE2w&zq{ zW`X2@zbKY4eo#_sxo%^ks=_{GRH;3jBUR6ro~|Jn$oECai3T!B4}9Vujf@u2!jP~W z()8#h$IRDTAcY3JUOTQAkl|ka3Nq%*O!Jl#7v)}j{YZ*CShlHY;{wK2_W-vPUL}%R z%L@*5sK)-6Pg5fS=LirJhHu_2iN)wB>ecjXzjta1*vxIerGRHiq8M4vJv%=R1F&AC zdJ>24^gkbhz_Eq@&Y@PTso{7p3jMI~jVq8_op1ZXn6mur8D`uty30O~-Cs#(t`64J zw`L-reIyH35}Ui3^CBt7#k0FbG#ZYo?uVlc`CcGG+Y0$7R9>^2<@f|2UXA{=JZs*I z+<9tdV4}SxKA+UvrS3IRMf}G>k=V=(F$ebns9U;mVjvrSoQ93t>7J<)Qi}V%wW{GK zmGadWT&l}H+R+w>n7zY+4gMo3@&OP$p66?yIGEW`mkuAcwn=)B*!H3FRfJZ*{@(XD z8*>`7ai*5ML#-~!Aczcq{hzE5eZJI*&XR3_P7d5m?KfFXqJKDoXIO65p-}k0Yjd?e zs-b-1P3eWk=HK=dQ`p{5EC*D!UacU#C7W4$u`}7x%Ks8^TofqQ8%)yDQ2Ee;Z8!X) z2V9MSAC_kt#KA zscJ&Lu?$mYfQaCO+7~59pPb1bl|?VhB=S({TY-+u75_~-0K@2=t8xQEf4<^ZJ`t2x&ibUY|uhMUUx9>#)G?W*@+@VJ-tKEHo3A9Vq7+K2v&@c=GP4*RE!E4&)|H zwU|3z#3B#DC6!d3cxD%GSkXm$fMHielr1C@{zuG~In_nEJ}DYNWZyu&?65Y(99;7PYGxPIzujp;MO7JNwVgC^kbBla zu=WH;?lcPje0p$D!>U3K`_1ke7a>MjkdE-tjXYPSdu?AaK;=o{h$N(q|CGYbnuP57 zYFD_~#k{ijnGf^1qTJMb&?Mi|g~A#gJ#N1h45UhGi7?nT%`0(LX{?8~fwWpcA6%BM zoM-Q%Fr6mr7MjbxUF1C;ePh09zh-p*%h(P)n#8nhgk@QI=#c$*PT0Z-6mk!9qa=Rt zN+SL{;6y{I}f14H1*ih)drqJw%wtm@30m#UZ%pY4f7VzLeCV^BsK1$ z0fSQj&(83W0B#RwPh9|U6KNY#M7{%v^6O0W(TTclm&fGAh+RD5Ah72&)q^OgFEKm| zPG)!1^%1dtH7yr!X&}C-qnk$zSrv{7kyJ)$wZeU;sBLnh47Kpb6^_>_4lv`_FhwTkkIb;l3CkvaUS2 z*m8lu7x=4fY}y^%19w%0Nd?C(xl=8O-b1T%!!g9&NF~PW*%!Tcc(*eKg7tUv{U%8Xp1+@4rY1ZRW({`ORTyud*()sjfGaM%%AO% zRQrfoiW%{*s2Fz4f4jj4nujm%3cb{m9G{Xfs z?Dn*~}L5^+z|Cd1sMCZ-gj?}ri^ z4xQ2ymc`u0+-EAb{sSJEu|w|~4T4$=bdu-Lb_@tBak23P;ck33oDwZ#H> z`*mMD&TDH;!EqMn<)sn+7B^U@lH%9~HD8MxG*z;NAE5e9p{cB*(%3iFn5(Q@OHRE6DqoWU>-z=&clJaUyeziRO-dVrWFdS^ zufGcK!1F>DR`BNP&4sJmq~Y`pot^lA6z)s~^Jz9=In3nG!!`S5nY|}5Gs;6xY)QfB z{r(}=fbN})jS#wN8E^R9%R@%L#cQ z^PJhJdQBU%5+>R&7IojH1-GT3uNB`SDH!;`2%(*igaX}0PXH~)pQh8aQ^RkBVV(c_ z$_Drk)=3WExI&>e=N(JCAMSl&icci{-qifHtr>y9eov;&jCaF*->2scx2Ml-efHTf z?8DHu5hY4b1&1{csN9T7;GEa;R6smU*mAY0F;4Hvfc&7krD^T88?Rf^MU<6x$%nGYrrIQ`5= z)&0v^)g8=n&1se=doQY#I}0)1ZzvN5eJl%MVJN1YjgSciFMVe+2|LoN?Mg=Fc#gJ9 zU{f?pmS4-3>*!l6hIziP#X0k!4kKK9Ke@-^%x$8LtnCSLF;HwnV#3aDPh)2Oldf*( zV&?bzC_$=gRhy(?8QPY)9Im232<)Ph5x*)!)EY}vjXiIF|HH<2 z05VhnBLDz=aQ7DO1-SR5FYEdHenaqv-`*WWlDa#^e5MWu5n2EN>_B$1qq2c*pbe2I zfKcTH%BUD9IyM8*QFKsU|3?)lM=Iza8lcN)fK3BZKBU{$@qM!2_u_m205k(eL;zH5 zM9<9Ld;a?F`ljw`sv%-T%*ZyCEHsQidPpj`1t!Vs1R z3n8rf{XjU3JUIgTS9IzgS{0p4iAJCB#0)i$ZHxlmsac?;4sW%Y0H-l!Lrfx+c`d-)_pS!H$Sbh4~ z{KU)ydP)7|{xSkFVzIF_VVN?Nl{s9T&5lNZ$m@%@$R$8MS$_-6beT#B3b+&{uE~Tp z|M&b^DS*s1FO$5lJopBh*$QVk=R_vo6-1?kGi#DU>Ku35p)j@R8vo!QPBtIt_DX`F z36$fQ{{|yHu%v-THWQ!{e4-3k;Fvam6>)j)p!V(t@u>p?9UwEvU<|AYz_*C3m$v}@ z;vgCw$0^O3z?nZmKEHH=_JiJldnHh^HoiT8It1YX`j8iX5d6?NQV0ixXVZkIKi^n8 z%CqBA1em{6vvALHGzfqUVh=CiZb-S(N&!nEGY>4xXW2RcofNDm(dCbgi9K&4f9oT| zv%~PrNjyAc^&b1{o_$G+3=G{jM$D8)6 zG^~IpShFC3uY|K^m`GnS7~3Q_E}JiAW@dDSV}Dzh_i|&)gxTdB0+b$%s?2soEEF+sS*TI_S5y0PB=0JCy;Qcxp@2d_Q&@Rs1bVn-8alL?W*rQGSSG>%3? z3%r8tfbIXzb8razvw`-4^w0?->jnXK{%1Pd+}X3jal)RrK@NI25E3 za>Mo3_e{>lKk5m*bs>yDPQ&h5a5E7;NW_*nU8d3Aj{nmIfC^@5)LFbWV zlW9LpdJ08okcr=f0#WJm6&`&ka@lMU_#^izO*w#UULj@GX!^+f7d+1Ab_NR)QkM`8 zD#2Gy>0g)n z2p?{RJT#z5eooGE&I;nh1AYW|eBctG{1UExehqN)#?F%BZ|?0Pa>PwULqb60qy2Np zO1IGH3_@NB8ctTnZIuO%Yx<8@9q&VA0*ID`ISxPopJqHC1+^}k@a)H5>U-oS{&b3L z55~cXU0Nq0WcT99(hT6BZ*1!Ud5P;x8*>v0t4r4U83fE;2aXGK9CVF1t{lbbSu|>5 zg9N~$(!?bo2QJPkTG@3=** z98$H4`+zmRm3aF(@aLf`b{(LSg3L~uJK+ab(6r{Z+w4$k63U$0JvfhEM4H6alOCp3 z^xWG}Rn&1njpn$G5lRlM5VJ(eOyY)(KQjqs?xEOADh32gEQf9=%P}@8Aqt6Lp_9?Z zgFUD?FC7q=0fan^>iaoOfTR#6B-Fcbnu+;dpII2~a7?>vVr4~P$lpDZAJN4!j z?^9}@(QeKrR_#E_60A7MIk248Z+l7#%VOefsqL{3moUy(7ZV`*SZKA7r( z=O14J{uwu2%($?bb4u`%>Q%8k?ZMB}ykk2ak$hV_6hI6A_vbhic2lm28rOD?B$}s( zdk;}5Lx_wY554%NfN};=76n{R&2nB~=!*7S?tNtc*GsE@scRxqy=dLl&+Nohc` zC9I#2h~5(eITHi1XJ~FZ58|hFof&uuv@%T7J)fQ&>qU_2^giod3LK@-&m6p;f?!r^ z=AbX~*zBufpoT6}{tqY+#U{gB={k}~d4fK7Wv6mWvDcUBGlSbib;&#&I7l7xK z$dmpjxVMMk(#S|qkGLw7wpq<78(jf$lTlvuoO9sGTkbc|2!=;eb!m9=&Cdjz-kH&z zHvsA0&wqQ~GE4g#Vk2n%Ougrq8JTf6w~41qr~4rW2)B7B*;|(Wd$4IfQ{#y$*kohA zZd=H__6t2jcZmIfM)32Kx8Gy9>z>TEp5I)?>VFR|kOuvaR|ZJ5nH|bD2;GVcR)2m}wXjluO1A*9 zhhvs{6gyQ3#j6SSRv6L;4cT85SKQTp;RJE#s;|r(*Ti+vW)_qrAH_cBv+ZTv0~ARF ztpzv#Ki{*-)2$uQ3a%?{m`y%a=$QRzTo5c!erBu9xltYzIMmuKiLzs8S) zZ|&H)8ttI|B^P^f?1IcFF|3WTxok`@>SW5asG41B;S>#slocyaV7Bz$kTnqBil1)` zlElOmVwKYQl3-gWc@x+|Xf?C0V0%KGbN0p9+a{_zLn1;8?$YI^X(Wx-}p+Gnk z-_$l@bdze+wYTcnA{{> zgbY&-fROE=FIwVDIeFm#I_zDYahgW(+s&l6MSr!NJ#X}mWyQ;@^XY+Nw?RX4Cl^$c%#OvsitufrwL8}Md*<|P80jW{#E;+q-uVjD4+PA6OCB5-Z_jgT<*q;MZp z`vmE&_3Wrf*^h?G46)3ZmHgyU$yA~6`~EFeCKx(?5?qTsMA)>mg^`ygtH*5h7x9l! ziclH(2PTO*E%G5OR`n&(#NEEbK(iVxw?m(vp*&0=S^Xj;hrT`TdUR~-4}mLi7s($8 z+GqN$Aa)4z{MrnfhEtR9{K+n7Pd7#`bUfyI% zI`l;H&NzVdR;Sx%<(u1mhC+@5b~ZK}toM0JM`ilX{sv3c2?62+O6_k)Fz-S1ucV@e znvAkSS{Gi!tDV*|o7$mM#*sygUG{LLv5CpS79x0}e|(oe-ZJ!o;s6JXq5d8O(tyZ< zB~+(Mh)OV7yNUABsSG!f?X9_#D{9+v1(mHC{H4+gw9Mn_R`Z<+t)!Hu@azL5TmdHu z4kzJroN70+E7aBr3-5*|a+Gj3Hp}5Qe0Orx7J&M#Rgx+4JtZUOpDB?~Gp2g@M@)|g z?xq?&yg)w80S;C>npsr4)q*1wT2?dy!dNb+qF<+Ld8G zABfDjjG+q3m15;f=G~b^mpvYmx)#U>L~Usp%O-HVmP1n(rMQ!)CSHB0W?A<%Nl7$5 zb`LuAOR-|2ELZW)FNuW=%r^T!MCmkR&0djy*PBc9bCkG%sFO`kf)XkisdNUdfZr5% zKBfM>&pw+I-12=2#Cp41#JLMi!6oHA^}hSZ=s1WOm zeaQ)VyvP9ajATjT+lC<2p^hW*IYq2*5u+{a;SF>o1kE9ht{sjRA>#-#Ll%coum<`9 zjjB7Buf-aK>Gy=JJ9cR-kXml(!H;SMb%UdM&#!3c?g(n4(*7mkm^N*F=ZkZLw$4Ro zy!B4R)>eJw&^>9JLd+U7iE3b}v$BosmAm_u?^J4D4;!*t#KO`FMiGsM@*LQ?b@j+o zVlCRI2*xHZRl9VTLY0S}9y$va)oG8Tv|Mxgt`QP%i6iHIsxZVB4LK33SgE@ew9jSQ zrIMS#Rp>z0!!&n1hZ3JwyOJA`RaT|t&A=1~;!&)_Q|c+b&9wH5)A<)&If+UZ=BXOt zCuSI+jcaKX2pm<)8j)sLQ;qJ`&y-M%vs=S^a>EQ#2IKJ~%)mg#$4~V744*^y=zGN8Wi_fl!iLO52IIZmrKsj*B|XDRmht$~rsikA$1+g~nMUD_v?Fc@CFr zsSY9=m8Kr@SLK2&D1|;91#2}p;A@w1l9Mn0l-tBTO6FIqHcqXjur` z?D=NQ;vcv11D<`zxz4GglY~c96kfnJ#iJlQDWSA03L0v70m@=qLo+npYNL@JP3Wt{@y2U%f zRqmUsJ6^@H`T7dS7VUEF1S)t=G*YQUjq^xNT>UC(7;x`c*s4LM^8K0rZSahC^~be& zQnS{#S;Pt|5m)P8qd^8%v3dc35NuDSk=l0sFdyPQb_)+b+5Wi-EcZ)_^(dmc(GW^}NUK z6E#BlHX1wYf=k5|ZPb4(Z{v@2?$Sa!oz1y3?OtOxHBYa881~gw zt@`gP0-y9?4WS5MB1@VQa7&o{UB3YR=|}BCYE0%q|!*9hw75Q zxKs^6aETXmA|0ahyH7Mg?jgBg&u_0ci)nxksuwRvye3*tRTYo2T;!K$#4+?E(76lR z%_Rv$oH1p3szz*yd|$?(BQ8N@e=cqubh_Ojsc__~Tgm&jna0!`W}k71N9rh#j)yN< z>$3YAP*`CM0@E(6Gum-=^!N(iotU1^E&!Ag zq4@Typnf=o3HS;w=a?*xA&%k5ao_|l6pB+Hc>Gw>m7y{?1&Z#Y6J7IMLups^ER?LQ zTMgOl6Lr{-_DiFNRfWM!!YB zUIm3f&?5!lfM>i%5!f1O!td(TQ=0yPrpQFD0|!@1J+vDsNZmHwLCOuCQ{av&1VK&; z#6aN8WRBW5ag=_h8{SI=f543d39gFpsd3(k(J_|SG6pnf^H0+lW{X6OaxQ9c;HFw1 z$$?@IaT+w*k$7)TSI-TF33EeghDqp<8=GTVB~7BCEQa_(gX1Js?f6`TqP4AzEV$T{ zs4hgrtcoy)OYBlnP76OYwf4IVU@f4EX?~)B39JD-ADjKWOV3HlyBH~3>jV`Ei$GRl zo=_x{e3=DsTJ`almE{-V7I%-E>XXRn?$^EL7xqmbVk4foN$}U(Z4a`xH&7F&;sWF&Vv}h$%_eqH_!FsK1jYC~a-g z*a-Eh;oD)W8jvygX!Q{#vfU<=NO3um()_J<4n79TAa=&Lh~Vi&fh|}4LK*Jm+p@sx zOn1;h);}*9$ZxWDG&n6jx+LfjpW(>-amr<{UX2LUS#ENT#}l`*%_ zQiRI`7b+l3OKwVuW%4vqPp_3p z|5X?K$JCf&5i@3A(~=^(v<^Tzwv!CxBWIi5Z5|`yLqZnPbs<=4kQN!7?*50g* z9RGrfh@RA$*rh7ONEF2&A08D3wV|*m7ouoK5@CMvzcQ3+vl?ogZpuZB2_he(VZ-F1 zsV@vT7tDp6FZqpG_ob`dX2!FH2D@nc*LRzm-XXPC&dj+bEOv%uKh=W!B^9ndc|@1> z=x=s9`K~cYdd$K>2iEm)$?ri0M9_Oh`YA>40HHn zWcB2W*Ou{H6q}nN^y3JHP8Ndj7^UldGh5`Cg!k}806Icgmyol>_(|mE!bO-kpi1uX zzWGYoTta$}uZxl}p)(dx{d^<7%{{`l7fEYi1I6A#z^@Sm_-F&&D~9~4pu z#SjXjhk%3wIw0Wkr^*nS!BzdAQZsf-j!9^=w0$SRO^bG75q!B!Y;vK#5W6SdD@+2n zG{;9kn6EqPUUG1G8N#~>czxP}cQ$DkeX~jq2tea{64n9I;^ z@cwnk;-M0Haua&=)b@mMwnKXaD#L}K075{$zh3Z(;NNDR6exU*8%&+4LBd_~(~rxg zSeUTq-WD-I4@{y-tEGg^7rupezVZ^%g8QKyX#`K^vYaJG=*^s*9{dJn?h^i3^os;(XTBz$q(KmkH5hrIZnP$r(!}obB<{Pc{Sd4AOH%1nKBUkNJwxPy}{a zLZq*99fVKmm^=QMx=3i+tKCLxAJW6-&NhMnn-|nnK|3XWGn!xG)kZ0GrdNj(*3f>H zj@*luP0O2uMc9;0+8NnBz;ztUhvEbrb`_=56ZY-h(HMtvgNgkxBYVSZL8rk2w2KHY zGAvh0fQ>zkk1r%(BR0@Y{uKt^TRxqpvhst@FaKRwr))vy@r2U$GC~S@-jc=y`B^k5 zGGxPxK}>GUzG(O-v?OQKRbd?u;{W3KJD_S1J&1|y$)uE$D&dpQ5c_CtJGkoGde#qQ zLePkOD&GyJKlkrNV^Pda^!r*=ly4eDTZ}IXl!MjvT6a2G5xi7HL{cbrukrE41YZB4 z{s0-jkT=)Rm)E2ZkSSyV6!)Sb!26-u|4NX&cdfjxrOrw?^VcWd#QI>|9^a0 zS(d+fI`?xHi_^G7grwSYWB^GqhF5#89pUJmX`q7^M0BMOjq@8q4vp{5Y=E*1OsFTf9rPhjI@8(NI3rq~;#xCz#_Hq48Yw zYKKV+N^`xBbysCh_FFj1e%?6vtvhYa{IW_EN{_znPyMRp^A#DPNk%hV@M0KwNx1|(L+Imo?l-gtu z2v5yU8@fX~LFkl9D5zh&EPFi=vTHPIfwSOxGS)H&hW(!uK)(69L_qZr)y zUl^C1B1QMi&>_{~&N42C>)!r>WNiMk0&byW@V6UyKm8P^J- zaVc(_rEhO2QjfL156|8nEUpnXvZ!Hq+Z48=?ORqmE5_DDs68%0z^39{6P4QpRse~l zQx8ql-*B5H9aYrW1(uyJwm)8^iKJc3%)_hjGwVf0#!eM}#&dFg=wb�vf3yViQNk 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

    2. c31fRAxJJZ^fmz|H4LaFs{ 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 x&t#RaE)@;Bk?c_71xZ+(6JLO4rIGOFy>Gs6Rkf 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