static int set_tsc_freq_from_clock(void) { #define NS_PER_SEC 1E9 struct timespec sleeptime = {.tv_nsec = 5E8 }; /* 1/2 second */ struct timespec t_start, t_end; if (clock_gettime(CLOCK_MONOTONIC_RAW, &t_start) == 0) { uint64_t ns, end, start = get_tsc(); nanosleep(&sleeptime,NULL); clock_gettime(CLOCK_MONOTONIC_RAW, &t_end); end = get_tsc(); ns = ((t_end.tv_sec - t_start.tv_sec) * NS_PER_SEC); ns += (t_end.tv_nsec - t_start.tv_nsec); double secs = (double)ns/NS_PER_SEC; eal_tsc_resolution_hz = (uint64_t)((end - start)/secs); return 0; } return -1; } int main(int argc , char *argv[]) { int socket_desc , client_sock , c , read_size; unsigned long long total_rcvd = 0; struct sockaddr_in server , client; char client_message[2000]; printf("Clock measure:%d\n\n",set_tsc_freq_from_clock()); //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } puts("Socket created"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr("192.168.56.101"); server.sin_port = htons( 80 ); //Bind if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { //print the error message perror("bind failed. Error"); return 1; } puts("bind done"); //Listen listen(socket_desc , 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); //accept connection from an incoming client client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); if (client_sock < 0) { perror("accept failed"); return 1; } puts("Connection accepted"); uint64_t end = get_tsc() + eal_tsc_resolution_hz; //Receive a message from client while( 1 ) { read_size = recv(client_sock , client_message , 2000 , MSG_DONTWAIT ); if (read_size > 0) { total_rcvd += read_size; } if(get_tsc() >= end) { printf("%llu \n", total_rcvd); total_rcvd = 0; end = get_tsc() + eal_tsc_resolution_hz; } } if(read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if(read_size == -1) { perror("recv failed"); } return 0; }
static int set_tsc_freq_from_clock(void) { #define NS_PER_SEC 1E9 struct timespec sleeptime = {.tv_nsec = 5E8 }; /* 1/2 second */ struct timespec t_start, t_end; if (clock_gettime(CLOCK_MONOTONIC_RAW, &t_start) == 0) { uint64_t ns, end, start = get_tsc(); nanosleep(&sleeptime,NULL); clock_gettime(CLOCK_MONOTONIC_RAW, &t_end); end = get_tsc(); ns = ((t_end.tv_sec - t_start.tv_sec) * NS_PER_SEC); ns += (t_end.tv_nsec - t_start.tv_nsec); double secs = (double)ns/NS_PER_SEC; eal_tsc_resolution_hz = (uint64_t)((end - start)/secs); return 0; } return -1; } int main(int argc , char *argv[]) { int sock; struct sockaddr_in server; unsigned char buffer[1400] , server_reply[2000]; unsigned long long total_rcvd = 0, rcvd; memset(buffer, 'A', 1400); printf("Clock measure:%d\n\n",set_tsc_freq_from_clock()); //Create socket sock = socket(AF_INET , SOCK_STREAM , 0); if (sock == -1) { printf("Could not create socket"); } puts("Socket created"); server.sin_addr.s_addr = inet_addr("10.132.251.197"); server.sin_family = AF_INET; server.sin_port = htons( 80 ); //Connect to remote server if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } puts("Connected\n"); uint64_t end = get_tsc() + eal_tsc_resolution_hz; //keep communicating with server while(1) { //Send some data if( send(sock , buffer , 1400 , 0) < 0) { puts("Send failed"); return 1; } //Receive a reply from the server if( (rcvd = recv(sock , server_reply , 2000 , 0)) < 0) { puts("recv failed"); break; } else { total_rcvd += rcvd; } if(get_tsc() >= end) { printf("%llu \n", total_rcvd); total_rcvd = 0; end = get_tsc() + eal_tsc_resolution_hz; } //puts("Server reply :"); //puts(server_reply); } close(sock); return 0; }
/* * This function measures the TSC frequency. It uses a variety of approaches. * * 1. If kernel provides CLOCK_MONOTONIC_RAW we use that to tune the TSC value * 2. If kernel does not provide that, and we have HPET support, tune using HPET * 3. Lastly, if neither of the above can be used, just sleep for 1 second and * tune off that, printing a warning about inaccuracy of timing */ static void set_tsc_freq (hptl_clock *clk) { if (set_tsc_freq_from_clock (clk) < 0) { set_tsc_freq_linux (clk); } }