예제 #1
0
파일: ib-conn.c 프로젝트: styxyang/codelib
int on_event(struct rdma_cm_event *event)
{
	int r = 0;

	if (event->event == RDMA_CM_EVENT_CONNECT_REQUEST)
		r = on_connect_request(event->id);
	else if (event->event == RDMA_CM_EVENT_ESTABLISHED)
		r = on_connection(event->id->context);
	else if (event->event == RDMA_CM_EVENT_DISCONNECTED)
		r = on_disconnect(event->id);
	else
		die("on_event: unknown event.");

	return r;
}
int on_event(struct rdma_cm_event *event)
{
  int r = 0;

  if (event->event == RDMA_CM_EVENT_ADDR_RESOLVED)
    r = on_addr_resolved(event->id);
  else if (event->event == RDMA_CM_EVENT_ROUTE_RESOLVED)
    r = on_route_resolved(event->id);
  else if (event->event == RDMA_CM_EVENT_ESTABLISHED)
    r = on_connection(event->id->context);
  else if (event->event == RDMA_CM_EVENT_DISCONNECTED)
    r = on_disconnect(event->id);
  else
    die("on_event: unknown event.");

  return r;
}
예제 #3
0
//event handler
int on_event(struct rdma_cm_id *id, struct rdma_cm_event *event)
{
  int r = 0;

  if (event->event == RDMA_CM_EVENT_ADDR_RESOLVED)
    r = on_addr_resolved(id);
  else if (event->event == RDMA_CM_EVENT_ROUTE_RESOLVED)
    r = on_route_resolved(id);
  else if (event->event == RDMA_CM_EVENT_ESTABLISHED)
    r = on_connection(id);
  else if (event->event == RDMA_CM_EVENT_DISCONNECTED)
    r = on_disconnect(id);
  else {
     pr_debug("on_event: %d\n", event->event);
   die("on_event: unknown event.");
  }

  return r;
}
예제 #4
0
void
server_handler::on_readable(int fd) {
   if(fd != server_socket) {
      return;
   }
   tracer.trace0("New connection on fd %d", fd);
   struct sockaddr_storage their_addr;
   socklen_t addr_size = sizeof(their_addr);
   int new_fd = accept(server_socket, (sockaddr *) &their_addr,
                       &addr_size);
   if(new_fd == -1) {
      tracer.trace1("accept() unexpectedly returned -1 ");
      return;
   }
   // Set the new socket to be nonblocking
   int flags = fcntl(new_fd, F_GETFL, 0);
   fcntl(new_fd, F_SETFL, flags | O_NONBLOCK);

   on_connection(new_fd, their_addr);
}
예제 #5
0
파일: rdma-client.c 프로젝트: kento/Samples
int on_event(struct rdma_cm_event *event)
{
  int r = 0;

  printf("event id: %d\n", event->event);
  if (event->event == RDMA_CM_EVENT_ADDR_RESOLVED)
    r = on_addr_resolved(event->id);
  else if (event->event == RDMA_CM_EVENT_ROUTE_RESOLVED)
    r = on_route_resolved(event->id);
  else if (event->event == RDMA_CM_EVENT_ESTABLISHED)
    r = on_connection(event->id);
  else if (event->event == RDMA_CM_EVENT_DISCONNECTED)
    r = on_disconnect(event->id);
  else
    fprintf(stderr, "unknow event id: %d\n", event->event);
    fprintf(stderr, "exit");
    exit(1);
  //    die("on_event: unknown event a");

  return r;
}
예제 #6
0
파일: client.c 프로젝트: xiansl/mytests
void client_test(char *ip, char *port) {


    struct addrinfo *addr;
    struct rdma_cm_event *event = NULL;
    struct rdma_cm_id *conn= NULL;
    struct rdma_event_channel *ec = NULL;

    TEST_NZ(getaddrinfo(ip, port, NULL, &addr));

    TEST_Z(ec = rdma_create_event_channel());
    TEST_NZ(rdma_create_id(ec, &conn, NULL, RDMA_PS_TCP));
    TEST_NZ(rdma_resolve_addr(conn, NULL, addr->ai_addr, TIMEOUT_IN_MS));

    freeaddrinfo(addr);

    while (rdma_get_cm_event(ec, &event) == 0) {
        struct rdma_cm_event event_copy;

        memcpy(&event_copy, event, sizeof(*event));
        rdma_ack_cm_event(event);

        if (on_event(&event_copy)) {
            s_ctx->ec = ec;
            s_ctx->id = conn;
            on_connection(event_copy.id);//send our memory information to server using post_send
            //printf("wait for msg_send_completion\n");
            poll_cq(NULL);//wait for send_completion
            //printf("wait for msg_recv_completion\n");
            poll_cq(NULL);//wait for recv_completion
            break;
        }
    }
    return;

};
예제 #7
0
파일: client1.c 프로젝트: xiansl/mytests
void client_test(char *ip, char *port) {


    struct addrinfo *addr;
    struct rdma_cm_event *event = NULL;
    struct rdma_cm_id *conn= NULL;
    struct rdma_event_channel *ec = NULL;
    struct timeval t1, t2, t3, t11, t12;
    struct timeval dt, dt1, dt2, dt11, dt12, dt13;

    gettimeofday(&t1, NULL);

    TEST_NZ(getaddrinfo(ip, port, NULL, &addr));
    TEST_Z(ec = rdma_create_event_channel());
    gettimeofday(&t11, NULL);

    TEST_NZ(rdma_create_id(ec, &conn, NULL, RDMA_PS_TCP));
    gettimeofday(&t12, NULL);

    TEST_NZ(rdma_resolve_addr(conn, NULL, addr->ai_addr, TIMEOUT_IN_MS));
    freeaddrinfo(addr);
    gettimeofday(&t2, NULL);

    while (rdma_get_cm_event(ec, &event) == 0) {
        struct rdma_cm_event event_copy;

        memcpy(&event_copy, event, sizeof(*event));
        rdma_ack_cm_event(event);

        if (on_event(&event_copy)) {
            s_ctx->ec = ec;
            s_ctx->id = conn;


            on_connection(event_copy.id);//send our memory information to server using post_send
            poll_cq(NULL);//wait for send_completion
            poll_cq(NULL);//wait for recv_completion

            break;
        }
    }

    gettimeofday(&t3, NULL);
    timersub(&t3, &t1, &dt);
    timersub(&t3, &t2, &dt2);
    timersub(&t2, &t1, &dt1);
    timersub(&t2, &t12, &dt13);
    timersub(&t12, &t11, &dt12);
    timersub(&t11, &t1, &dt11);
    long usec = dt.tv_usec + 10000 * dt.tv_sec;

    printf("[dt]:\t%ld us.\n", usec);
    printf("[dt1]:\t%ld us.\n", dt1.tv_usec+1000000 *dt1.tv_sec);
    printf("Including the following steps: \n");
    printf("[dt11]:\t%ld us.\n", dt11.tv_usec+1000000 *dt11.tv_sec);
    printf("[dt12]:\t%ld us.\n", dt12.tv_usec+1000000 *dt12.tv_sec);
    printf("[dt13]:\t%ld us.\n", dt13.tv_usec+1000000 *dt13.tv_sec);
    printf("[dt2] takes %ld micro_secs.\n", dt2.tv_usec+1000000*dt2.tv_sec);
    printf("[dt]:total time\t[dt1]:pre_setup\t[dt2]:send/recv\t.\n");
    printf("[dt11]:create_event_channel\t[dt12]:create_id\t[dt13]:resolve_address.\n");
    return;

};