update to sualibrary-0.1.1 from 2002-03-15:

* Contains Relaying functionality using hostnames.
    * Correct some bugs (multihoming....)
    * Compiles and runs on Linux, FreeBSD ....
    * Tested on IPv4 and IPV6 networks
    * interoperable with other SUA implementations
    * corresponds to sua draft v11
    * requires SCTP implementation from www.sctp.de
This commit is contained in:
Harald Welte 2010-07-09 20:56:56 +02:00
parent acd8cf6013
commit 7e7186ca00
8 changed files with 725 additions and 450 deletions

View File

@ -1,57 +1,57 @@
# KDE Config File
[Workspace_1]
openfiles=Untitled.h,Untitled.cpp,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-1.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-4.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-2.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-3.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-5.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-6.html,/home/p82609/siemens/sualibrary/sualibrary/docs/en/Makefile.in,/home/p82609/siemens/sualibrary/sualibrary/docs/en/index.sgml,
show_outputview=true
show_treeview=true
header_file=/home/p82609/siemens/sualibrary/sualibrary/docs/en/index-4.html
cpp_file=Untitled.cpp
browser_file=file:/opt/kde/share/doc/HTML/default/kdevelop/reference/C/LIBRARIES/libraries.html
[sualibrary/docs/en/index-6.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_logging.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_logging.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_adapt.cpp]
install_location=
dist=true
install=false
type=SOURCE
[Workspace_1]
openfiles=Untitled.h,Untitled.cpp,/home/p82609/siemens/sualibrary/sualibrary/sua/sua_datassoc.cpp,/home/p82609/siemens/sualibrary/sualibrary/sua/sua_distribution.cpp,
show_outputview=true
show_treeview=true
header_file=Untitled.h
cpp_file=/home/p82609/siemens/sualibrary/sualibrary/sua/sua_datassoc.cpp
browser_file=file:/opt/kde/share/doc/HTML/default/kdevelop/reference/C/LIBRARIES/libraries.html
[COPYING]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_adapt.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_logging.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_logging.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_database.h]
install_location=
dist=true
install=false
type=HEADER
[Config for BinMakefileAm]
ldflags=
addcxxflags=
ldadd=
cxxflags=-O0 -g3 -Wall
bin_program=sualibrary
[sualibrary/sua/sua.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_tcb.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua.h]
install_location=
dist=true
install=false
type=HEADER
[Config for BinMakefileAm]
ldflags=
addcxxflags=
ldadd=
bin_program=sualibrary
cxxflags=-O0 -g3 -Wall
[sualibrary/testup/main.cpp]
install_location=
dist=true
@ -62,22 +62,22 @@ install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_file.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_asp_mgnt.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary.kdevprj]
[sualibrary/sua/sua_file.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/docs/en/index-1.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/docs/en/index-1.html]
[sualibrary.kdevprj]
install_location=
dist=true
install=false
@ -93,21 +93,26 @@ install_location=
dist=true
install=false
type=DATA
[sualibrary/docs/en/Makefile.am]
files=sualibrary/docs/en/index.html,sualibrary/docs/en/index-1.html,sualibrary/docs/en/index-2.html,sualibrary/docs/en/index-3.html,sualibrary/docs/en/index-4.html,sualibrary/docs/en/index-5.html,sualibrary/docs/en/index-6.html,
sub_dirs=
type=normal
[sualibrary/sua/sua_sual.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/docs/en/Makefile.am]
files=sualibrary/docs/en/index.html,sualibrary/docs/en/index-1.html,sualibrary/docs/en/index-2.html,sualibrary/docs/en/index-3.html,sualibrary/docs/en/index-4.html,sualibrary/docs/en/index-5.html,sualibrary/docs/en/index-6.html,
type=normal
sub_dirs=
[sualibrary/docs/en/index.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_file.cpp]
[sualibrary/docs/en/index-3.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_asp_mgnt.cpp]
install_location=
dist=true
install=false
@ -117,35 +122,25 @@ install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_asp_mgnt.cpp]
[sualibrary/sua/sua_file.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/docs/en/index-3.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/docs/Makefile.am]
type=normal
sub_dirs=en,
[sualibrary/testup/assoc.sua]
install_location=
dist=false
install=false
type=DATA
[sualibrary/sua/sua_distribution.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/docs/Makefile.am]
sub_dirs=en,
type=normal
[sualibrary/docs/en/index-4.html]
install_location=
dist=true
install=false
type=DATA
[sualibrary/testup/testuser.h]
[sualibrary/sua/sua_distribution.h]
install_location=
dist=true
install=false
@ -155,20 +150,25 @@ install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_tcb.cpp]
[sualibrary/testup/testuser.h]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/Makefile.am]
files=
type=prog_main
sub_dirs=docs,sua,testup,
type=HEADER
[sualibrary.lsm]
install_location=
dist=true
install=false
type=DATA
[sualibrary/Makefile.am]
files=
sub_dirs=docs,sua,testup,
type=prog_main
[sualibrary/sua/sua_tcb.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/docs/en/index-5.html]
install_location=
dist=true
@ -179,53 +179,48 @@ install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_cl.cpp]
install_location=
dist=true
install=false
type=SOURCE
[ChangeLog]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/sua_cl.cpp]
install_location=
dist=true
install=false
type=SOURCE
[General]
make_options=-j1
makefiles=Makefile.am,sualibrary/Makefile.am,sualibrary/docs/Makefile.am,sualibrary/docs/en/Makefile.am,sualibrary/sua/Makefile.am,sualibrary/testup/Makefile.am,
version_control=None
project_type=normal_cpp
author=Lode Coene
project_type=normal_cpp
sub_dir=sualibrary/
lfv_open_groups=
workspace=1
project_name=Sualibrary
version=0.1
AMChanged=true
project_name=Sualibrary
AMChanged=false
sgml_file=/home/p82609/sualibrary/sualibrary/docs/en/index.sgml
short_info=,
email=lode.coene@siemens.atea.be
kdevprj_version=1.2
configure_args=
modifyMakefiles=true
[INSTALL]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/Makefile.am]
files=sualibrary/sua/sua.h,sualibrary/sua/sua_adapt.cpp,sualibrary/sua/sua_adapt.h,sualibrary/sua/sua_asp_mgnt.cpp,sualibrary/sua/sua_asp_mgnt.h,sualibrary/sua/sua_cl.cpp,sualibrary/sua/sua_cl.h,sualibrary/sua/sua_datassoc.cpp,sualibrary/sua/sua_co.cpp,sualibrary/sua/sua_co.h,sualibrary/sua/sua_database.cpp,sualibrary/sua/sua_database.h,sualibrary/sua/sua_dataname.cpp,sualibrary/sua/sua_debug.h,sualibrary/sua/sua_distribution.cpp,sualibrary/sua/sua_distribution.h,sualibrary/sua/sua_file.cpp,sualibrary/sua/sua_file.h,sualibrary/sua/sua_logging.cpp,sualibrary/sua/sua_logging.h,sualibrary/sua/sua_sual.cpp,sualibrary/sua/sua_sual.h,sualibrary/sua/sua_syntax.cpp,sualibrary/sua/sua_syntax.h,sualibrary/sua/sua_tcb.cpp,sualibrary/sua/sua_tcb.h,
type=static_library
[TODO]
install_location=
dist=true
install=false
type=DATA
[sualibrary/sua/Makefile.am]
files=sualibrary/sua/sua.h,sualibrary/sua/sua_adapt.cpp,sualibrary/sua/sua_adapt.h,sualibrary/sua/sua_asp_mgnt.cpp,sualibrary/sua/sua_asp_mgnt.h,sualibrary/sua/sua_cl.cpp,sualibrary/sua/sua_cl.h,sualibrary/sua/sua_datassoc.cpp,sualibrary/sua/sua_co.cpp,sualibrary/sua/sua_co.h,sualibrary/sua/sua_database.cpp,sualibrary/sua/sua_database.h,sualibrary/sua/sua_dataname.cpp,sualibrary/sua/sua_debug.h,sualibrary/sua/sua_distribution.cpp,sualibrary/sua/sua_distribution.h,sualibrary/sua/sua_file.cpp,sualibrary/sua/sua_file.h,sualibrary/sua/sua_logging.cpp,sualibrary/sua/sua_logging.h,sualibrary/sua/sua_sual.cpp,sualibrary/sua/sua_sual.h,sualibrary/sua/sua_syntax.cpp,sualibrary/sua/sua_syntax.h,sualibrary/sua/sua_tcb.cpp,sualibrary/sua/sua_tcb.h,
type=static_library
[sualibrary/sua/sua_syntax.h]
[INSTALL]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_co.h]
type=DATA
[sualibrary/sua/sua_syntax.h]
install_location=
dist=true
install=false
@ -235,7 +230,17 @@ install_location=local.sua
dist=false
install=false
type=DATA
[sualibrary/testup/testuser.cpp]
[sualibrary/sua/sua_co.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_adapt.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_co.cpp]
install_location=
dist=true
install=false
@ -245,17 +250,16 @@ install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_co.cpp]
[sualibrary/testup/testuser.cpp]
install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_adapt.h]
install_location=
dist=true
install=false
type=HEADER
[sualibrary/sua/sua_sual.h]
[Makefile.am]
files=sualibrary.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,sualibrary.lsm,
sub_dirs=sualibrary,
type=normal
[sualibrary/sua/sua_cl.h]
install_location=
dist=true
install=false
@ -265,24 +269,20 @@ install_location=
dist=true
install=false
type=SOURCE
[sualibrary/sua/sua_cl.h]
[sualibrary/sua/sua_sual.h]
install_location=
dist=true
install=false
type=HEADER
[Makefile.am]
files=sualibrary.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,sualibrary.lsm,
type=normal
sub_dirs=sualibrary,
[sualibrary/testup/Makefile.am]
files=sualibrary/testup/main.cpp,sualibrary/testup/testuser.cpp,sualibrary/testup/testuser.h,sualibrary/testup/local.sua,sualibrary/testup/assoc.sua,
sub_dirs=
type=static_library
[AUTHORS]
install_location=
dist=true
install=false
type=DATA
[sualibrary/testup/Makefile.am]
files=sualibrary/testup/main.cpp,sualibrary/testup/testuser.cpp,sualibrary/testup/testuser.h,sualibrary/testup/local.sua,sualibrary/testup/assoc.sua,
type=static_library
sub_dirs=
[sualibrary/sua/sua_debug.h]
install_location=
dist=true

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_cl.cpp,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
* $Id: sua_cl.cpp,v 1.3 2002/03/01 12:57:38 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -48,7 +48,9 @@
* inspiration : Dorothee
* "Always admire the local beauties in their natural enviroment."
*
* Purpose: This code-file defines the SUA connectionless message handling:
* Purpose: This code-file defines the SUA connectionless message handling:
* - send a SUA message(CL or CO) to SCTP
* - route a SUA message(CL or CO)
* - send a Unitdata msg to remote node
* (- send a Unitdata Service msg to remote node)
* - Process a Unitdata msg
@ -92,24 +94,180 @@ extern tcb_Sua_msgqueue_pool msg_store;
// import the received msg pool
extern vector<sua_save_str> rec_msg_pool;
/***********************************************************************/
/* sua_send_Message */
/***********************************************************************/
int sua_send_Message( signed int sctp_assoc_id,
short int sctp_stream_id,
int sctp_delivery_type,
unsigned int sctp_loadshare,
char *databuf,
unsigned int datalen
)
{
signed int result;
/* send data to SCTP */
/* yes it does, continue, no problem, send the msg */
#ifdef DEBUG
/* display byte array */
display_byte_array(databuf , datalen);
#endif
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", sctp_assoc_id);
event_log("sua_cl.c",logstring);
log_byte_array("sua_cl.c", databuf,datalen);
result = sctp_send ( sctp_assoc_id,
sctp_stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY, /* replace in future with sctp_loadshare*/
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
sctp_delivery_type,
SCTP_BUNDLING_DISABLED
);
#ifdef DEBUG
cout << "sua_cl.c:result sctp send = "<< result << "\n";
printf( "%d \n", result);
#endif
return(result);
}
/***********************************************************************/
/* sua_route_Message */
/***********************************************************************/
int sua_route_Message( unsigned int sctp_assoc_id,
unsigned int local_sua_id,
Sua_container &msg,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address
)
{
int result = 0;
short int sctp_stream_id = 0;
int sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
int sua_assoc_id = 0;
int datalen = 0;
Sua_syntax_error_struct error;
// call routing to figure out which association to take for sending
// out the message
#ifdef DEBUG
cout << "call routing function\n";
#endif
sctp_assoc_id = Assoc_sua.route_msg( called_pty_address,
calling_pty_address,
sua_assoc_id
);
#ifdef DEBUG
cout << "routed to SCTP assoc " << sctp_assoc_id << "/SUA assoc id " << sua_assoc_id <<"\n";
#endif
/* does association exist? */
if (sctp_assoc_id > 0)
{
/* YES, encode the SUA unitdata message and ... */
error = msg.sua_encode();
/* figure out SCTP delivery type, stream to send msg on,...and.. */
if (msg.sua_prim.prot_class_pres)
{
switch(msg.sua_prim.prot_class.pcl)
{
case(prot_class_0): /* connectionless transport, non sequenced */
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(prot_class_1): /* connectionless transport, sequenced */
sctp_delivery_type = SCTP_ORDERED_DELIVERY;
break;
case(prot_class_2): /* connection-oriented transport, ... */
sctp_delivery_type = SCTP_ORDERED_DELIVERY;
break;
case(prot_class_3): /* connection-oriented transport, ... */
sctp_delivery_type = SCTP_ORDERED_DELIVERY;
break;
default:
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
}
sctp_stream_id = Assoc_sua.instance[sua_assoc_id].nr_of_outbound_streams;
sctp_stream_id = 0;
}
else
{
sctp_stream_id = 0;
}
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
// send data to SCTP
result = sua_send_Message( sctp_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
#ifdef DEBUG
cout.setf(ios::internal);
cout << "sua_cl.c:result sua send = "<< result << "\n";
#endif
}
else if (sctp_assoc_id < 0)
{
/* NOPE, message is routable, but destination is blocked */
/* due to administration or management descisions */
#ifdef DEBUG
cout << "sua_cl.c:sending msg prohibited \n";
#endif
result = -1;
}
else
{
/* NOPE message is NOT routable, destination not found. */
/* drop the message, no route present for that address */
result = 0;
}
return(result);
}
/***********************************************************************/
/* sua_send_Unitdata */
/***********************************************************************/
int sua_send_Unitdata(sccp_QOS_str &QOS,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address,
char *buffer,
unsigned int len
)
int sua_send_Unitdata ( sccp_QOS_str &QOS,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address,
char *buffer,
unsigned int len
)
{
Sua_container msg;
Sua_syntax_error_struct error;
int error_value;
int error_value = 0;
int string_size, datalen;
signed int sctp_assoc_id;
unsigned int sua_assoc_id;
short stream_id = 0;
int delivery_type, result;
int sua_assoc_id;
short sctp_stream_id = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
int sctp_delivery_type, result;
tcb_Sua_msg_elem sua_msg;
// init the message
@ -134,14 +292,14 @@ int sua_send_Unitdata(sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_0;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = QOS.sequence_number;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class1):
msg.sua_prim.prot_class_pres = TRUE;
msg.sua_prim.prot_class.pcl = prot_class_1;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = QOS.sequence_number;
delivery_type = SCTP_ORDERED_DELIVERY;
sctp_delivery_type = SCTP_ORDERED_DELIVERY;
break;
default:
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -297,46 +455,35 @@ int sua_send_Unitdata(sccp_QOS_str &QOS,
cout << "call routing function\n";
#endif
sctp_assoc_id = Assoc_sua.route_msg( called_pty_address,
calling_pty_address
);
calling_pty_address,
sua_assoc_id
);
#ifdef DEBUG
cout << "routed to SCTP assoc " << sctp_assoc_id << "\n";
#endif
/* does association exist? */
if (sctp_assoc_id > 0)
{
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
/* yes it does, continue, no problem, send the msg */
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", sctp_assoc_id);
event_log("sua_cl.c",logstring);
log_byte_array("sua_cl.c", databuf,msg.sua_msg.length());
result = sctp_send ( sctp_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
// send data to SCTP
result = sua_send_Message( sctp_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
#ifdef DEBUG
cout << "sua_cl.c:result sctp send = "<< result << "\n";
#endif
error_value = 0;
}
else if (sctp_assoc_id < 0)
{
@ -361,12 +508,12 @@ int sua_send_Unitdata(sccp_QOS_str &QOS,
/* - save the msg till the association is setup or */
/* association setup fails -> drop saved msg */
sua_msg.byte = msg.sua_msg;
sua_msg.delivery_type = delivery_type;
sua_msg.stream_id = stream_id;
sua_msg.delivery_type = sctp_delivery_type;
sua_msg.stream_id = sctp_stream_id;
sua_msg.valid = true;
msg_store.add_msg ( sua_assoc_id,
sua_msg
);
sua_msg
);
error_value = -1;
}
@ -385,8 +532,9 @@ short process_unitdata_msg ( int local_sua_id,
Sua_container &msg
)
{
sua_save_str temp;
int result = 0;
int sctp_assoc_id = 0;
temp.primitive = N_UNITDATA;
temp.user_ref = 0;
@ -435,7 +583,7 @@ short process_unitdata_msg ( int local_sua_id,
if (msg.sua_prim.source_addr.pc_pres == TRUE)
{
temp.calling_pty_address.address_fields_present.pc = ss7_pc_present;
temp.calling_pty_address.pc.ss7.ITU24.family = ITU24bit;
temp.calling_pty_address.pc.ss7.ITU24.family = Assoc_sua.instance[sua_assoc_id].Dest.pc.ITU14.family;
temp.calling_pty_address.pc.ss7.ITU24.pc = msg.sua_prim.source_addr.pc;
}
if (msg.sua_prim.source_addr.gt_pres == TRUE)
@ -483,11 +631,25 @@ short process_unitdata_msg ( int local_sua_id,
// retrieve the called(=destination) address(=should be our own local addr)
// not completely done yet
if (msg.sua_prim.dest_addr.ip_addr_pres == TRUE)
{
temp.called_pty_address.address_fields_present.pc = ipvx_pc_present;
if (msg.sua_prim.dest_addr.ip_addr_type == ip_v4) {
temp.called_pty_address.pc.ipvx.sin = msg.sua_prim.dest_addr.ip_addr.ipv4;
temp.called_pty_address.pc.ipvx.sa.sa_family = AF_INET;
temp.called_pty_address.pc.ipvx.sin.sin_port = Assoc_sua.instance[sua_assoc_id].Dest.addrs[0].sin.sin_port;
}
else if (msg.sua_prim.dest_addr.ip_addr_type == ip_v6) {
temp.called_pty_address.pc.ipvx.sin6 = msg.sua_prim.dest_addr.ip_addr.ipv6;
temp.called_pty_address.pc.ipvx.sa.sa_family = AF_INET6;
temp.called_pty_address.pc.ipvx.sin6.sin6_port = Assoc_sua.instance[sua_assoc_id].Dest.addrs[0].sin.sin_port;
}
}
if (msg.sua_prim.dest_addr.pc_pres == TRUE)
{
temp.called_pty_address.address_fields_present.pc = ss7_pc_present;
temp.called_pty_address.pc.ss7.ITU24.family = ITU24bit;
temp.called_pty_address.pc.ss7.ITU24.pc = msg.sua_prim.source_addr.pc;
temp.called_pty_address.pc.ss7.ITU24.family = Assoc_sua.instance[sua_assoc_id].Dest.pc.ITU14.family;
temp.called_pty_address.pc.ss7.ITU24.pc = msg.sua_prim.dest_addr.pc;
}
if (msg.sua_prim.dest_addr.hostname_pres == TRUE)
@ -525,19 +687,33 @@ short process_unitdata_msg ( int local_sua_id,
temp.userdata = msg.sua_prim.data_string;
else
cout << "sua_cl.c: no sua user data in unitdata msg \n";
// store primitive in a list(is retrieve via sua_receive_msg)
rec_msg_pool.push_back(temp);
/* call the application/user callBack function */
local_sua.instance[local_sua_id].SUA_APLCallBack.ulp_ClDataIndNotif
( local_sua_id,
N_UNITDATA,
temp.userdata.length()
);
/* Is this the final destination ? */
if ( Assoc_sua.Find_local_sua ( temp.called_pty_address) > 0 )
{
/* Yes, message has arrived at its final destination -> send to upper layer */
/* store primitive in a list(is retrieve via sua_receive_msg) */
rec_msg_pool.push_back(temp);
/* call the application/user callBack function */
local_sua.instance[local_sua_id].SUA_APLCallBack.ulp_ClDataIndNotif
( local_sua_id,
N_UNITDATA,
temp.userdata.length()
);
}
else
{
/* No, Message has not arrived at its final destination -> */
/* route it to the next SUA node via an SCTP association nr x */
result = sua_route_Message( sctp_assoc_id,
local_sua_id,
msg,
temp.called_pty_address,
temp.calling_pty_address
);
}
return(0);
}

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_cl.h,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
* $Id: sua_cl.h,v 1.2 2002/03/01 12:57:38 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -44,7 +44,9 @@
* Contact: gery.verwimp@siemens.atea.be
* lode.coene@siemens.atea.be
*
* Purpose: This header-file defines the SUA connectionless message handling:
* Purpose: This header-file defines the SUA connectionless message handling:
* - send a SUA message to SCTP
* - route/relay a received SUA msg towards to the correct SCTP association
* - send a Unitdata msg to remote node
* (- send a Unitdata Service msg to remote node)
* - Process a Unitdata msg
@ -69,17 +71,32 @@
using namespace std;
int sua_send_Unitdata(sccp_QOS_str &QOS,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address,
char *buffer,
unsigned int len
);
int sua_send_Message( signed int sctp_assoc_id,
short int sctp_stream_id,
int sctp_delivery_type,
unsigned int sctp_loadshare,
char *databuf,
unsigned int datalen
);
int sua_route_Message( unsigned int sctp_assoc_id,
unsigned int local_sua_id,
Sua_container &msg,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address
);
int sua_send_Unitdata( sccp_QOS_str &QOS,
sccp_addr_str &called_pty_address,
sccp_addr_str &calling_pty_address,
char *buffer,
unsigned int len
);
short process_unitdata_msg ( int local_sua_id,
unsigned int sua_assoc_id,
Sua_container &sua_msg
);
unsigned int sua_assoc_id,
Sua_container &sua_msg
);
#endif // SUA_CL_H

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_co.cpp,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
* $Id: sua_co.cpp,v 1.2 2002/03/01 12:57:38 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -70,7 +70,7 @@
#include "sua_distribution.h"
#include "sua_logging.h"
#include "sua_tcb.h"
#include "sua_cl.h"
#ifdef LINUX
#include <unistd.h>
@ -122,9 +122,10 @@ int sua_send_CORE( sccp_QOS_str &QOS,
int error_value;
int string_size, datalen;
signed int SCTP_assoc_id;
unsigned int sua_assoc_id;
short stream_id = 0;
int delivery_type, result;
int sua_assoc_id;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result;
tcb_Sua_msg_elem sua_msg;
@ -150,7 +151,7 @@ int sua_send_CORE( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = 1;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -320,10 +321,11 @@ int sua_send_CORE( sccp_QOS_str &QOS,
cout << "call routing function\n";
#endif
SCTP_assoc_id = Assoc_sua.route_msg( called_pty_address,
calling_pty_address
);
calling_pty_address,
sua_assoc_id
);
#ifdef DEBUG
cout << "routed to SCTP assoc " << SCTP_assoc_id << "\n";
cout << "routed to SCTP assoc " << SCTP_assoc_id << "/SUA association " << sua_assoc_id << "\n";
#endif
// fill in the TCB
@ -337,35 +339,24 @@ int sua_send_CORE( sccp_QOS_str &QOS,
/* does association exist? */
if (SCTP_assoc_id > 0)
{
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
/* yes it does, continue, no problem, send the msg */
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef DEBUG
cout << "sua_co.c:result sctp send = "<< result << "\n";
#endif
@ -395,8 +386,8 @@ int sua_send_CORE( sccp_QOS_str &QOS,
/* - save the msg till the association is setup or */
/* association setup fails -> drop saved msg */
sua_msg.byte = msg.sua_msg;
sua_msg.delivery_type = delivery_type;
sua_msg.stream_id = stream_id;
sua_msg.delivery_type = sctp_delivery_type;
sua_msg.stream_id = sctp_stream_id;
sua_msg.valid = true;
msg_store.add_msg ( sua_assoc_id,
sua_msg
@ -425,8 +416,9 @@ int sua_send_CORESP( sccp_QOS_str &QOS,
unsigned int SCTP_assoc_id;
unsigned int sua_assoc_id;
unsigned int local_sua_id,remote_sua_id;
short stream_id = 0;
int delivery_type, result = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result = 0;
// init the message
msg.sua_init();
@ -450,7 +442,7 @@ int sua_send_CORESP( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = tcb_ptr->seq_number ;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -508,35 +500,24 @@ int sua_send_CORESP( sccp_QOS_str &QOS,
if (Assoc_sua.instance[sua_assoc_id].asp.status == asp_active)
{
#endif
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef SUA_MANAGEMENT
}
else
@ -572,8 +553,9 @@ int sua_send_CODATA( sccp_QOS_str &QOS,
unsigned int SCTP_assoc_id;
unsigned int sua_assoc_id;
unsigned int local_sua_id,remote_sua_id;
short stream_id = 0;
int delivery_type, result = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result = 0;
// init the message
@ -598,7 +580,7 @@ int sua_send_CODATA( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = tcb_ptr->seq_number ;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -650,35 +632,25 @@ int sua_send_CODATA( sccp_QOS_str &QOS,
if (Assoc_sua.instance[sua_assoc_id].asp.status == asp_active)
{
#endif
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef SUA_MANAGEMENT
}
else
@ -714,8 +686,9 @@ int sua_send_CORELRQ( sccp_QOS_str &QOS,
unsigned int SCTP_assoc_id;
unsigned int sua_assoc_id;
unsigned int local_sua_id,remote_sua_id;
short stream_id = 0;
int delivery_type, result = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result = 0;
// init the message
@ -740,7 +713,7 @@ int sua_send_CORELRQ( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = tcb_ptr->seq_number ;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -797,35 +770,24 @@ int sua_send_CORELRQ( sccp_QOS_str &QOS,
if (Assoc_sua.instance[sua_assoc_id].asp.status == asp_active)
{
#endif
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef SUA_MANAGEMENT
}
else
@ -861,8 +823,9 @@ int sua_send_CORELCO( sccp_QOS_str &QOS,
unsigned int SCTP_assoc_id;
unsigned int sua_assoc_id;
unsigned int local_sua_id,remote_sua_id;
short stream_id = 0;
int delivery_type, result = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result = 0;
// init the message
@ -887,7 +850,7 @@ int sua_send_CORELCO( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = tcb_ptr->seq_number ;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -940,35 +903,24 @@ int sua_send_CORELCO( sccp_QOS_str &QOS,
if (Assoc_sua.instance[sua_assoc_id].asp.status == asp_active)
{
#endif
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef SUA_MANAGEMENT
}
else
@ -1007,8 +959,9 @@ int sua_send_COREF( sccp_QOS_str &QOS,
unsigned int SCTP_assoc_id;
unsigned int sua_assoc_id;
unsigned int local_sua_id,remote_sua_id;
short stream_id = 0;
int delivery_type, result = 0;
signed int sctp_loadshare = SCTP_USE_PRIMARY;
short sctp_stream_id = 0;
int sctp_delivery_type, result = 0;
sccp_addr_str called_pty_address;
// init the message
@ -1033,7 +986,7 @@ int sua_send_COREF( sccp_QOS_str &QOS,
msg.sua_prim.prot_class.pcl = prot_class_2;
msg.sua_prim.seq_control_pres = TRUE;
msg.sua_prim.seq_control = tcb_ptr->seq_number ;
delivery_type = SCTP_UNORDERED_DELIVERY;
sctp_delivery_type = SCTP_UNORDERED_DELIVERY;
break;
case(class3):
return(PROTOCOL_CLASS_NOT_SPECIFIED);
@ -1125,35 +1078,24 @@ int sua_send_COREF( sccp_QOS_str &QOS,
if (Assoc_sua.instance[sua_assoc_id].asp.status == asp_active)
{
#endif
// send data to SCTP
char* databuf = new char[msg.sua_msg.length()];
/* copy data into buffer, then finally... */
char* databuf = new char[msg.sua_msg.length()];
msg.sua_msg.copy(databuf, msg.sua_msg.length());
datalen = msg.sua_msg.length();
// send data to SCTP
result = sua_send_Message( SCTP_assoc_id,
sctp_stream_id,
sctp_delivery_type,
sctp_loadshare,
databuf,
datalen
);
delete databuf;
error_value = 0;
#ifdef DEBUG
// display byte array
display_byte_array(databuf , msg.sua_msg.length());
#endif
char logstring[100];
sprintf(logstring, "SUA encoded message, ready for being send to SCTP assoc %d", SCTP_assoc_id);
event_log("sua_co.c",logstring);
log_byte_array("sua_co.c", databuf,msg.sua_msg.length());
result = sctp_send ( SCTP_assoc_id,
stream_id,
(unsigned char *) databuf,
datalen,
SUA_PPI,
SCTP_USE_PRIMARY,
SCTP_NO_CONTEXT,
SCTP_INFINITE_LIFETIME,
delivery_type,
SCTP_BUNDLING_DISABLED
);
error_value = result;
delete databuf;
#ifdef SUA_MANAGEMENT
}
else

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_database.h,v 1.2 2002/02/07 16:34:27 p82609 Exp $
* $Id: sua_database.h,v 1.4 2002/03/01 12:57:38 p82609 Exp $
*
* SUA implementation according to SUA draft issue 8.
*
@ -317,23 +317,27 @@ class db_Sua_AssociationList{
);
short Terminate_remote_assoc_instance();
short shutdown();
signed int route_msg(sccp_addr_str& cld,
sccp_addr_str& clg
);
signed int resolve_host_name( hostname_str& dest_name,
pointcode_str& dest_pc
);
signed int route_msg( sccp_addr_str& cld,
sccp_addr_str& clg,
int& sua_assoc_id
);
signed int route_on_IPpc ( ipvxunion& dest_pc,
ipvxunion& org_pc,
int& sua_assoc_id
);
signed int route_on_SS7pc ( SS7union& dest_pc,
SS7union& org_pc,
int& sua_assoc_id
);
SS7union& org_pc,
int& sua_assoc_id
);
signed int route_on_GTname ( hostname_str& dest_name,
hostname_str& org_name,
int& sua_assoc_id,
pointcode_str& dest_pc,
pointcode_str& org_pc
);
hostname_str& org_name,
int& sua_assoc_id,
pointcode_str& dest_pc,
pointcode_str& org_pc
);
void increase_instance();
bool activate( unsigned int sua_id,
short mode

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_dataname.cpp,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
* $Id: sua_dataname.cpp,v 1.2 2002/03/01 12:57:38 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -104,6 +104,9 @@ void db_Sua_NameList::initialize(){
}
}
/***********************************************************************/
/* Sua_NameList::read_host_name */
/***********************************************************************/
string db_Sua_NameList::read_host_name(string name){
char *hostname;
@ -165,6 +168,7 @@ string db_Sua_NameList::read_host_name(string name){
}
// end of module sua_dataname.c

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_datassoc.cpp,v 1.3 2002/02/15 16:19:46 p82609 Exp $
* $Id: sua_datassoc.cpp,v 1.6 2002/03/15 12:53:53 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -70,6 +70,7 @@
* - route on IP pointcode address
* - route on Global Title/Hostname
* - route message to a association
* - Final destination?
* - increase instance
* - Dynamic association setup(initiating)
*/
@ -239,6 +240,66 @@ void db_Sua_AssociationList:: read_stream_number(string stream_num){
}
}
/***********************************************************************/
/* db_Sua_AssociationList::resolve_host_name */
/***********************************************************************/
signed int db_Sua_AssociationList::resolve_host_name ( hostname_str& dest_name,
pointcode_str& dest_pc
)
{
struct hostent *hptr;
char **pptr;
char str[INET6_ADDRSTRLEN];
char *dest_carr;
/* resolving can be done via: */
/* - local global Titel database */
/* - resolve hostname via DNS(simplest for single hop translations) */
dest_carr = dest_name;
if ((hptr = gethostbyname( dest_carr )) == NULL)
{
cout << "Hostname " << dest_name << " not known in DNS.\n";
return(-1);
}
#ifdef DEBUG
cout << "Hostname " << dest_name << " resolved to dest IP address(es)\n";
cout << "IP address length = "<< hptr->h_length << "\n";
#endif
/* initialise the length field of the structure: */
/* length field is NOT always present in every Unix like operating system */
dest_pc.ipvx.ch[0] = 0;
pptr = hptr->h_addr_list;
for ( ; (*pptr != NULL) ;pptr++)
{
inet_ntop(hptr->h_addrtype, *pptr, str,sizeof(str));
#ifdef DEBUG
cout << str << "\n";
#endif
/* got a IP address */
dest_pc.ipvx.sa.sa_family = hptr->h_addrtype;
if (dest_pc.ipvx.sa.sa_family == AF_INET)
inet_pton( AF_INET,
str,
&dest_pc.ipvx.sin.sin_addr
);
else if (dest_pc.ipvx.sa.sa_family == AF_INET6)
inet_pton( AF_INET6,
str,
&dest_pc.ipvx.sin6.sin6_addr
);
else
{
cout << "ERROR resolve_host_name: Unknown IP addresstype\n";
return(-2);
}
}
return(0);
};
/***********************************************************************/
/* Sua_AssociationList::register_instance */
/***********************************************************************/
@ -390,28 +451,125 @@ Find_association( unsigned int sctp_assoc_id,
/***********************************************************************/
unsigned int db_Sua_AssociationList::
Find_local_sua( sccp_addr_str& local_address
)
)
{
short i = 1, j = 0;
unsigned int Local_sua_id = 0;
bool result = FALSE;
pointcode_str dest_pc;
short i = 1, j = 0, count, addr_start, addr_stop;
unsigned int Local_sua_id = 0;
bool result = FALSE;
while ((i < db_MAX_REMOTE_SUA) && !(result) && (instance[i].Source.nr_of_addrs != 0))
{
j = 0;
while ((j < instance[i].Source.nr_of_addrs) && !(result))
{
result = ((instance[i].Source.addrs[j].sin.sin_addr.s_addr == local_address.pc.ipvx.sin.sin_addr.s_addr) ||
{
/*result = ((instance[i].Source.addrs[j].sin.sin_addr.s_addr == local_address.pc.ipvx.sin.sin_addr.s_addr) ||
(instance[i].Source.addrs[j].sin6.sin6_addr.s6_addr == local_address.pc.ipvx.sin6.sin6_addr.s6_addr));
if (result)
{
Local_sua_id = instance[i].local_sua_id;
*/
if (local_address.address_fields_present.pc == ipvx_pc_present)
{
result = (local_address.pc.ipvx.sa.sa_family == instance[i].Source.addrs[j].sa.sa_family);
if (local_address.pc.ipvx.sa.sa_family == AF_INET)
{
addr_start = 4;
addr_stop = addr_start + 4;
}
else if (local_address.pc.ipvx.sa.sa_family == AF_INET6)
{
addr_start = 8;
addr_stop = addr_start + 16;
}
else
{
addr_start = 0;
addr_stop = 0;
result = false;
cout << "ERROR Find_local_sua: Unknown IPvx addresstype\n";
}
/* compare the address family field */
result = result &&
(local_address.pc.ipvx.ch[1] == instance[i].Source.addrs[j].ch[1]);
/* compare the ipv4/ipv6 address field */
for (count = addr_start; count < addr_stop; count++)
{
result = result &&
(local_address.pc.ipvx.ch[count] == instance[i].Source.addrs[j].ch[count]);
}
}
else if (local_address.address_fields_present.pc == ss7_pc_present)
{
result = (local_address.pc.ss7.ITU14.family == instance[i].Source.pc.ITU14.family);
if (((local_address.pc.ss7.ITU14.family == ITU14bit) ||
(local_address.pc.ss7.ITU14.family == ITU24bit)) ||
(local_address.pc.ss7.ITU14.family == ANSI24bit))
{
/* compare the ITU 14/24bit or ANSI 24bit PC address field */
result = result &&
(local_address.pc.ss7.ITU14.pc == instance[i].Source.pc.ITU14.pc);
}
else
{
result = false;
cout << "ERROR Find_local_sua: Unknown SS7 pointcode addresstype\n";
}
}
else if (local_address.address_fields_present.name_gt == hostname_present)
{
count = 0;
result = resolve_host_name ( local_address.name.HostName,
dest_pc
);
result = (dest_pc.ipvx.sa.sa_family == instance[i].Source.addrs[j].sa.sa_family);
if (dest_pc.ipvx.sa.sa_family == AF_INET)
{
addr_start = 4;
addr_stop = addr_start + 4;
}
else if (dest_pc.ipvx.sa.sa_family == AF_INET6)
{
addr_start = 8;
addr_stop = addr_start + 16;
}
else
{
addr_start = 0;
addr_stop = 0;
result = false;
cout << "ERROR Find_local_sua: Unknown IPvx addresstype\n";
}
/* compare the address family field : already done */
/* compare the ipv4/ipv6 address field */
short k=0;
for (count = addr_start; count < addr_stop; count++)
{
result = result &&
(dest_pc.ipvx.ch[count] == instance[i].Source.addrs[j].ch[count]);
k++;
}
}
else if (local_address.address_fields_present.name_gt == GT_present)
{
cout << "ERROR Find_local_sua: GT code not implemented yet\n";
}
else
{
cout << "ERROR Find_local_sua: Unknown SUA addresstype\n";
result = false;
}
if (result)
{
Local_sua_id = instance[i].local_sua_id;
#ifdef DEBUG
cout << "local_sua_id = " << Local_sua_id << " , instance "<< i << "\n";
cout << "Find_local_sua: local_sua_id = " << Local_sua_id << " , instance "<< i << "\n";
#endif
}
j++;
}
}
j++;
}
i++;
}
@ -431,6 +589,7 @@ passive_associate( unsigned int assoc_id,
){
SCTP_AssociationStatus status;
SCTP_Path_Status path_x_status;
int result;
short k;
int bla;
@ -471,13 +630,21 @@ passive_associate( unsigned int assoc_id,
event_log("sua_database.c",logstring);
result = sctp_getAssocStatus(instance[assoc_instance_idx].SCTP_assoc_id, &status);
result = sctp_getAssocStatus( instance[assoc_instance_idx].SCTP_assoc_id,
&status
);
/* conversion and fill in the destination address */
instance[assoc_instance_idx].Dest.nr_of_addrs = nr_of_dest_addr;
instance[assoc_instance_idx].Dest.address_string[0] = status.primaryDestinationAddress;
instance[assoc_instance_idx].Dest.addrs[0].sin.sin_port = status.destPort;
for(k=0; k < instance[assoc_instance_idx].Dest.nr_of_addrs ; k++)
{
result = sctp_getPathStatus( instance[assoc_instance_idx].SCTP_assoc_id,
k,
&path_x_status
);
instance[assoc_instance_idx].Dest.address_string[k] = path_x_status.destinationAddress;
instance[assoc_instance_idx].Dest.addrs[k].sin.sin_port = status.destPort;
}
/* try to figure out ipv4 or v6 address family: get it from the source address */
k = 0;
instance[assoc_instance_idx].Dest.addrs[0].sa.sa_family = AF_LOCAL;
@ -692,72 +859,36 @@ route_on_SS7pc ( SS7union& dest_pc,
/***********************************************************************/
signed int db_Sua_AssociationList::
route_on_GTname ( hostname_str& dest_name,
hostname_str& org_name,
int& sua_assoc_id,
pointcode_str& dest_pc,
pointcode_str& org_pc
)
hostname_str& org_name,
int& sua_assoc_id,
pointcode_str& dest_pc,
pointcode_str& org_pc
)
{
struct hostent *hptr;
char **pptr;
unsigned int sctp_assoc_id = 0;
char str[INET6_ADDRSTRLEN];
char *dest_carr;
int result = 0;
unsigned int sctp_assoc_id = 0;
sua_assoc_id = 0;
/* resolving can be done via: */
/* - local global Titel database */
/* - resolve hostname via DNS(simplest for single hop translations) */
dest_carr = dest_name;
if ((hptr = gethostbyname( dest_carr )) == NULL)
{
cout << "Hostname " << dest_name << " not known in DNS.\n";
return(-1);
}
#ifdef DEBUG
cout << "Hostname " << dest_name << " resolved to dest IP address(es)\n";
cout << "IP address length = "<< hptr->h_length << "\n";
#endif
/* initialise the length field of the structure: */
/* length field is NOT always present in every Unix like operating system */
dest_pc.ipvx.ch[0] = 0;
org_pc.ipvx.ch[0] = 0;
pptr = hptr->h_addr_list;
for ( ; (*pptr != NULL) ;pptr++)
{
inet_ntop(hptr->h_addrtype, *pptr, str,sizeof(str));
#ifdef DEBUG
cout << str << "\n";
#endif
/* got IP address, look if association already exists */
dest_pc.ipvx.sa.sa_family = hptr->h_addrtype;
if (dest_pc.ipvx.sa.sa_family == AF_INET)
inet_pton( AF_INET,
str,
&dest_pc.ipvx.sin.sin_addr
);
else if (dest_pc.ipvx.sa.sa_family == AF_INET6)
inet_pton( AF_INET6,
str,
&dest_pc.ipvx.sin6.sin6_addr
);
else
cout << "ERROR route_on_GTname: Unknown IP addresstype\n";
result = resolve_host_name ( dest_name,
dest_pc
);
/*result = resolve_host_name ( org_name,
org_pc
); */
sctp_assoc_id = route_on_IPpc( dest_pc.ipvx,
org_pc.ipvx,
sua_assoc_id
);
sctp_assoc_id = route_on_IPpc( dest_pc.ipvx,
org_pc.ipvx,
sua_assoc_id
);
if (sctp_assoc_id != 0 )
return(sctp_assoc_id);
if (sctp_assoc_id != 0 )
return(sctp_assoc_id);
}
return(sctp_assoc_id);
};
@ -766,12 +897,14 @@ route_on_GTname ( hostname_str& dest_name,
/* Sua_AssociationList::route_msg */
/***********************************************************************/
signed int db_Sua_AssociationList::
route_msg( sccp_addr_str& cld,
sccp_addr_str& clg
route_msg( sccp_addr_str& cld,
sccp_addr_str& clg,
int& sua_assoc_id
){
unsigned int sctp_assoc_id = 0;
int sua_assoc_id = 0;
sua_assoc_id = 0;
#ifdef DEBUG
cout << "num_of_instance : "<< num_of_instance << "\n";
@ -837,7 +970,6 @@ route_msg( sccp_addr_str& cld,
return(sctp_assoc_id);
};
/***********************************************************************/
/* Sua_AssociationList::increase_instance */
/***********************************************************************/

View File

@ -15,7 +15,7 @@
* *
***************************************************************************/
/*
* $Id: sua_debug.h,v 1.1.1.1 2002/02/04 14:30:41 p82609 Exp $
* $Id: sua_debug.h,v 1.2 2002/02/22 16:12:11 p82609 Exp $
*
* SUA implementation according to SUA draft issue 6.
*
@ -57,8 +57,8 @@
#ifndef SUA_DEBUG_H
#define SUA_DEBUG_H
/*#define DEBUG activates debuging msg on screen */
/*#define FILE_DEBUG activates debugging info to output file */
//#define DEBUG /* activates debuging msg on screen */
//#define FILE_DEBUG /* activates debugging info to output file */
#define SUA_MANAGEMENT /* activates SUA management */
#define SG_ASP_MODE /* implementation acts as ASP towards a SG */