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);
}
Exemple #2
0
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;
}