libsua/sualibrary/testup/main.cpp

333 lines
9.6 KiB
C++

/***************************************************************************
main.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: main.cpp,v 1.1 2003/01/14 13:47:56 p82609 Exp $
*
* SUA Test user part implementation.
*
* 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
*
* Purpose: This code-file defines the SUA Test User Part application and
* has functions for:
* - get single argument from commandline
* - get input commandline parameters
* - get own host parameters
* - main function
*/
#ifdef LINUX
#include <unistd.h>
#endif
#include "sua.h"
#include "sctp.h"
#include "testuser.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>
#include <sys/utsname.h>
#ifdef HAVE_SYS_POLL_H
#include <sys/poll.h>
#else
#define POLLIN 0x001
#define POLLPRI 0x002
#define POLLOUT 0x004
#define POLLERR 0x008
#endif
using namespace std;
char own_hostname[512];
int nr_local_instances = 0;
/***********************************************************************/
/* TEST USER PART: get argument from commandline */
/***********************************************************************/
string get_argument( char *argv)
{
int num_of_char = 0;
while ((argv[num_of_char]) != '\0')
{
// convert to lowercase characters for easier processing
argv[num_of_char] = tolower(argv[num_of_char]);
num_of_char++;
}
return(argv);
}
/***********************************************************************/
/* TEST USER PART: get input commandline parameters */
/***********************************************************************/
int sua_get_arguments(int argc, char **argv)
{
string address_str;
string nr_of_streams;
bool help_flag = false;
string sua_filename;
char ch1,ch2;
string sua_arg;
int result;
int num_of_arg = 0;
/* copy all charachters from the comandline into a string */
while (num_of_arg < argc)
{
sua_arg =get_argument(argv[num_of_arg]);
#ifdef DEBUG
//cout << "num_of_arg =" << num_of_arg <<" " << sua_arg << " \n";
#endif
// look at each of the arguments
if (num_of_arg == 0)
{
ch1 = 'i'; // ignore character
}
else
{
if (sua_arg[0] == '-')
{
ch1 = sua_arg[1];
ch2 = sua_arg[2];
#ifdef DEBUG
//cout << "character =" << ch1 <<" \n";
#endif
}
else
{
cout << "weird option \n";
ch1 = ' ';
}
}
switch (ch1)
{
case 's':
{ // source address option: read a ipv4/v6 address or hostname
num_of_arg++;
break;
}
case 'd':
{ // destination address option: read a ipv4/v6 address or hostname
num_of_arg++;
break;
}
case 'u':
{ //
break;
}
case 'm':
{ //
break;
}
case 'f':
{ // file option: read a file with all the info needed
num_of_arg++;
sua_filename = argv[num_of_arg];
result = sua_read_config_file( argv[num_of_arg]);
break;
}
case 'i':
{
// ignore character, is not a error, go to next argument
break;
}
default:
{
help_flag = true;
break;
}
}
num_of_arg++;
}
/* no input parameters, display the help text */
if (help_flag) {
cout << "usage: \n";
cout << " sua [-s sourceaddr1,sourceaddr2,... -l localPort] \\ \n";
cout << " [-d destaddr1,destaddr2 ....-r remotePort] \\ \n";
cout << " [-m number-of-streams] \\ \n";
cout << " [-f sua-address-filename] \\ \n";
cout << " [-n subsystem-number] \n";
cout << "use -s option to define source address(es) as IPv4/6 numerical/(hex) addresses.\n";
cout << "use -d option to define destination address(es) as IPv4/6 numerical/(hex) addresses.\n";
cout << "use -l option to define the local port where inits are accepted.\n";
cout << "use -r option to define the remote port where init is sent to.\n";
cout << "use -n option to define the subsytem number used\n";
cout << "use -m '#of streams' enter number of streams, default is 15 streams\n";
cout << "for multihoming multiple source addresses can be entered after the -s option.\n";
cout << "They must be separated by commas and no spaces may be included.\n";
cout << "To establish more than one association, use the -f 'sua-address-filename' file option \n";
cout << "format is as follows:\n";
cout << "-d can be ommitted to start a sua that listens only for incoming inits\n";
cout << "Default local/remote portnumber = 14001\n";
}
return(0);
} /* end of sua_get_arguments */
/***********************************************************************/
/* TEST USER PART: get own host parameters */
/***********************************************************************/
int tstup_get_host_parm()
{
struct hostent *hptr;
struct utsname myhostname;
char str[INET6_ADDRSTRLEN];
char **pptr;
if (uname(&myhostname) < 0){
cout << "Determination of own name failed\n";
return(-1);
}
cout << "Own name = " << myhostname.nodename << "\n";
if ((hptr = gethostbyname(myhostname.nodename)) == NULL){
cout << "Determination of hostname failed\n";
return (-2);
}
cout << "Host OS " << myhostname.sysname << " " << myhostname.release << " " << myhostname.version << "\n";
cout << "Hostname = " << hptr->h_name << "\n";
strcpy ( own_hostname, hptr->h_name );
switch (hptr->h_addrtype){
case AF_INET:
cout << "Host ip address type = AF_INET\n";
break;
case AF_INET6:
cout << "Host ip address type = AF_INET6\n";
break;
default:
cout << "Host ip address type = " << hptr->h_addrtype << "\n";
break;
}
cout << "Hostname ip address length = "<< hptr->h_length << "\n";
pptr = hptr->h_addr_list;
for ( ; *pptr != NULL;pptr++)
{
cout << inet_ntop(hptr->h_addrtype, *pptr, str,sizeof(str)) << "\n";
}
return(0);
}
/***********************************************************************/
/* TEST USER PART: main function */
/***********************************************************************/
int main(int argc, char **argv )
{
int res;
Sua_ULP_CallBacks SUACallbackFunctions;
cout << "Welcome to Test User Part(TSTUP) for SCCP User Adaptation Layer (SUA)\n";
sua_initialisation();
SUACallbackFunctions.ulp_ClDataIndNotif = &ulp_ClDataIndNotif;
SUACallbackFunctions.ulp_ConnIndNotif = &ulp_ConnIndNotif;
SUACallbackFunctions.ulp_ConnConfIndNotif = &ulp_ConnConfIndNotif;
SUACallbackFunctions.ulp_ConnDataIndNotif = &ulp_ConnDataIndNotif;
SUACallbackFunctions.ulp_DisConnIndNotif = &ulp_DisConnIndNotif;
// determine own hostname and address
res = tstup_get_host_parm();
// read cmdline paremeters (including a file containing cmds)
res = sua_get_arguments(argc, argv);
// register sua and its users
// register all the local SUA together with their SCTP instances
res = sua_registerInstance( SUACallbackFunctions
);
// initiate all the SUA associations with their respective peers
res = sua_associate();
// register sua and its users
res = sctp_registerUserCallback( fileno(stdin),
&testip_stdin_cb,
NULL,
POLLIN|POLLPRI
);
cout << "sctp_registerUserCallback result = "<< res << "\n";
init_testip_stdin();
// go into infinite loop( = handle all events)
cout << "Let Test User Part run free!!!! \n";
while (sctp_eventLoop() >= 0);
// close the program
//close_logging_file();
exit (0);
}
// end of module sua_main.c