From: Junhwan Park Date: Wed, 19 Apr 2017 10:20:37 +0000 (+0900) Subject: examples/easysetup: add an application for easysetup X-Git-Tag: 1.1_Public_Release~597^2~81 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c175416b5a62db0a9fdfe429bdf7496ad3474cb;p=rtos%2Ftinyara.git examples/easysetup: add an application for easysetup This patch includes an example application for easysetup. Change-Id: Ic379a4d3c2e9600620926046e0b05ddf1bb7ac8f Signed-off-by: Junhwan Park --- diff --git a/apps/examples/easysetup/Kconfig b/apps/examples/easysetup/Kconfig new file mode 100644 index 0000000..508829b --- /dev/null +++ b/apps/examples/easysetup/Kconfig @@ -0,0 +1,20 @@ +# +# For a description of the syntax of this configuration file, +# see misc/tools/kconfig-language.txt. +# + +config EXAMPLES_EASYSETUP + bool "Easysetup example" + depends on NETUTILS_WEBSERVER + depends on NETUTILS_JSON + depends on NETUTILS_WIFI + default n + +if EXAMPLES_EASYSETUP + +config EXAMPLES_EASYSETUP_PROGNAME + string "Program name" + default "easetup example" + depends on BUILD_KERNEL + +endif # EXAMPLES_EASYSETUP diff --git a/apps/examples/easysetup/Make.defs b/apps/examples/easysetup/Make.defs new file mode 100644 index 0000000..62850c6 --- /dev/null +++ b/apps/examples/easysetup/Make.defs @@ -0,0 +1,21 @@ +########################################################################### +# +# Copyright 2017 Samsung Electronics All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +# either express or implied. See the License for the specific +# language governing permissions and limitations under the License. +# +########################################################################### + +ifeq ($(CONFIG_EXAMPLES_EASYSETUP),y) +CONFIGURED_APPS += examples/easysetup +endif diff --git a/apps/examples/easysetup/Makefile b/apps/examples/easysetup/Makefile new file mode 100644 index 0000000..bfbfea2 --- /dev/null +++ b/apps/examples/easysetup/Makefile @@ -0,0 +1,142 @@ +############################################################################ +# apps/examples/hello/Makefile +# +# Copyright (C) 2008, 2010-2013 Gregory Nutt. All rights reserved. +# Author: Gregory Nutt +# +# 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. Neither the name NuttX nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# 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. +# +############################################################################ + +-include $(TOPDIR)/.config +-include $(TOPDIR)/Make.defs +include $(APPDIR)/Make.defs + +# Hello, World! built-in application info + +APPNAME = easysetup +PRIORITY = SCHED_PRIORITY_DEFAULT +STACKSIZE = 2048 +THREADEXEC = TASH_EXECMD_ASYNC + +# Hello, World! Example + +ASRCS = +CSRCS = wifi_api.c +MAINSRC = easysetup_main.c + +AOBJS = $(ASRCS:.S=$(OBJEXT)) +COBJS = $(CSRCS:.c=$(OBJEXT)) +MAINOBJ = $(MAINSRC:.c=$(OBJEXT)) + +SRCS = $(ASRCS) $(CSRCS) $(MAINSRC) +OBJS = $(AOBJS) $(COBJS) + +ifneq ($(CONFIG_BUILD_KERNEL),y) + OBJS += $(MAINOBJ) +endif + +ifeq ($(CONFIG_WINDOWS_NATIVE),y) + BIN = ..\..\libapps$(LIBEXT) +else +ifeq ($(WINTOOL),y) + BIN = ..\\..\\libapps$(LIBEXT) +else + BIN = ../../libapps$(LIBEXT) +endif +endif + +ifeq ($(WINTOOL),y) + INSTALL_DIR = "${shell cygpath -w $(BIN_DIR)}" +else + INSTALL_DIR = $(BIN_DIR) +endif + +CONFIG_EXAMPLES_EASYSETUP_PROGNAME ?= easysetup$(EXEEXT) +PROGNAME = $(CONFIG_EXAMPLES_EASYSETUP_PROGNAME) + + +ROOTDEPPATH = --dep-path . + +# Common build + +VPATH = + +all: .built +.PHONY: clean depend distclean preconfig + +$(AOBJS): %$(OBJEXT): %.S + $(call ASSEMBLE, $<, $@) + +$(COBJS) $(MAINOBJ): %$(OBJEXT): %.c + $(call COMPILE, $<, $@) + +.built: $(OBJS) + $(call ARCHIVE, $(BIN), $(OBJS)) + @touch .built + +ifeq ($(CONFIG_BUILD_KERNEL),y) +$(BIN_DIR)$(DELIM)$(PROGNAME): $(OBJS) $(MAINOBJ) + @echo "LD: $(PROGNAME)" + $(Q) $(LD) $(LDELFFLAGS) $(LDLIBPATH) -o $(INSTALL_DIR)$(DELIM)$(PROGNAME) $(ARCHCRT0OBJ) $(MAINOBJ) $(LDLIBS) + $(Q) $(NM) -u $(INSTALL_DIR)$(DELIM)$(PROGNAME) + +install: $(BIN_DIR)$(DELIM)$(PROGNAME) + +else +install: + +endif + +ifeq ($(CONFIG_EXAMPLES_EASYSETUP),y) +$(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat: $(DEPCONFIG) Makefile + $(call REGISTER,$(APPNAME),$(APPNAME)_main,$(THREADEXEC)) + +context: $(BUILTIN_REGISTRY)$(DELIM)$(APPNAME)_main.bdat + +else +context: + +endif + +.depend: Makefile $(SRCS) + @$(MKDEP) $(ROOTDEPPATH) "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep + @touch $@ + +depend: .depend + +clean: + $(call DELFILE, .built) + $(call CLEAN) + +distclean: clean + $(call DELFILE, Make.dep) + $(call DELFILE, .depend) + +-include Make.dep +preconfig: diff --git a/apps/examples/easysetup/controller_cert/test_ca_cert.pem b/apps/examples/easysetup/controller_cert/test_ca_cert.pem new file mode 100755 index 0000000..24e1252 --- /dev/null +++ b/apps/examples/easysetup/controller_cert/test_ca_cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDkDCCAngCCQDNBYyeTQ0JVjANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMC +S1IxETAPBgNVBAgMCEt5ZW9uZ0dpMQ4wDAYDVQQHDAVTdXdvbjEQMA4GA1UECgwH +U2Ftc3VuZzELMAkGA1UECwwCREExETAPBgNVBAMMCEFSVElLMDUxMSYwJAYJKoZI +hvcNAQkBFhdoaDA2MTkuY2hvaUBzYW1zdW5nLmNvbTAeFw0xNjA5MDQwNjMyMDJa +Fw0xNzA5MDQwNjMyMDJaMIGKMQswCQYDVQQGEwJLUjERMA8GA1UECAwIS3llb25n +R2kxDjAMBgNVBAcMBVN1d29uMRAwDgYDVQQKDAdTYW1zdW5nMQswCQYDVQQLDAJE +QTERMA8GA1UEAwwIQVJUSUswNTExJjAkBgkqhkiG9w0BCQEWF2hoMDYxOS5jaG9p +QHNhbXN1bmcuY29tMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEApQic +nEB1U7LV+EjNhe8Nw7kiqPtkigAC8+lad0kJ+phZ9yRZ/1+/Qp+Ngod8LcR1Cath +szXskEhFkodqLynwYrb7nDLSsFDU10oiMgHxO+PyGt76IBzpGEc8OG9Ha4O82ARa +glZQ/8kuHt5auDnsBbqYrhznzYMzVbbrrJnG4lirh0hJYJLr8/Rtvh1u1N2aeyz3 +XAmO27N7DZCtLXFtQgfd2TbZ4uvX3mGkgQUru9mgr3V6hf0cFTXs8iJ/IVR8UE37 +pkZTzZdvnLqoWLdlM/lgtzmsaDF7tlj7NyHf9gil7NVAUPAunY/HG5P1tcnookJi +lL+NwiaLgbPcozoRjwIBAzANBgkqhkiG9w0BAQsFAAOCAQEAEAF0GbZf7YZlztVU +mA2yGMOdt/gc0sCBJJZefxXgCI5poNC0H0CDwkqwZS9Tpe+rA1vwE9Be69INNP1d +/tX0Z7Xqf22CWGoDeQdiHl4OfumY4cLHrz1BwosHLgCuuIUbjTXtmjxA8T5VFfNO +P/Y8cDfLCbbvzhOq/qRvNayAk7oNsAzPZOZR3X4967fuYdUk1Y9qgW3FF4asv8KR +lCTiKkSnEOmQSYLYGj1xtgxEJbSWNmld+Bujxso8ZkQnxk/gKjn3qv4Wcpuin+3n +fwWb0zmYmGCWGt3ZgqtzrGJQqn2bEUhFHzsPzINDdLlyI/Y3meOoCc+uGVxegT7d +ODC9Ww== +-----END CERTIFICATE----- diff --git a/apps/examples/easysetup/controller_cert/test_client_cert.pem b/apps/examples/easysetup/controller_cert/test_client_cert.pem new file mode 100755 index 0000000..c934c03 --- /dev/null +++ b/apps/examples/easysetup/controller_cert/test_client_cert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDijCCAnKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCS1Ix +ETAPBgNVBAgTCEt5ZW9uZ0dpMQ4wDAYDVQQHEwVTdXdvbjEQMA4GA1UEChMHU2Ft +c3VuZzELMAkGA1UECxMCREExETAPBgNVBAMTCEFSVElLMDUxMSYwJAYJKoZIhvcN +AQkBFhdoaDA2MTkuY2hvaUBzYW1zdW5nLmNvbTAeFw0xNjAxMDEwMDAwMDBaFw0z +NjEyMzEyMzU5NTlaMDkxFTATBgNVBAMTDEFSVElLMDUxX2RldjETMBEGA1UEChMK +U2Ftc3VuZyBEQTELMAkGA1UEBhMCS1IwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCiZCHPHNtJbEQB+NWLjSD+KkZNKfSCPKQpfWvcxATWD/NrqLGtK6Gl +rfuaunJuTnGTVI2QAjSAHYyDyYSjz5+A6U9b9ikX9n9aeUcMLM+YiGoxTgosjozl +pZ/Xj9DBBBrpVKE2TpJeQZwHyEisnHzLoIpRUk9HoshIvM1VhST/+ljmdWEUGoJO +a0Bjnu+9cIieyFmJFgxOcewtpAuzIMoEWzf2XICNauQmleTVNc3TkGdI7xSOxswW +23qW1r8B71+N7jXRZqMmll5zOx72csl4yN2BIQ8N3D9jepLxMVPmNNdwsB0vl6tE +8XBYDsqrJiM5btv1WhVKCQB85YJ4uPDRAgEDo00wSzAJBgNVHRMEAjAAMB0GA1Ud +DgQWBBQugjgQS6yL1j8vCRd+pG3A/paiwDAfBgNVHSMEGDAWgBRm83GkU3388NoR +Y3hQMpXH8VpoZzANBgkqhkiG9w0BAQsFAAOCAQEAiDnO5R/NlRZd+XpHHO/oYBee +XPIP4EZFOTt/N0Kcu36byaGhY9BPDoiy/S9wIRxOPIfFsehJTDC4qAxUHQneW14o +xzeZIM1OFCiV/9xWkQLdZwG6nfJZgOmb0KGMsZWyBxFr7v9MwVtuIVr9O4om57ej +fMJLz64j/mj+jRK4acqZVisZfQv0nZUANOQZWPjjlvGeMnWjKqRJ0Cc0rp3u3DiL +yuNE7DJI3+xzloQhcjkv8H7oQAUVPhVxCGGumjly+PQiiclVqOQn6tQcr8CqSvUK +z14Rpa7jNeIOD10MyVkvJQ28QH4w0kSvEhqN28ISIY1E2cvvHXuvGLfNulm69g== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/apps/examples/easysetup/controller_cert/test_client_key.pem b/apps/examples/easysetup/controller_cert/test_client_key.pem new file mode 100755 index 0000000..4139ef5 --- /dev/null +++ b/apps/examples/easysetup/controller_cert/test_client_key.pem @@ -0,0 +1,28 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAQKCAQEAomQhzxzbSWxEAfjVi40g/ipGTSn0gjykKX1r3MQE1g/za6ix +rSuhpa37mrpybk5xk1SNkAI0gB2Mg8mEo8+fgOlPW/YpF/Z/WnlHDCzPmIhqMU4K +LI6M5aWf14/QwQQa6VShNk6SXkGcB8hIrJx8y6CKUVJPR6LISLzNVYUk//pY5nVh +FBqCTmtAY57vvXCInshZiRYMTnHsLaQLsyDKBFs39lyAjWrkJpXk1TXN05BnSO8U +jsbMFtt6lta/Ae9fje410WajJpZeczse9nLJeMjdgSEPDdw/Y3qS8TFT5jTXcLAd +L5erRPFwWA7KqyYjOW7b9VoVSgkAfOWCeLjw0QIBAwKCAQBsQsE0veeGSC1WpeOy +XhX+xtmIxqMBfcLGU5092AM5X/edGyEeHRZuc/0R0aGe3vZiOF5gAXhVaQhX263C +impV8N+SpBtlTv+Rpi9dczUQWvF2NAbIXwiZGRU6X+CArWdGOGt5ibbpgRKv2tsd +vaiHwFw2Nt+FFzAwfd45A23/+ytdQpBCA1X20cPdLOWUg/c1uAXN9aXmO9HSSeK+ +WHtsx9X3NuQApNbp9mIZNlj7tBcOl5q6qn29kPUsOeuGJtXqvc/0j1qmdt6ncC8a +Hv9AOU3An6oKmQhol5axtzbhRtXW0NGPI1IZuP3RR/SyDZm3etJXAd42aVOftlag +YYlLAoGBAM+ssDLcoRq3xuO43gpwS/pZogtrK+Zc1uTIyeXot6WjlMtVdE7+34KX +0DbuAAOOhiihENX5kQt6P04R3EQ5vsJMEK92pOL20lpZabtCtGVQyNgYRFUmZo3U +bp1C56xEOktNcUaUBRmbj9wlBu8A0tV46PCe3S/2qFTftzTjXclVAoGBAMgt4VXU +dGakabbe/YzuXpt0kkVo+a0YQUypa1Gs5Gs9mquuFduNlB8v1BrBZETLfBwR+tZ9 +NgQAQrzCo5l+9lxhwM5r6rg2EbYeqR0Mj+VHqhDH7TrXkCTyKJOjttVQEEthBZxE +3ZaCzBd5G+yfPuctTa/T+hgBwq4tnMukyNmNAoGBAIpzICHoa2clL0J7PrGgMqbm +bAecx+7oj0MwhplFz8PCYzI4+DSp6lcP4CSeqq0JrsXAteP7tgem1N62ktgmfywy +tcpPGJdPNubmRnzXIu412zq62DjERF6NnxOB78gtfDIzoNm4A2ZntT1uBJ9V4eOl +8KBp6MqkcDiVJM3s6TDjAoGBAIVz646Nou8YRnnp/l30PxJNttjwpnNlgN3GR4vI +mEd+Zx0euT0JDWof4ryA7YMyUr1hUeRTeVgALH3XF7up+ZLr1d7ynHrOtnlpxhNd +tUOFHAsv83yPtW32xbfCeeOKtYeWA72DPmRXMrpQvUhqKe9ziR/iprqr1x7JEzJt +2zuzAoGBAKnko1QDL8KNoh6u4PvpuuC1tmkN447rCimdFcKKdpZOd+oaC+ibXfe9 +hvvkazwyxnr+91/sLiT6aKzypTJN2NNo+t7MNzioO07rriXKt8CAcFjqw1KqJDwk +F0c3cPlFgyDOkuJrWP2ikFtoTH4am82U70vojZv4OG4eEqWv0/C9 +-----END RSA PRIVATE KEY----- + diff --git a/apps/examples/easysetup/easysetup_main.c b/apps/examples/easysetup/easysetup_main.c new file mode 100644 index 0000000..4e38f79 --- /dev/null +++ b/apps/examples/easysetup/easysetup_main.c @@ -0,0 +1,565 @@ +/**************************************************************************** + * examples/eaysetup/easysetup.c + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wifi_api.h" + +/**************************************************************************** + * Definitions + ****************************************************************************/ +#define WPA_MAX_SSID_LEN (4 * 32 + 1) +#define MODE_STRING_MAX 100 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ +struct ap_info_t +{ + char ssid[32]; + char security[32]; + char pwd[64]; +}; + +const char *soft_ap_ssid = "IoT_SoftAP10"; +const char *soft_ap_passphase = "12345678"; +const char *soft_ap_security = "wpa2_aes"; +static int soft_ap_channel = 1; +static struct ap_info_t ap_info; +sem_t get_netinfo; +sem_t finish_scan; +sem_t get_ctrl; +static int g_stop_easysetup = 0; +const char *root_uri = "/"; +const char *network_uri = "/network"; +const char *control_uri = "/control"; +static struct http_server_t *https_server = NULL; +static const char g_httpcontype[] = "Content-type"; +static const char g_httpconhtml[] = "text/html"; +static const char g_httpcontsize[] = "Content-Length"; +static const char g_httpconnect[] = "Connection"; +static const char g_httpcnlost[] = "close"; +static struct timeval rt; + +#ifdef CONFIG_HW_RSA +#include "tls/sss_key.h" +#include "tls/see_api.h" + +#define EASY_CA_KEY_INDEX 1 +#define EASY_DEV_KEY_INDEX 2 +#define EASY_CA_CERT_INDEX 1 +#define EASY_DEV_CERT_INDEX 2 + +#else +static const char ca_crt_rsa[] = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" + "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" + "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" + "A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" + "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" + "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" + "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" + "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" + "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" + "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" + "gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" + "/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" + "BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" + "dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" + "SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" + "DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" + "pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" + "m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" + "7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" + "-----END CERTIFICATE-----\r\n"; + +static const char srv_crt_rsa[] = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" + "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" + "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" + "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" + "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" + "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" + "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" + "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" + "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" + "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" + "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" + "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJxnXClY\r\n" + "oHkbp70cqBrsGXLybA74czbO5RdLEgFs7rHVS9r+c293luS/KdliLScZqAzYVylw\r\n" + "UfRWvKMoWhHYKp3dEIS4xTXk6/5zXxhv9Rw8SGc8qn6vITHk1S1mPevtekgasY5Y\r\n" + "iWQuM3h4YVlRH3HHEMAD1TnAexfXHHDFQGe+Bd1iAbz1/sH9H8l4StwX6egvTK3M\r\n" + "wXRwkKkvjKaEDA9ATbZx0mI8LGsxSuCqe9r9dyjmttd47J1p1Rulz3CLzaRcVIuS\r\n" + "RRQfaD8neM9c1S/iJ/amTVqJxA1KOdOS5780WhPfSArA+g4qAmSjelc3p4wWpha8\r\n" + "zhuYwjVuX6JHG0c=\r\n" + "-----END CERTIFICATE-----\r\n"; + +static const char srv_key_rsa[] = + "-----BEGIN RSA PRIVATE KEY-----\r\n" + "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" + "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" + "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" + "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" + "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" + "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" + "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" + "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" + "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" + "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" + "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" + "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" + "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" + "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" + "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" + "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" + "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" + "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" + "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" + "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" + "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" + "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" + "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" + "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" + "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" + "-----END RSA PRIVATE KEY-----\r\n"; +#endif /* CONFIG_HW_RSA */ + +void print_laptime(void) +{ + struct timeval ct; + gettimeofday(&ct, NULL); + + while (ct.tv_usec < rt.tv_usec) { + ct.tv_usec += 1000000; + ct.tv_sec-- ; + } + + printf("%d sec %d msecs\n", + ct.tv_sec - rt.tv_sec, + (ct.tv_usec - rt.tv_usec)/1000); + rt.tv_sec = ct.tv_sec; + rt.tv_usec = ct.tv_usec; + +} + +static void http_get_cb(struct http_client_t *client, struct http_req_message *msg) +{ + struct http_keyvalue_list_t response_headers; + const char *rsp_msg = "This is a root page"; + char contlen[6] = {0,}; + + http_keyvalue_list_init(&response_headers); + + http_keyvalue_list_add(&response_headers, g_httpcontype, g_httpconhtml); + sprintf(contlen, "%d", strlen(rsp_msg)); + http_keyvalue_list_add(&response_headers, g_httpcontsize, contlen); + http_keyvalue_list_add(&response_headers, g_httpconnect, g_httpcnlost); + + printf(">get_root\n"); + http_send_response(client, 200, rsp_msg, &response_headers); + http_keyvalue_list_release(&response_headers); +} + +static void http_post_cb(struct http_client_t *client, struct http_req_message *msg) +{ + cJSON *tmp; + static bool valid_info = false; + + if (msg->entity != NULL) { + cJSON *request_json = cJSON_Parse(msg->entity); + valid_info = true; + if (request_json != NULL) { + memset(&ap_info, 0, sizeof(struct ap_info_t)); + + tmp = cJSON_GetObjectItem(request_json, "ssid"); + + if (tmp != NULL) { + printf("ssid %s\n", tmp->valuestring); + memcpy(ap_info.ssid, tmp->valuestring, strlen(tmp->valuestring)); + } else { + valid_info = false; + } + + tmp = cJSON_GetObjectItem(request_json, "password"); + if (tmp != NULL) { + printf("password %s\n", tmp->valuestring); + memcpy(ap_info.pwd, tmp->valuestring, strlen(tmp->valuestring)); + } else { + valid_info = false; + } + + tmp = cJSON_GetObjectItem(request_json, "security"); + if (tmp != NULL) { + printf("security %s\n", tmp->valuestring); + if (wifi_securitymode_check(tmp->valuestring) != 0) { + + valid_info = false; + printf("wrong argunets\n"); + } else { + memcpy(ap_info.security, tmp->valuestring, strlen(tmp->valuestring)); + } + } else { + valid_info = false; + } + } else { + valid_info = false; + } + + cJSON_Delete(request_json); + + if (msg->encoding == HTTP_CHUNKED_ENCODING && msg->entity[0] != '\0') { + return; + } + } + + http_send_response(client, 200, NULL, NULL); + + if (valid_info) { + sem_post(&get_netinfo); + valid_info = false; + } else { + printf("AP information is not valid\n"); + } +} + +static void http_post_ctrl_cb(struct http_client_t *client, struct http_req_message *msg) +{ + cJSON *tmp; + int stop_val = 0; + + if (msg->entity != NULL) { + cJSON *request_json = cJSON_Parse(msg->entity); + if (request_json != NULL) { + printf(">>>> post /control \n"); + memset(&ap_info, 0, sizeof(struct ap_info_t)); + + tmp = cJSON_GetObjectItem(request_json, "stop"); + if (tmp != NULL) { + printf("stop %d \n", tmp->valueint); + stop_val = tmp->valueint; + } else { + stop_val = 0; + } + } + cJSON_Delete(request_json); + } + + if (msg->encoding == HTTP_CHUNKED_ENCODING && msg->entity[0] != '\0') { + g_stop_easysetup = stop_val; + return; + } + + http_send_response(client, 200, NULL, NULL); + sem_post(&get_ctrl); +} + +static int start_webserver(void) +{ + int https_port = 443; + struct ssl_config_t ssl_config; + + https_server = http_server_init(https_port); + if (https_server == NULL) { + printf ("Error: Cannot allocate server structure!!\n"); + return -1; + } + +#if defined(CONFIG_HW_RSA) + int ret; + + see_init(); + + /* Setup post key */ + /* THIS CODE SHOULD BE REMOVED AFTER USING SSS KEY AND CERT */ + if ((ret = see_setup_key(sss_da_rsa_ca, sizeof(sss_da_rsa_ca), + SECURE_STORAGE_TYPE_KEY_RSA, EASY_CA_KEY_INDEX)) != 0) { + printf( "Error: see_setup_key ca 0x%x\n\n", ret); + return -1; + } + + if ((ret = see_setup_key(sss_da_rsa_dev, sizeof(sss_da_rsa_dev), + SECURE_STORAGE_TYPE_KEY_RSA, EASY_DEV_KEY_INDEX)) != 0) { + printf( "Error: see_setup_key dev 0x%x\n\n", ret); + return -1; + } + + if ((ret = see_set_certificate(sss_ca_crt, sizeof(sss_ca_crt), + EASY_CA_CERT_INDEX, CERT_PEM)) != 0) { + printf ("Error: set_cert fail %d\n", ret); + return -1; + } + + if ((ret = see_set_certificate(sss_dev_crt, sizeof(sss_dev_crt), + EASY_DEV_CERT_INDEX, CERT_PEM)) != 0) { + printf ("Error: set_cert fail %d\n", ret); + return -1; + } + + ssl_config.ca_key_index = EASY_CA_KEY_INDEX; + ssl_config.dev_key_index = EASY_DEV_KEY_INDEX; + ssl_config.ca_cert_index = EASY_CA_CERT_INDEX; + ssl_config.dev_cert_index = EASY_DEV_CERT_INDEX; + ssl_config.auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED; +#else + ssl_config.root_ca = (char *)ca_crt_rsa; + ssl_config.root_ca_len = sizeof(ca_crt_rsa); + ssl_config.dev_cert = (char *)srv_crt_rsa; + ssl_config.dev_cert_len = sizeof(srv_crt_rsa); + ssl_config.private_key = (char *)srv_key_rsa; + ssl_config.private_key_len = sizeof(srv_key_rsa); + ssl_config.auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED; +#endif /* CONFIG_HW_RSA */ + + if (http_tls_init(https_server, &ssl_config) != 0) { + printf("ssl config Error\n"); + return -1; + } + + http_server_register_cb (https_server, HTTP_METHOD_GET, root_uri, http_get_cb); + http_server_register_cb(https_server, HTTP_METHOD_POST, network_uri, http_post_cb); + http_server_register_cb(https_server, HTTP_METHOD_POST, control_uri, http_post_ctrl_cb); + + http_server_start (https_server); + + return 0; +} + +static int stop_webserver(void) +{ + http_server_deregister_cb (https_server, HTTP_METHOD_GET, root_uri); + http_server_deregister_cb(https_server, HTTP_METHOD_POST, network_uri); + http_server_deregister_cb(https_server, HTTP_METHOD_POST, control_uri); + http_server_stop(https_server); + http_server_release (&https_server); + +#if defined(CONFIG_HW_RSA) + see_free(); +#endif + return 0; +} +/* function is used from multiple places so dont rely on local static vars in this file */ +static void getSecurityModeString(slsi_security_config_t *sec, uint8_t count, char* modestring) +{ + memset(modestring, 0, MODE_STRING_MAX); + char *pos = modestring; + int x = 0; + + if (count == 0) { + strncat(pos, "[NONE]", 6); + } else { + for (x = 0; x < count; x++) { + strncat(pos, "[", 1); + pos += 1; + if (sec->secmode == SLSI_SEC_MODE_WEP) { + strncat(pos, "WEP", 3); + pos += 3; + } else if (sec->secmode == SLSI_SEC_MODE_WEP_SHARED) { + strncat(pos, "WEP_SHARED", 10); + pos += 10; + } else if (sec->secmode == (SLSI_SEC_MODE_WEP | SLSI_SEC_MODE_WEP_SHARED)) { + strncat(pos, "WEP_UNKNOWN", 11); + pos += 11; + } else if (sec->secmode == SLSI_SEC_MODE_WPA_TKIP) { + strncat(pos, "WPA-PSK+TKIP", 12); + pos += 12; + } else if (sec->secmode == SLSI_SEC_MODE_WPA_CCMP) { + strncat(pos, "WPA-PSK+AES", 11); + pos += 11; + } else if (sec->secmode == SLSI_SEC_MODE_WPA_MIXED) { + strncat(pos, "WPA-PSK+AES+TKIP", 16); + pos += 16; + } else if (sec->secmode == SLSI_SEC_MODE_WPA2_TKIP) { + strncat(pos, "WPA2-PSK+TKIP", 13); + pos += 13; + } else if (sec->secmode == SLSI_SEC_MODE_WPA2_CCMP) { + strncat(pos, "WPA2-PSK+AES", 12); + pos += 12; + } else if (sec->secmode == SLSI_SEC_MODE_WPA2_MIXED) { + strncat(pos, "WPA2-PSK+AES+TKIP", 17); + pos += 17; + } else if (sec->secmode == SLSI_SEC_MODE_EAP) { + strncat(pos, "WPA-EAP", 7); + pos += 7; + } + + strncat(pos, "]", 1); + pos += 1; + sec++; //go to next structure + } + } +} + +static void print_scan_result(slsi_scan_info_t *list) +{ + int count = 0; + slsi_scan_info_t *current_element = list; + printf("Scan Result - networks:\n"); + printf(" %-20.20s %-8.8s %-40.40s %-6.6s %s\n", "BSSID", "RSSI", "SECURITY", "CH", "SSID"); + + while (current_element) { + char ssid[WPA_MAX_SSID_LEN]; + char modestring[MODE_STRING_MAX]; + count++; + getSecurityModeString(current_element->sec_modes, current_element->num_sec_modes, modestring); + printf_encode(ssid, WPA_MAX_SSID_LEN, current_element->ssid, current_element->ssid_len); + printf(" %3.3d) %-20.20s %-8.8d %-40.40s %-6.6d %.32s \n", + count, current_element->bssid, current_element->rssi, modestring, + current_element->channel, ssid); + current_element = current_element->next; + } +} + +static int8_t scan_result_handler(slsi_reason_t* reason) +{ + if (reason->reason_code != 0) { + printf("Scan failed reason: %d, locally_generated: %d\n", reason->reason_code, reason->locally_generated); + } else { + slsi_scan_info_t *scan_list_head; + WiFiGetScanResults(&scan_list_head); + print_scan_result(scan_list_head); + WiFiFreeScanResults(&scan_list_head); + sem_post(&finish_scan); + } + + return 0; +} + +#ifdef CONFIG_BUILD_KERNEL +int main(int argc, FAR char *argv[]) +#else +int easysetup_main(int argc, char **argv) +#endif +{ + int easysetup_cnt = 0; +_START_: + sem_init(&get_netinfo, 0, 0); + sem_init(&finish_scan, 0, 0); + sem_init(&get_ctrl, 0, 0); + + gettimeofday(&rt, NULL); + printf("=======================================\n"); + printf("EASYSETUP start [%d] ::", easysetup_cnt); + print_laptime(); + if (wifi_start_ap((uint8_t *)soft_ap_ssid, (char *)soft_ap_security, (char *)soft_ap_passphase, soft_ap_channel) != 0) { + printf("Error start softap\n"); + return 0; + } + + printf("Start SoftAP ::"); + print_laptime(); + +#ifdef CONFIG_SLSI_WIFI_SANITY + dhcpserver_start(); + printf("Start DHCP Server Start ::"); + print_laptime(); +#endif + + if (start_webserver() != 0) { + printf("webserver start fail\n"); + } + + printf("Start Webserver ::"); + print_laptime(); + + sem_wait(&get_netinfo); + printf("Get AP information ::"); + print_laptime(); + WiFiRegisterScanCallback(&scan_result_handler); + WiFiScanNetwork(); + sem_wait(&finish_scan); + printf("Scan finish ::"); + print_laptime(); + + stop_webserver(); + printf("Stop Webserver ::"); + print_laptime(); + +#ifdef CONFIG_SLSI_WIFI_SANITY + stop_dhcp(SLSI_WIFI_SOFT_AP_IF); + printf("Stop DHCP Server ::"); + print_laptime(); +#endif + + if (wifi_start_station() < 0) { + printf("start station error \n"); + sem_destroy(&get_netinfo); + sem_destroy(&finish_scan); + return 0; + } + + while (wifi_join((uint8_t *)ap_info.ssid, ap_info.security, ap_info.pwd) != 0) { + printf("Retry to Join\n"); + sleep(1); + } + + while (get_wifiState() == WIFI_DISCONNECTED) { + printf("wait connecting to AP\n"); + usleep(300000); + } + + printf("AP join ::"); + print_laptime(); + +#ifdef CONFIG_SLSI_WIFI_SANITY + while (dhcpc_start() != 0) { + printf("Get IP address Fail\n"); + } +#endif + + printf("DHCP Client Start ::"); + print_laptime(); + g_stop_easysetup = 0; + if (start_webserver() !=0) { + printf("webserver start fail\n"); + return -1; + } + + printf("Start Webserver ::\n"); + print_laptime(); + + sem_wait(&get_ctrl); + + sleep(1); + + printf("Stop\n"); + sem_destroy(&get_netinfo); + sem_destroy(&finish_scan); + sem_destroy(&get_ctrl); + stop_webserver(); +#ifdef CONFIG_SLSI_WIFI_SANITY + stop_dhcp(SLSI_WIFI_STATION_IF); +#endif + + easysetup_cnt++; + + printf("=======================================\n"); + if (g_stop_easysetup == 2) { + goto _START_; + } + + if (WiFiStop() != 0) { + return -1; + } + + return 0; +} diff --git a/apps/examples/easysetup/wifi_api.c b/apps/examples/easysetup/wifi_api.c new file mode 100644 index 0000000..44938a7 --- /dev/null +++ b/apps/examples/easysetup/wifi_api.c @@ -0,0 +1,350 @@ +/* ************************************************************************** + * @file apps/example/easysetup/wifi_api.c + ****************************************************************************/ +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_NET_LWIP +#include +#include +#endif +#include "apps/netutils/wifi/slsi_wifi_api.h" +#include "wifi_api.h" + +#ifndef BIT +#define BIT(x) (1 << (x)) +#endif + +#define SLSI_WIFI_SECURITY_OPEN "open" +#define SLSI_WIFI_SECURITY_WEP_OPEN "wep" +#define SLSI_WIFI_SECURITY_WEP_SHARED "wep_shared" +#define SLSI_WIFI_SECURITY_WPA_MIXED "wpa_mixed" +#define SLSI_WIFI_SECURITY_WPA_TKIP "wpa_tkip" +#define SLSI_WIFI_SECURITY_WPA_AES "wpa_aes" +#define SLSI_WIFI_SECURITY_WPA2_MIXED "wpa2_mixed" +#define SLSI_WIFI_SECURITY_WPA2_TKIP "wpa2_tkip" +#define SLSI_WIFI_SECURITY_WPA2_AES "wpa2_aes" + +#ifdef CONFIG_SLSI_WIFI_SANITY +static struct netif *gnet_if; +#endif +static int g_wifi_state; + +int wifi_securitymode_check(char *sec_type) +{ + int ret = -1; + + if (strncmp(SLSI_WIFI_SECURITY_OPEN, + sec_type, sizeof(SLSI_WIFI_SECURITY_OPEN)) == 0) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WEP_OPEN, + sec_type, sizeof(SLSI_WIFI_SECURITY_WEP_OPEN)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WEP_SHARED, + sec_type, sizeof(SLSI_WIFI_SECURITY_WEP_SHARED)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_MIXED, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA_MIXED)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_TKIP, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA_TKIP)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_AES, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA_AES)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_MIXED, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA2_MIXED)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_TKIP, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA2_TKIP)) == 0 ) { + ret = 0; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_AES, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA2_AES)) == 0 ) { + ret = 0; + } + + return ret; + +} + +static slsi_security_config_t *get_security_config_(char *sec_type, char *psk) +{ + slsi_security_config_t *ret = NULL; + if (strncmp(SLSI_WIFI_SECURITY_OPEN, + sec_type, sizeof(SLSI_WIFI_SECURITY_OPEN)) != 0 ) { + ret = (slsi_security_config_t *)zalloc(sizeof(slsi_security_config_t)); + if (ret) { + if (strncmp(SLSI_WIFI_SECURITY_WEP_OPEN, + sec_type, sizeof(SLSI_WIFI_SECURITY_WEP_OPEN)) == 0) { + ret->secmode = SLSI_SEC_MODE_WEP; + } else if (strncmp(SLSI_WIFI_SECURITY_WEP_SHARED, + sec_type, sizeof(SLSI_WIFI_SECURITY_WEP_SHARED)) == 0) { + ret->secmode = SLSI_SEC_MODE_WEP_SHARED; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_MIXED, + sec_type,sizeof(SLSI_WIFI_SECURITY_WPA_MIXED)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA_MIXED; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_TKIP, + sec_type,sizeof(SLSI_WIFI_SECURITY_WPA_TKIP)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA_TKIP; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA_AES, + sec_type,sizeof(SLSI_WIFI_SECURITY_WPA_AES)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA_CCMP; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_MIXED, + sec_type,sizeof(SLSI_WIFI_SECURITY_WPA2_MIXED)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA2_MIXED; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_TKIP, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA2_TKIP)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA2_TKIP; + } else if (strncmp(SLSI_WIFI_SECURITY_WPA2_AES, + sec_type, sizeof(SLSI_WIFI_SECURITY_WPA2_AES)) == 0) { + ret->secmode = SLSI_SEC_MODE_WPA2_CCMP; + } + } + + /* store the passphrase */ + if (psk) { + memcpy(ret->passphrase, psk, strlen(psk)); + } else { + free(ret); + ret = NULL; + } + } + + return ret; +} + +static void linkUpHandler(slsi_reason_t* reason) +{ + g_wifi_state = WIFI_CONNECTED; + printf("Connected to network\n"); +} + +static void linkDownHandler(slsi_reason_t* reason) +{ + if (reason) { + printf("Disconnected from network reason_code: %d %s\n", reason->reason_code, + reason->locally_generated ? "(locally_generated)": ""); + } else { + printf("Disconnected from network\n"); + } +} + +int get_wifiState(void) +{ + return g_wifi_state; +} + +int wifi_start_station(void) +{ + int result = -1; + printf("Starting STA mode...\n"); + + g_wifi_state = WIFI_DISCONNECTED; + + if (WiFiStart(SLSI_WIFI_STATION_IF, NULL) == SLSI_STATUS_SUCCESS) { + result = 0; + if (!WiFiRegisterLinkCallback(&linkUpHandler, &linkDownHandler)) { + printf("Link call back handles registered - per default!\n"); + } else { + printf("Link call back handles registered - status failed !\n"); + } + } else { + printf("WiFiStart STA mode failed !\n"); + } + + return result; +} + +int wifi_start_ap(uint8_t *ssid, char *security, char *passwd, int ch) +{ + slsi_ap_config_t *app_settings = zalloc(sizeof(slsi_ap_config_t)); + + if (app_settings == NULL) { + return -1; + } + g_wifi_state = WIFI_DISCONNECTED; + + memcpy(app_settings->ssid, ssid, strlen((char *)ssid)); + app_settings->ssid_len = strlen((char *)ssid); + app_settings->beacon_period = 100; + app_settings->DTIM = 2; + app_settings->channel = ch; + app_settings->phy_mode = 1; + app_settings->security = get_security_config_(security, passwd); + + /*activate hostapd*/ + printf("Starting AP mode...\n"); + if (WiFiStart(SLSI_WIFI_SOFT_AP_IF, app_settings) == SLSI_STATUS_SUCCESS) { + if (!WiFiRegisterLinkCallback(&linkUpHandler, &linkDownHandler)) { + printf("Link call back handles registered - per default!\n"); + } else { + printf("Link call back handles registered - status failed !\n"); + } + } else { + printf("WiFiStart AP mode failed !\n"); + return -1; + } + return 0; +} + +int wifi_join(uint8_t *ssid, char *security, char *passwd) +{ + slsi_security_config_t *security_config; + + uint8_t ssid_len = strlen((char *)ssid); + + security_config = get_security_config_(security, passwd); + printf("Joining selected network...\n"); + + if (WiFiNetworkJoin(ssid, ssid_len, NULL, security_config) != 0) { + printf("SLSI_WiFiNetworkJoin start failed!\n"); + if (security_config) { + free(security_config); + security_config = NULL; + } + return -1; + } else { + printf("WiFiNetworkJoin start success!\n"); + if (security_config) { + free(security_config); + security_config = NULL; + } + } + return 0; +} + +int wifi_leave(void) +{ + int result = -1; + + printf("Leaving selected network...\n"); + if (WiFiNetworkLeave()) { + printf("WiFiNetworkLeave failed!\n"); + } else { + result = 0; + } + + return result; +} + +#ifdef CONFIG_SLSI_WIFI_SANITY +int dhcpc_start(void) +{ + gnet_if = netif_find(CTRL_IFNAME); + + if (gnet_if == NULL) { + return -1; + } + + if (gnet_if->dhcp != NULL) { + gnet_if->dhcp = NULL; + } + + printf( " netic hwaddr_len %d\n" + " netic hwaddr %x%x%x%x%x%x\n" + " netic mtu %d\n" + " netic flags %x\n", + gnet_if->hwaddr_len, + gnet_if->hwaddr[0], gnet_if->hwaddr[1], gnet_if->hwaddr[2], + gnet_if->hwaddr[3], gnet_if->hwaddr[4], gnet_if->hwaddr[5], + gnet_if->mtu, gnet_if->flags); + + err_t res = dhcp_start(gnet_if); + + if (res) { + printf("slsi_start_dhcp dhcp_start result %d\n", res); + return -1; + } + + printf("slsi_start_dhcp start success state %d result %d\n", + gnet_if->dhcp->state, res); + + int32_t timeleft = 5000000; + + while (gnet_if->dhcp->state != DHCP_BOUND) { + usleep(10000); + timeleft -= 10000; + if (timeleft <= 0) { + break; + } + } + + if (gnet_if->dhcp->state == DHCP_BOUND) { + printf("DHCP Client - got IP address %u.%u.%u.%u\n", + (unsigned char) ((htonl(gnet_if->ip_addr.addr) >> 24) & 0xff), + (unsigned char) ((htonl(gnet_if->ip_addr.addr) >> 16) & 0xff), + (unsigned char) ((htonl(gnet_if->ip_addr.addr) >> 8) & 0xff), + (unsigned char) ((htonl(gnet_if->ip_addr.addr) >> 0) & 0xff)); + } else { + if (timeleft <= 0) { + printf("DHCP Client - Timeout fail to get ip address\n"); + return -1; + } + } + + return 0; +} + +int dhcpserver_start(void) +{ + ip_addr_t ipaddr, netmask, gateway; + + gnet_if = netif_find(CTRL_IFNAME); + + if (gnet_if == NULL) { + return -1; + } + + // Setting static IP as 192.168.47.1 in AP mode + ipaddr.addr = 0x012FA8C0; + netmask.addr = 0x00FFFFFF; + gateway.addr = 0x012FA8C0; + netif_set_addr(gnet_if, &ipaddr, &netmask, &gateway); + netif_set_up(gnet_if); + + if (dhcps_start(gnet_if) != ERR_OK) { + printf("DHCP Server - started Fail\n"); + return -1; + } + + printf("DHCP Server - started Success\n"); + + return 0; +} + +int stop_dhcp(int interface) +{ + ip_addr_t ipaddr; + + if (gnet_if == NULL) { + printf("stop_dhcp - nothing to stop\n"); + return 0; + } + + if (interface == SLSI_WIFI_STATION_IF) { + if (gnet_if->dhcp != NULL) { + dhcp_stop(gnet_if); + printf("dhcp client stop!!"); + } else { + return -1; + } + } else if (interface == SLSI_WIFI_SOFT_AP_IF) { + if (gnet_if->dhcps_pcb != NULL) { + dhcps_stop(gnet_if); + printf("dhcp server stop!!"); + + ipaddr.addr = 0; + netif_set_ipaddr(gnet_if, &ipaddr); + } else { + return -1; + } + } + + gnet_if = NULL; + return 0; +} +#endif diff --git a/apps/examples/easysetup/wifi_api.h b/apps/examples/easysetup/wifi_api.h new file mode 100644 index 0000000..17709cb --- /dev/null +++ b/apps/examples/easysetup/wifi_api.h @@ -0,0 +1,21 @@ +#ifndef _WIFI_API_H_ +#define _WIFI_API_H_ +#include "apps/netutils/wifi/slsi_wifi_api.h" + +enum wifi_state { + WIFI_CONNECTED, + WIFI_DISCONNECTED, +}; + +int get_wifiState(void); +int wifi_start_station(void); +int wifi_start_ap(uint8_t *ssid, char *security, char *password, int ch); +int wifi_join(uint8_t *ssid, char *security, char *passwd); +int wifi_leave(void); +#ifdef CONFIG_SLSI_WIFI_SANITY +int dhcpc_start(void); +int dhcpserver_start(void); +int stop_dhcp(int interface); +#endif +int wifi_securitymode_check(char *sec_type); +#endif