int main(void) { int s1; int s2; int r; struct onload_stat * stat; struct sockaddr_in servaddr; stat = malloc(sizeof(struct onload_stat)); /* new sockets created in this thread will not be accelerated */ if( onload_set_stackname(ONLOAD_THIS_THREAD, ONLOAD_SCOPE_THREAD, ONLOAD_DONT_ACCELERATE) ) perror("Error setting stackname:"); /* set up a basic UDP socket */ s1 = socket(AF_INET, SOCK_DGRAM, 0); r = onload_fd_stat(s1, stat); outputStatInfo(r, stat); close(s1); /* revert to accelerating sockets */ if( onload_set_stackname(ONLOAD_ALL_THREADS, ONLOAD_SCOPE_NOCHANGE, "") ) perror("Error setting stackname:"); /* set up a basic UDP socket */ s1 = socket(AF_INET, SOCK_DGRAM, 0); r = onload_fd_stat(s1, stat); outputStatInfo(r, stat); close(s1); /* give the stack a name */ if( onload_set_stackname(ONLOAD_ALL_THREADS, ONLOAD_SCOPE_GLOBAL, "s_name") ) perror("Error setting stackname:"); /* set up two basic UDP sockets */ s1 = socket(AF_INET, SOCK_DGRAM, 0); r = onload_fd_stat(s1, stat); outputStatInfo(r, stat); s2 = socket(AF_INET, SOCK_DGRAM, 0); r = onload_fd_stat(s2, stat); outputStatInfo(r, stat); close(s1); close(s2); /* tidy up */ free(stat); }
static void do_server(void) { int sl; int sa1; int sa2; int r; int i; struct onload_stat * stat; struct sockaddr_in saddr; stat = malloc(sizeof(struct onload_stat)); /* create a named stack for the socket */ if( onload_set_stackname(ONLOAD_ALL_THREADS, ONLOAD_SCOPE_GLOBAL, "initial") ) perror("Error setting stackname:"); /* set up a basic listening TCP socket */ sl = socket(AF_INET, SOCK_STREAM, 0); bzero(&saddr, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(20001); bind(sl, (struct sockaddr *) &saddr, sizeof(saddr)); listen(sl, 10); /* accept the first connection */ printf("Accepting first connection\n"); sa1 = accept(sl, (struct sockaddr *) NULL, NULL); r = onload_fd_stat(sa1, stat); outputStatInfo(r, stat); /* create a new named stack to move the socket to */ if( onload_set_stackname(ONLOAD_ALL_THREADS, ONLOAD_SCOPE_GLOBAL, "stack1") ) perror("Error setting stackname:"); /* move the socket into the current (stack1) stack */ printf("Moving first connection\n"); onload_move_fd(sa1); r = onload_fd_stat(sa1, stat); outputStatInfo(r, stat); /* accept the second connection */ printf("Accepting second connection\n"); sa2 = accept(sl, (struct sockaddr *) NULL, NULL); r = onload_fd_stat(sa2, stat); outputStatInfo(r, stat); /* create a new named stack to move the socket to */ if( onload_set_stackname(ONLOAD_ALL_THREADS, ONLOAD_SCOPE_GLOBAL, "stack2") ) perror("Error setting stackname:"); /* move the socket into the current (stack2) stack */ printf("Moving second connection\n"); onload_move_fd(sa2); r = onload_fd_stat(sa2, stat); outputStatInfo(r, stat); /* tidy up */ close(sl); close(sa1); close(sa2); free(stat); }