omadmadapters/nsmldminternet/inc/NSmlWLanAdapter.h
changeset 42 aa33c2cb9a50
equal deleted inserted replaced
41:c742e1129640 42:aa33c2cb9a50
       
     1 /*
       
     2  * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description:   Wlan adapter
       
    15  *
       
    16  */
       
    17 
       
    18 #ifndef __NSMLWLANADAPTER_H__
       
    19 #define __NSMLWLANADAPTER_H__
       
    20 
       
    21 // -----------------------------------------------------------------------------------------------
       
    22 // Includes
       
    23 // -----------------------------------------------------------------------------------------------
       
    24 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
       
    25 #include <commsdat_partner.h>
       
    26 #endif
       
    27 #include <utf.h>
       
    28 #include <commdb.h>
       
    29 #include <EapSettings.h>
       
    30 #include "smldmadapter.h"
       
    31 #include "nsmlconstants.h"
       
    32 #include "NSmlWlanSettings.h"
       
    33 
       
    34 // -----------------------------------------------------------------------------------------------
       
    35 // Constants
       
    36 // -----------------------------------------------------------------------------------------------
       
    37 const TInt KNSmlWepKeyGranularity = 4;
       
    38 const TInt KNSmlMaxURISegLen = 32;
       
    39 const TInt KExpandedEAPIdLength = 8;
       
    40 const TInt KNsmlSubjectKeyIdLength = 255;
       
    41 const TInt KIdentifierLength = 20;
       
    42 const TUint KMaxLengthOfEapList = 50;
       
    43 
       
    44 _LIT8( KNSmlWLanAdapterDDFversion, "1.0" );
       
    45 _LIT16( KNSmlWLanServiceTable, "WLANServiceTable" );
       
    46 _LIT8( KNSmlWLanId, "Id" );
       
    47 _LIT8( KNSmlWLanName, "Name" );
       
    48 _LIT8( KNSmlWLanHidden, "Hidden" );
       
    49 _LIT8( KNSmlWLanReadOnly, "ReadOnly" );
       
    50 _LIT8( KNSmlWLanServiceId, "ServiceID" );
       
    51 _LIT8( KNSmlWLanNetworkMode, "NetworkMode" );
       
    52 _LIT8( KNSmlWLanConnectionMode, "WlanConnectionMode" );
       
    53 _LIT8( KNSmlWLanSsid, "SSID" );
       
    54 _LIT8( KNSmlWLanUsedSsid, "UsedSSID" );
       
    55 _LIT8( KNSmlWLanSsidHidden, "SSIDHidden" );
       
    56 _LIT8( KNSmlWLanUseWPAPSK, "UseWPAPSK" );
       
    57 _LIT8( KNSmlWLanEnablePSK, "EnablePSK" );
       
    58 _LIT8( KNSmlWLanWepKey1, "WEPKey1InHex" );
       
    59 _LIT8( KNSmlWLanWepKey2, "WEPKey2InHex" );
       
    60 _LIT8( KNSmlWLanWepKey3, "WEPKey3InHex" );
       
    61 _LIT8( KNSmlWLanWepKey4, "WEPKey4InHex" );
       
    62 _LIT8( KNSmlWLanWepIndex, "WEPKeyIndex" );
       
    63 _LIT8( KNSmlWLanWepKey, "WEPKey" );
       
    64 _LIT8( KNSmlWLanSecurityMode, "SecurityMode" );
       
    65 _LIT8( KNSmlWLanWpaAuthMode, "WPAAuthMode" );
       
    66 _LIT8( KNSmlWLanWpaPreSharedKey, "WPAPreSharedKey" );
       
    67 _LIT8( KNSmlWLanEapList, "WLANEAPList" );
       
    68 _LIT8( KNSmlWLanAuthMode, "WEPAuthMode" );
       
    69 _LIT8( KNSmlWLanWepKeyId, "WEPKeyID" );
       
    70 _LIT8( KNSmlWLanWepKeyData, "Data" );
       
    71 _LIT8( KNSmlWLanNodeName, "WLAN" );
       
    72 
       
    73 _LIT8( KNSmlEmpty, "" );
       
    74 #define  KNSmlWLanDefaultSSID _S("Net1")
       
    75 
       
    76 _LIT8( KNSmlWLan, "/WLAN" );
       
    77 _LIT8( KNSmlNAPDefWlanNode,"Name/NAPID/Bearer/IPAddrFromServer/IfNetworks/NAPAddr/NAPAddrTy/IPDNSAddrFromServer/DNSAddr/DefGW/NetworkMask/Networks/IAPService");
       
    78 
       
    79 _LIT8( KNSmlWLanListOfLeafs, "SSID/UsedSSID/SSIDHidden/NetworkMode/SecurityMode/WPAPreSharedKey/UseWPAPSK/WEPKey/WEPKeyIndex/WLANEAPList/WEPAuthMode/EAP/SecondarySSID" );
       
    80 
       
    81 _LIT8( KNSmlWLanListOfSecondaryLeafs, "SSID/UsedSSID" );
       
    82 _LIT8( KNSmlWLanListOfWepKeys, "1/2/3/4" );
       
    83 _LIT8( KNSmlWLanListOfWepKeyLeafs, "WEPKeyID/Data" );
       
    84 _LIT8( KNSmlWLanAllowUnsecure8, "allow unsecure" );
       
    85 _LIT8( KNSmlWLanWep8, "WEP" );
       
    86 _LIT8( KNSmlWLan8021x8, "802.1X" );
       
    87 _LIT8( KNSmlWLanWpa8, "WPA" );
       
    88 _LIT8( KNSmlWLanWpa28, "WPA2" );
       
    89 _LIT8( KNSmlWLanWpaPreSharedKey8, "WPA pre-shared key" );
       
    90 _LIT8( KNSmlWLanAdHoc8, "ADHOC" );
       
    91 _LIT8( KNSmlWLanInfrastructure8, "Infrastructure" );
       
    92 _LIT8( KNSmlMimeType, "text/plain" );
       
    93 
       
    94 #ifdef FF_WLAN_EXTENSIONS
       
    95 _LIT8( KNSmlWLanListOfEAPLeafs, "EAPType/Username/Password/Realm/UsePseudonym/VerifyCertRealm/RequireClientAuthentication/SessionValidityTime/CipherSuite/AllowPEAPv0/AllowPEAPv1/AllowPEAPv2/Certificate/AuthProvMode/UnauthProvMode/PACGroupRef/WarnADHPNoPAC/WarnADHPNoMatchPAC/WarnNotDefaultSrv" );
       
    96 #else
       
    97 _LIT8( KNSmlWLanListOfEAPLeafs, "EAPType/Username/Password/Realm/UsePseudonym/VerifyCertRealm/RequireClientAuthentication/SessionValidityTime/CipherSuite/AllowPEAPv0/AllowPEAPv1/AllowPEAPv2/Certificate" );
       
    98 #endif
       
    99 
       
   100 _LIT8( KNSmlWLanListOfCertificateLeafs, "IssuerName/SubjectName/CertType/SerialNumber/SubjectKeyId/Fingerprint" );
       
   101 
       
   102 _LIT8( KNSmlWLanSecSsid, "SecondarySSID" );
       
   103 _LIT8( KNSmlWLanEap, "EAP" );
       
   104 _LIT8( KNSmlWLanEapType, "EAPType" );
       
   105 _LIT8( KNSmlWLanUsername, "Username" );
       
   106 _LIT8( KNSmlWLanPassword, "Password" );
       
   107 _LIT8( KNSmlWLanRealm, "Realm" );
       
   108 _LIT8( KNSmlWLanUsePseudonym, "UsePseudonym" );
       
   109 _LIT8( KNSmlWLanEncapsulation, "Encapsulation" );
       
   110 _LIT8( KNSmlWLanVerifyCertRealm, "VerifyCertRealm" );
       
   111 _LIT8( KNSmlWLanRequireClientAuthentication, "RequireClientAuthentication" );
       
   112 _LIT8( KNSmlWLanSessionValidityTime, "SessionValidityTime" );
       
   113 _LIT8( KNSmlWLanCipherSuite, "CipherSuite" );
       
   114 _LIT8( KNSmlWLanAllowPEAPv0, "AllowPEAPv0" );
       
   115 _LIT8( KNSmlWLanAllowPEAPv1, "AllowPEAPv1" );
       
   116 _LIT8( KNSmlWLanAllowPEAPv2, "AllowPEAPv2" );
       
   117 #ifdef FF_WLAN_EXTENSIONS 
       
   118 _LIT8( KNSmlWLanAuthProvMode, "AuthProvMode" );
       
   119 _LIT8( KNSmlWLanUnauthProvMode, "UnauthProvMode" );
       
   120 _LIT8( KNSmlWLanPACGroupRef, "PACGroupRef" );
       
   121 _LIT8( KNSmlWLanWarnADHPNoPAC, "WarnADHPNoPAC" );
       
   122 _LIT8( KNSmlWLanWarnADHPNoMatchPAC, "WarnADHPNoMatchPAC" );
       
   123 _LIT8( KNSmlWLanWarnNotDefaultSrv, "WarnNotDefaultSrv" );
       
   124 #endif
       
   125 _LIT8( KNSmlWLanCertificate, "Certificate" );
       
   126 _LIT8( KNSmlWLanIssuerName, "IssuerName" );
       
   127 _LIT8( KNSmlWLanSubjectName, "SubjectName" );
       
   128 _LIT8( KNSmlWLanCertType, "CertType" );
       
   129 _LIT8( KNSmlWLanSerialNumber, "SerialNumber" );
       
   130 _LIT8( KNSmlWLanSubjectKeyId, "SubjectKeyId" );
       
   131 _LIT8( KNSmlWLanFingerprint, "Fingerprint" );
       
   132 
       
   133 _LIT8(KTrue, "True");
       
   134 _LIT8(KFalse, "False");
       
   135 _LIT8(KTtrue, "true");
       
   136 _LIT8(KFfalse, "false");
       
   137 _LIT8(KSlash, "/");
       
   138 _LIT8(KDash, "-");
       
   139 _LIT8(KNSmlWLanEapId, "EAPId" );
       
   140 
       
   141 _LIT8(KSuitesDefault, "-010,-022,-019,-047,-050,-051,-004,-005");
       
   142 
       
   143 const TUint RSA_3DES_SHA = 10;
       
   144 const TUint DHE_RSA_3DES_SHA = 22;
       
   145 const TUint DHE_DSS_3DES_SHA = 19;
       
   146 const TUint RSA_AES_SHA = 47; // ?
       
   147 const TUint DHE_RSA_AES_SHA = 50; // ?
       
   148 const TUint DHE_DSS_AES_SHA = 51; // ?
       
   149 const TUint RSA_RC4_MD5 = 4;
       
   150 const TUint RSA_RC4_SHA = 5;
       
   151 const TUint NUMBER_OF_CIPHERSUITES = 8;
       
   152 const TUint KExpandedEapIdLength = 8;
       
   153 const TUint8 KEapPlus = '+';
       
   154 
       
   155 _LIT8(KEAPSIM, "EAP-SIM");
       
   156 _LIT8(KEAPAKA, "EAP-AKA");
       
   157 _LIT8(KEAPTLS, "EAP-TLS");
       
   158 _LIT8(KEAPPEAP, "EAP-PEAP");
       
   159 _LIT8(KEAPTTLS, "EAP-TTLS");
       
   160 _LIT8(KEAPLEAP, "EAP-LEAP");
       
   161 _LIT8(KEAPMSCHAPV2, "EAP-MSCHAPV2");
       
   162 _LIT8(KMSCHAPV2, "MSCHAPV2");
       
   163 _LIT8(KEAPGTC, "EAP-GTC");
       
   164 _LIT8(KEAPFAST, "EAP-FAST");
       
   165 _LIT8(KEAPTTLSPAP, "EAP-TTLSPAP");
       
   166 
       
   167 _LIT8(KEapAll,"-017,-018,-023,-013,-025,-021,-043" );
       
   168 
       
   169 const TUint8 KEapNoneId[] =
       
   170     {
       
   171     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
       
   172     };
       
   173 const TUint8 KEapTlsTypeId[] =
       
   174     {
       
   175     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d
       
   176     };
       
   177 const TUint8 KEapGtcTypeId[] =
       
   178     {
       
   179     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06
       
   180     };
       
   181 const TUint8 KEapLeapTypeId[] =
       
   182     {
       
   183     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11
       
   184     };
       
   185 const TUint8 KEapSimTypeId[] =
       
   186     {
       
   187     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12
       
   188     };
       
   189 const TUint8 KEapTtlsTypeId[] =
       
   190     {
       
   191     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15
       
   192     };
       
   193 const TUint8 KEapAkaTypeId[] =
       
   194     {
       
   195     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17
       
   196     };
       
   197 const TUint8 KEapPeapTypeId[] =
       
   198     {
       
   199     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19
       
   200     };
       
   201 const TUint8 KEapMschapv2TypeId[] =
       
   202     {
       
   203     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A
       
   204     };
       
   205 const TUint8 KEapSecuridTypeId[] =
       
   206     {
       
   207     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20
       
   208     };
       
   209 const TUint8 KEapFastTypeId[] =
       
   210     {
       
   211     0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B
       
   212     };
       
   213 const TUint8 KMschapv2TypeId[] =
       
   214     {
       
   215     0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x63
       
   216     };
       
   217 const TUint8 KTtlspapTypeId[] =
       
   218     {
       
   219     0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x62
       
   220     };
       
   221 const TUint8 KNotInsidePEAP = 0x04;
       
   222 const TUint8 KNotOutsidePEAP = 0x08;
       
   223 const TUint8 KNotInsideTTLS = 0x10;
       
   224 
       
   225 //Forward Declarations
       
   226 class TEapExpandedType;
       
   227 
       
   228 // -----------------------------------------------------------------------------------------------
       
   229 // Structures
       
   230 // -----------------------------------------------------------------------------------------------
       
   231 struct TNSmlWepKeyBufferElement
       
   232     {
       
   233     HBufC8* iUri;
       
   234     HBufC8* iData;
       
   235     TInt iWepKeyId;
       
   236     TInt iIdStatusRef;
       
   237     //TInt iUseWPAPSK;
       
   238     TInt iDataStatusRef;
       
   239     TInt iNodeStatusRef;
       
   240     TInt iLengthStatusRef;
       
   241     TBool iExecuted;
       
   242     TBool iDataSet;
       
   243     TInt iLuid;
       
   244     };
       
   245 
       
   246 struct TNSmlSecondarySSIDBufferElement
       
   247     {
       
   248     HBufC8* iUri;
       
   249     TBuf<KMaxTextLength> ScannedId;
       
   250     TBuf<KMaxTextLength> UsedId;
       
   251     TInt wlanLuid;
       
   252     TBool iExecuted;
       
   253     };
       
   254 
       
   255 struct TNSmlEAPBufferElement
       
   256     {
       
   257     EAPSettings* iEAPSettings;
       
   258     TEapExpandedType iEncapsulatingExpandedEapId;
       
   259     RArray<TInt> iStatusRefArray;
       
   260     TInt iWLANServiceId;
       
   261     TBuf8<KExpandedEapIdLength> iEapTypeString;
       
   262     TBuf8<KExpandedEapIdLength> iEncapsulatingString;
       
   263     };
       
   264 
       
   265 // -----------------------------------------------------------------------------------------------
       
   266 // Enumerations
       
   267 // -----------------------------------------------------------------------------------------------
       
   268 enum TConnectionMode
       
   269     {
       
   270     EAdhoc = 0, EInfrastructure = 1
       
   271     };
       
   272 
       
   273 enum TWLanSecurityMode
       
   274     {
       
   275     EAllowUnsecure = 1, EWep = 2, EWlan8021x = 4, EWpa = 8, EWpa2 = 16
       
   276     };
       
   277 
       
   278 enum TWepAuthenticationMode
       
   279     {
       
   280     EOpen = 0, EShared = 1
       
   281     };
       
   282 
       
   283 enum TNsmlWLANAdapterEapType
       
   284     {
       
   285     EEapNone = 0,
       
   286     EEapGtc = 6,
       
   287     EEapTls = 13,
       
   288     EEapLeap = 17,
       
   289     EEapSim = 18,
       
   290     EEapTtls = 21,
       
   291     EEapAka = 23,
       
   292     EEapPeap = 25,
       
   293     EEapMschapv2 = 26,
       
   294     EEapSecurid = 32,
       
   295     EEapFast = 43,
       
   296     ETtlsPlainPap = 98,
       
   297     EPlainMschapv2 = 99
       
   298     };
       
   299 // ------------------------------------------------------------------------------------------------
       
   300 // CNSmlWLanAdapter 
       
   301 // ------------------------------------------------------------------------------------------------
       
   302 class CNSmlWLanAdapter : public CSmlDmAdapter
       
   303     {
       
   304 public:
       
   305     static CNSmlWLanAdapter* NewL(MSmlDmCallback* aDmCallback,
       
   306             CCommsDatabase& aDatabase);
       
   307     static CNSmlWLanAdapter* NewLC(MSmlDmCallback* aDmCallback,
       
   308             CCommsDatabase& aDatabase);
       
   309     void ConstructL(CCommsDatabase& aDatabase);
       
   310     virtual ~CNSmlWLanAdapter();
       
   311 
       
   312     // Adapter interface
       
   313     void DDFVersionL(CBufBase& aDDFVersion);
       
   314     void DDFStructureL(MSmlDmDDFObject& aDDF);
       
   315     void
       
   316             AddLeafObjectL(const TDesC8& aURI, const TDesC8& aParentLUID,
       
   317                     const TDesC8& aObject, const TDesC8& aType,
       
   318                     const TInt aStatusRef);
       
   319     void
       
   320             UpdateLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID,
       
   321                     const TDesC8& aObject, const TDesC8& aType,
       
   322                     const TInt aStatusRef);
       
   323     void UpdateLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID,
       
   324             RWriteStream*& aStream, const TDesC8& aType, TInt aStatusRef);
       
   325     void DeleteObjectL(const TDesC8& aURI, const TDesC8& aLUID,
       
   326             const TInt aStatusRef);
       
   327     void FetchLeafObjectL(const TDesC8& aURI, const TDesC8& aLUID,
       
   328             const TDesC8& aType, const TInt aResultsRef,
       
   329             const TInt aStatusRef);
       
   330     void FetchLeafObjectSizeL(const TDesC8& aURI, const TDesC8& aLUID,
       
   331             const TDesC8& aType, TInt aResultsRef, TInt aStatusRef);
       
   332 
       
   333     void ChildURIListL(const TDesC8& aURI, const TDesC8& aLUID,
       
   334             const CArrayFix<TSmlDmMappingInfo>& aPreviousURISegmentList,
       
   335             const TInt aResultsRef, const TInt aStatusRef);
       
   336     void AddNodeObjectL(const TDesC8& aURI, const TDesC8& aParentLUID,
       
   337             const TInt aStatusRef);
       
   338     void ExecuteCommandL(const TDesC8& aURI, const TDesC8& aLUID,
       
   339             const TDesC8& aArgument, const TDesC8& aType, TInt aStatusRef);
       
   340     void ExecuteCommandL(const TDesC8& aURI, const TDesC8& aLUID,
       
   341             RWriteStream*& aStream, const TDesC8& aType, TInt aStatusRef);
       
   342     void CopyCommandL(const TDesC8& aTargetURI, const TDesC8& aTargetLUID,
       
   343             const TDesC8& aSourceURI, const TDesC8& aSourceLUID,
       
   344             const TDesC8& aType, TInt aStatusRef);
       
   345     void StartAtomicL();
       
   346     void CommitAtomicL();
       
   347     void RollbackAtomicL();
       
   348     TBool StreamingSupport(TInt& aItemSize);
       
   349     void StreamCommittedL();
       
   350     void CompleteOutstandingCmdsL();
       
   351     CSmlDmAdapter::TError FetchLeafObjectL(const TDesC8& aURI,
       
   352             const TDesC8& aLUID, const TDesC8& aType, CBufBase& aObject);
       
   353 
       
   354 private:
       
   355     CNSmlWLanAdapter(TAny* aEcomArguments, CCommsDatabase& aDatabase);
       
   356     void FillNodeInfoL(MSmlDmDDFObject& aNode, TSmlDmAccessTypes aAccTypes,
       
   357             MSmlDmDDFObject::TOccurence aOccurrence,
       
   358             MSmlDmDDFObject::TScope aScope,
       
   359             MSmlDmDDFObject::TDFFormat aFormat, const TDesC8& aDescription);
       
   360     HBufC* IntToDesLC(const TInt aLuid);
       
   361     HBufC8* IntToDes8LC(const TInt aLuid);
       
   362     TInt DesToInt(const TDesC8& aLuid);
       
   363     TInt GetIdFromLuid(const TDesC8& aLuid);
       
   364     TUint32 GetSecSSIDFromUriL(const TDesC8& aUri);
       
   365     TInt GetEAPIdFromUri(const TDesC8& aUri);
       
   366     TInt GetCertificateIdFromUri(const TDesC8& aUri);
       
   367     TInt GetWepKeyIdFromLuid(const TDesC8& aLuid);
       
   368     TInt GetWepKeyIdFromUri(const TDesC8& aUri);
       
   369     TInt NumOfUriSegs(const TDesC8& aUri);
       
   370     TPtrC8 GetLastUriSeg(const TDesC8& aURI);
       
   371     TPtrC8 RemoveLastUriSeg(const TDesC8& aURI);
       
   372     void ExecuteBufferL(TBool aFinal = EFalse);
       
   373     TDesC8& ConvertTo8LC(const TDesC& aSource);
       
   374     TDesC16& ConvertTo16LC(const TDesC8& aSource);
       
   375     void DesToBufferL(CBufBase& aTo, const TDesC& aFrom);
       
   376     void FillCipherSuiteBufferL(CBufBase& aBuffer);
       
   377     void FillCipherSuitesL(const TDesC8& aObject, const TInt aLuid);
       
   378     void ConvertEAPStringToIds(TDes8& aEAPString, TEapExpandedType& aId);
       
   379     TInt GetServiceIdFromUriL(const TDesC8& aURI);
       
   380     TInt GetEncapsEAPIdFromUri(const TDesC8& aUri);
       
   381     void ResetEAPStructL();
       
   382     void DeleteEAPStructL();
       
   383     void GetExpandedType(const TInt aEapType, const TInt aTunnelingType,
       
   384             TEapExpandedType& aExpanedId, TEapExpandedType& aExpanedEncapsId);
       
   385 
       
   386     MSmlDmCallback* iCallBack;
       
   387     CWlanSettings* iWlanSettings;
       
   388     CArrayFixFlat<TNSmlWepKeyBufferElement> *iBuffer;
       
   389     TWlanSettings *iSettings;
       
   390     EAPSettings* iEAPSettings;
       
   391     RPointerArray<TNSmlSecondarySSIDBufferElement> iSecondaryBuffer;
       
   392     RPointerArray<TNSmlEAPBufferElement> iEAPBuffer;
       
   393     CCommsDatabase& iDatabase;
       
   394 
       
   395     };
       
   396 
       
   397 #endif __NSMLWLANADAPTER_H__