X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=examples%2Fsender.c;h=42cc017ab3c3a419c94588175bfb17c9cea75323;hb=71df2a2b09d072090c29713d05a49b5670b11053;hp=0fa53436b9a70106737eaa6556333dca3f6711d8;hpb=fd9cc7a5b3355146388ebdf4d558cb284c66c5f1;p=ric-plt%2Flib%2Frmr.git diff --git a/examples/sender.c b/examples/sender.c index 0fa5343..42cc017 100644 --- a/examples/sender.c +++ b/examples/sender.c @@ -1,4 +1,22 @@ // :vim ts=4 sw=4 noet: +/* +================================================================================== + Copyright (c) 2019-2020 Nokia + Copyright (c) 2018-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: sender.c @@ -10,13 +28,19 @@ [listen_port [delay [stats-freq] [msg-type]]]] Defaults: - listen_port 43086 + listen_port 43086 delay (mu-sec) 1000000 (1 sec) stats-freq 10 msg-type 0 Date: 1 April 2019 + + CAUTION: This example is now being pulled directly into the user documentation. + Because of this some altered line lengths and/or parameter list breaks + which seem strage have been applied to ensure that it formats nicely. + All code following the 'start_example' tag below is included. */ +// start_example #include #include @@ -29,22 +53,22 @@ #include int main( int argc, char** argv ) { - void* mrc; //msg router context - struct epoll_event events[1]; // list of events to give to epoll - struct epoll_event epe; // event definition for event to listen to - int ep_fd = -1; // epoll's file des (given to epoll_wait) - int rcv_fd; // file des that NNG tickles -- give this to epoll to listen on - int nready; // number of events ready for receive - rmr_mbuf_t* sbuf; // send buffer - rmr_mbuf_t* rbuf; // received buffer + void* mrc; // msg router context + struct epoll_event events[1]; // list of events to give to epoll + struct epoll_event epe; // event definition for event to listen to + int ep_fd = -1; // epoll's file des (given to epoll_wait) + int rcv_fd; // file des for epoll checks + int nready; // number of events ready for receive + rmr_mbuf_t* sbuf; // send buffer + rmr_mbuf_t* rbuf; // received buffer int count = 0; int rcvd_count = 0; char* listen_port = "43086"; - int delay = 1000000; // mu-sec delay between messages + int delay = 1000000; // mu-sec delay between messages int mtype = 0; int stats_freq = 100; - if( argc > 1 ) { + if( argc > 1 ) { // simplistic arg picking listen_port = argv[1]; } if( argc > 2 ) { @@ -54,14 +78,15 @@ int main( int argc, char** argv ) { mtype = atoi( argv[3] ); } - fprintf( stderr, " listen port: %s; mtype: %d; delay: %d\n", listen_port, mtype, delay ); + fprintf( stderr, " listen port: %s; mtype: %d; delay: %d\n", + listen_port, mtype, delay ); - if( (mrc = rmr_init( listen_port, 1400, RMRFL_NONE )) == NULL ) { - fprintf( stderr, " unable to initialise RMr\n" ); + if( (mrc = rmr_init( listen_port, 1400, RMRFL_NONE )) == NULL ) { + fprintf( stderr, " unable to initialise RMR\n" ); exit( 1 ); } - rcv_fd = rmr_get_rcvfd( mrc ); // set up epoll things, start by getting the FD from MRr + rcv_fd = rmr_get_rcvfd( mrc ); // set up epoll things, start by getting the FD from RMR if( rcv_fd < 0 ) { fprintf( stderr, " unable to set up polling fd\n" ); exit( 1 ); @@ -70,51 +95,53 @@ int main( int argc, char** argv ) { fprintf( stderr, "[FAIL] unable to create epoll fd: %d\n", errno ); exit( 1 ); } - epe.events = EPOLLIN; - epe.data.fd = rcv_fd; + epe.events = EPOLLIN; + epe.data.fd = rcv_fd; - if( epoll_ctl( ep_fd, EPOLL_CTL_ADD, rcv_fd, &epe ) != 0 ) { + if( epoll_ctl( ep_fd, EPOLL_CTL_ADD, rcv_fd, &epe ) != 0 ) { fprintf( stderr, "[FAIL] epoll_ctl status not 0 : %s\n", strerror( errno ) ); exit( 1 ); } - sbuf = rmr_alloc_msg( mrc, 256 ); // alloc first send buffer; subsequent buffers allcoated on send + sbuf = rmr_alloc_msg( mrc, 256 ); // alloc 1st send buf; subsequent bufs alloc on send rbuf = NULL; // don't need to alloc receive buffer - while( ! rmr_ready( mrc ) ) { // must have a route table before we can send; wait til RMr say it has one - sleep( 1 ); + while( ! rmr_ready( mrc ) ) { // must have route table + sleep( 1 ); // wait til we get one } fprintf( stderr, " rmr is ready\n" ); - - while( 1 ) { // send messages until the cows come home - snprintf( sbuf->payload, 200, "count=%d received= %d ts=%lld %d stand up and cheer!", // create the payload + + while( 1 ) { // send messages until the cows come home + snprintf( sbuf->payload, 200, + "count=%d received= %d ts=%lld %d stand up and cheer!", // create the payload count, rcvd_count, (long long) time( NULL ), rand() ); sbuf->mtype = mtype; // fill in the message bits - sbuf->len = strlen( sbuf->payload ) + 1; // our receiver likely wants a nice acsii-z string + sbuf->len = strlen( sbuf->payload ) + 1; // send full ascii-z string sbuf->state = 0; - sbuf = rmr_send_msg( mrc, sbuf ); // send it (send returns an empty payload on success, or the original payload on fail/retry) + sbuf = rmr_send_msg( mrc, sbuf ); // send & get next buf to fill in while( sbuf->state == RMR_ERR_RETRY ) { // soft failure (device busy?) retry - sbuf = rmr_send_msg( mrc, sbuf ); // retry send until it's good (simple test; real programmes should do better) + sbuf = rmr_send_msg( mrc, sbuf ); // w/ simple spin that doesn't give up } count++; - while( (nready = epoll_wait( ep_fd, events, 1, 0 )) > 0 ) { // if something ready to receive (non-blocking check) - if( events[0].data.fd == rcv_fd ) { // we only are waiting on 1 thing, so [0] is ok + // check to see if anything was received and pull all messages in + while( (nready = epoll_wait( ep_fd, events, 1, 0 )) > 0 ) { // 0 is non-blocking + if( events[0].data.fd == rcv_fd ) { // waiting on 1 thing, so [0] is ok errno = 0; - rbuf = rmr_rcv_msg( mrc, rbuf ); + rbuf = rmr_rcv_msg( mrc, rbuf ); // receive and ignore; just count if( rbuf ) { rcvd_count++; } } } - if( (count % stats_freq) == 0 ) { + if( (count % stats_freq) == 0 ) { // occasional stats out to tty fprintf( stderr, " sent %d received %d\n", count, rcvd_count ); } usleep( delay ); - } + } }