/* ipwps_ui.c - IPWPS User Interface implementation */ /* * Copyright (c) 2009 Wind River Systems, Inc. * * The right to copy, distribute, modify, or otherwise make use * of this software may be licensed only pursuant to the terms * of an applicable Wind River license agreement. * */ /* modification history -------------------- 01a,16mar09,mry Created */ /* DESCRIPTION: * =========== * This library contains the IPWPS User Interface implementation. * The current User Interface implementation uses the console to * prompt/notify with the user (via printf). * The implementation of the UI functions can be cutomized to support * a richer UI (e.g. web based or GUI). */ /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipwps_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #define IPCOM_USE_CLIB_PROTO #include #include #include #include #include #include "ipwps_core.h" #include "ipwps_ui.h" /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* **************************************************************************** * 6 EXTERN PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 7 LOCAL PROTOTYPES **************************************************************************** */ /* **************************************************************************** * 8 STATIC FUNCTIONS **************************************************************************** */ IP_STATIC int ipwps_ui_led_feedback(Ipwps_session_status status); /* * **************************************************************************** * 9 DATA **************************************************************************** */ /* **************************************************************************** * 10 GLOBAL FUNCTIONS **************************************************************************** */ /* *=========================================================================== * ipwps_ui_display *=========================================================================== * Description: * The implementation of this function can customized to use a richer UI * NOTE: THIS FUNCTION MUST NOT BLOCK OR PEND. * Parameters: * Returns: * >= 0 if successful, < 0 if not. */ IP_GLOBAL int ipwps_ui_display(Ipwps_ui_display_type type, const char *string) { char *prefix = ""; #define IPWPS_UI_DISPLAY_STRING ">>>>> WPS %s: %s" switch (type) { case IPWPS_UI_DISPLAY_CRITICAL: /* Warn the user of a possible serious event */ prefix = "CRITICAL"; IPCOM_LOG2(CRIT, IPWPS_UI_DISPLAY_STRING, prefix, string); break; case IPWPS_UI_DISPLAY_ERROR: /* Inform the user of an error event */ prefix = "ERROR"; IPCOM_LOG2(ERR, IPWPS_UI_DISPLAY_STRING, prefix, string); break; case IPWPS_UI_DISPLAY_WARNING: /* Warn the user of a possible serious event */ prefix = "WARNING"; IPCOM_LOG2(WARNING, IPWPS_UI_DISPLAY_STRING, prefix, string); break; case IPWPS_UI_DISPLAY_NOTIFICATION: prefix = "NOTIFICATION"; IPCOM_LOG2(INFO, IPWPS_UI_DISPLAY_STRING, prefix, string); break; case IPWPS_UI_DISPLAY_INFO: prefix = "INFO"; IPCOM_LOG2(INFO, IPWPS_UI_DISPLAY_STRING, prefix, string); break; } return 0; } /* *=========================================================================== * ipwps_ui_prompt *=========================================================================== * Description: * The implementation of this function can customized to use a richer UI * NOTE: THIS FUNCTION MUST NOT BLOCK OR PEND. * Parameters: * Returns: * >= 0 if successful, < 0 if not. */ IP_GLOBAL int ipwps_ui_prompt(Ipwps_ui_prompt_type prompt, const char *string) { switch (prompt) { case IPWPS_UI_PROMPT_ENTER_PIN: ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, string); ipwps_ui_display(IPWPS_UI_DISPLAY_INFO, "Use \"wps pin set\"."); break; case IPWPS_UI_PROMPT_WPS_AP_FOUND: ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, string); break; case IPWPS_UI_PROMPT_WPS_REGISTRAR_FOUND: ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, string); break; case IPWPS_UI_PROMPT_WPS_PBC_ENROLLEE_DETECTED: ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, string); break; } return 0; } /* *=========================================================================== * ipwps_ui_report_wps_status *=========================================================================== * Description: IPWPS User Interface function which is called by * IPWPS applications to report the WPS status as described in the WPS spec. * DO NOT MODIFY THIS FUNCTION. Instead modify * ipwps_ui_display() and/or ipwps_ui_led_feedback(). * Parameters: * Ipwps_session_status status - WPS status to report. * Returns: * >= 0 if successful, < 0 if not. */ IP_GLOBAL int ipwps_ui_report_wps_status(Ipwps_ctx* ctx, Ipwps_session_status status) { int rc = 0; ip_assert(ctx); if (ipwps_ui_led_feedback(status) == 0) return 0; switch (status) { case IPWPS_SESSION_STATUS_IDLE: ctx->public.coop_info.session_status = IPWPS_SESSION_STATUS_IDLE; ctx->public.coop_info.config_error = IPWPS_CONFIG_ERROR_NOERR; ipcom_memset(&ctx->public.peer_dev_info, 0, sizeof(ctx->public.peer_dev_info)); ipcom_memset(&ctx->public.peer_cap_info, 0, sizeof(ctx->public.peer_cap_info)); IPCOM_LOG0(DEBUG, "IPWPS UI STATUS IDLE"); break; case IPWPS_SESSION_STATUS_IN_PROGRESS: ctx->public.coop_info.session_status = IPWPS_SESSION_STATUS_IN_PROGRESS; rc = ipwps_ui_display(IPWPS_UI_DISPLAY_INFO, "WPS Session in progress. Please wait..."); break; case IPWPS_SESSION_STATUS_ERROR: ctx->public.coop_info.session_status = IPWPS_SESSION_STATUS_ERROR; rc = ipwps_ui_display(IPWPS_UI_DISPLAY_ERROR, "WPS Session failed."); break; case IPWPS_SESSION_STATUS_SESSION_OVERLAP: ctx->public.coop_info.session_status = IPWPS_SESSION_STATUS_SESSION_OVERLAP; rc = ipwps_ui_display(IPWPS_UI_DISPLAY_CRITICAL, "WPS Session overlap detected. Possible Security Risk!"); break; case IPWPS_SESSION_STATUS_SUCCESS: ctx->public.coop_info.session_status = IPWPS_SESSION_STATUS_SUCCESS; rc = ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, "WPS Session completed sucessfully."); break; case IPWPS_ENROLLEE_JOIN_SUCCESS: { char notify[256]; snprintf(notify, sizeof(notify), "Successfully associated with ssid \"%s\".", ctx->credentials.enrollee_credentials[ctx->public.enrollee_info.credential_setno].ssid); ipwps_ui_display(IPWPS_UI_DISPLAY_NOTIFICATION, notify); break; } case IPWPS_ENROLLEE_JOIN_FAIL: ipwps_ui_display(IPWPS_UI_DISPLAY_CRITICAL, "FAILED to associate with an AP using the credentials provided by the WPS registrar."); break; } return rc; } /* *=========================================================================== * ipwps_ui_led_feedback *=========================================================================== * Description: * The implementation of this function can customized to provide the LED feedback * NOTE: THIS FUNCTION MUST NOT BLOCK OR PEND. * If LED feedback is desired, define IPWPS_UI_LED_FEEDBACK * and customize this function to implement the LED feedback functionality. * Parameters: * Ipwps_session_status status - WPS session status to report. * Returns: * 0 if successful and no further UI display is desired. * >0 if successful and/or further UI display is desired. * < 0 if not successful but further UI display is desired. */ IP_STATIC int ipwps_ui_led_feedback(Ipwps_session_status status) { #ifdef IPWPS_UI_LED_FEEDBACK /* LED Patterns for IPWPS_SESSION_STATUS_IN_PROGRESS, IPWPS_SESSION_STATUS_ERROR, * IPWPS_SESSION_STATUS_SESSION_OVERLAP, IPWPS_SESSION_STATUS_SUCCESS * are defined in "WPS Usability and Protocol Best Practices, v1.0.7, Oct 2008" as follows: * IPWPS_SESSION_STATUS_IN_PROGRESS: 2 sec on, 1 sec off, ... repeated (in yellow if available) * IPWPS_SESSION_STATUS_ERROR: 0.25 sec on, 0.25 sec off, ... repeated (in red if available) * IPWPS_SESSION_STATUS_SESSION_OVERLAP: 0.25 sec on, 0.25 sec off, ... repeated for 1 second, * followed by 0.5 sec off, then the whole pattern repeated (in red if available) * IPWPS_SESSION_STATUS_SUCCESS: 300 seconds on then off (in green if available) * IPWPS_SESSION_STATUS_IDLE should cause the LED to be turned off */ return 1; #else return -1; #endif }