static void nc_master_test(struct sockaddr *slave, int test_tcp, int test_udp, int test_slave_loads, int test_master_loads) { int s, i; struct sockaddr_storage my_addr; struct pause pause_times[] = { {0,0}, {1,10}, {5,10}, {10,10}, {1,1} }; s = socket(slave->sa_family, SOCK_DGRAM, 0); if (s < 0) { pexit("datagram socket"); } memset(&my_addr, 0, sizeof(my_addr)); ((struct sockaddr *)&my_addr)->sa_family = slave->sa_family; #ifndef __linux ((struct sockaddr *)&my_addr)->sa_len = slave->sa_len; #endif switch (slave->sa_family) { case AF_INET: ((struct sockaddr_in *)&my_addr)->sin_addr.s_addr = htonl(INADDR_ANY); ((struct sockaddr_in *)&my_addr)->sin_port = htons(NC_MASTER_PORT); break; case AF_INET6: ((struct sockaddr_in6 *)&my_addr)->sin6_addr = in6addr_any; ((struct sockaddr_in6 *)&my_addr)->sin6_port = htons(NC_MASTER_PORT); break; default: pexit("strange sockaddr family"); } if (bind(s, (struct sockaddr *) &my_addr, sa_len((struct sockaddr *)&my_addr)) < 0) { pexit("UDP bind <main>"); } test_printf("================== No load, master at 100%% ========================\n"); if (test_udp) { do_udp_test(s, NC_REQUEST_UDP_ECHO, slave, 640, 1024, 0, 0); do_udp_test(s, NC_REQUEST_UDP_SEND, slave, 640, 1024, 0, 0); do_udp_test(s, NC_REQUEST_UDP_RECV, slave, 640, 1024, 0, 0); } if (test_tcp) { do_tcp_test(s, NC_REQUEST_TCP_ECHO, slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_SEND, slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_RECV, slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_ECHO, slave, 64, 10240, 0, 0); } if (test_slave_loads) { if (do_set_load(s, slave, 0)) { test_printf("\n====================== Various slave compute loads ===================\n"); for (i = 0; i < 60; i += 10) { test_printf(">>>>>>>>>>>> slave processing load at %d%%\n", i); do_set_load(s, slave, i); if (test_udp) { do_udp_test(s, NC_REQUEST_UDP_ECHO, slave, 2048, 1024, 0, 0); } if (test_tcp) { do_tcp_test(s, NC_REQUEST_TCP_ECHO, slave, 2048, 1024, 0, 0); } } } } if (test_master_loads) { if (do_start_idle(s, slave)) { test_printf("\n====================== Various master loads ===================\n"); test_printf("Testing IDLE for %d seconds\n", IDLE_TEST_TIME); test_delay(IDLE_TEST_TIME*100); do_stop_idle(s, slave, true); for (i = 0; i < LENGTH(pause_times); i++) { if (test_udp) { do_start_idle(s, slave); do_udp_test(s, NC_REQUEST_UDP_ECHO, slave, 2048, 1024, pause_times[i].pause_ticks, pause_times[i].pause_threshold); do_stop_idle(s, slave, false); } if (test_tcp) { do_start_idle(s, slave); do_tcp_test(s, NC_REQUEST_TCP_ECHO, slave, 2048, 1024, pause_times[i].pause_ticks, pause_times[i].pause_threshold); do_stop_idle(s, slave, false); } } } } // do_disconnect(s, slave); close(s); }
// // Protocol driver for testing slave. // // This function is the main routine running here, handling requests sent from // the master and providing various responses. // static void nc_slave(test_param_t param) { int s, masterlen; struct sockaddr_in my_addr, master; struct nc_request req; struct nc_reply reply; int done = false; test_printf("Start test for eth%d\n", param); s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { pexit("datagram socket"); } memset((char *) &my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_len = sizeof(my_addr); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); my_addr.sin_port = htons(NC_SLAVE_PORT); if (bind(s, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) { pexit("bind"); } while (!done) { masterlen = sizeof(master); if (recvfrom(s, &req, sizeof(req), 0, (struct sockaddr *)&master, &masterlen) < 0) { pexit("recvfrom"); } #if 0 test_printf("Request %d from %s:%d\n", ntohl(req.type), inet_ntoa(master.sin_addr), ntohs(master.sin_port)); #endif reply.response = htonl(NC_REPLY_ACK); reply.seq = req.seq; switch (ntohl(req.type)) { case NC_REQUEST_DISCONNECT: done = true; break; case NC_REQUEST_UDP_SEND: test_printf("UDP send - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_UDP_RECV: test_printf("UDP recv - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_UDP_ECHO: test_printf("UDP echo - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_TCP_SEND: test_printf("TCP send - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_TCP_RECV: test_printf("TCP recv - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_TCP_ECHO: test_printf("TCP echo - %d buffers, %d bytes\n", ntohl(req.nbufs), ntohl(req.buflen)); break; case NC_REQUEST_SET_LOAD: start_load(ntohl(req.nbufs)); break; case NC_REQUEST_START_IDLE: test_printf("Start IDLE thread\n"); idle_thread_count = 0; idle_thread_start_time = cyg_current_time(); cyg_semaphore_post(&idle_thread_sem); break; case NC_REQUEST_STOP_IDLE: cyg_semaphore_wait(&idle_thread_sem); idle_thread_stop_time = cyg_current_time(); test_printf("Stop IDLE thread\n"); reply.misc.idle_results.elapsed_time = htonl(idle_thread_stop_time - idle_thread_start_time); reply.misc.idle_results.count[0] = htonl(idle_thread_count >> 32); reply.misc.idle_results.count[1] = htonl((long)idle_thread_count); break; default: test_printf("Unrecognized request: %d\n", ntohl(req.type)); reply.response = htonl(NC_REPLY_NAK); reply.reason = htonl(NC_REPLY_NAK_UNKNOWN_REQUEST); break; } if (sendto(s, &reply, sizeof(reply), 0, (struct sockaddr *)&master, masterlen) < 0) { pexit("sendto"); } if (reply.response == ntohl(NC_REPLY_NAK)) { continue; } switch (ntohl(req.type)) { case NC_REQUEST_UDP_SEND: case NC_REQUEST_UDP_RECV: case NC_REQUEST_UDP_ECHO: do_udp_test(s, &req, &master); break; case NC_REQUEST_TCP_SEND: case NC_REQUEST_TCP_RECV: case NC_REQUEST_TCP_ECHO: do_tcp_test(s, &req, &master); break; case NC_REQUEST_START_IDLE: case NC_REQUEST_STOP_IDLE: case NC_REQUEST_SET_LOAD: default: break; } } close(s); }
static void nc_master(struct test_params *p) { int s, i; struct sockaddr_in slave, my_addr; struct hostent *host; struct pause pause_times[] = { {0,0}, {1,10}, {5,10}, {10,10}, {1,1} }; if (p->argc != 2) { test_printf("Need exactly 'master <host>'\n"); return; } s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { pexit("datagram socket"); } memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; #ifdef __ECOS my_addr.sin_len = sizeof(my_addr); #endif my_addr.sin_port = htons(NC_MASTER_PORT); my_addr.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) { pexit("bind"); } host = gethostbyname(p->argv[1]); if (host == (struct hostent *)NULL) { pexit("gethostbyname"); } memset(&slave, 0, sizeof(slave)); slave.sin_family = AF_INET; #ifdef __ECOS slave.sin_len = sizeof(slave); #endif slave.sin_port = htons(NC_SLAVE_PORT); memcpy(&slave.sin_addr.s_addr, host->h_addr, host->h_length); test_printf("================== No load, master at 100%% ========================\n"); #if 0 do_udp_test(s, NC_REQUEST_UDP_ECHO, &slave, 640, 1024, 0, 0); do_udp_test(s, NC_REQUEST_UDP_SEND, &slave, 640, 1024, 0, 0); do_udp_test(s, NC_REQUEST_UDP_RECV, &slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_ECHO, &slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_SEND, &slave, 640, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_RECV, &slave, 640, 1024, 0, 0); #endif do_tcp_test(s, NC_REQUEST_TCP_ECHO, &slave, 64, 10240, 0, 0); if (do_set_load(s, &slave, 0)) { test_printf("\n====================== Various slave compute loads ===================\n"); for (i = 0; i < 60; i += 10) { test_printf(">>>>>>>>>>>> slave processing load at %d%%\n", i); do_set_load(s, &slave, i); do_udp_test(s, NC_REQUEST_UDP_ECHO, &slave, 2048, 1024, 0, 0); do_tcp_test(s, NC_REQUEST_TCP_ECHO, &slave, 2048, 1024, 0, 0); } } if (do_start_idle(s, &slave)) { test_printf("\n====================== Various master loads ===================\n"); test_printf("Testing IDLE for %d seconds\n", IDLE_TEST_TIME); test_delay(IDLE_TEST_TIME*100); do_stop_idle(s, &slave, true); for (i = 0; i < LENGTH(pause_times); i++) { do_start_idle(s, &slave); do_udp_test(s, NC_REQUEST_UDP_ECHO, &slave, 2048, 1024, pause_times[i].pause_ticks, pause_times[i].pause_threshold); do_stop_idle(s, &slave, false); do_start_idle(s, &slave); do_tcp_test(s, NC_REQUEST_TCP_ECHO, &slave, 2048, 1024, pause_times[i].pause_ticks, pause_times[i].pause_threshold); do_stop_idle(s, &slave, false); } } do_disconnect(s, &slave); close(s); }