X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Frmr%2Fsi%2Fsrc%2Fsi95%2Fsiinit.c;fp=src%2Frmr%2Fsi%2Fsrc%2Fsi95%2Fsiinit.c;h=80bfbdce4a06030b9091f712d86fdeb7ab9c52c3;hb=ec88d3c0563eeb6ae5f73427edb0b3c4d7acf299;hp=0000000000000000000000000000000000000000;hpb=77406e61f2158f5b88b7a9f6e3e86d8f62c8f71a;p=ric-plt%2Flib%2Frmr.git diff --git a/src/rmr/si/src/si95/siinit.c b/src/rmr/si/src/si95/siinit.c new file mode 100644 index 0000000..80bfbdc --- /dev/null +++ b/src/rmr/si/src/si95/siinit.c @@ -0,0 +1,127 @@ +// vim: noet sw=4 ts=4: +/* +================================================================================== + Copyright (c) 2020 Nokia + Copyright (c) 2020 AT&T Intellectual Property. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +================================================================================== +*/ + +/* +************************************************************************** +* Mnemonic: SIinitialise +* Abstract: Initialisation and other context management functions. +* +* Date: 26 March 1995 +* Author: E. Scott Daniels +* +* Mod: 17 FEB 2002 - To convert to a globally managed gpointer +* 09 Mar 2007 - To allow for ipv6 (added SIinitialise() to +* replace SIinit()) +************************************************************************** +*/ +#include "sisetup.h" // get the setup stuff + +/* + Initialise the SI environment. Specifically: + allocate the global info block (context) + + Returns a pointer to the block or nil on failure. + On failure errno should indicate the problem. +*/ +extern struct ginfo_blk* SIinitialise( int opts ) +{ + struct ginfo_blk *gptr = NULL; // pointer at gen info blk + int status = SI_OK; // status of internal processing + struct tp_blk *tpptr; // pointer at tp stuff + struct sigaction sact; // signal action block + int i; // loop index + int signals = SI_DEF_SIGS; // signals to be set in SIsetsig + + errno = ENOMEM; + + if( (gptr = SInew( GI_BLK )) != NULL ) { // make our context + gptr->rbuf = (char *) malloc( MAX_RBUF ); // get rcv buffer + gptr->rbuflen = MAX_RBUF; + gptr->tp_map = (struct tp_blk **) malloc( sizeof( struct tp_blk *) * MAX_FDS ); + if( gptr->tp_map == NULL ) { + fprintf( stderr, "SIinit: unable to initialise tp_map: no memory\n" ); + free( gptr ); + return NULL; + } + memset( gptr->tp_map, 0, sizeof( struct tp_blk *) * MAX_FDS ); + + gptr->sierr = SI_ERR_TPORT; + + gptr->cbtab = (struct callback_blk *) malloc( + (sizeof( struct callback_blk ) * MAX_CBS ) ); + if( gptr->cbtab != NULL ) { + for( i = 0; i < MAX_CBS; i++ ) { // initialize callback table + gptr->cbtab[i].cbdata = NULL; // no data and no functions + gptr->cbtab[i].cbrtn = NULL; + } + } else { // if call back table allocation failed - error off + SIshutdown( gptr ); // clean up any open fds + free( gptr ); + gptr = NULL; // dont allow them to continue + } + + gptr->sierr = SI_OK; + } // end if gen infor block allocated successfully + + + memset( &sact, 0, sizeof( sact ) ); + sact.sa_handler = SIG_IGN; + sigaction( SIGPIPE, &sact, NULL ); // ignore pipe signals as for some bloody reason linux sets this off if write to closed socket + + return gptr; // all's well that ends well +} + +/* + This will set all of the tcp oriented flags in mask (SI_TF_* constants). +*/ +extern void SIset_tflags( struct ginfo_blk* gp, int mask ) { + if( gp != NULL ) { + gp->tcp_flags |= mask; + } +} + +/* + This will clear all tcp oriented flags set in mask. +*/ +extern void SIclr_tflags( struct ginfo_blk* gp, int mask ) { + if( gp != NULL ) { + gp->tcp_flags &= ~mask; + } +} + +/* + Dump stats to stderr. + + NOTE: the receive stats are the number of times that wait popped for + a file descriptor and NOT the actual number of RMR messages which + were contained. Thus it is VERY likely that the receive count + reported will not match the number of actual messages sent. These + counts should be used only to track activity on a socket. +*/ +extern void SItp_stats( void *vgp ) { + struct ginfo_blk* gp; + struct tp_blk* tp; + + if( (gp = (struct ginfo_blk *) vgp) != NULL ) { + for( tp = gp->tplist; tp != NULL; tp = tp->next ) { + fprintf( stderr, "[DBUG] si95: tp: fd=%d sent=%lld rcvd=%lld qc=%lld\n", tp->fd, tp->sent, tp->rcvd, tp->qcount ); + } + } +}