summaryrefslogtreecommitdiff
path: root/mcastseed/src/mcastleech.c
diff options
context:
space:
mode:
Diffstat (limited to 'mcastseed/src/mcastleech.c')
-rw-r--r--mcastseed/src/mcastleech.c85
1 files changed, 26 insertions, 59 deletions
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;