examples/easysetup: add an application for easysetup
authorJunhwan Park <junhwan.park@samsung.com>
Wed, 19 Apr 2017 10:20:37 +0000 (19:20 +0900)
committerHeesub Shin <heesub.shin@samsung.com>
Sat, 6 May 2017 14:00:38 +0000 (23:00 +0900)
This patch includes an example application for easysetup.

Change-Id: Ic379a4d3c2e9600620926046e0b05ddf1bb7ac8f
Signed-off-by: Junhwan Park <junhwan.park@samsung.com>
apps/examples/easysetup/Kconfig [new file with mode: 0644]
apps/examples/easysetup/Make.defs [new file with mode: 0644]
apps/examples/easysetup/Makefile [new file with mode: 0644]
apps/examples/easysetup/controller_cert/test_ca_cert.pem [new file with mode: 0755]
apps/examples/easysetup/controller_cert/test_client_cert.pem [new file with mode: 0755]
apps/examples/easysetup/controller_cert/test_client_key.pem [new file with mode: 0755]
apps/examples/easysetup/easysetup_main.c [new file with mode: 0644]
apps/examples/easysetup/wifi_api.c [new file with mode: 0644]
apps/examples/easysetup/wifi_api.h [new file with mode: 0644]

diff --git a/apps/examples/easysetup/Kconfig b/apps/examples/easysetup/Kconfig
new file mode 100644 (file)
index 0000000..508829b
--- /dev/null
@@ -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 (file)
index 0000000..62850c6
--- /dev/null
@@ -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 (file)
index 0000000..bfbfea2
--- /dev/null
@@ -0,0 +1,142 @@
+############################################################################
+# apps/examples/hello/Makefile
+#
+#   Copyright (C) 2008, 2010-2013 Gregory Nutt. All rights reserved.
+#   Author: Gregory Nutt <gnutt@nuttx.org>
+#
+# 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 (executable)
index 0000000..24e1252
--- /dev/null
@@ -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 (executable)
index 0000000..c934c03
--- /dev/null
@@ -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 (executable)
index 0000000..4139ef5
--- /dev/null
@@ -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 (file)
index 0000000..4e38f79
--- /dev/null
@@ -0,0 +1,565 @@
+/****************************************************************************
+ * examples/eaysetup/easysetup.c
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+#include <tinyara/config.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <debug.h>
+#include <stdlib.h>
+#include <string.h>
+#include <semaphore.h>
+#include <time.h>
+#include <sys/socket.h>
+#include <apps/netutils/webserver/http_server.h>
+#include <apps/netutils/webserver/http_keyvalue_list.h>
+#include <apps/netutils/cJSON.h>
+#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 (file)
index 0000000..44938a7
--- /dev/null
@@ -0,0 +1,350 @@
+/* **************************************************************************
+ * @file apps/example/easysetup/wifi_api.c
+ ****************************************************************************/
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifdef CONFIG_NET_LWIP
+#include <net/lwip/dhcp.h>
+#include <net/lwip/netif.h>
+#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 (file)
index 0000000..17709cb
--- /dev/null
@@ -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