Files
m241Neelima/components/ip_net2-6.9/ipwps/src/ipwps_debug.c
T
2026-07-30 11:19:44 +05:30

1963 lines
72 KiB
C

/* ipwps_debug.c - IPWPS DEBUG-ONLY API implementation */
/*
* Copyright (c) 2008 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
--------------------
01d,24mar09,hfc Add drv if support
01c,05mar09,mry Add priliminary enrollee support
01b,04mar09,dwb Adding Fake attribute support in test vector
01a,29Dec08,mry Created
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/* The following APIs are to be used for debugging purposes ONLY.
* They are not part of the officially supported wps APIs.
* Behavior when these commands are invoked is not guaranteed to be valid
* nor safe for normal operation.
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipwps_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#define IPCOM_USE_CLIB_PROTO
#include <ipcom_type.h>
#include <ipcom_cstyle.h>
#include <ipcom_clib.h>
#include <ipcom_err.h>
#include <ipcom_sock.h>
#include <ipcom_syslog.h>
#include <ipcom_sysvar.h>
#include <ipcom_errno.h>
#include <ipcom_err.h>
#include <ipcom_os.h>
#include <ipcom_ipd.h>
#include <ipcom_shell.h>
#include "ipwps_debug.h"
#include "ipwps_private_api.h"
#include "ipwps_core.h"
#include "ipwps_ui.h"
#ifdef IPWPS_USE_WPS_PROTOCOL
#include "ipwps_proto_adaptor.h"
#include "ipwps_protocol.h"
#include "ipwps_protocol_handler.h"
#include "ipwps_config_adaptor.h"
#endif
#ifdef IPWPS_USE_WPS_DRV_IF
#include "ipwps_drv_if.h"
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
#if 0
#define IPWSP_PROTOMSG_TEST_OTHER_ATTR
#define IPWPS_USE_PROTOMSG_TEST_VECTORS
#define IPWPS_WPS_TESTAPP_ACK_DONE
#endif
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/*
****************************************************************************
* 6 EXTERN PROTOTYPES
****************************************************************************
*/
extern IP_GLOBAL void ipwps_proto_crypto_randgen(Ip_u8 *buf, Ip_u16 nbytes);
extern IP_GLOBAL Ip_err ipwps_credentials_add_set(Ipwps_ctx* ctx, Ip_u16 setid,
Ipwps_credential_set *from_cred);
/*
****************************************************************************
* 7 LOCAL PROTOTYPES
****************************************************************************
*/
/*
****************************************************************************
* 8 STATIC FUNCTIONS
****************************************************************************
*/
#ifdef IPWPS_ENABLE_WPS_TESTAPP
#ifdef IPWPS_USE_WPS_PROTOCOL
IP_STATIC Ip_err ipwps_testapp_ca_cb_handler(struct Ipwps_ctx_st* ctx, Ipwps_config_adaptor_event *event);
IP_STATIC Ip_err ipwps_testapp_notify_EAPOL_START(struct Ipwps_ctx_st* ctx, Ip_u8* peer_eth_addr);
IP_STATIC Ip_err ipwps_testapp_rcv_ID_RESP(Ipwps_ctx* ctx, char *identity);
IP_STATIC Ip_err ipwps_testapp_rcv_START(Ipwps_ctx* ctx);
IP_STATIC Ip_err ipwps_testapp_rcv_M1(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1);
IP_STATIC Ip_err ipwps_testapp_send_M2(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1);
IP_STATIC Ip_err ipwps_testapp_send_M2D(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1);
IP_STATIC Ip_err ipwps_testapp_rcv_M2(Ipwps_ctx* ctx, Ipwps_protomsg_M2* m2);
IP_STATIC Ip_err ipwps_testapp_rcv_M2D(Ipwps_ctx* ctx, Ipwps_protomsg_M2D* m2d);
IP_STATIC Ip_err ipwps_testapp_rcv_M3(Ipwps_ctx* ctx, Ipwps_protomsg_M3* m3);
IP_STATIC Ip_err ipwps_testapp_rcv_M4(Ipwps_ctx* ctx, Ipwps_protomsg_M4* m4);
IP_STATIC Ip_err ipwps_testapp_rcv_M5(Ipwps_ctx* ctx, Ipwps_protomsg_M5* m5);
IP_STATIC Ip_err ipwps_testapp_rcv_M6(Ipwps_ctx* ctx, Ipwps_protomsg_M6* m6);
IP_STATIC Ip_err ipwps_testapp_rcv_M7(Ipwps_ctx* ctx, Ipwps_protomsg_M7* m7);
IP_STATIC Ip_err ipwps_testapp_rcv_M8(Ipwps_ctx* ctx, Ipwps_protomsg_M8* m8);
IP_STATIC Ip_err ipwps_testapp_rcv_ACK(Ipwps_ctx* ctx, Ipwps_protomsg_ACK* ack);
IP_STATIC Ip_err ipwps_testapp_rcv_NACK(Ipwps_ctx* ctx, Ipwps_protomsg_NACK* nack);
IP_STATIC Ip_err ipwps_testapp_rcv_DONE(Ipwps_ctx* ctx, Ipwps_protomsg_DONE* done);
IP_STATIC Ip_err ipwps_testapp_notify_wps_finished(Ipwps_ctx* ctx);
IP_STATIC Ip_err ipwps_testapp_notify_wps_timeout(Ipwps_ctx* ctx);
#endif
#ifdef IPWPS_USE_WPS_DRV_IF
IP_STATIC Ip_err ipwps_testapp_rcv_probe_response_ies
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
);
IP_STATIC Ip_err ipwps_testapp_rcv_probe_request_ies
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
);
IP_STATIC Ip_err ipwps_testapp_rcv_assoc_notify
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
);
#endif
#endif
/*
*
****************************************************************************
* 9 DATA
****************************************************************************
*/
#ifdef IPWPS_ENABLE_WPS_TESTAPP
#ifdef IPWPS_USE_WPS_PROTOCOL
IP_GLOBAL Ip_bool ipwps_testapp_use_m2d = IP_FALSE; /* Just for testing */
IP_STATIC Ipwps_proto_ctx *ipwps_testapp_proto_ctx = IP_NULL;
IP_STATIC Ipwps_proto_rcv_methods ipwps_testapp_rcv_methods = {
ipwps_testapp_notify_EAPOL_START,
ipwps_testapp_rcv_ID_RESP,
ipwps_testapp_rcv_START,
ipwps_testapp_rcv_M1,
ipwps_testapp_rcv_M2,
ipwps_testapp_rcv_M2D,
ipwps_testapp_rcv_M3,
ipwps_testapp_rcv_M4,
ipwps_testapp_rcv_M5,
ipwps_testapp_rcv_M6,
ipwps_testapp_rcv_M7,
ipwps_testapp_rcv_M8,
ipwps_testapp_rcv_ACK,
ipwps_testapp_rcv_NACK,
ipwps_testapp_rcv_DONE,
ipwps_testapp_notify_wps_finished,
ipwps_testapp_notify_wps_timeout
};
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
/* test vectors (based on a captured PBC exchange) used to fake a WPS exchange */
#define IPWPS_DEBUG_M1_VECTOR_SIZE 426
#define IPWPS_DEBUG_FAKE_ATTRIBUTE_SIZE 2048
#define IPWSP_PROTOMSG_TEST_OTHER_ATTR_SIZE 14
#if !defined(IPWPS_DEBUG_FAKE_ATTRIBUTE) && defined(IPWSP_PROTOMSG_TEST_OTHER_ATTR)
IP_STATIC Ip_u8 m1_test_vector[IPWPS_DEBUG_M1_VECTOR_SIZE+
IPWSP_PROTOMSG_TEST_OTHER_ATTR_SIZE] = {
#elif defined(IPWSP_PROTOMSG_TEST_OTHER_ATTR) && defined(IPWPS_DEBUG_FAKE_ATTRIBUTE)
IP_STATIC Ip_u8 m1_test_vector[IPWPS_DEBUG_M1_VECTOR_SIZE+
IPWPS_DEBUG_FAKE_ATTRIBUTE_SIZE+
IPWSP_PROTOMSG_TEST_OTHER_ATTR_SIZE] = {
#elif defined(IPWPS_DEBUG_FAKE_ATTRIBUTE) && !defined(IPWSP_PROTOMSG_TEST_OTHER_ATTR)
IP_STATIC Ip_u8 m1_test_vector[IPWPS_DEBUG_M1_VECTOR_SIZE+
IPWPS_DEBUG_FAKE_ATTRIBUTE_SIZE] = {
#else
IP_STATIC Ip_u8 m1_test_vector[IPWPS_DEBUG_M1_VECTOR_SIZE] = {
#endif
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x04, 0x10, 0x47, 0x00, 0x10, 0x00, 0x8f,
0xbd, 0x60, 0xe4, 0xf5, 0xe4, 0xf5, 0xc4, 0xe8,
0xeb, 0x29, 0xc9, 0xbc, 0x5c, 0x2f, 0x10, 0x20,
0x00, 0x06, 0x00, 0x17, 0x9a, 0x44, 0x61, 0x38,
0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0, 0xea, 0xef,
0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b, 0xa3, 0x14,
0x21, 0xd0, 0x74, 0xdf, 0x10, 0x32, 0x00, 0xc0,
0x70, 0x66, 0x75, 0xa3, 0x83, 0x52, 0x9a, 0x45,
0xff, 0x9e, 0xd3, 0xc2, 0x0b, 0x08, 0x91, 0x88,
0xbc, 0xc6, 0x6f, 0x54, 0x0e, 0x17, 0x3b, 0xd3,
0x4d, 0xfe, 0x2b, 0x2b, 0xd6, 0xc3, 0xec, 0x2e,
0xd3, 0x21, 0x87, 0x1c, 0xfb, 0x57, 0xfb, 0x06,
0x17, 0x95, 0xad, 0xea, 0xf0, 0x29, 0x36, 0x3b,
0x7a, 0x11, 0x5f, 0xf4, 0x04, 0xb2, 0x3f, 0x2b,
0x9d, 0x2f, 0x58, 0xa8, 0x23, 0x97, 0xa1, 0x3e,
0xbe, 0x91, 0x98, 0x5e, 0x97, 0x48, 0xb1, 0x5a,
0x54, 0x06, 0xae, 0xfe, 0x4b, 0xdc, 0x31, 0xdf,
0xce, 0x1e, 0xe0, 0x30, 0x30, 0x71, 0xbb, 0xcd,
0xea, 0xe3, 0xde, 0x1b, 0x63, 0x1f, 0x24, 0xdd,
0xbe, 0x59, 0x53, 0xa6, 0xa0, 0x00, 0x35, 0x7d,
0x64, 0x6c, 0x6a, 0x88, 0x3a, 0x31, 0xe9, 0xb9,
0xb0, 0xdf, 0x6e, 0x1b, 0x30, 0xdc, 0xde, 0xc6,
0x03, 0x88, 0x54, 0x8f, 0x20, 0xf2, 0x8e, 0x80,
0x67, 0xae, 0xd2, 0x28, 0x15, 0x36, 0x31, 0xd6,
0x45, 0xd3, 0x32, 0xda, 0x1c, 0xa9, 0x9b, 0x14,
0x79, 0x38, 0x51, 0x76, 0x3a, 0x20, 0x32, 0xea,
0x8a, 0x18, 0x7f, 0xb1, 0x72, 0xe3, 0x2e, 0x67,
0x07, 0x74, 0x8d, 0x64, 0x0b, 0xcd, 0x56, 0x51,
0x14, 0xd9, 0x4f, 0x20, 0x1d, 0xdd, 0x3e, 0x3d,
0xdf, 0xba, 0x5e, 0x4f, 0x93, 0x18, 0x9b, 0x81,
0x78, 0x70, 0xca, 0x6f, 0xb5, 0xa8, 0xae, 0x40,
0x10, 0x04, 0x00, 0x02, 0x00, 0x27, 0x10, 0x10,
0x00, 0x02, 0x00, 0x0f, 0x10, 0x0d, 0x00, 0x01,
0x01, 0x10, 0x08, 0x00, 0x02, 0x00, 0x8c, 0x10,
0x44, 0x00, 0x01, 0x01, 0x10, 0x21, 0x00, 0x16,
0x41, 0x74, 0x68, 0x65, 0x72, 0x6f, 0x73, 0x20,
0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x23,
0x00, 0x12, 0x4a, 0x75, 0x6d, 0x70, 0x73, 0x74,
0x61, 0x72, 0x74, 0x20, 0x45, 0x6e, 0x72, 0x6f,
0x6c, 0x6c, 0x65, 0x65, 0x10, 0x24, 0x00, 0x05,
0x32, 0x33, 0x30, 0x35, 0x34, 0x10, 0x42, 0x00,
0x09, 0x34, 0x34, 0x32, 0x33, 0x2d, 0x38, 0x38,
0x37, 0x38, 0x10, 0x54, 0x00, 0x08, 0x00, 0x01,
0x00, 0x50, 0xf2, 0x04, 0x00, 0x01, 0x10, 0x11,
0x00, 0x19, 0x59, 0x4f, 0x57, 0x2d, 0x4d, 0x59,
0x41, 0x4b, 0x41, 0x4e, 0x2d, 0x44, 0x32, 0x20,
0x2d, 0x20, 0x4a, 0x75, 0x6d, 0x70, 0x73, 0x74,
0x61, 0x72, 0x74, 0x10, 0x3c, 0x00, 0x01, 0x03,
0x10, 0x02, 0x00, 0x02, 0x00, 0x00, 0x10, 0x12,
0x00, 0x02, 0x00, 0x04, 0x10, 0x09, 0x00, 0x02,
0x00, 0x00, 0x10, 0x2d, 0x00, 0x04, 0x00, 0x80,
0x00, 0x00
#ifdef IPWPS_DEBUG_FAKE_ATTRIBUTE
,
0x10, 0x06, 0x07, 0xfc,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb,
0xdb, 0xdb, 0xdb, 0xdb
#endif
#ifdef IPWSP_PROTOMSG_TEST_OTHER_ATTR
,
0x10, 0x66, 0x00, 0x02, 0x00, 0x00, 0x10, 0x67,
0x00, 0x04, 0x01, 0x02, 0x03, 0x04
#endif
};
#ifdef IPWSP_PROTOMSG_TEST_OTHER_ATTR
IP_STATIC Ip_u8 m2_test_vector[420] = {
#else
IP_STATIC Ip_u8 m2_test_vector[408] = {
#endif
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x05, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x39,
0x00, 0x10, 0x29, 0x9c, 0x0d, 0x20, 0x50, 0xc9,
0x8c, 0x9d, 0xf8, 0x58, 0x9a, 0xff, 0x9c, 0x0c,
0x86, 0xfc, 0x10, 0x48, 0x00, 0x10, 0xc7, 0xc4,
0x14, 0x93, 0x64, 0x74, 0x30, 0x84, 0xa6, 0xa5,
0xa4, 0x1f, 0x50, 0x29, 0xb1, 0xd1, 0x10, 0x32,
0x00, 0xc0, 0x24, 0xb0, 0x3c, 0xb9, 0x6f, 0xf0,
0xf7, 0x5d, 0xba, 0x8a, 0xa8, 0xcd, 0x47, 0xab,
0xfd, 0xa7, 0x5c, 0x98, 0xfd, 0xda, 0x8e, 0xf0,
0x3d, 0xc3, 0x5e, 0xe2, 0xa9, 0x21, 0xe9, 0x0b,
0x20, 0xdc, 0x29, 0x6f, 0x5f, 0x64, 0xbc, 0x53,
0x85, 0x41, 0x6f, 0x43, 0x3e, 0x4e, 0x38, 0xc3,
0x02, 0xba, 0xd5, 0xe3, 0xe2, 0x82, 0x02, 0x91,
0xa4, 0xbb, 0x74, 0x26, 0x6e, 0x00, 0xd7, 0x93,
0x55, 0xb6, 0xdc, 0x6a, 0xf1, 0x65, 0xef, 0xaa,
0xff, 0xb3, 0xab, 0xde, 0xd4, 0xe9, 0x74, 0x4e,
0x42, 0xbf, 0x00, 0xf5, 0x47, 0xc8, 0xc7, 0xa6,
0x47, 0x79, 0xcb, 0xc8, 0x91, 0x51, 0x12, 0xdd,
0x5c, 0xf7, 0x3b, 0xdc, 0x80, 0xcc, 0x00, 0xde,
0x67, 0x1e, 0x70, 0xa4, 0xe3, 0x6f, 0xf0, 0x79,
0xe9, 0x91, 0x82, 0x8b, 0xc5, 0xbb, 0xc7, 0xf0,
0x05, 0x98, 0x6c, 0x9a, 0xfe, 0x99, 0xfd, 0x9d,
0x31, 0x52, 0x42, 0xce, 0x74, 0x05, 0xac, 0xd9,
0x18, 0xe3, 0x6f, 0x46, 0x4b, 0x90, 0x3f, 0x02,
0x83, 0xce, 0x79, 0x30, 0xf4, 0xe9, 0xb1, 0x87,
0xb4, 0x1e, 0x39, 0xe8, 0x5d, 0xb6, 0xd3, 0x30,
0x2e, 0xb2, 0x1f, 0x9b, 0x45, 0x10, 0xf3, 0x51,
0xef, 0xfe, 0x32, 0x64, 0x6b, 0x9b, 0x6f, 0xff,
0x6d, 0xc0, 0xd8, 0xc3, 0xed, 0x28, 0x14, 0xe8,
0x9c, 0x67, 0x1d, 0x33, 0x9a, 0x8b, 0xbe, 0x80,
0x79, 0x85, 0x10, 0x04, 0x00, 0x02, 0x00, 0x3f,
0x10, 0x10, 0x00, 0x02, 0x00, 0x0f, 0x10, 0x0d,
0x00, 0x01, 0x03, 0x10, 0x08, 0x00, 0x02, 0x00,
0x8c, 0x10, 0x21, 0x00, 0x0e, 0x44, 0x2d, 0x4c,
0x69, 0x6e, 0x6b, 0x20, 0x53, 0x79, 0x73, 0x74,
0x65, 0x6d, 0x73, 0x10, 0x23, 0x00, 0x07, 0x44,
0x49, 0x52, 0x2d, 0x36, 0x32, 0x35, 0x10, 0x24,
0x00, 0x02, 0x43, 0x32, 0x10, 0x42, 0x00, 0x04,
0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x54, 0x00, 0x08,
0x00, 0x06, 0x00, 0x50, 0xf2, 0x04, 0x00, 0x01,
0x10, 0x11, 0x00, 0x11, 0x57, 0x69, 0x72, 0x65,
0x6c, 0x65, 0x73, 0x73, 0x20, 0x4e, 0x20, 0x52,
0x6f, 0x75, 0x74, 0x65, 0x72, 0x10, 0x3c, 0x00,
0x01, 0x01, 0x10, 0x02, 0x00, 0x02, 0x00, 0x01,
0x10, 0x09, 0x00, 0x02, 0x00, 0x00, 0x10, 0x12,
0x00, 0x02, 0x00, 0x04, 0x10, 0x2d, 0x00, 0x04,
0x80, 0x03, 0x06, 0x01,
#ifdef IPWSP_PROTOMSG_TEST_OTHER_ATTR
0x10, 0x66, 0x00, 0x02, 0x00, 0x00, 0x10, 0x67,
0x00, 0x02, 0x01, 0x02,
#endif
0x10, 0x05, 0x00, 0x08,
0x9e, 0x8c, 0xce, 0xe1, 0x96, 0xb3, 0xfe, 0xa0
};
IP_STATIC Ip_u8 m2d_test_vector[194] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x06, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x39,
0x00, 0x10, 0x29, 0x9c, 0x0d, 0x20, 0x50, 0xc9,
0x8c, 0x9d, 0xf8, 0x58, 0x9a, 0xff, 0x9c, 0x0c,
0x86, 0xfc, 0x10, 0x48, 0x00, 0x10, 0xc7, 0xc4,
0x14, 0x93, 0x64, 0x74, 0x30, 0x84, 0xa6, 0xa5,
0xa4, 0x1f, 0x50, 0x29, 0xb1, 0xd1, 0x10, 0x04,
0x00, 0x02, 0x00, 0x3f, 0x10, 0x10, 0x00, 0x02,
0x00, 0x0f, 0x10, 0x0d, 0x00, 0x01, 0x03, 0x10,
0x08, 0x00, 0x02, 0x00, 0x8c, 0x10, 0x21, 0x00,
0x0e, 0x44, 0x2d, 0x4c, 0x69, 0x6e, 0x6b, 0x20,
0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x10,
0x23, 0x00, 0x07, 0x44, 0x49, 0x52, 0x2d, 0x36,
0x32, 0x35, 0x10, 0x24, 0x00, 0x02, 0x43, 0x32,
0x10, 0x42, 0x00, 0x04, 0x6e, 0x6f, 0x6e, 0x65,
0x10, 0x54, 0x00, 0x08, 0x00, 0x06, 0x00, 0x50,
0xf2, 0x04, 0x00, 0x01, 0x10, 0x11, 0x00, 0x11,
0x57, 0x69, 0x72, 0x65, 0x6c, 0x65, 0x73, 0x73,
0x20, 0x4e, 0x20, 0x52, 0x6f, 0x75, 0x74, 0x65,
0x72, 0x10, 0x3c, 0x00, 0x01, 0x01, 0x10, 0x02,
0x00, 0x02, 0x00, 0x01, 0x10, 0x09, 0x00, 0x02,
0x00, 0x00, 0x10, 0x2d, 0x00, 0x04, 0x80, 0x03,
0x06, 0x01
};
IP_STATIC Ip_u8 m3_test_vector[114] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x07, 0x10, 0x39, 0x00, 0x10, 0x29, 0x9c,
0x0d, 0x20, 0x50, 0xc9, 0x8c, 0x9d, 0xf8, 0x58,
0x9a, 0xff, 0x9c, 0x0c, 0x86, 0xfc, 0x10, 0x14,
0x00, 0x20, 0xb2, 0x4d, 0xb7, 0x81, 0x55, 0x55,
0xe7, 0x55, 0x35, 0x60, 0x55, 0x98, 0x07, 0x97,
0x19, 0x1c, 0x06, 0xc3, 0x94, 0x29, 0x3f, 0x5a,
0x7f, 0x88, 0x47, 0xdc, 0x2b, 0xfd, 0xf5, 0x9b,
0x68, 0x81, 0x10, 0x15, 0x00, 0x20, 0xb2, 0x4d,
0xb7, 0x81, 0x55, 0x55, 0xe7, 0x55, 0x35, 0x60,
0x55, 0x98, 0x07, 0x97, 0x19, 0x1c, 0x06, 0xc3,
0x94, 0x29, 0x3f, 0x5a, 0x7f, 0x88, 0x47, 0xdc,
0x2b, 0xfd, 0xf5, 0x9b, 0x68, 0x81, 0x10, 0x05,
0x00, 0x08, 0xf9, 0x37, 0x33, 0x62, 0x7d, 0x93,
0x6d, 0x0f
};
IP_STATIC Ip_u8 m4_test_vector[182] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x08, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x3d,
0x00, 0x20, 0xe4, 0xdc, 0xa2, 0xb4, 0x3d, 0x5a,
0xdf, 0x06, 0x84, 0x6e, 0xa4, 0xcf, 0x93, 0xe2,
0x55, 0x18, 0x80, 0x43, 0xb6, 0x60, 0xf1, 0xda,
0xef, 0xbe, 0xb9, 0xde, 0xb1, 0x74, 0xfe, 0x20,
0x94, 0x63, 0x10, 0x3e, 0x00, 0x20, 0x0c, 0x8d,
0xc4, 0xde, 0xbd, 0x29, 0xc0, 0x76, 0xe1, 0x20,
0xa5, 0x88, 0x13, 0x10, 0x71, 0x65, 0xa2, 0x53,
0x11, 0x20, 0x9f, 0x4d, 0xb2, 0xac, 0xc1, 0x9c,
0xba, 0x1b, 0xa7, 0x07, 0x8a, 0x4e, 0x10, 0x18,
0x00, 0x40, 0xca, 0x8c, 0xd4, 0x61, 0x94, 0x65,
0x21, 0xfb, 0xc3, 0x87, 0xc1, 0x59, 0x76, 0x38,
0x6a, 0x56, 0x45, 0x5b, 0xbf, 0x5a, 0x88, 0x24,
0x4f, 0xaf, 0x06, 0xd5, 0x0c, 0x4a, 0x67, 0xa6,
0xfa, 0xd0, 0xc2, 0xf8, 0x46, 0x9b, 0xf2, 0x57,
0x8c, 0x6e, 0x75, 0x8e, 0x60, 0x2b, 0x6a, 0x9e,
0xbd, 0x68, 0x48, 0xf3, 0xdc, 0x56, 0x9a, 0x12,
0x60, 0x72, 0x4b, 0x86, 0x60, 0x4e, 0x99, 0xfd,
0x2a, 0x83, 0x10, 0x05, 0x00, 0x08, 0x39, 0x2f,
0xb4, 0x36, 0x0b, 0x6c, 0x8c, 0x21
};
IP_STATIC Ip_u8 m5_test_vector[110] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x09, 0x10, 0x39, 0x00, 0x10, 0x29, 0x9c,
0x0d, 0x20, 0x50, 0xc9, 0x8c, 0x9d, 0xf8, 0x58,
0x9a, 0xff, 0x9c, 0x0c, 0x86, 0xfc, 0x10, 0x18,
0x00, 0x40, 0xf0, 0xbc, 0xb2, 0xee, 0x50, 0x99,
0x63, 0x4b, 0x2d, 0x66, 0x0f, 0x40, 0x9b, 0x72,
0x25, 0x99, 0xf7, 0x69, 0x92, 0xe0, 0x54, 0xac,
0x66, 0x41, 0xf0, 0xe0, 0x39, 0xb3, 0xe6, 0x24,
0x6a, 0x35, 0x30, 0xfc, 0x80, 0xa7, 0x21, 0x1d,
0x09, 0x93, 0x52, 0x15, 0xed, 0x7d, 0xbe, 0x59,
0xb5, 0x51, 0x6f, 0xb1, 0x15, 0xd8, 0xf4, 0x04,
0x6c, 0x1e, 0x8d, 0xe9, 0xfd, 0xf7, 0x44, 0xee,
0xf5, 0xe5, 0x10, 0x05, 0x00, 0x08, 0x70, 0xc2,
0x19, 0x55, 0xd0, 0x1e, 0xac, 0x10
};
IP_STATIC Ip_u8 m6_test_vector[110] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0a, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x18,
0x00, 0x40, 0x66, 0x99, 0x5b, 0x5d, 0xdd, 0x87,
0x49, 0x97, 0x84, 0x28, 0x5b, 0x76, 0x40, 0xc5,
0x3e, 0xb7, 0x0f, 0x71, 0xa8, 0xee, 0x1e, 0xe2,
0xed, 0xa2, 0xbe, 0x0e, 0x0b, 0xac, 0x24, 0x64,
0x85, 0x0d, 0x24, 0xf5, 0x34, 0xea, 0xa7, 0x67,
0xc8, 0x2a, 0xba, 0x0e, 0x4e, 0xcf, 0xd9, 0xcf,
0x10, 0x5f, 0xf2, 0x17, 0xe9, 0x71, 0x84, 0x0a,
0xa4, 0xa2, 0x1b, 0x90, 0xfb, 0xe1, 0x06, 0xa7,
0x21, 0xa6, 0x10, 0x05, 0x00, 0x08, 0x62, 0xb7,
0x28, 0xae, 0xc8, 0xe9, 0x36, 0xa1
};
IP_STATIC Ip_u8 m7_test_vector[110] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0b, 0x10, 0x39, 0x00, 0x10, 0x29, 0x9c,
0x0d, 0x20, 0x50, 0xc9, 0x8c, 0x9d, 0xf8, 0x58,
0x9a, 0xff, 0x9c, 0x0c, 0x86, 0xfc, 0x10, 0x18,
0x00, 0x40, 0xf0, 0xbc, 0xb2, 0xee, 0x50, 0x99,
0x63, 0x4b, 0x2d, 0x66, 0x0f, 0x40, 0x9b, 0x72,
0x25, 0x99, 0x8c, 0x82, 0xf6, 0x95, 0xcc, 0xe4,
0xe8, 0x0d, 0x60, 0xc0, 0x62, 0xb8, 0xc7, 0x4b,
0x2b, 0xd2, 0x72, 0x7f, 0xa3, 0x26, 0x65, 0x2b,
0x92, 0xf5, 0x74, 0xd1, 0xfe, 0x43, 0x2d, 0xf6,
0xaf, 0x18, 0x65, 0xa9, 0x9b, 0x01, 0x79, 0xf5,
0x6d, 0xdb, 0x35, 0x47, 0xc8, 0x27, 0x11, 0x14,
0xb7, 0xb3, 0x10, 0x05, 0x00, 0x08, 0x8e, 0x62,
0x8d, 0xca, 0x9c, 0x16, 0x23, 0xd1
};
IP_STATIC Ip_u8 m8_test_vector[206] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0c, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x18,
0x00, 0xa0, 0xfa, 0xfe, 0x7d, 0x58, 0xa1, 0x0f,
0x0a, 0xf0, 0xfa, 0x60, 0xc5, 0xcc, 0xa7, 0x5e,
0x9a, 0x14, 0xcc, 0x19, 0x19, 0xe0, 0x3a, 0xcc,
0x13, 0x29, 0x11, 0xc3, 0x7a, 0xad, 0xe6, 0x5c,
0x86, 0x47, 0x64, 0xef, 0xbe, 0x2b, 0x90, 0xad,
0x9b, 0x2f, 0x80, 0x10, 0xe8, 0x78, 0xef, 0xa8,
0x65, 0x6b, 0x94, 0x83, 0x7a, 0x56, 0x7c, 0xe8,
0x5f, 0x7d, 0x59, 0x2e, 0x3a, 0xe3, 0xd0, 0x84,
0x20, 0x39, 0xac, 0xed, 0xd2, 0xa4, 0x04, 0x8c,
0x1a, 0x96, 0x3b, 0x31, 0xfe, 0x57, 0x09, 0x62,
0x8e, 0x5c, 0x7f, 0xc3, 0x47, 0xde, 0xd5, 0x37,
0x07, 0x7c, 0x43, 0x72, 0x74, 0x1e, 0x02, 0xec,
0x7d, 0x87, 0xa7, 0x0b, 0xb1, 0xad, 0x3e, 0xeb,
0x6e, 0x80, 0xef, 0x55, 0x34, 0xe6, 0x5c, 0x3f,
0xa6, 0x97, 0x45, 0x38, 0x34, 0xd9, 0xbd, 0x1e,
0xb0, 0x2d, 0x2d, 0x37, 0x18, 0xfb, 0xb7, 0xb3,
0xc9, 0xc7, 0xef, 0x81, 0xa0, 0x46, 0x64, 0x46,
0x0d, 0xe2, 0x15, 0x4a, 0x17, 0x6a, 0x95, 0x63,
0x3b, 0x80, 0x38, 0x94, 0x44, 0x76, 0x26, 0x41,
0xad, 0xf2, 0x17, 0xce, 0x10, 0x5f, 0x8c, 0xc8,
0xeb, 0x03, 0x10, 0x05, 0x00, 0x08, 0x85, 0xbb,
0x55, 0x5d, 0xfa, 0x51, 0x89, 0x81
};
IP_STATIC Ip_u8 ack_test_vector[50] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0d, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x39,
0x00, 0x10, 0x29, 0x9c, 0x0d, 0x20, 0x50, 0xc9,
0x8c, 0x9d, 0xf8, 0x58, 0x9a, 0xff, 0x9c, 0x0c,
0x86, 0xfc
};
IP_STATIC Ip_u8 nack_test_vector[56] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0e, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x39,
0x00, 0x10, 0x29, 0x9c, 0x0d, 0x20, 0x50, 0xc9,
0x8c, 0x9d, 0xf8, 0x58, 0x9a, 0xff, 0x9c, 0x0c,
0x86, 0xfc, 0x10, 0x09, 0x00, 0x02, 0x00, 0x11
};
IP_STATIC Ip_u8 done_test_vector[50] = {
0x10, 0x4a, 0x00, 0x01, 0x10, 0x10, 0x22, 0x00,
0x01, 0x0f, 0x10, 0x1a, 0x00, 0x10, 0xec, 0xc0,
0xea, 0xef, 0x06, 0x42, 0x3a, 0xbb, 0xad, 0x6b,
0xa3, 0x14, 0x21, 0xd0, 0x74, 0xdf, 0x10, 0x39,
0x00, 0x10, 0x29, 0x9c, 0x0d, 0x20, 0x50, 0xc9,
0x8c, 0x9d, 0xf8, 0x58, 0x9a, 0xff, 0x9c, 0x0c,
0x86, 0xfc
};
#endif
#endif
#ifdef IPWPS_USE_WPS_DRV_IF
IP_STATIC Ipwps_drv_rcv_methods ipwps_testapp_drv_rcv_methods = {
ipwps_testapp_rcv_probe_response_ies,
ipwps_testapp_rcv_probe_request_ies,
ipwps_testapp_rcv_assoc_notify
};
#endif
#endif
/*
****************************************************************************
* 10 GLOBAL FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipwps_dbg_send_event
*===========================================================================
* Description: Send a Debug event to the IPWPS process
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_dbg_send_event(Ipwps_msg_type_wpsdebug event_type) {
Ipwps_ipd_msg *request, *response;
Ip_err rc = IPCOM_SUCCESS;
request = ipcom_calloc(1, sizeof(Ipwps_ipd_msg));
response = ipcom_calloc(1, sizeof(Ipwps_ipd_msg));
if (!request || !response ) {
rc = IPCOM_ERR_NO_MEMORY;
goto done_dbg_send_event;
}
IPWPS_PREPARE_IPD_MSG(request, IPWPS_IPD_EVENT_WPSDEBUG, IPCOM_SUCCESS, event_type);
rc = ipcom_ipd_datamsg(IPWPS_PROCESS_NAME,request,sizeof(Ipwps_ipd_msg),response,sizeof(Ipwps_ipd_msg));
if (rc != IPCOM_SUCCESS)
goto done_dbg_send_event;
rc = response->ipd_msg.msgerr;
done_dbg_send_event:
if (response)
ipcom_free(response);
if (request)
ipcom_free(request);
return rc;
}
/*
*===========================================================================
* ipwps_dbg_wps_begin
*===========================================================================
* Description: DEBUG API - Trigger a WPS Begin Event
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_dbg_wps_begin(void) {
return ipwps_dbg_send_event(IPWPS_MSG_TYPE_WPSDEBUG_WPS_BEGIN);
}
/*
*===========================================================================
* ipwps_dbg_ap_show
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_dbg_ap_show(void) {
return ipwps_dbg_send_event(IPWPS_MSG_TYPE_WPSDEBUG_AP_SHOW);
}
/*
*===========================================================================
* ipwps_dbg_enrollee_show
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_dbg_enrollee_show(void) {
return ipwps_dbg_send_event(IPWPS_MSG_TYPE_WPSDEBUG_ENROLLEE_SHOW);
}
/*
*===========================================================================
* ipwps_dbg_registrar_show
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_dbg_registrar_show(void) {
return ipwps_dbg_send_event(IPWPS_MSG_TYPE_WPSDEBUG_REGISTRAR_SHOW);
}
/*
*===========================================================================
* ipwps_dbg_timers_show
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_dbg_timers_show(void) {
return ipwps_dbg_send_event(IPWPS_MSG_TYPE_WPSDEBUG_TIMERS_SHOW);
}
#ifdef IPWPS_ENABLE_WPS_TESTAPP
/*
*===========================================================================
* ipwps_testapp_init
*===========================================================================
* Description: Initializes the debug wps application which sends and receives
* some WPS test vectors.
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_testapp_init(Ipwps_ctx* ctx) {
#ifdef IPWPS_USE_WPS_PROTOCOL
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
ip_assert(ctx);
if (ctx->public.coop_info.wps_role) {
IPCOM_LOG2(CRIT, "ipwps_testapp_init :: ERROR! WPS Role already set to %s (%d)",
ipwps_api_wps_role_name(ctx->public.coop_info.wps_role), ctx->public.coop_info.wps_role);
return IPCOM_ERR_FAILED;
}
ctx->public.coop_info.wps_role = IPWPS_ROLE_TESTAPP;
if (!ipwps_testapp_proto_ctx) {
ipwps_testapp_proto_ctx = ipwps_protocol_ctx_init(ctx);
if (!ipwps_testapp_proto_ctx) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: failed to init protocol context");
return IPCOM_ERR_FAILED;
}
}
if (ipwps_config_adaptor_register_cb(ctx, ipwps_testapp_ca_cb_handler) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: failed to register callback with config adaptor");
return IPCOM_ERR_FAILED;
}
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_IDLE);
#endif
if (ipwps_proto_adaptor_set_methods(ctx, &ipwps_testapp_rcv_methods,
ipwps_testapp_proto_ctx) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: ipwps_proto_adaptor_set_methods() failed");
return IPCOM_ERR_FAILED;
}
ipwps_proto_adaptor_set_identity(ctx, "WFA-SimpleConfig-TestApp-1-0");
if (ipwps_proto_adaptor_wps_on(ctx) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: ipwps_proto_adaptor_wps_on() failed");
return IPCOM_ERR_FAILED;
}
#endif
#ifdef IPWPS_USE_WPS_DRV_IF
if (ctx->public.wps_drv_module.enabled) {
if (ipwps_drv_set_methods(ctx, &ipwps_testapp_drv_rcv_methods) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: ipwps_drv_set_methods() failed");
return IPCOM_ERR_FAILED;
}
}
#endif
return IPCOM_SUCCESS;
}
/*
*===========================================================================
* ipwps_testapp_shutdown
*===========================================================================
* Description: Shuts down the debug wps application.
* Parameters:
* Returns:
*
*/
IP_GLOBAL Ip_err ipwps_testapp_shutdown(Ipwps_ctx* ctx) {
ip_assert(ctx);
#ifdef IPWPS_USE_WPS_PROTOCOL
ctx->public.coop_info.wps_role = IPWPS_ROLE_NONE;
ipcom_memset(&ctx->public.enrollee_info, 0, sizeof(ctx->public.enrollee_info));
ipcom_memset(&ctx->public.registrar_info, 0, sizeof(ctx->public.registrar_info));
ipwps_proto_adaptor_set_identity(ctx, "");
ipwps_proto_adaptor_wps_off(ctx);
if (ipwps_config_adaptor_deregister_cb(ctx, ipwps_testapp_ca_cb_handler) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_shutdown :: failed to deregister callback with config adaptor");
return IPCOM_ERR_FAILED;
}
if (ipwps_proto_adaptor_remove_methods(ctx, ipwps_testapp_proto_ctx) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_shutdown :: ipwps_proto_adaptor_remove_methods() failed");
}
if (ipwps_testapp_proto_ctx) {
if (ipwps_protocol_ctx_destroy(ctx, ipwps_testapp_proto_ctx) != IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_shutdown :: failed to destroy protocol context");
}
ipwps_testapp_proto_ctx = IP_NULL;
}
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_IDLE);
#endif
return IPCOM_SUCCESS;
}
#ifdef IPWPS_USE_WPS_PROTOCOL
/*
*===========================================================================
* ipwps_testapp_ca_cb_handler
*===========================================================================
* Description: Handle the Config Adaptor callback
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err
ipwps_testapp_ca_cb_handler(Ipwps_ctx *ctx, Ipwps_config_adaptor_event *event) {
Ip_err rc;
Ipwps_dev_pwd_container dev_pwd;
Ipwps_operation_status status;
ip_assert(ctx);
ip_assert(event);
if (event->status != IPWPS_OPSTATUS_OK) {
IPCOM_LOG2(DEBUG2, "ipwps_testapp_ca_cb_handler :: Received a config adaptor event %d with status %d",
event->type, event->status);
return IPCOM_ERR_FAILED;
}
if (event->type == IPWPS_CA_EVENT_PIN) {
IPCOM_LOG0(DEBUG2, "ipwps_testapp_ca_cb_handler :: Received a PIN event");
status = ipwps_ca_get_device_password(ctx, &dev_pwd);
if (status != IPWPS_OPSTATUS_OK) {
IPCOM_LOG1(ERR, "ipwps_testapp_init :: failed to retrieve device password (status=%d)", status);
return IPCOM_ERR_FAILED;
}
rc = ipwps_proto_set_device_password(ipwps_testapp_proto_ctx, dev_pwd.pwd, dev_pwd.len);
if (rc!= IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_ca_cb_handler :: ipwps_proto_set_device_password() failed");
}
} else if (event->type == IPWPS_CA_EVENT_PUSHBUTTON) {
IPCOM_LOG0(DEBUG2, "ipwps_testapp_ca_cb_handler :: Received a PUSHBUTTON event");
rc = ipwps_proto_adaptor_wps_begin(ctx);
if (rc!= IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_ca_cb_handler :: ipwps_proto_adaptor_wps_begin() failed");
}
} else {
IPCOM_LOG1(ERR, "ipwps_testapp_ca_cb_handler :: Unrecognized event type %d", event->type);
rc = IPCOM_ERR_FAILED;
}
return rc;
}
/*
*===========================================================================
* ipwps_testapp_notify_EAPOL_START
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err
ipwps_testapp_notify_EAPOL_START(struct Ipwps_ctx_st* ctx, Ip_u8* peer_eth_addr) {
if (!peer_eth_addr) {
IPCOM_LOG0(ERR, "ipwps_testapp_notify_EAPOL_START :: NULL peer_eth_addr");
return IPCOM_ERR_INVALID_ARG;
}
IPCOM_LOG6(DEBUG2, "ipwps_testapp_notify_EAPOL_START called :: peer_eth_addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
peer_eth_addr[0], peer_eth_addr[1], peer_eth_addr[2], peer_eth_addr[3], peer_eth_addr[4], peer_eth_addr[5]);
ip_assert(ctx);
ipcom_memcpy(ctx->public.enrollee_info.mac_addr, peer_eth_addr, 6);
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_IN_PROGRESS);
return IPCOM_SUCCESS;
}
/*
*===========================================================================
* ipwps_testapp_rcv_ID_RESP
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_ID_RESP(Ipwps_ctx* ctx, char *identity) {
Ip_err rc = IPCOM_ERR_FAILED;
IPCOM_LOG1(DEBUG2, "ipwps_testapp_rcv_ID_RESP called :: identity = %s",
(identity ? identity : "(null)"));
ip_assert(ctx);
rc = ipwps_proto_adaptor_send_START(ctx);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_START
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_START(Ipwps_ctx* ctx) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M1 *m1 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_START called");
ip_assert(ctx);
ipcom_memcpy(ctx->public.enrollee_info.mac_addr, ctx->public.if_mac_addr, 6);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m1 = (Ipwps_protomsg_M1 *)ipwps_protocol_decode_message(m1_test_vector, sizeof(m1_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_START :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m1 = (Ipwps_protomsg_M1 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M1);
#endif
if (!m1) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_START :: Failed to decode m1_test_vector");
return IPCOM_ERR_FAILED;
}
#if defined(IPWPS_USE_PROTOMSG_TEST_VECTORS) && defined(IPWPS_DEBUG_FAKE_ATTRIBUTE)
ipwps_dump_data("Fake tlv data", m1->fake.octet, m1->fake.len);
#endif
if (m1->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M1) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_START :: Failed to decode m1_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M1 (0x%.4x)",
m1->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M1);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m1) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M1(ctx, m1);
ipcom_free(m1);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M1
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M1(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1) {
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M2 *m2 = IP_NULL;
Ipwps_protomsg_M2D *m2d = IP_NULL;
#else
Ipwps_operation_status status;
Ipwps_dev_pwd_container dev_pwd;
#endif
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M1 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
#if defined(IPWPS_DEBUG_FAKE_ATTRIBUTE)
ipwps_dump_data("Fake tlv data", m1->fake.octet, m1->fake.len);
#endif
if (!ipwps_testapp_use_m2d)
m2 = (Ipwps_protomsg_M2 *)ipwps_protocol_decode_message(m2_test_vector, sizeof(m2_test_vector));
else
m2d = (Ipwps_protomsg_M2D *)ipwps_protocol_decode_message(m2d_test_vector, sizeof(m2d_test_vector));
if (!ipwps_testapp_use_m2d && !m2) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M1 :: Failed to decode m2_test_vector");
return IPCOM_ERR_FAILED;
}
if (!ipwps_testapp_use_m2d && (m2->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M2)) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M1 :: Failed to decode m2_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M2 (0x%.4x)",
m2->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M2);
return IPCOM_ERR_FAILED;
}
if (ipwps_testapp_use_m2d && !m2d) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M2 :: Failed to decode m2d_test_vector");
return IPCOM_ERR_FAILED;
}
if (ipwps_testapp_use_m2d && (m2d->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M2D)) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M2 :: Failed to decode m2d_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M2D (0x%.4x)",
m2d->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M2D);
return IPCOM_ERR_FAILED;
}
if (!ipwps_testapp_use_m2d)
rc = ipwps_proto_adaptor_send_M2(ctx, m2);
else
rc = ipwps_proto_adaptor_send_M2D(ctx, m2d);
if (m2)
ipcom_free(m2);
if (m2d)
ipcom_free(m2d);
return rc;
#else
status = ipwps_ca_get_device_password(ctx, &dev_pwd);
if (status < 0) {
IPCOM_LOG1(ERR, "ipwps_testapp_init :: failed to retrieve device password (status=%d)", status);
return IPCOM_ERR_FAILED;
}
if (status == IPWPS_OPSTATUS_PENDING) {
IPCOM_LOG0(WARNING, "ipwps_testapp_init :: PIN NOT SET. Please set the PIN then restart the registration proces.");
return ipwps_testapp_send_M2D(ctx, m1);
}
if (ipwps_proto_set_device_password(ipwps_testapp_proto_ctx, dev_pwd.pwd, dev_pwd.len)
!= IPCOM_SUCCESS) {
IPCOM_LOG0(ERR, "ipwps_testapp_init :: ipwps_proto_set_device_password() failed");
return IPCOM_ERR_FAILED;
}
return ipwps_testapp_send_M2(ctx, m1);
#endif
}
/*
*===========================================================================
* ipwps_testapp_send_M2
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_send_M2(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M2 *m2 = IP_NULL;
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_send_M2 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m2 = (Ipwps_protomsg_M2 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M2);
if (!m2) {
IPCOM_LOG0(ERR, "ipwps_testapp_send_M2 :: Failed to alloc m2");
return IPCOM_ERR_FAILED;
}
rc = ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m2);
if (rc == IPCOM_SUCCESS) {
rc = ipwps_proto_adaptor_send_M2(ctx, m2);
}
if (m2)
ipcom_free(m2);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_send_M2D
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_send_M2D(Ipwps_ctx* ctx, Ipwps_protomsg_M1* m1) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M2D *m2d = IP_NULL;
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M1 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m2d = (Ipwps_protomsg_M2D *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M2D);
if (!m2d) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M1 :: Failed to alloc m2d");
return IPCOM_ERR_FAILED;
}
rc = ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m2d);
if (rc == IPCOM_SUCCESS) {
rc = ipwps_proto_adaptor_send_M2D(ctx, m2d);
}
if (m2d)
ipcom_free(m2d);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M2
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M2(Ipwps_ctx* ctx, Ipwps_protomsg_M2* m2) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M3 *m3 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M2 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m3 = (Ipwps_protomsg_M3 *)ipwps_protocol_decode_message(m3_test_vector, sizeof(m3_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M2 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m3 = (Ipwps_protomsg_M3 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M3);
#endif
if (!m3) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M2 :: Failed to decode m3_test_vector");
return IPCOM_ERR_FAILED;
}
if (m3->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M3) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M2 :: Failed to decode m3_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M3 (0x%.4x)",
m3->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M3);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m3) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M3(ctx, m3);
ipcom_free(m3);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M2D
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M2D(Ipwps_ctx* ctx, Ipwps_protomsg_M2D* m2d) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_NACK *nack = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M2D called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
nack = (Ipwps_protomsg_NACK *)ipwps_protocol_decode_message(nack_test_vector, sizeof(nack_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M2D :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
nack = (Ipwps_protomsg_NACK *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_NACK);
#endif
if (!nack) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M2D :: Failed to decode nack_test_vector");
return IPCOM_ERR_FAILED;
}
if (nack->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_NACK) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M2D :: Failed to decode nack_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_NACK (0x%.4x)",
nack->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_NACK);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)nack) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_NACK(ctx, nack);
ipcom_free(nack);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M3
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M3(Ipwps_ctx* ctx, Ipwps_protomsg_M3* m3) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M4 *m4 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M3 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m4 = (Ipwps_protomsg_M4 *)ipwps_protocol_decode_message(m4_test_vector, sizeof(m4_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M3 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m4 = (Ipwps_protomsg_M4 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M4);
#endif
if (!m4) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M3 :: Failed to decode m4_test_vector");
return IPCOM_ERR_FAILED;
}
if (m4->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M4) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M3 :: Failed to decode m4_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M4 (0x%.4x)",
m4->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M4);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m4) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M4(ctx, m4);
ipcom_free(m4);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M4
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M4(Ipwps_ctx* ctx, Ipwps_protomsg_M4* m4) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M5 *m5 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M4 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m5 = (Ipwps_protomsg_M5 *)ipwps_protocol_decode_message(m5_test_vector, sizeof(m5_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M4 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m5 = (Ipwps_protomsg_M5 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M5);
#endif
if (!m5) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M4 :: Failed to decode m5_test_vector");
return IPCOM_ERR_FAILED;
}
if (m5->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M5) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M4 :: Failed to decode m5_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M5 (0x%.4x)",
m5->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M5);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m5) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M5(ctx, m5);
ipcom_free(m5);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M5
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M5(Ipwps_ctx* ctx, Ipwps_protomsg_M5* m5) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M6 *m6 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M5 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m6 = (Ipwps_protomsg_M6 *)ipwps_protocol_decode_message(m6_test_vector, sizeof(m6_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M5 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m6 = (Ipwps_protomsg_M6 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M6);
#endif
if (!m6) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M5 :: Failed to decode m6_test_vector");
return IPCOM_ERR_FAILED;
}
if (m6->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M6) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M5 :: Failed to decode m6_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M6 (0x%.4x)",
m6->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M6);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m6) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M6(ctx, m6);
ipcom_free(m6);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M6
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M6(Ipwps_ctx* ctx, Ipwps_protomsg_M6* m6) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M7 *m7 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M6 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m7 = (Ipwps_protomsg_M7 *)ipwps_protocol_decode_message(m7_test_vector, sizeof(m7_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M6 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m7 = (Ipwps_protomsg_M7 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M7);
#endif
if (!m7) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M6 :: Failed to decode m7_test_vector");
return IPCOM_ERR_FAILED;
}
if (m7->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M7) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M6 :: Failed to decode m7_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M7 (0x%.4x)",
m7->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M7);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m7) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M7(ctx, m7);
ipcom_free(m7);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M7
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M7(Ipwps_ctx* ctx, Ipwps_protomsg_M7* m7) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_M8 *m8 = IP_NULL;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M7 called");
ip_assert(ctx);
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
m8 = (Ipwps_protomsg_M8 *)ipwps_protocol_decode_message(m8_test_vector, sizeof(m8_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M7 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
m8 = (Ipwps_protomsg_M8 *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_M8);
#endif
if (!m8) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M7 :: Failed to decode m8_test_vector");
return IPCOM_ERR_FAILED;
}
if (m8->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_M8) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M7 :: Failed to decode m8_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_M8 (0x%.4x)",
m8->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_M8);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)m8) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_M8(ctx, m8);
ipcom_free(m8);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_M8
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_M8(Ipwps_ctx* ctx, Ipwps_protomsg_M8* m8) {
Ip_err rc = IPCOM_ERR_FAILED;
Ipwps_protomsg_DONE *done = IP_NULL;
Ipwps_credential_set *ecred;
int i;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_M8 called");
ip_assert(ctx);
/* Set the retrieved enrollee credentials */
ctx->credentials.num_enrollee_creds = m8->decr_set.num_wlan_creds;
for (i = 0; i < m8->decr_set.num_wlan_creds; i++) {
ecred = &ctx->credentials.enrollee_credentials[i];
ipcom_strncpy(ecred->ssid, (char *)m8->decr_set.wlan_credentials[i].ssid.name, IPWPS_SSID_MAXLEN+1);
ecred->ssid[IPWPS_SSID_MAXLEN] = '\0';
ecred->auth_type = m8->decr_set.wlan_credentials[i].auth_type.val;
ecred->encr_type = m8->decr_set.wlan_credentials[i].encr_type.val;
ipcom_memcpy(ecred->mac_addr, m8->decr_set.wlan_credentials[i].mac_addr.octet, 6);
if (m8->decr_set.wlan_credentials[i].network_idx.len)
ecred->network_idx = m8->decr_set.wlan_credentials[i].network_idx.val;
else
ecred->network_idx = 1; /* defaults to 1 */
if (m8->decr_set.wlan_credentials[i].netkey_idx.len)
ecred->netkey_idx = m8->decr_set.wlan_credentials[i].netkey_idx.val;
else
ecred->netkey_idx = 1; /* defaults to 1 */
ecred->netkey_size = m8->decr_set.wlan_credentials[i].netkey.len;
ipcom_memcpy(ecred->netkey, m8->decr_set.wlan_credentials[i].netkey.octet, ecred->netkey_size);
ecred->enabled_8021x = m8->decr_set.wlan_credentials[i].enabled_8021x.val;
if (ecred->enabled_8021x) {
ipcom_memcpy(ecred->eap_type, m8->decr_set.wlan_credentials[i].eap_type.octet, 8);
ipcom_strncpy(ecred->eap_id, (char *)m8->decr_set.wlan_credentials[i].eap_id.name, IPWPS_MAX_EAP_ID_LEN+1);
ecred->eap_id[IPWPS_MAX_EAP_ID_LEN] = '\0';
}
ecred->valid = IP_TRUE;
}
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
done = (Ipwps_protomsg_DONE *)ipwps_protocol_decode_message(done_test_vector, sizeof(done_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M8 :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
done = (Ipwps_protomsg_DONE *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_DONE);
#endif
if (!done) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_M8 :: Failed to decode done_test_vector");
return IPCOM_ERR_FAILED;
}
if (done->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_DONE) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_M8 :: Failed to decode done_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_DONE (0x%.4x)",
done->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_DONE);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)done) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_DONE(ctx, done);
ipcom_free(done);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_DONE
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_DONE(Ipwps_ctx* ctx, Ipwps_protomsg_DONE* done) {
Ip_err rc = IPCOM_ERR_FAILED;
#if defined (IPWPS_WPS_TESTAPP_ACK_DONE)
Ipwps_protomsg_ACK *ack = IP_NULL;
#endif
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_DONE called");
ip_assert(ctx);
#if defined (IPWPS_WPS_TESTAPP_ACK_DONE)
/* Send a WSC ACK */
#ifdef IPWPS_USE_PROTOMSG_TEST_VECTORS
ack = (Ipwps_protomsg_ACK *)ipwps_protocol_decode_message(ack_test_vector, sizeof(ack_test_vector));
#else
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_DONE :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
ack = (Ipwps_protomsg_ACK *)ipwps_proto_alloc_msg_struct(IPWPS_PROTO_MSGTYPE_ACK);
#endif
if (!ack) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_DONE :: Failed to decode ack_test_vector");
return IPCOM_ERR_FAILED;
}
if (ack->common_hdr.msg_type.val != IPWPS_PROTO_MSGTYPE_ACK) {
IPCOM_LOG2(ERR, "ipwps_testapp_rcv_DONE :: Failed to decode ack_test_vector msg_type.val "
"(0x%.4x) != IPWPS_PROTO_MSGTYPE_ACK (0x%.4x)",
ack->common_hdr.msg_type.val, IPWPS_PROTO_MSGTYPE_ACK);
return IPCOM_ERR_FAILED;
}
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
if (ipwps_proto_setup_msg(ctx, ipwps_testapp_proto_ctx, (Ipwps_protomsg_overlay *)ack) == IPCOM_SUCCESS)
#endif
rc = ipwps_proto_adaptor_send_ACK(ctx, ack);
ipcom_free(ack);
#else
/* Send EAP FAILURE */
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_DONE :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_SUCCESS);
#endif
rc = ipwps_proto_adaptor_send_WPS_FIN(ctx);
#endif
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_ACK
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_ACK(Ipwps_ctx* ctx, Ipwps_protomsg_ACK* ack) {
Ip_err rc = IPCOM_SUCCESS;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_ACK called");
ip_assert(ctx);
#ifndef IPWPS_WPS_TESTAPP_DONOT_TERMINATE_ON_ACK
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_ACK :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_SUCCESS);
#endif
rc = ipwps_proto_adaptor_send_WPS_FIN(ctx);
#endif
return rc;
}
/*
*===========================================================================
* ipwps_testapp_rcv_NACK
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_rcv_NACK(Ipwps_ctx* ctx, Ipwps_protomsg_NACK* nack) {
Ip_err rc = IPCOM_ERR_FAILED;
IPCOM_LOG0(DEBUG2, "ipwps_testapp_rcv_NACK called");
ip_assert(ctx);
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_NACK :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
#endif
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_ERROR);
rc = ipwps_proto_adaptor_send_WPS_FIN(ctx);
return rc;
}
/*
*===========================================================================
* ipwps_testapp_notify_wps_finished
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_notify_wps_finished(Ipwps_ctx* ctx) {
IPCOM_LOG0(DEBUG2, "ipwps_testapp_notify_wps_finished called");
ip_assert(ctx);
#ifndef IPWPS_USE_PROTOMSG_TEST_VECTORS
ip_assert(ipwps_testapp_proto_ctx);
if (ipwps_testapp_proto_ctx->sm_error) {
IPCOM_LOG0(ERR, "ipwps_testapp_rcv_NACK :: IPWPS Proto Handler Error State. Will not process message");
return IPCOM_ERR_FAILED;
}
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_SUCCESS);
#endif
return IPCOM_SUCCESS;
}
/*
*===========================================================================
* ipwps_testapp_notify_wps_timeout
*===========================================================================
* Description:
* Parameters:
* Returns:
*
*/
IP_STATIC Ip_err ipwps_testapp_notify_wps_timeout(Ipwps_ctx* ctx) {
IPCOM_LOG0(DEBUG2, "ipwps_testapp_notify_wps_timeout called");
ip_assert(ctx);
ipwps_ui_report_wps_status(ctx, IPWPS_SESSION_STATUS_ERROR);
return IPCOM_ERR_FAILED;
}
#endif
#ifdef IPWPS_USE_WPS_DRV_IF
IP_STATIC Ip_err ipwps_testapp_rcv_probe_response_ies
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
)
{
Ip_err rc = IPCOM_SUCCESS;
Ip_u32 i;
if(no_of_drv_data == 0)
{
IPCOM_LOG1(DEBUG, "ipwps_testapp_rcv_probe_response_ies::no of probe response %d ",no_of_drv_data );
return rc;
}
if(drv_data==IP_NULL)
{
return IPCOM_ERR_FAILED;
}
IPCOM_LOG0(DEBUG, "ipwps_testapp_rcv_probe_response_ies:: received data ");
IPCOM_LOG0(DEBUG, "====================================================== ");
for(i=0;i<no_of_drv_data;i++)
{
IPCOM_LOG1(DEBUG, "ssid %s ", drv_data[i].ssid);
ipwps_dump_data(" IEs: ",drv_data[i].buf , drv_data[i].buflen);
}
return rc;
}
IP_STATIC Ip_err ipwps_testapp_rcv_probe_request_ies
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
)
{
Ip_err rc = IPCOM_SUCCESS;
Ip_u32 i;
if(no_of_drv_data == 0)
{
IPCOM_LOG1(DEBUG, "ipwps_testapp_rcv_probe_request_ies::no of probe request %d ",no_of_drv_data );
return rc;
}
if(drv_data==IP_NULL)
{
return IPCOM_ERR_FAILED;
}
IPCOM_LOG0(DEBUG, "ipwps_testapp_rcv_probe_request_ies:: received data ");
IPCOM_LOG0(DEBUG, "====================================================== ");
for(i=0;i<no_of_drv_data;i++)
{
IPCOM_LOG1(DEBUG2, "ssid %s ", drv_data[i].ssid);
IPCOM_LOG6(DEBUG2, "src-addr %02x:%02x:%02x:%02x:%02x:%02x ", drv_data[i].src_mac[0],drv_data[i].src_mac[1],
drv_data[i].src_mac[2],drv_data[i].src_mac[3],drv_data[i].src_mac[4],drv_data[i].src_mac[5]);
IPCOM_LOG1(DEBUG2, "band %s ", drv_data[i].band== IPWPS_RFBAND_2_4GHZ? "2.4GHz":"5 GHz");
ipwps_dump_data(" IEs: ",drv_data[i].buf , drv_data[i].buflen);
}
return rc;
}
IP_STATIC Ip_err ipwps_testapp_rcv_assoc_notify
(
Ipwps_ctx* ctx,
Ipwps_drv_data* drv_data,
Ip_u8 no_of_drv_data,
Ipwps_drv_event_type event_type
)
{
Ip_err rc = IPCOM_SUCCESS;
return rc;
}
#endif
#endif /* IPWPS_ENABLE_WPS_TESTAPP */