aboutsummaryrefslogtreecommitdiffstats
path: root/sualibrary/sua/sua_database.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sualibrary/sua/sua_database.cpp')
-rw-r--r--sualibrary/sua/sua_database.cpp642
1 files changed, 642 insertions, 0 deletions
diff --git a/sualibrary/sua/sua_database.cpp b/sualibrary/sua/sua_database.cpp
new file mode 100644
index 0000000..ce953e1
--- /dev/null
+++ b/sualibrary/sua/sua_database.cpp
@@ -0,0 +1,642 @@
+/***************************************************************************
+ sua_database.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_database.cpp,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
+ *
+ * SUA implementation according to SUA draft issue 6.
+ *
+ * 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 : Ann V.
+ * "What does reuse of code mean if the code is NOT even used yet."
+ *
+ * Purpose: This code-file defines the SUA database access functions for:
+ * - dummy Indication Notifications
+ * - dummy DISxx indciation Notifications
+ * Sybsystem Number(SSN) Object:
+ * - read SSN
+ * Address Object:
+ * - read IP address parameter
+ * - read IP portnumber
+ * Local SUA Object:
+ * - initialise Local SUA Object
+ * Local SUA List:
+ * - initialise Local SUA List
+ * - read SSN
+ * - increase instance
+ * - unregister instance
+ * - register instance
+ * Remote SUA object:
+ * - initialise Remote SUA Object
+ * Remote SUA List
+ * - initialise Remote SUA list
+ * - read SSN
+ * - increase instance
+ * SUA Application Server list
+ * - initialise AS List
+ *
+ */
+
+#include "sctp.h"
+
+#include "sua_debug.h"
+#include "sua_database.h"
+#include "sua_logging.h"
+
+#include <cstdio>
+#include <iostream>
+#include <cstdlib>
+#include <string>
+
+#include "unistd.h"
+
+
+
+using namespace std;
+
+
+/***********************************************************************/
+/*Initialisation dummy functions for the object class SUA List & Object*/
+/***********************************************************************/
+void db_dummy_xxxxIndNotif ( unsigned int local_sua_Id,
+ unsigned int primitive,
+ unsigned int datalen
+ )
+{
+ cout << "You've just called the dummy_xxxxIndNotif function ! \n";
+ cout << "Better check youre initialisation and registration !! \n";
+}
+
+void db_dummy_DisxIndNotif ( unsigned int local_sua_Id,
+ unsigned int primitive,
+ unsigned int cause,
+ unsigned int datalen
+ )
+{
+ cout << "You've just called the dummy_DisxIndNotif function ! \n";
+ cout << "Better check youre initialisation and registration !! \n";
+}
+/***********************************************************************/
+/* functions of the object class SUA SSN Object */
+/***********************************************************************/
+
+/***********************************************************************/
+/* Sua_SSNObject::read_ssn */
+/***********************************************************************/
+void db_Sua_SSNObject::read_ssn(string ssn_str){
+
+ char *tokstr = new char[ssn_str.length()+1];
+ short sua_ssn;
+
+
+ ssn_str.copy(tokstr,ssn_str.length());
+ tokstr[ssn_str.length()] = '\0';
+ sua_ssn = atoi(tokstr);
+
+ ssn = sua_ssn;
+
+#ifdef DEBUG
+ //cout << "SSN value = " << sua_ssn << "\n";
+#endif
+};
+
+/***********************************************************************/
+/* functions of the object class SUA Address Object */
+/***********************************************************************/
+
+/***********************************************************************/
+/* Sua_AddressObject::read_addr_param */
+/***********************************************************************/
+void db_Sua_AddressObject::read_addr_param(string address_str){
+ int b=0,len=0,count_punct=0, count_colon=0;
+ unsigned int i=0;
+ int tokstr_len = 0;
+ char *tokstr;
+ int result;
+
+#ifdef DEBUG
+ cout << "address = " << address_str << " len = " <<address_str.length() << "\n";
+#endif
+
+ while ((i <= address_str.length()))
+ {
+ if (address_str[i] == '.') count_punct++;
+ if (address_str[i] == ':') count_colon++;
+ if ((address_str[i] == ',') || (i == address_str.length()))
+ {
+ len = i - b;
+ string dest(address_str,b,len);
+
+ tokstr_len = dest.length()+1;
+ tokstr = new char[tokstr_len];
+
+ dest.copy(tokstr,dest.length());
+ // we are dealing with char arrays, so....
+ tokstr[dest.length()] = '\0';
+ short k;
+ for(k=0; k < tokstr_len; k++)
+ address_string[nr_of_addrs][k] = tokstr[k];
+ if (count_punct == 3)
+ { // IPv4 address parameters
+ addrs[nr_of_addrs].sa.sa_family = AF_INET;
+ addrs[nr_of_addrs].sin.sin_port = SUA_PORT;
+ result = inet_pton(AF_INET, tokstr,&addrs[nr_of_addrs].sin.sin_addr);
+ if (result != 1)
+ cout << "IPvx address conversion returned "<< result << " \n";
+#ifdef DEBUG
+ cout << "IPv4 = " << addrs[nr_of_addrs].sin.sin_addr.s_addr << " \n";
+#endif
+ }
+ if (count_colon >= 2)
+ { // IPv6 address parameters
+ addrs[nr_of_addrs].sa.sa_family = AF_INET6;
+ addrs[nr_of_addrs].sin6.sin6_port = SUA_PORT;
+ result = inet_pton(AF_INET6, tokstr,&addrs[nr_of_addrs].sin6.sin6_addr);
+ if (result != 1)
+ cout << "IPvx address conversion returned "<< result << " \n";
+#ifdef DEBUG
+ cout << "IPv6 = " << &addrs[nr_of_addrs].sin6.sin6_addr << " \n";
+#endif
+ }
+
+ nr_of_addrs++;
+ b = i + 1;
+ count_punct = 0;
+ count_colon = 0;
+
+ }
+
+ i++;
+
+ }
+#ifdef DEBUG
+ cout << "number of address = " << nr_of_addrs << " \n";
+#endif
+}
+
+/***********************************************************************/
+/* Sua_AddressObject::read_pointcode */
+/***********************************************************************/
+void db_Sua_AddressObject::read_pointcode_param(string pointcode_str) {
+ int b=0,len=0;
+ unsigned int i=0;
+ int tokstr_len = 0;
+ char *tokstr;
+
+#ifdef DEBUG
+ cout << "Pointcode string = " << pointcode_str << " len = " << pointcode_str.length() << "\n";
+#endif
+
+ while ((i <= pointcode_str.length()))
+ {
+ if (i == pointcode_str.length())
+ {
+ len = i - b;
+ string dest(pointcode_str,b,len);
+
+ tokstr_len = dest.length()+1;
+ tokstr = new char[tokstr_len];
+
+ dest.copy(tokstr,dest.length());
+ // we are dealing with char arrays, so....
+ tokstr[dest.length()] = '\0';
+
+ pc.ITU24.family = ITU24bit;
+ pc.ITU24.pc = atoi(tokstr);
+
+#ifdef DEBUG
+ cout << "Pointcode value = " << pc.ITU24.pc << " \n";
+#endif
+ b = i + 1;
+ }
+ i++;
+ }
+
+#ifdef DEBUG
+ cout << "Only 1 pointcode per association allowed \n";
+#endif
+}
+
+/***********************************************************************/
+/* Sua_AddressObject::read_port_num */
+/***********************************************************************/
+void db_Sua_AddressObject::read_port_num(string port_str){
+ int i=0;
+ char *tokstr = new char[port_str.length()+1];
+ int sua_port_number;
+
+
+ port_str.copy(tokstr,port_str.length());
+ tokstr[port_str.length()] = '\0';
+ sua_port_number = atoi(tokstr);
+
+ for(i = 0; i < nr_of_addrs ; i++)
+ addrs[i].sin6.sin6_port = sua_port_number;
+
+#ifdef DEBUG
+ //cout << "Portnumber = " << sua_port_number << " * " << nr_of_addrs << " times \n";
+#endif
+}
+
+/***********************************************************************/
+/* functions of the object class SUA Local Object */
+/***********************************************************************/
+
+/***********************************************************************/
+/* Sua_LocalObject::initalize */
+/***********************************************************************/
+void db_Sua_LocalObject::initialize(){
+
+
+ SUA_APLCallBack.ulp_ClDataIndNotif = &db_dummy_xxxxIndNotif;
+ SUA_APLCallBack.ulp_ConnIndNotif = &db_dummy_xxxxIndNotif;
+ SUA_APLCallBack.ulp_ConnConfIndNotif = &db_dummy_xxxxIndNotif;
+ SUA_APLCallBack.ulp_ConnDataIndNotif = &db_dummy_xxxxIndNotif;
+ SUA_APLCallBack.ulp_DisConnIndNotif = &db_dummy_DisxIndNotif;
+
+}
+
+/***********************************************************************/
+/* functions of the object class SUA LocalList */
+/***********************************************************************/
+/***********************************************************************/
+/* Sua_LocalList::initialize */
+/***********************************************************************/
+void db_Sua_LocalList::initialize(){
+ short i;
+ num_of_instance = 0;
+ for (i=0; i < db_MAX_LOCAL_SUA; i++)
+ {
+ instance[i].initialize();
+ }
+}
+
+/***********************************************************************/
+/* Sua_LocalList::read_ssn */
+/***********************************************************************/
+void db_Sua_LocalList:: read_ssn(string ssn_str){
+
+ instance[num_of_instance].ssn.read_ssn(ssn_str);
+};
+
+/***********************************************************************/
+/* Sua_LocalList::increase_instance */
+/***********************************************************************/
+void db_Sua_LocalList:: increase_instance(){
+
+ num_of_instance++;
+#ifdef DEBUG
+ cout << "New instance nr " << (num_of_instance - 1) << " \n";
+#endif
+ char logstring[100];
+ sprintf(logstring, "New instance nr %d", num_of_instance - 1);
+ event_log("sua_database.c",logstring);
+
+};
+
+
+/***********************************************************************/
+/* Sua_LocalList::unregister_instance */
+/***********************************************************************/
+short db_Sua_LocalList:: unregister_instance(){
+
+ int i;
+
+ for(i=0; i < num_of_instance; i++)
+ {
+#ifdef DEBUG
+ cout << "UnRegister SUA(& SCTP) local instance nr " << i << " \n";
+#endif
+ char logstring[100];
+ sprintf(logstring, "Unregister SUA(& SCTP) local instance nr %d", i);
+ event_log("sua_database.c",logstring);
+ /* result = sctp_unregisterSCTP_instance ( instance[i].assoc_id );
+ */
+ }
+ return(0);
+};
+
+/***********************************************************************/
+/* Sua_LocalList::register_instance */
+/***********************************************************************/
+short db_Sua_LocalList::
+register_instance( unsigned int local_sua_id,
+ Sua_ULP_CallBacks SUACallbackFunctions,
+ unsigned int init_association
+ ){
+
+
+ instance[local_sua_id].SUA_APLCallBack.ulp_ClDataIndNotif = SUACallbackFunctions.ulp_ClDataIndNotif;
+ instance[local_sua_id].SUA_APLCallBack.ulp_ConnIndNotif = SUACallbackFunctions.ulp_ConnIndNotif;
+ instance[local_sua_id].SUA_APLCallBack.ulp_ConnConfIndNotif = SUACallbackFunctions.ulp_ConnConfIndNotif;
+ instance[local_sua_id].SUA_APLCallBack.ulp_ConnDataIndNotif = SUACallbackFunctions.ulp_ConnDataIndNotif;
+ instance[local_sua_id].SUA_APLCallBack.ulp_DisConnIndNotif = SUACallbackFunctions.ulp_DisConnIndNotif;
+
+ instance[local_sua_id].init_assoc_id = init_association;
+
+ return(0);
+}
+
+/***********************************************************************/
+/* functions of the object class SUA Remote Object */
+/***********************************************************************/
+/***********************************************************************/
+/* Sua_RemoteObject::initalize */
+/***********************************************************************/
+void db_Sua_RemoteObject::initialize(){
+
+ ;
+}
+
+/***********************************************************************/
+/* functions of the object class SUA RemoteList */
+/***********************************************************************/
+
+/***********************************************************************/
+/* Sua_RemoteList::initialize */
+/***********************************************************************/
+void db_Sua_RemoteList::initialize(){
+ short i;
+ num_of_instance = 0;
+ for (i=0; i < db_MAX_REMOTE_SUA; i++)
+ {
+ instance[i].initialize();
+ }
+}
+
+/***********************************************************************/
+/* Sua_RemoteList::read_ssn */
+/***********************************************************************/
+void db_Sua_RemoteList:: read_ssn(string ssn_str){
+
+ instance[num_of_instance].ssn.read_ssn(ssn_str);
+};
+
+/***********************************************************************/
+/* Sua_RemoteList::increase_instance */
+/***********************************************************************/
+void db_Sua_RemoteList:: increase_instance(){
+
+ num_of_instance++;
+#ifdef DEBUG
+ cout << "New instance nr " << (num_of_instance - 1) << " \n";
+#endif
+ char logstring[100];
+ sprintf(logstring, "New instance nr %d", num_of_instance - 1);
+ event_log("sua_database.c",logstring);
+
+};
+/***********************************************************************/
+/* functions of the object class SUA Application Server Process (ASP) */
+/***********************************************************************/
+/***********************************************************************/
+/* Sua_ASPObject::initalize */
+/***********************************************************************/
+void db_Sua_ASPObject::initialize(){
+ short j;
+
+ status = asp_idle;
+ for (j=0; j < db_MAX_1ASP_IN_AS ; j++)
+ linked_to_AS[j] = 0;
+}
+
+/***********************************************************************/
+/* Sua_ASPObject::Activate ASP */
+/***********************************************************************/
+bool db_Sua_ASPObject::activate(unsigned int sua_assoc_id,
+ short mode
+ )
+{
+ bool traf_hold=FALSE;
+ short i;
+
+
+ switch ( status)
+ {
+ case (asp_inactive):
+ {
+ switch (mode)
+ {
+ case (tmt_override ):
+ {
+ cout << "ASP in override mode\n";
+ /* this node becomes the override node for processing */
+ /* all other ASP of this AS must be put in standby */
+ i = 0;
+ /*while (i <= db_MAX_1ASP_IN_AS)
+ {
+ if ((linked_to_AS[i] > 0) &&
+ (linked_to_AS[i] <= db_MAX_SUA_AS))
+ Asp_mngt_standby ( linked_to_AS[i],
+ sua_assoc_id,
+ mode
+ );
+ }*/
+ }
+ case (tmt_loadshare):
+ {
+ cout << "ASP in loadshare mode\n";
+ }
+ case (tmt_max/*broadcast*/):
+ {
+ cout << "ASP in broadcast -> very dangerous\n";
+ }
+ default:
+ {
+ cout << "default mode in activation\n";
+ }
+ }
+ status = asp_active;
+ }
+ case (asp_inactive_traf_hold):
+ {
+ status = asp_active;
+ traf_hold = TRUE;
+ }
+ default:
+ {
+ /* remain in same state */
+ /* depdending on the mode of the ASPAC */
+ ;
+ }
+ }
+ return(traf_hold);
+}
+
+/***********************************************************************/
+/* Sua_ASPObject::inactivate ASP */
+/***********************************************************************/
+void db_Sua_ASPObject::deactivate( unsigned int sua_assoc_id,
+ short mode
+ )
+{
+ if( status == asp_active)
+ status = asp_inactive;
+}
+
+/***********************************************************************/
+/* Sua_ASPObject::put ASP up = inactive */
+/***********************************************************************/
+void db_Sua_ASPObject::up( unsigned int sua_assoc_id,
+ short mode
+ )
+{
+ switch(status)
+ {
+ case( asp_down):
+ {
+ status = asp_inactive;
+ }
+ case (asp_down_traf_hold):
+ {
+ status = asp_inactive_traf_hold;
+ }
+ default:
+ {
+ // do nothing , state is not changed
+ }
+ }
+}
+
+/***********************************************************************/
+/* Sua_ASPObject::put ASP in down mode */
+/***********************************************************************/
+void db_Sua_ASPObject::down( unsigned int sua_assoc_id,
+ short mode
+ )
+{
+ status = asp_down;
+}
+
+/***********************************************************************/
+/* functions of the object class SUA Application Server List */
+/***********************************************************************/
+/***********************************************************************/
+/* Sua_ASList::initalize */
+/***********************************************************************/
+void db_Sua_ASList::initialize(){
+
+ short i,j;
+ num_of_instance = 0;
+ for (i=0; i < db_MAX_SUA_AS; i++)
+ {
+ instance[i].status = as_idle;
+ for (j=0; j < db_MAX_ASP_IN_1AS; j++)
+ instance[i].ASP_linked_to_this_AS[j] = 0;
+ }
+}
+
+/***********************************************************************/
+/* Sua_ASList::read_AS string */
+/***********************************************************************/
+short db_Sua_ASList::read_AS( string as_str,
+ unsigned int sua_id
+ ){
+ int i=0;
+ char *tokstr = new char[as_str.length()+1];
+ int as_number;
+ bool cont_loop;
+
+
+ as_str.copy(tokstr,as_str.length());
+ tokstr[as_str.length()] = '\0';
+ as_number = atoi(tokstr);
+
+ if ( instance[as_number].status == as_idle)
+ instance[as_number].status = as_down;
+
+ i= 0;
+ cont_loop = (i < db_MAX_ASP_IN_1AS);
+ while (cont_loop)
+ {
+ if (instance[as_number].ASP_linked_to_this_AS[i] == 0)
+ {
+ instance[as_number].ASP_linked_to_this_AS[i] = sua_id;
+ cont_loop = false;
+ }
+ }
+#ifdef DEBUG
+ cout << "Application Server number used " << as_number << " for ASP " << sua_id << "\n";
+#endif
+
+ return(as_number);
+
+}
+
+/***********************************************************************/
+/* AS_override_ASP */
+/***********************************************************************/
+void db_Sua_ASList::override_ASP( unsigned int asp_sua_assoc_id,
+ unsigned int AS_id,
+ short mode
+ )
+{
+ short i;
+ short asp_present_nr = 0;
+ unsigned short processed_ASP = 0;
+
+ for (i=0; i <= db_MAX_ASP_IN_1AS; i++){
+ processed_ASP = instance[AS_id].ASP_linked_to_this_AS[i];
+ if (processed_ASP == asp_sua_assoc_id )
+ {
+ asp_present_nr++;
+ asp_activate_override(asp_sua_assoc_id);
+ }
+ else if ((processed_ASP > 0) &&
+ (processed_ASP <= db_MAX_REMOTE_SUA))
+ {
+ asp_present_nr++;
+ asp_deactivate(asp_sua_assoc_id);
+ }
+ /*else nothing to do */
+
+ }
+ //if (asp_present_nr = 0)
+ // instance(AS_id).status = as_
+}
+
+// end of module sua_database.c
+
+
+
+
+
+