From 0545a7e105633763507c24cc45ac03942fb271b3 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sat, 2 Jul 2016 20:31:40 +0200 Subject: dgrambuf: full scatter/gather, no ringbuffer. Dummy data to check some code paths. --- mcastseed/src/mcastleech.c | 85 ++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 59 deletions(-) (limited to 'mcastseed/src/mcastleech.c') diff --git a/mcastseed/src/mcastleech.c b/mcastseed/src/mcastleech.c index c832489..9315992 100644 --- a/mcastseed/src/mcastleech.c +++ b/mcastseed/src/mcastleech.c @@ -17,6 +17,7 @@ #define MTU 1500 #define MULTICAST_RECV_BUF (MTU-20-8) #define MULTICAST_SO_RCVBUF 425984 +#define DGRAM_HEADER_SIZE 8 #define DEFAULT_MCAST_IP_STR "ff02::114" #define DEFAULT_PORT_STR "9000" @@ -48,7 +49,7 @@ const char * const state_str[] = { void die(char* msg); void usage(char *msg); void arg_parse(int argc, char* argv[]); -size_t get_available_mem(); +int get_available_mem_kb(); void dgrambuf_init(); uint32_t validate_data_dgram(unsigned int nread, void *recvbuf); void ack(uint32_t seq); @@ -175,39 +176,7 @@ int wait_start_and_start_job() { int receive_data() { - /* - ssize_t nread; - uint32_t seq; - uint16_t datalen; - - // Wait for a "data" datagram from the server - nread = recvfrom(mcast_sock, recvbuf, MULTICAST_RECV_BUF, 0, NULL, 0); - if (nread < 0 ) { - perror("recvfrom() failed"); - return -1; - } - if ( nread >= 10 && strncmp("data", recvbuf, 4) == 0 ) { - seq = ntohl( *( (uint32_t *) recvbuf+1 ) ); - datalen = ntohs( *( (uint16_t *) recvbuf+4 ) ); - if ( nread == (10 + datalen) ) { - ack(seq); - dgrambuf_memcpy_into(dgrambuf, recvbuf+10, datalen); - } else { - fprintf(stderr, "Short or inconsistent data #%u packet : nread==%zi, (10 + datalen)==%i\n", seq, nread, (10 + datalen)); - } - } - - return 1; - */ - - unsigned int count; - - count = dgrambuf_recvmmsg(dgrambuf, mcast_sock); - if (count < 0) { - return -1; - } - - return 0; + return dgrambuf_recvmmsg(dgrambuf, mcast_sock); } @@ -217,6 +186,8 @@ void ack(uint32_t seq) { int finalize_job() { + //XXX Dummy test + dgrambuf_write(dgrambuf, 2); return 0; } int is_there_more_job() { @@ -252,26 +223,22 @@ void arg_parse(int argc, char* argv[]) { mcast_ip = (argc >= 3)?argv[2]:DEFAULT_MCAST_IP_STR; } -size_t get_available_mem() { +int get_available_mem_kb() { char key[64]; - int value; - int found=0; - unsigned long int mem_avail; + int res, value, found=0; FILE * fh = fopen("/proc/meminfo", "r"); if ( fh ) { while (!found && !feof(fh)) { - fscanf(fh, "%63s %i kB\n", key, &value); + res = fscanf(fh, "%63s %i kB\n", key, &value); + if ( res < 0 ) + break; found = ( strncmp("MemAvailable:", key, 12) == 0 ); } + fclose(fh); } - if ( found ) { - mem_avail = value * 1024; - if ( mem_avail > (size_t)-1 ) { - return -1; - } else { - return mem_avail; - } + if ( found && value > 0 ) { + return value; } return 0; @@ -280,34 +247,34 @@ size_t get_available_mem() { void dgrambuf_init() { /* Guess dgrambuf size from global free memory */ size_t dgram_count; - size_t avail_mem = get_available_mem(); + int avail_mem = get_available_mem_kb(); + if ( avail_mem < MULTICAST_SO_RCVBUF ) { dgram_count = MULTICAST_SO_RCVBUF / MULTICAST_RECV_BUF; } else { - dgram_count = avail_mem / MULTICAST_RECV_BUF / 2; + dgram_count = avail_mem / MULTICAST_RECV_BUF / 2 * 1024; } + //XXX Dummy + dgram_count = 3; + fprintf(stderr, "avail_mem == %i kb, dgram_count == %zi\n", avail_mem, dgram_count); /* Allocate dgrambuf */ - dgrambuf = dgrambuf_new(dgram_count, MULTICAST_RECV_BUF); + dgrambuf = dgrambuf_new(dgram_count, MULTICAST_RECV_BUF, DGRAM_HEADER_SIZE); if ( dgrambuf == NULL ) { perror("dgrambuf_new/malloc"); exit(EXIT_FAILURE); } - printf("dgrambuf_free_count() => %zi\n", dgrambuf_free_count(dgrambuf)); + //printf("dgrambuf_free_count() => %zi\n", dgrambuf_free_count(dgrambuf)); dgrambuf_set_validate_func(dgrambuf, validate_data_dgram); } unsigned int validate_data_dgram(unsigned int nread, void *recvbuf ) { - uint32_t seq; - uint16_t datalen; - - if ( nread >= 10 && strncmp("data", recvbuf, 4) == 0 ) { - seq = ntohl( *( (uint32_t *) recvbuf+1 ) ); - datalen = ntohs( *( (uint16_t *) recvbuf+4 ) ); - if ( nread == (10 + datalen) ) { - return seq; - } + if ( nread >= DGRAM_HEADER_SIZE && strncmp("data", recvbuf, 4) == 0 ) { + return ntohl( *( (uint32_t *) recvbuf+1 ) ); + } + if ( nread >= 5 && strncmp("final", recvbuf, 5) == 0 ) { + return -1; } return 0; -- cgit v1.2.3