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); }
JNIEXPORT jint JNICALL Java_OnloadExt_FdStat__ILOnloadExt_Stat_2 (JNIEnv * env, jclass cls, jint fd_val, jobject stat) { jint rval; jclass stat_class; jfieldID field_sid; jfieldID field_name; jfieldID field_eid; jfieldID field_state; jstring stack_name; struct onload_stat native_stats; if ( !stat ) return -EINVAL; stat_class = (*env)->GetObjectClass(env, stat); if ( !stat_class ) return -EINVAL; field_sid = (*env)->GetFieldID(env, stat_class, "stackId", "I"); field_eid = (*env)->GetFieldID(env, stat_class, "endpointId", "I"); field_state = (*env)->GetFieldID(env, stat_class, "endpointState", "I"); field_name = (*env)->GetFieldID(env, stat_class, "stackName", "Ljava/lang/String;" ); if ( !field_sid || !field_name || !field_eid || !field_state ) return -EINVAL; (*env)->SetIntField( env, stat, field_sid, 0 ); (*env)->SetIntField( env, stat, field_eid, 0 ); (*env)->SetIntField( env, stat, field_state, 0 ); stack_name = JNU_NewStringNative(env, "" ); if ( stack_name ) (*env)->SetObjectField( env, stat, field_name, stack_name ); if ( fd_val < 0 ) return -EINVAL; rval = onload_fd_stat( fd_val, &native_stats ); if( rval ) { (*env)->SetIntField( env, stat, field_sid, native_stats.stack_id ); (*env)->SetIntField( env, stat, field_eid, native_stats.endpoint_id ); (*env)->SetIntField( env, stat, field_state, native_stats.endpoint_state ); if ( native_stats.stack_name ) { stack_name = JNU_NewStringNative(env, native_stats.stack_name ); if ( stack_name ) (*env)->SetObjectField( env, stat, field_name, stack_name ); } } return rval; }