diff -r 000000000000 -r 3da2a79470a7 testexecmgmt/ucc/Source/facontroller/CSFacontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecmgmt/ucc/Source/facontroller/CSFacontroller.cpp Mon Mar 08 15:04:18 2010 +0800 @@ -0,0 +1,780 @@ +/* +* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* This file was autogenerated by rpcgen, but should be modified by the developer. +* Make sure you don't use the -component_mod flag in future or this file will be overwritten. +* Mon Oct 06 12:02:04 2003 +* System Includes +* +*/ + + + + + +#include +#include +#ifndef WIN32 +#include +#include +#endif + + +/**************************************************************************************** + * + * Local Includes + * + ***************************************************************************************/ +#include "CSvcFacontroller.h" +#include "CSFacontroller.h" + + +/**************************************************************************************** + * + * Definition + * + ***************************************************************************************/ +#define TEMPLATE_CONFIG_FILE "dynfad.template.conf" +#define MOBILE_AGENT_COMMAND_LINE "./dynfad --fg --debug --config " +#define MAXCOMMANDLINELENGTH (31 + 256 + 1) +#define MAXTUNNELS 32 +#define MAXINTERFACECONFIGENTRY (IFNAMSIZ + 128) +#define CONFIGCOUNT 16 + + +/******************************************************************************* + * + * Macro Functions + * + ******************************************************************************/ + + +/**************************************************************************************** + * + * Implementation + * + ***************************************************************************************/ +CSFacontroller::CSFacontroller() +{ + iDynamicsCallTimeout = -1; + iAgentProcess = NULL; +} + +CSFacontroller::~CSFacontroller() +{ + assert( iAgentProcess == NULL ); +} + +int CSFacontroller::GetKey() +{ + return iKey; +} + +void CSFacontroller::SetKey( int aKey ) +{ + iKey = aKey; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: cstr_createagent + * + ***************************************************************************************/ +TResult CSFacontroller::cstr_createagent( void ) +{ + TResult rv; + TDCFError terr, terr_a[CONFIGCOUNT]; + TInterfaceAliasError ierr; + TStartupInfo startup_info; + CIntegerAllocator *ialloc; + char dynamics_config[MAXINTERFACECONFIGENTRY]; + string interface_name, interface_address; + int errcode, i; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // get an address for the new interface alias + ialloc = CSvcFacontroller::GetIntegerAllocator(); + assert( ialloc != NULL ); + iInterfaceHostAddress = ialloc->AllocateInteger(); + if( iInterfaceHostAddress == -1 ) { + rv.iServiceResult = ERR_NO_MORE_INTERFACES; + return rv; + } + + // create a local copy of the configuration file + terr = iDynamicsConfigFile.SetReferenceFile( TEMPLATE_CONFIG_FILE ); + if( terr != DCE_NONE ) { + ialloc->FreeInteger( iInterfaceHostAddress ); + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)terr; + return rv; + } + terr = iDynamicsConfigFile.CreateLocalCopy( &errcode ); + if( terr != DCE_NONE ) { + ialloc->FreeInteger( iInterfaceHostAddress ); + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)terr; + rv.iData0 = errcode; + return rv; + } + + // create an alias interface to use + startup_info = CSvcFacontroller::GetStartupInfo(); + ierr = iAgentInterface.CreateNewInterfaceAlias( startup_info.iBaseInterfaceIndex, startup_info.iNetworkMask, iInterfaceHostAddress, &iInterfaceIndex, &errcode ); + if( ierr != IE_NONE ) { + rv.iServiceResult = ERR_CREATE_INTERFACE_ERROR; + rv.iSubComponentResult = ierr; + rv.iData0 = errcode; + ialloc->FreeInteger( iInterfaceHostAddress ); + iDynamicsConfigFile.RemoveLocalCopy( &errcode ); + return rv; + } + ierr = iAgentInterface.GetInterfaceAddress( &interface_address ); + assert( ierr == IE_NONE ); + + // set the interface name in the config file + ierr = iAgentInterface.GetInterfaceName( &interface_name ); + snprintf( dynamics_config, MAXINTERFACECONFIGENTRY, "%s 2 -1 10", interface_name.c_str() ); + terr_a[0] = iDynamicsConfigFile.AddListOption( "INTERFACES_BEGIN", "INTERFACES_END", dynamics_config, &errcode ); + + // set the tunnel name prefix to a unique value for this agent + // snprintf( dynamics_config, MAXINTERFACECONFIGENTRY, "TunnelDevice \"TUNL-%s-\"", interface_name.c_str() ); + snprintf( dynamics_config, MAXINTERFACECONFIGENTRY, "TunnelDevice \"TUNL\"" ); + terr_a[1] = iDynamicsConfigFile.SetSingleOption( "TunnelDevice", dynamics_config, &errcode ); + + // set the FA addresses to the alias interface address + snprintf( dynamics_config, MAXINTERFACECONFIGENTRY, "HighestFAIPAddress %s", interface_address.c_str() ); + terr_a[2] = iDynamicsConfigFile.SetSingleOption( "HighestFAIPAddress", dynamics_config, &errcode ); + + // set the FA addresses to the alias interface address + snprintf( dynamics_config, MAXINTERFACECONFIGENTRY, "UpperFAIPAddress %s", interface_address.c_str() ); + terr_a[3] = iDynamicsConfigFile.SetSingleOption( "UpperFAIPAddress", dynamics_config, &errcode ); + + // see if any errors occured setting the config info + for( i = 0; i < 3; i++ ) { + if( terr_a[i] != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)terr_a[i]; + iAgentInterface.DestroyInterfaceAlias( &errcode ); + ialloc->FreeInteger( iInterfaceHostAddress ); + iDynamicsConfigFile.RemoveLocalCopy( &errcode ); + return rv; + } + } + + // done - success + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: dstr_removeagent + * + ***************************************************************************************/ +int CSFacontroller::dstr_removeagent( int aArgs, int *aDeleteInstance ) +{ + int rv = ERR_NONE, errcode; + TDCFError terr; + TInterfaceAliasError ierr; + CIntegerAllocator *ialloc; + + // make sure that the proces isn't running + if( iAgentProcess != NULL ) { + *aDeleteInstance = 0; + rv = ERR_INVALIDSTATE; + return rv; + } + + // free the interface index + ialloc = CSvcFacontroller::GetIntegerAllocator(); + assert( ialloc != NULL ); + ialloc->FreeInteger( iInterfaceHostAddress ); + + // clean up the config file + terr = iDynamicsConfigFile.RemoveLocalCopy( &errcode ); + + // destroy the interface alias + ierr = iAgentInterface.DestroyInterfaceAlias( &errcode ); + + // check for errors from the config file - delete the instance in any case + if( terr != DCE_NONE ) { + rv = ERR_CONFIG_FILE_ERROR; + return rv; + } + + // check for errors from the interface alias - delete the instance + if( ierr != IE_NONE ) { + rv = ERR_DESTROY_INTERFACE_ERROR; + return rv; + } + + // done - success + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: startmobileagent + * + ***************************************************************************************/ +TResult CSFacontroller::startmobileagent( TStartAgentRequest aArgs ) +{ + TResult rv; + int errcode; + TCAProcessError perr; + char command_line_str[MAXCOMMANDLINELENGTH]; + TDCFError terr; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // check that there is currently no process + if( iAgentProcess != NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // do some semantic checking of the params + if( (aArgs.iSolicitationMode < -1) || (aArgs.iSolicitationMode > 1) ) { + rv.iServiceResult = ERR_INVALIDARG; + rv.iData0 = 3; + return rv; + } + if( (aArgs.iSolicitationMode == 1) && (aArgs.iSolicitationInterval < 1) ) { + rv.iServiceResult = ERR_INVALIDARG; + rv.iData0 = 4; + return rv; + } + if( aArgs.iSolicitationMode != 1 ) { + aArgs.iSolicitationInterval = 1; + } + + // add the interface name to the config file + snprintf( command_line_str, MAXCOMMANDLINELENGTH, "%s 3 %d %d", aArgs.iLowerInterface, aArgs.iSolicitationMode, aArgs.iSolicitationInterval ); + terr = iDynamicsConfigFile.AddListOption( "INTERFACES_BEGIN", "INTERFACES_END", command_line_str, &errcode ); + if( terr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)terr; + return rv; + } + + // create the new process object + iAgentProcess = new CAProcess(); + assert( iAgentProcess != NULL ); + + // construct the command line + snprintf( command_line_str, MAXCOMMANDLINELENGTH, "%s%s", MOBILE_AGENT_COMMAND_LINE, iDynamicsConfigFile.GetLocalFilename() ); + + // start the actual process + perr = iAgentProcess->StartProcess( command_line_str, &errcode, false, false, false ); + if( perr != CAE_NONE ) { + rv.iServiceResult = ERR_START_PROCESS_ERROR; + rv.iSubComponentResult = (int)perr; + delete iAgentProcess; + iAgentProcess = NULL; + return rv; + } + iLowerInterface = aArgs.iLowerInterface; + + // done - success + rv.iServiceResult = ERR_NONE; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: stopmobileagent + * + ***************************************************************************************/ +TResult CSFacontroller::stopmobileagent( int aArgs ) +{ + TResult rv; + TCAProcessError perr; + TProcessStatus pstatus; + TDCFError terr; + int errcode; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + + // if the process isn't started then invalid state + if( iAgentProcess == NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // remove the interface line added in startup + terr = iDynamicsConfigFile.RemoveListOption( "INTERFACES_BEGIN", "INTERFACES_END", iLowerInterface.c_str(), &errcode ); + if( terr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)terr; + return rv; + } + + // if the process isn't running then it has died outside the scope of this controller, clean up the state, return an error since + // this is noteworthy and should be either expected or not happen. + perr = iAgentProcess->GetProcessStatus( &pstatus ); + assert( perr == CAE_NONE ); + if( pstatus != PS_STARTED ) { + assert( (pstatus == PS_STOPPED) || (pstatus == PS_ABANDONNED) ); + delete iAgentProcess; + iAgentProcess = NULL; + rv.iServiceResult = ERR_PROCESS_TERMINATED_OUTSIDE_SCOPE; + return rv; + } + + // request the process to stop + perr = iAgentProcess->RequestStop( SIGTERM ); + if( perr != CAE_NONE ) { + rv.iServiceResult = ERR_STOP_PROCESS_ERROR; + rv.iSubComponentResult = (int)perr; + return rv; + } + + // wait for the process to stop + perr = iAgentProcess->WaitForProcessToTerminate( -1 ); + if( perr != CAE_NONE ) { + rv.iServiceResult = ERR_WAIT_PROCESS_ERROR; + rv.iSubComponentResult = (int)perr; + return rv; + } + + // remove the process + delete iAgentProcess; + iAgentProcess = NULL; + + // done - success + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: getmobileagentstatus + * + ***************************************************************************************/ +TResult CSFacontroller::getmobileagentstatus( int aArgs ) +{ + TResult rv; + TCAProcessError perr; + TProcessStatus pstatus; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + + // if the process doesn't exist then we return PS_INVALID + if( iAgentProcess == NULL ) { + rv.iData0 = PS_INVALID; + return rv; + } + + // otherwise just return whatever iAgentProcess->GetProcessStatus() returns + perr = iAgentProcess->GetProcessStatus( &pstatus ); + assert( perr == CAE_NONE ); + rv.iData0 = (int)pstatus; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: setsingleoption + * + ***************************************************************************************/ +TResult CSFacontroller::setsingleoption( TOptionDesc aArgs ) +{ + TResult rv; + int errcode; + TDCFError cerr; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // make sure that the process isn't running + if( iAgentProcess != NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // modify the config file + cerr = iDynamicsConfigFile.SetSingleOption( aArgs.iOptionToken, aArgs.iOptionValue, &errcode ); + if( cerr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)cerr; + rv.iData0 = errcode; + return rv; + } + + // return success + rv.iServiceResult = ERR_NONE; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: removesingleoption + * + ***************************************************************************************/ +TResult CSFacontroller::removesingleoption( TOptionDesc aArgs ) +{ + TResult rv; + int errcode; + TDCFError cerr; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // make sure that the process isn't running + if( iAgentProcess != NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // modify the config file + cerr = iDynamicsConfigFile.RemoveSingleOption( aArgs.iOptionToken, &errcode ); + if( cerr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)cerr; + rv.iData0 = errcode; + return rv; + } + + // return success + rv.iServiceResult = ERR_NONE; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: addlistoption + * + ***************************************************************************************/ +TResult CSFacontroller::addlistoption( TOptionDesc aArgs ) +{ + TResult rv; + int errcode; + TDCFError cerr; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // make sure that the process isn't running + if( iAgentProcess != NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // modify the config file + cerr = iDynamicsConfigFile.AddListOption( aArgs.iOptionBlockStart, aArgs.iOptionBlockEnd, aArgs.iOptionValue, &errcode ); + if( cerr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)cerr; + rv.iData0 = errcode; + return rv; + } + + // return success + rv.iServiceResult = ERR_NONE; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: removelistoption + * + ***************************************************************************************/ +TResult CSFacontroller::removelistoption( TOptionDesc aArgs ) +{ + TResult rv; + int errcode; + TDCFError cerr; + + // initialise the result + rv.iServiceResult = ERR_NONE; + rv.iSubComponentResult = 0; + rv.iData0 = 0; + rv.iData1 = 0; + + // make sure that the process isn't running + if( iAgentProcess != NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // modify the config file + cerr = iDynamicsConfigFile.RemoveListOption( aArgs.iOptionBlockStart, aArgs.iOptionBlockEnd, aArgs.iOptionToken, &errcode ); + if( cerr != DCE_NONE ) { + rv.iServiceResult = ERR_CONFIG_FILE_ERROR; + rv.iSubComponentResult = (int)cerr; + rv.iData0 = errcode; + return rv; + } + + // return success + rv.iServiceResult = ERR_NONE; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: getstatus + * + ***************************************************************************************/ +TFaStatusInfo CSFacontroller::getstatus( int aArgs ) +{ + TFaStatusInfo rv; + TDynamicsCallInfo cres; + TForeignAgentStatusInfo foreign_agent_info; + + // init the return value + memset( &rv, 0, sizeof(rv) ); + rv.iCallResult.iServiceResult = ERR_NONE; + + // check that the agent is running + rv.iCallResult = is_agent_running(); + if( rv.iCallResult.iServiceResult != ERR_NONE ) { + return rv; + } + + // make the call to dynamics + cres = iDynamicsCommand.ForeignAgentGetStatus( &foreign_agent_info ); + if( cres.iResult != DC_SUCCESS ) { + set_dynamics_error( &(rv.iCallResult), &cres ); + return rv; + } + + // set the result + rv.iAdvertisementsSent = foreign_agent_info.iAdvertisementsSent; + rv.iDiscardedMalformed = foreign_agent_info.iDiscardedMalformed; + rv.iDiscardedUnknownExtension = foreign_agent_info.iDiscardedUnknownExtension; + rv.iDiscardedVendor = foreign_agent_info.iDiscardedVendor; + rv.iPendingRegistrationRequests = foreign_agent_info.iPendingRegistrationRequests; + rv.iReplysAccepted = foreign_agent_info.iReplysAccepted; + rv.iReplysRejected = foreign_agent_info.iReplysRejected; + rv.iRequestsAccepted = foreign_agent_info.iRequestsAccepted; + rv.iRequestsRejected = foreign_agent_info.iRequestsRejected; + rv.iTunnelCount = foreign_agent_info.iTunnelCount; + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: destroytunnelid + * + ***************************************************************************************/ +TResult CSFacontroller::destroytunnelid( TFaTunnelID aArgs ) +{ + TResult rv; + TDynamicsCallInfo cres; + + // init the return value + memset( &rv, 0, sizeof(rv) ); + rv.iServiceResult = ERR_NONE; + + // check that the agent is running + rv = is_agent_running(); + if( rv.iServiceResult != ERR_NONE ) { + return rv; + } + + // make the call to dynamics + cres = iDynamicsCommand.ForeignAgentDestroyTunnel( aArgs.iMobileNodeAddress ); + if( cres.iResult != DC_SUCCESS ) { + set_dynamics_error( &rv, &cres ); + return rv; + } + + // done + return rv; +} + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: listtunnels + * + ***************************************************************************************/ +TFaTunnelList CSFacontroller::listtunnels( int aArgs ) +{ + TResult res; + TFaTunnelList rv = { 0, NULL }; + TDynamicsCallInfo cres; + TTunnelID tunnel_list[MAXTUNNELS]; + int tunnel_count = MAXTUNNELS, i; + + // check that the agent is running + res = is_agent_running(); + if( res.iServiceResult != ERR_NONE ) { + return rv; + } + + // make the call to dynamics + cres = iDynamicsCommand.ForeignAgentGetTunnels( &tunnel_count, tunnel_list ); + if( cres.iResult != DC_SUCCESS ) { + return rv; + } + + // allocate memory for the list + rv.TFaTunnelList_len = tunnel_count; + rv.TFaTunnelList_val = (TFaTunnelID*)calloc( tunnel_count, sizeof(TFaTunnelID) ); + assert( rv.TFaTunnelList_val != NULL ); + + // now return the information + for( i = 0; i < tunnel_count; i++ ) { + (rv.TFaTunnelList_val)[i].iAgentID = 0; + (rv.TFaTunnelList_val)[i].iID = (tunnel_list[i]).iTunnelID; + (rv.TFaTunnelList_val)[i].iHomeAgentAddress = (tunnel_list[i]).iHomeAgentAddress; + (rv.TFaTunnelList_val)[i].iMobileNodeAddress = (tunnel_list[i]).iMobileNodeAddress; + } + + // done - success + return rv; +} + +/**************************************************************************************** + * + * PUBLIC FUNCTION: gettunnelinfo + * + ***************************************************************************************/ +TFaTunnelInfo CSFacontroller::gettunnelinfo( TGetTunnelRequest aArgs ) +{ + TFaTunnelInfo rv; + TDynamicsCallInfo cres; + TForeignAgentTunnelInfo fati; + + // init the result + memset( &rv, 0, sizeof(rv) ); + rv.iCallResult.iServiceResult = ERR_NONE; + + // check that the agent is running + rv.iCallResult = is_agent_running(); + if( rv.iCallResult.iServiceResult != ERR_NONE ) { + return rv; + } + + // make the call to dynamics + cres = iDynamicsCommand.ForeignAgentGetTunnelInfo( aArgs.iMobileNodeAddress, &fati ); + if( cres.iResult != DC_SUCCESS ) { + set_dynamics_error( &(rv.iCallResult), &cres ); + return rv; + } + + // set the info + rv.iCareofAddress = fati.iCareofAddress; + rv.iCreationTime = fati.iCreationTime; + rv.iExpirationTime = fati.iExpirationTime; + rv.iHomeAgentAddress = fati.iHomeAgentAddress; + rv.iLastTimestamp = fati.iLastTimestamp; + rv.iMobileNodeAddress = fati.iMobileNodeAddress; + rv.iPrivateHomeAgentID = fati.iPrivateHomeAgentID; + rv.iRefreshTime = fati.iRefreshTime; + rv.iSPI = fati.iSPI; + rv.iTimeout = fati.iTimeout; + return rv; +} + + + +/**************************************************************************************** + * + * PUBLIC FUNCTION: settimeout + * + ***************************************************************************************/ +void CSFacontroller::settimeout( TTimeoutRequest aArgs ) +{ + iDynamicsCallTimeout = aArgs.iTimeout; + iDynamicsCommand.SetTimeout( aArgs.iTimeout ); +} + + +/**************************************************************************************** + * + * PRIVATE FUNCTION: is_agent_running + * + ***************************************************************************************/ +TResult CSFacontroller::is_agent_running() +{ + TResult rv; + TCAProcessError perr; + TProcessStatus pstatus; + + // clear the rv + memset( &rv, 0, sizeof(rv) ); + + // check that the agent was running + if( iAgentProcess == NULL ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // check that the agent is still runnning + perr = iAgentProcess->GetProcessStatus( &pstatus ); + assert( perr == CAE_NONE ); + if( pstatus != PS_STARTED ) { + rv.iServiceResult = ERR_INVALIDSTATE; + return rv; + } + + // done - success + return rv; +} + + +/**************************************************************************************** + * + * PRIVATE FUNCTION: is_agent_running + * + ***************************************************************************************/ +void CSFacontroller::set_dynamics_error( TResult *result, TDynamicsCallInfo *cres ) +{ + result->iServiceResult = ERR_DYNAMICS_CALL_FAILED; + result->iSubComponentResult = cres->iResult; + result->iData0 = cres->iErrorCode; + result->iData1 = cres->iErrorDetail; +} +