Main Page | Class List | Directories | File List | Class Members

diameter_mip4_fa_client_session.hxx

00001 /* BEGIN_COPYRIGHT                                                        */
00002 /*                                                                        */
00003 /* OpenDiameter: Open-source software for the Diameter protocol           */
00004 /*                                                                        */
00005 /* Copyright (C) 2004  Open Diameter Project.                             */
00006 /*                                                                        */
00007 /* This library is free software; you can redistribute it and/or modify   */
00008 /* it under the terms of the GNU Lesser General Public License as         */
00009 /* published by the Free Software Foundation; either version 2.1 of the   */
00010 /* License, or (at your option) any later version.                        */
00011 /*                                                                        */
00012 /* This library is distributed in the hope that it will be useful,        */
00013 /* but WITHOUT ANY WARRANTY; without even the implied warranty of         */
00014 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU      */
00015 /* Lesser General Public License for more details.                        */
00016 /*                                                                        */
00017 /* You should have received a copy of the GNU Lesser General Public       */
00018 /* License along with this library; if not, write to the Free Software    */
00019 /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307    */
00020 /* USA.                                                                   */
00021 /*                                                                        */
00022 /* In addition, when you copy and redistribute some or the entire part of */
00023 /* the source code of this software with or without modification, you     */
00024 /* MUST include this copyright notice in each copy.                       */
00025 /*                                                                        */
00026 /* If you make any changes that are appeared to be useful, please send    */
00027 /* sources that include the changed part to                               */
00028 /* diameter-developers@lists.sourceforge.net so that we can reflect your  */
00029 /* changes to one unified version of this software.                       */
00030 /*                                                                        */
00031 /* END_COPYRIGHT                                                          */
00032 /* 
00033    diameter_mip4_fa_client_session.hxx
00034    Fa Client Session definition for Diameter MIP 4 Application 
00035    Written by Miriam Tauil
00036    Created January 19, 2005.
00037 */
00038 
00039 #ifndef __MIP4_FA_CLIENT_SESSION_H__
00040 #define __MIP4_FA_CLIENT_SESSION_H__
00041 
00042 
00043 #include <list>
00044 #include "ace/Synch.h"
00045 #include "diameter_api.h"
00046 #include "diameter_mip4_fa_client_fsm.hxx"
00047 #include "diameter_mip4_parser.hxx"
00048 #include "mip4_diameter_fa_client_interface.hxx"
00049 
00050 
00055 template<class SpecificFaClientSession > 
00056 class DIAMETER_MIP4_FA_CLIENT_EXPORTS DiameterMip4FaClientSession : 
00057   public AAAClientSession, public DiameterMip4FaClientStateMachine, 
00058   public Mip4DiameterFaClientInterface
00059 {
00060  public:
00061 
00062   class DIAMETER_MIP4_FA_CLIENT_EXPORTS AMA_Handler : 
00063     public AAASessionMessageHandler
00064   {
00065   public:
00066     AMA_Handler(AAAApplicationCore &appCore,
00067                 DiameterMip4FaClientSession<SpecificFaClientSession>  &s) 
00068       : AAASessionMessageHandler(appCore, MipAmrCommandCode),
00069         session(s)
00070     {}
00071 
00072   private:  
00073     DiameterMip4FaClientSession<SpecificFaClientSession> &session;
00074 
00075   
00076     AAAReturnCode HandleMessage (AAAMessage &msg)
00077     {
00078     // Header flag check.
00079       if (msg.hdr.flags.r)
00080         {
00081           AAA_LOG(LM_ERROR, "[%N] Received AMR instead of AMA.\n");
00082           return AAA_ERR_UNKNOWN_CMD;
00083         }
00084 
00085       // Parse the received message.
00086       AMA_Parser parser;
00087       parser.setAppData(&session.amaData);
00088       parser.setRawData(&msg);
00089 
00090       try {
00091         parser.parseRawToApp();
00092       }
00093       catch ( DiameterParserError ) 
00094         {
00095           AAA_LOG(LM_ERROR, "[%N] Payload error.\n");
00096           return AAA_ERR_PARSING_ERROR;
00097         }
00098 
00099       session.Notify(DiameterMip4FaClientStateMachine::EvRxAMA);
00100       return AAA_ERR_SUCCESS;
00101     }
00102 
00103   };
00104 
00106   DiameterMip4FaClientSession(AAAApplicationCore &appCore): 
00107     AAAClientSession(appCore, Mip4ApplicationId),  
00108     DiameterMip4FaClientStateMachine(*this, appCore.GetTask().JobHandle()),
00109     specificFaClientSession(*new SpecificFaClientSession(*this)) 
00110   {
00111 
00112     answerHandler = (new AMA_Handler(appCore, *this));
00113     
00114     // Register the AMA message handler
00115     if (RegisterMessageHandler( answerHandler) != AAA_ERR_SUCCESS)
00116     {
00117       AAA_LOG(LM_ERROR, "[%N] AMA_Handler registration failed.\n");
00118       throw -1; 
00119     }
00120 
00121     // test if SpecificFaClientSession is an FaClientSession
00122 #ifdef THIS_SHOULD_WORK_BUT_IT_DOESNT
00123     try {
00124      FaClientSession &faClientSession = 
00125        dynamic_cast<FaClientSession&>(specificFaClientSession);
00126      assert (faClientSession != NULL);
00127 
00128      }
00129      catch (bad_cast) {    
00130        DIAMETER_LOG(LM_ERROR, "[%N] AMA_Handler registration failed.\n");
00131        throw -1;
00132      }    
00133 #endif
00134 }
00135 
00137   virtual ~DiameterMip4FaClientSession() 
00138   {
00139     delete (&specificFaClientSession);
00140     delete answerHandler;
00141   }
00142 
00143 
00144   // this is a virtual fn in the parent interface, that must be implemented 
00145   // here. 
00146   void RxMipRegReq( diameter_octetstring_t &mipRegReq) 
00147   {
00148      amrData.MipRegRequest.Set( mipRegReq); 
00149      Notify(  DiameterMip4FaClientStateMachine::EvRxMipRegReq); 
00150   }
00151 
00152   DiameterMip4FaClientSession* Self() { return this; }
00153 
00160   AAAReturnCode HandleMessage(AAAMessage &msg)
00161   {
00162     AAA_LOG(LM_ERROR, "[%N] Unknown command.\n");
00163     return AAA_ERR_UNKNOWN_CMD;
00164   }
00165 
00172   AAAReturnCode HandleDisconnect()
00173   { 
00174     AAA_LOG(LM_ERROR, "[%N] Session termination event received.\n");
00175     Notify(DiameterMip4FaClientStateMachine::EvSgDisconnect);
00176     return AAA_ERR_SUCCESS; 
00177   }
00179   AAAReturnCode HandleSessionTimeout()
00180   { 
00181     AAA_LOG(LM_ERROR, "[%N] Session timeout received.\n");
00182     Notify(DiameterMip4FaClientStateMachine::EvSgSessionTimeout);
00183     return AAA_ERR_SUCCESS; 
00184   }
00185                                      
00187   AAAReturnCode HandleAuthLifetimeTimeout()
00188   { 
00189     AAA_LOG(LM_ERROR, "[%N] Timeout received.\n");
00190     Notify(DiameterMip4FaClientStateMachine::EvSgAuthLifetimeTimeout);
00191     return AAA_ERR_SUCCESS; 
00192   }
00193 
00195   AAAReturnCode HandleAuthGracePeriodTimeout()
00196   { 
00197     AAA_LOG(LM_ERROR, "[%N] Timeout received.\n");
00198     Notify(DiameterMip4FaClientStateMachine::EvSgAuthGracePeriodTimeout);
00199     return AAA_ERR_SUCCESS; 
00200   }
00201 
00207   AAAReturnCode HandleTimeout()
00208   { 
00209     AAA_LOG(LM_ERROR, "[%N] Session timeout received.\n");
00210     Notify(DiameterMip4FaClientStateMachine::EvSgTimeout);
00211     return AAA_ERR_SUCCESS; 
00212   }
00218   AAAReturnCode HandleAbort() { return AAA_ERR_SUCCESS; }
00219 
00220   void Start() throw (AAA_Error)
00221   {
00222     DiameterMip4FaClientStateMachine::Start();
00223     AAAClientSession::Start();
00224   }
00225 
00226   AAAReturnCode Reset() throw (AAA_Error)
00227   {    
00228     AAAClientSession::Start();
00229     amrData.Clear(); 
00230     amaData.Clear();
00231     //sets the session state to StInitialize
00232     DiameterMip4FaClientStateMachine::Restart();
00233    
00234     specificFaClientSession.Reset();
00235 
00236     return AAA_ERR_SUCCESS;
00237   }
00238 
00239   // The implementation of this function in a child class is optional.
00240   // The function's purpose is to provide an interface for memory deallocation
00241   // of the DiameterMip4FaClientSession, when it is allocated using the "new"
00242   // operator. More documentation in the sample application file.
00243   virtual void Abort(){}
00244 
00245  void SetUserName(AAA_ScholarAttribute<diameter_utf8string_t> &userName)
00246   {
00247     diameter_utf8string_t _userName;
00248     specificFaClientSession.SetUserName( _userName);
00249     userName.Set( _userName);
00250   }
00251 
00254   virtual void SetDestinationRealm
00255   (AAA_ScholarAttribute<diameter_utf8string_t> &destinationRealm)
00256   {
00257     diameter_utf8string_t _destinationRealm;
00258     specificFaClientSession.SetDestinationRealm( _destinationRealm);
00259     destinationRealm.Set( _destinationRealm);
00260   }
00261   // OriginHost & OriginRealm --> this will be populated from the config file
00262   //  MipRegRequest will be set by the fn RxMipregReq()
00263 
00264   void SetMipMnAaaAuth
00265     (AAA_ScholarAttribute<mip_mn_aaa_auth_info_t> &mipMnAaaAuth)
00266   {
00267 
00268     AAA_ScholarAttribute<mip_mn_aaa_auth_info_t> _mipMnAaaAuth; 
00269     
00270     specificFaClientSession.SetMipMnAaaSpi( 
00271                          &( _mipMnAaaAuth().MipMnAaaSpi() ));
00272     specificFaClientSession.SetMipAuthInputDataLength( 
00273                         &(_mipMnAaaAuth().MipAuthInputDataLength() ));
00274     specificFaClientSession.SetMipAuthenticatorLength( 
00275                         &( _mipMnAaaAuth().MipAuthenticatorLength() ));
00276     specificFaClientSession.SetMipAuthenticatorOffset( 
00277                         &( _mipMnAaaAuth().MipAuthenticatorOffset() ));
00278 
00279 
00280     mipMnAaaAuth.Set(  _mipMnAaaAuth());
00281 
00282     mipMnAaaAuth().MipMnAaaSpi = _mipMnAaaAuth().MipMnAaaSpi();
00283 
00284     mipMnAaaAuth().MipAuthInputDataLength =
00285                                      _mipMnAaaAuth().MipAuthInputDataLength();
00286     mipMnAaaAuth().MipAuthenticatorLength =
00287                                      _mipMnAaaAuth().MipAuthenticatorLength();
00288     mipMnAaaAuth().MipAuthenticatorOffset =
00289                                      _mipMnAaaAuth().MipAuthenticatorOffset();
00290 
00291   }
00292 
00293   //optional AVPs
00294 
00297   void SetDestinationHost//( diameter_utf8string_t  _destinationHost)
00298   (AAA_ScholarAttribute<diameter_utf8string_t> &destinationHost)
00299   {
00300     diameter_utf8string_t _destinationHost;
00301     specificFaClientSession.SetDestinationHost( _destinationHost);
00302     destinationHost.Set(_destinationHost);
00303   }
00304 
00305   void SetMipMobileNodeAddress
00306   (AAA_ScholarAttribute<diameter_address_t> &mipMobileNodeAddress)
00307   {
00308     diameter_address_t _mipMobileNodeAddress;
00309     specificFaClientSession.SetMipMobileNodeAddress(_mipMobileNodeAddress);
00310     mipMobileNodeAddress.Set(_mipMobileNodeAddress);
00311   }
00312 
00313   void SetMipHomeAgentAddress
00314   (AAA_ScholarAttribute<diameter_address_t> &mipHomeAgentAddress)
00315   {
00316     diameter_address_t _mipHomeAgentAddress;
00317     specificFaClientSession.SetMipHomeAgentAddress(_mipHomeAgentAddress);
00318     mipHomeAgentAddress.Set(_mipHomeAgentAddress);
00319   }
00320 
00321   int IsMnHaKeyRequested()
00322   {
00323     return ( specificFaClientSession.IsMnHaKeyRequested() );
00324   }
00325 
00326   int IsMnFaKeyRequested() 
00327   {
00328     return ( specificFaClientSession.IsMnFaKeyRequested() );
00329   }
00330   int IsFaHaKeyRequested() 
00331   {
00332     return ( specificFaClientSession.IsFaHaKeyRequested() );
00333   }
00334   int IsMnHomeAddrRequested()
00335   {
00336     return ( specificFaClientSession.IsMnHomeAddrRequested() );
00337   }
00338   int IsMnHomeAgentRequested()
00339   {
00340     return ( specificFaClientSession.IsMnHomeAgentRequested() );
00341   }
00342 
00343   void SetAuthorizationLifetime
00344   (AAA_ScholarAttribute<diameter_unsigned32_t> &authorizationLifetime)
00345   {
00346     diameter_unsigned32_t _authorizationLifetime;
00347     if ( specificFaClientSession.SetAuthorizationLifetime(
00348                                           &_authorizationLifetime) == 0 )
00349         authorizationLifetime.Set(0);
00350     else
00351         authorizationLifetime.Set(_authorizationLifetime);
00352   }
00353 
00354 // fn not needed=> static info take from configuration file
00355 // void SetAuthSessionState
00356 //  (AAA_ScholarAttribute<diameter_enumerated_t> &authSessionState) {}
00357 
00358   //int 
00359   void SetMipHomeAgentHost
00360   (AAA_ScholarAttribute<mip_home_agent_host_info_t> &mipHomeAgentHost)
00361   {
00362     //mip_home_agent_host_info_t 
00363     diameter_identity_t _mipHomeAgentHost;
00364     if (specificFaClientSession.SetMipHomeAgentHost(_mipHomeAgentHost)==1)
00365       {
00366         // convert ip address from string to unsigned32 ???
00367         //mipHomeAgentHost.DestinationHost.Set(_mipHomeAgentHost);
00368       //return 1;
00369       }
00370     //else
00371     //return 0;
00372   }
00373 
00374   virtual int SetMipFaChallenge
00375   (AAA_ScholarAttribute<diameter_octetstring_t> &mipFaChallenge)
00376   {
00377     diameter_octetstring_t _mipFaChallenge;
00378 
00379     int rc = specificFaClientSession.SetMipFaChallenge(  _mipFaChallenge);
00380     mipFaChallenge.Set(_mipFaChallenge);
00381     return rc;
00382   }
00383 
00384   virtual void SetMipCandidateHomeAgentHost
00385   (AAA_ScholarAttribute<diameter_identity_t> &mipCandidateHomeAgentHost)
00386   {}
00387 
00388   virtual int SetMipHaToFaSpi
00389   (AAA_ScholarAttribute<diameter_unsigned32_t> &mipHaToFaSpi)
00390   {
00391     diameter_unsigned32_t _mipHaToFaSpi;
00392     if ( specificFaClientSession.SetMipHaToFaSpi( &_mipHaToFaSpi) == 0)
00393       {
00394         mipHaToFaSpi.Set(0);
00395         return 0;
00396       }
00397     else
00398       {
00399       mipHaToFaSpi.Set( _mipHaToFaSpi);
00400       return 1;
00401       }
00402   }
00403 
00404   void EnforceAuthorizationLifetime
00405                      (const diameter_unsigned32_t &authorizationLifetime)
00406   {
00407    specificFaClientSession.EnforceAuthorizationLifetime(authorizationLifetime);
00408   }
00409 
00410   void EnforceAuthSessionState( const diameter_enumerated_t &authSessionState)
00411   {
00412     specificFaClientSession.EnforceAuthSessionState( authSessionState);
00413   }
00414 
00415   void EnforceReAuthRequestType( const diameter_enumerated_t &reAuthReqType)
00416   {
00417     specificFaClientSession.EnforceReAuthRequestType( reAuthReqType);
00418   }
00419 
00420   void EnforceMipMnToFaMsa(const mip_mn_to_fa_msa_info_t &mipMnToFaMsa)
00421   {
00422     specificFaClientSession.EnforceMipMnToFaMsa( mipMnToFaMsa);
00423   }
00424   
00425   void EnforceMipMnToHaMsa( const mip_mn_to_ha_msa_info_t &mipMnToHaMsa)
00426   {
00427     specificFaClientSession.EnforceMipMnToHaMsa( mipMnToHaMsa);
00428   }
00429 
00430   void EnforceMipFaToMnMsa( const mip_fa_to_mn_msa_info_t &mipFaToMnMsa)
00431   {
00432     specificFaClientSession.EnforceMipFaToMnMsa( mipFaToMnMsa);
00433   }
00434 
00435   void EnforceMipFaToHaMsa( const mip_fa_to_ha_msa_info_t &mipFaToHaMsa)
00436   {
00437     specificFaClientSession.EnforceMipFaToHaMsa( mipFaToHaMsa);
00438   }
00439 
00440   void EnforceMipHaToMnMsa( const mip_ha_to_mn_msa_info_t &mipHaToMnMsa)
00441   {
00442     specificFaClientSession.EnforceMipHaToMnMsa( mipHaToMnMsa);
00443   }
00444 
00445   void EnforceMipMsaLifetime( const diameter_unsigned32_t &mipMsaLifetime)
00446   {
00447     specificFaClientSession.EnforceMipMsaLifetime( mipMsaLifetime);
00448   }
00449 
00450   void EnforceErrorMessage( const diameter_utf8string_t &errorMessage)
00451   {
00452     specificFaClientSession.EnforceErrorMessage( errorMessage);
00453   }
00454 
00455   void EnforceMipFilterRule ( 
00456       const  AAA_VectorAttribute<diameter_ipfilter_rule_t> &mipFilterRule)
00457      //const diameter_ipfilter_rule_t &mipFilterRule)
00458   {
00459     specificFaClientSession.EnforceMipFilterRule( mipFilterRule);
00460   }
00461 
00462   void SendMipRegReply(diameter_unsigned32_t &amaResultCode)
00463   {
00464     specificFaClientSession.SendMipRegReply( amaResultCode);
00465   }
00466 
00467 
00468   void SendMipRegReply( diameter_unsigned32_t &amaResultCode,
00469                                 diameter_octetstring_t &mipRegReply)
00470   {
00471     specificFaClientSession.SendMipRegReply( amaResultCode, mipRegReply);
00472   }
00473 
00474 
00475   AMR_Data& AMR() { return amrData; }
00476   AMA_Data& AMA() { return amaData; }
00477 
00478   SpecificFaClientSession &specificFaClientSession;
00479 
00480  protected:
00481  private:
00482   
00483   AMR_Data amrData;
00484   AMA_Data amaData;
00485   AMA_Handler *answerHandler;
00486  
00487 };
00488 
00489 
00490 #endif  // __MIP4_FA_CLIENT_SESSION_H__

Generated on Thu Apr 7 09:08:51 2005 for Diameter Mobile IP v4 C++ API by  doxygen 1.4.2