libsua/sualibrary/sua/sua_adapt.cpp

274 lines
9.2 KiB
C++
Raw Normal View History

/***************************************************************************
sua_adapt.cpp - description
-------------------
begin : Tue Jan 8 2002
copyright : (C) 2002 by Lode Coene
email : lode.coene@siemens.atea.be
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/*
* $Id: sua_adapt.cpp,v 1.5 2002/11/12 11:02:49 p82609 Exp $
*
* SUA implementation according to SUA draft issue 13.
*
* Author(s): Lode Coene
*
*
* Copyright (C) 2001 by Siemens Atea, Herentals, Belgium.
*
* Realized in co-operation between Siemens Atea and
* Siemens AG, Munich, Germany.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contact: gery.verwimp@siemens.atea.be
* lode.coene@siemens.atea.be
*
* The alternative comment
* inspiration : Katrien
* "Come on barbie, let's go party"
*
* Purpose: This code-file defines the SUA adaptation functions used by
* the SUA application for:
* - initialising the SUA layer
* - reading the SUA configuration file
* - registering a local SUA instance
* - Setting up the association with a remote SUA node
* - get info on a certain (SUA) association
* - terminate a association
* - convert Hostname(string) to SUAname(Character array)
* - convert SUAname(Character array) to Hostname(Character array)
*/
// sua_adapt.c++
// SCCP user adaptation program
#include "sua_debug.h"
#include "sua_database.h"
#include "sua_file.h"
#include "sua_distribution.h"
#include "sua_logging.h"
#ifdef LINUX
#include <unistd.h>
#endif
#include <sctp.h>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <string>
#include <netinet/in_systm.h>
#include <netinet/ip.h> /* includes <netinet/in.h> also ! */
#include <netinet/ip_icmp.h>
#include <netdb.h>
#include <arpa/inet.h>
using namespace std;
/* definition of SUA database objects */
db_Sua_DatabaseList sua;
/***********************************************************************/
/* sua_initialisation */
/***********************************************************************/
void sua_initialisation()
{
int res;
SCTP_LibraryParameters params;
cout << "Initialising SCTP & SUA\n ";
res = sctp_initLibrary();
/* set checksum to CRC32C */
sctp_getLibraryParameters(&params);
params.checksumAlgorithm = SCTP_CHECKSUM_ALGORITHM_CRC32C;
params.supportPRSCTP = 0;
sctp_setLibraryParameters(&params);
init_logging_file();
sua.local_sua.initialize();
sua.remote_sua.initialize();
sua.AssocDB.initialize();
cout << "Finished initialising SUA data\n ";
} /* end of sua_initialisation */
/***********************************************************************/
/* sua_read_configuration file */
/***********************************************************************/
unsigned int sua_read_config_file( char *pConfFile)
{
unsigned int result = SUA_CFG_NO_ERROR;
string sua_filename;
sua_filename = pConfFile;
result = read_sua_file( sua_filename,
sua.local_sua,
sua.remote_sua,
sua.AssocDB,
sua.NameDB,
sua.ApplicServ
);
return(result);
}
/***********************************************************************/
/* sua_registerInstance */
/***********************************************************************/
unsigned int sua_registerInstance ( short local_ssn,
Sua_ULP_CallBacks ulp_callback
)
{
unsigned int result = SUA_REG_NO_ERROR;
SCTP_ulp_Callbacks SCTPCallbackFunctions;
SCTPCallbackFunctions.dataArriveNotif = &sctp_DataArriveNotif;
SCTPCallbackFunctions.networkStatusChangeNotif = &sctp_NetworkStatusChangeNotif;
SCTPCallbackFunctions.sendFailureNotif = &sctp_SentFailureNotif;
SCTPCallbackFunctions.communicationLostNotif = &sctp_CommunicationLostNotif;
SCTPCallbackFunctions.communicationUpNotif = &sctp_CommunicationUpNotif;
SCTPCallbackFunctions.communicationErrorNotif = &sctp_CommunicationErrorNotif;
SCTPCallbackFunctions.restartNotif = &sctp_RestartNotif;
SCTPCallbackFunctions.shutdownCompleteNotif = &sctp_ShutDownCompleteNotif;
result = sua.AssocDB.register_instance ( SCTPCallbackFunctions,
ulp_callback,
sua.local_sua
);
return(result);
}
/***********************************************************************/
/* sua_associate */
/***********************************************************************/
unsigned int sua_associate ( )
{
unsigned int result = SUA_ASS_NO_ERROR;
result = sua.AssocDB.associate_instance( sua.local_sua,
sua.remote_sua
);
return(result);
}
/***********************************************************************/
/* sua_getPath */
/***********************************************************************/
unsigned int sua_getPath( unsigned int assoc_id,
sua_Path_str &pathinfo
)
{
unsigned int result = SUA_PATH_NO_ERROR;
if ( sua.AssocDB.instance[assoc_id].Dest.nr_of_addrs > 0)
{
/*pathinfo.remote_addr.*/
pathinfo.remote_addr.pc.ipvx = sua.AssocDB.instance[assoc_id].Dest.addrs[0];
/*memcpy( pathinfo.remote_addr.pc.ipvx.ch, sua.AssocDB.instance[assoc_id].Dest.addrs[0].ch, 24);*/
pathinfo.remote_addr.pc.ss7 = sua.AssocDB.instance[assoc_id].Dest.pc;
pathinfo.remote_addr.ssn = sua.remote_sua.instance[sua.AssocDB.instance[assoc_id].remote_sua_id].ssn.ssn;
pathinfo.ASP_status = sua.AssocDB.instance[assoc_id].asp.status;
#ifdef DEBUG
//cout << "remote ssn = " << pathinfo.remote_addr.ssn << "\n";
//cout << "remote sua_id = " << sua.AssocDB.instance[assoc_id].remote_sua_id << "\n";
#endif
}
else
result = SUA_PATH_NO_DEST_ADDR_PRESENT;
pathinfo.local_addr.pc.ipvx.ch = sua.AssocDB.instance[assoc_id].Source.addrs[0].ch;
/*memcpy( pathinfo.local_addr.pc.ipvx.ch, sua.AssocDB.instance[assoc_id].Source.addrs[0].ch,24);*/
pathinfo.local_addr.pc.ss7 = sua.AssocDB.instance[assoc_id].Source.pc;
pathinfo.local_addr.ssn = sua.local_sua.instance[sua.AssocDB.instance[assoc_id].local_sua_id].ssn.ssn;
return (result);
}
/***********************************************************************/
/* get destination pointcode address */
/***********************************************************************/
pointcode_str get_destpc_addr( unsigned int sua_id)
{
pointcode_str pc;
pc.ipvx = sua.AssocDB.instance[sua_id].Dest.addrs[0];
pc.ss7 = sua.AssocDB.instance[sua_id].Dest.pc;
return(pc);
}
/***********************************************************************/
/* get source pointcode address */
/***********************************************************************/
pointcode_str get_sourcepc_addr( unsigned int sua_id)
{
pointcode_str pc;
pc.ipvx = sua.AssocDB.instance[sua_id].Source.addrs[0];
pc.ss7 = sua.AssocDB.instance[sua_id].Source.pc;
return(pc);
}
/***********************************************************************/
/* sua_shutdown */
/***********************************************************************/
unsigned int sua_shutdown( )
{
unsigned int result = SUA_TERM_NO_ERROR;
sua.AssocDB.shutdown();
return (result);
}
/***********************************************************************/
/* sua_terminate */
/***********************************************************************/
unsigned int sua_terminate( )
{
unsigned int result = SUA_TERM_NO_ERROR;
sua.AssocDB.shutdown();
close_logging_file();
return (result);
}
// end of module sua_adapt.c++