日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RDMA Mellanox官方使用VPI verbs API的例子

發(fā)布時間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RDMA Mellanox官方使用VPI verbs API的例子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源:Mellanox RDMA文檔中的樣例
編譯庫的需求:libibverbs
編譯參數(shù):GCC <文件名> -o service -libverbs
運行方式:
1. 有IB網(wǎng)絡(luò)支持:
服務(wù)端:./service
客戶端:./service 服務(wù)端IP
2. 走ROCE:
服務(wù)端:./service -g 0
客戶端:./service -g 0 服務(wù)端IP

關(guān)于代碼中出現(xiàn)的問題請到github中添加issue
博主github:https://github.com/fruitdish/RDMA-EXAMPLE/tree/master/01

/* * BUILD COMMAND: * gcc -Wall -I/usr/local/ofed/include -O2 -o RDMA_RC_example -L/usr/local/ofed/lib64 -L/usr/local/ofed/lib - libverbs RDMA_RC_example.c * */ /****************************************************************************** * * RDMA Aware Networks Programming Example * * This code demonstrates how to perform the following operations using the * VPI Verbs API: * * Send * Receive * RDMA Read * RDMA Write * *****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdint.h> #include <inttypes.h> #include <endian.h> #include <byteswap.h> #include <getopt.h>#include <sys/time.h> #include <arpa/inet.h> #include <infiniband/verbs.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> /* poll CQ timeout in millisec (2 seconds) */ #define MAX_POLL_CQ_TIMEOUT 2000 #define MSG "SEND operation " #define RDMAMSGR "RDMA read operation " #define RDMAMSGW "RDMA write operation" #define MSG_SIZE (strlen(MSG) + 1) #if __BYTE_ORDER == __LITTLE_ENDIAN static inline uint64_t htonll(uint64_t x) { return bswap_64(x); } static inline uint64_t ntohll(uint64_t x) { return bswap_64(x); } #elif __BYTE_ORDER == __BIG_ENDIAN static inline uint64_t htonll(uint64_t x) { return x; } static inline uint64_t ntohll(uint64_t x) { return x; } #else #error __BYTE_ORDER is neither __LITTLE_ENDIAN nor __BIG_ENDIAN #endif /* structure of test parameters */ struct config_t {const char *dev_name; /* IB device name */char *server_name; /* server host name */u_int32_t tcp_port; /* server TCP port */int ib_port; /* local IB port to work with */int gid_idx; /* gid index to use */ }; /* structure to exchange data which is needed to connect the QPs */ struct cm_con_data_t {uint64_t addr; /* Buffer address */uint32_t rkey; /* Remote key */uint32_t qp_num; /* QP number */uint16_t lid; /* LID of the IB port */uint8_t gid[16]; /* gid */ } __attribute__((packed));/* structure of system resources */ struct resources {struct ibv_device_attrdevice_attr;/* Device attributes */struct ibv_port_attr port_attr; /* IB port attributes */struct cm_con_data_t remote_props; /* values to connect to remote side */struct ibv_context *ib_ctx; /* device handle */struct ibv_pd *pd; /* PD handle */struct ibv_cq *cq; /* CQ handle */struct ibv_qp *qp; /* QP handle */struct ibv_mr *mr; /* MR handle for buf */char *buf; /* memory buffer pointer, used for RDMA and send ops */int sock; /* TCP socket file descriptor */ }; struct config_t config = {NULL, /* dev_name */NULL, /* server_name */19875, /* tcp_port */1, /* ib_port */-1 /* gid_idx */};/****************************************************************************** Socket operations For simplicity, the example program uses TCP sockets to exchange control information. If a TCP/IP stack/connection is not available, connection manager (CM) may be used to pass this information. Use of CM is beyond the scope of this example ******************************************************************************/ /****************************************************************************** * Function: sock_connect * * Input * servername URL of server to connect to (NULL for server mode) * port port of service * * Output * none * * Returns * socket (fd) on success, negative error code on failure * * Description * Connect a socket. If servername is specified a client connection will be * initiated to the indicated server and port. Otherwise listen on the * indicated port for an incoming connection. * ******************************************************************************/ static int sock_connect(const char *servername, int port) {struct addrinfo *resolved_addr = NULL;struct addrinfo *iterator;char service[6];int sockfd = -1;int listenfd = 0;int tmp;struct addrinfo hints ={.ai_flags = AI_PASSIVE,.ai_family = AF_INET,.ai_socktype = SOCK_STREAM};if (sprintf(service, "%d", port) < 0)goto sock_connect_exit;/* Resolve DNS address, use sockfd as temp storage */sockfd = getaddrinfo(servername, service, &hints, &resolved_addr);if (sockfd < 0){fprintf(stderr, "%s for %s:%d\n", gai_strerror(sockfd), servername, port);goto sock_connect_exit;}/* Search through results and find the one we want */for (iterator = resolved_addr; iterator; iterator = iterator->ai_next){sockfd = socket(iterator->ai_family, iterator->ai_socktype, iterator->ai_protocol);if (sockfd >= 0){if (servername){/* Client mode. Initiate connection to remote */if ((tmp = connect(sockfd, iterator->ai_addr, iterator->ai_addrlen))){fprintf(stdout, "failed connect \n");close(sockfd);sockfd = -1;}}else{/* Server mode. Set up listening socket an accept a connection */listenfd = sockfd;sockfd = -1;if (bind(listenfd, iterator->ai_addr, iterator->ai_addrlen))goto sock_connect_exit;listen(listenfd, 1);sockfd = accept(listenfd, NULL, 0);}}} sock_connect_exit:if (listenfd)close(listenfd);if (resolved_addr)freeaddrinfo(resolved_addr);if (sockfd < 0){if (servername)fprintf(stderr, "Couldn't connect to %s:%d\n", servername, port);else{perror("server accept");fprintf(stderr, "accept() failed\n");}}return sockfd; } /****************************************************************************** * Function: sock_sync_data * * Input * sock socket to transfer data on * xfer_size size of data to transfer * local_data pointer to data to be sent to remote * * Output * remote_data pointer to buffer to receive remote data * * Returns * 0 on success, negative error code on failure * * Description * Sync data across a socket. The indicated local data will be sent to the * remote. It will then wait for the remote to send its data back. It is * assumed that the two sides are in sync and call this function in the proper * order. Chaos will ensue if they are not. :) * * Also note this is a blocking function and will wait for the full data to be * received from the remote. * ******************************************************************************/ int sock_sync_data(int sock, int xfer_size, char *local_data, char *remote_data) {int rc;int read_bytes = 0;int total_read_bytes = 0;rc = write(sock, local_data, xfer_size);if (rc < xfer_size)fprintf(stderr, "Failed writing data during sock_sync_data\n");elserc = 0;while (!rc && total_read_bytes < xfer_size){read_bytes = read(sock, remote_data, xfer_size);if (read_bytes > 0)total_read_bytes += read_bytes;elserc = read_bytes;}return rc; } /****************************************************************************** End of socket operations ******************************************************************************/ /* poll_completion */ /****************************************************************************** * Function: poll_completion * * Input * res pointer to resources structure * * Output * none * * Returns * 0 on success, 1 on failure * * Description * Poll the completion queue for a single event. This function will continue to * poll the queue until MAX_POLL_CQ_TIMEOUT milliseconds have passed. * ******************************************************************************/ static int poll_completion(struct resources *res) {struct ibv_wc wc;unsigned long start_time_msec;unsigned long cur_time_msec;struct timeval cur_time;int poll_result;int rc = 0;/* poll the completion for a while before giving up of doing it .. */gettimeofday(&cur_time, NULL);start_time_msec = (cur_time.tv_sec * 1000) + (cur_time.tv_usec / 1000);do{poll_result = ibv_poll_cq(res->cq, 1, &wc);gettimeofday(&cur_time, NULL);cur_time_msec = (cur_time.tv_sec * 1000) + (cur_time.tv_usec / 1000);} while ((poll_result == 0) && ((cur_time_msec - start_time_msec) < MAX_POLL_CQ_TIMEOUT));if (poll_result < 0){/* poll CQ failed */fprintf(stderr, "poll CQ failed\n");rc = 1;}else if (poll_result == 0){ /* the CQ is empty */fprintf(stderr, "completion wasn't found in the CQ after timeout\n");rc = 1;}else{/* CQE found */fprintf(stdout, "completion was found in CQ with status 0x%x\n", wc.status);/* check the completion status (here we don't care about the completion opcode */if (wc.status != IBV_WC_SUCCESS){fprintf(stderr, "got bad completion with status: 0x%x, vendor syndrome: 0x%x\n", wc.status,wc.vendor_err);rc = 1;}}return rc; } /****************************************************************************** * Function: post_send * * Input * res pointer to resources structure * opcode IBV_WR_SEND, IBV_WR_RDMA_READ or IBV_WR_RDMA_WRITE * * Output * none * * Returns * 0 on success, error code on failure * * Description * This function will create and post a send work request ******************************************************************************/ static int post_send(struct resources *res, int opcode) {struct ibv_send_wr sr;struct ibv_sge sge;struct ibv_send_wr *bad_wr = NULL;int rc;/* prepare the scatter/gather entry */memset(&sge, 0, sizeof(sge));sge.addr = (uintptr_t)res->buf;sge.length = MSG_SIZE;sge.lkey = res->mr->lkey;/* prepare the send work request */memset(&sr, 0, sizeof(sr));sr.next = NULL;sr.wr_id = 0;sr.sg_list = &sge;sr.num_sge = 1;sr.opcode = opcode;sr.send_flags = IBV_SEND_SIGNALED;if (opcode != IBV_WR_SEND){sr.wr.rdma.remote_addr = res->remote_props.addr;sr.wr.rdma.rkey = res->remote_props.rkey;}/* there is a Receive Request in the responder side, so we won't get any into RNR flow */rc = ibv_post_send(res->qp, &sr, &bad_wr);if (rc)fprintf(stderr, "failed to post SR\n");else{switch (opcode){case IBV_WR_SEND:fprintf(stdout, "Send Request was posted\n");break;case IBV_WR_RDMA_READ:fprintf(stdout, "RDMA Read Request was posted\n");break;case IBV_WR_RDMA_WRITE:fprintf(stdout, "RDMA Write Request was posted\n");break;default:fprintf(stdout, "Unknown Request was posted\n");break;}}return rc; } /****************************************************************************** * Function: post_receive * * Input * res pointer to resources structure * * Output * none * * Returns * 0 on success, error code on failure * * Description * ******************************************************************************/ static int post_receive(struct resources *res) {struct ibv_recv_wr rr;struct ibv_sge sge;struct ibv_recv_wr *bad_wr;int rc;/* prepare the scatter/gather entry */memset(&sge, 0, sizeof(sge));sge.addr = (uintptr_t)res->buf;sge.length = MSG_SIZE;sge.lkey = res->mr->lkey;/* prepare the receive work request */memset(&rr, 0, sizeof(rr));rr.next = NULL;rr.wr_id = 0;rr.sg_list = &sge;rr.num_sge = 1;/* post the Receive Request to the RQ */rc = ibv_post_recv(res->qp, &rr, &bad_wr);if (rc)fprintf(stderr, "failed to post RR\n");elsefprintf(stdout, "Receive Request was posted\n");return rc; } /****************************************************************************** * Function: resources_init * * Input * res pointer to resources structure * * Output * res is initialized * * Returns * none * * Description * res is initialized to default values ******************************************************************************/ static void resources_init(struct resources *res) {memset(res, 0, sizeof *res);res->sock = -1; } /****************************************************************************** * Function: resources_create * * Input * res pointer to resources structure to be filled in * * Output * res filled in with resources * * Returns * 0 on success, 1 on failure * * Description * * This function creates and allocates all necessary system resources. These * are stored in res. *****************************************************************************/ static int resources_create(struct resources *res) {struct ibv_device **dev_list = NULL;struct ibv_qp_init_attr qp_init_attr;struct ibv_device *ib_dev = NULL;size_t size;int i;int mr_flags = 0;int cq_size = 0;int num_devices;int rc = 0;/* if client side */if (config.server_name){res->sock = sock_connect(config.server_name, config.tcp_port);if (res->sock < 0){fprintf(stderr, "failed to establish TCP connection to server %s, port %d\n",config.server_name, config.tcp_port);rc = -1;goto resources_create_exit;}}else{fprintf(stdout, "waiting on port %d for TCP connection\n", config.tcp_port);res->sock = sock_connect(NULL, config.tcp_port);if (res->sock < 0){fprintf(stderr, "failed to establish TCP connection with client on port %d\n",config.tcp_port);rc = -1;goto resources_create_exit;}}fprintf(stdout, "TCP connection was established\n");fprintf(stdout, "searching for IB devices in host\n");/* get device names in the system */dev_list = ibv_get_device_list(&num_devices);if (!dev_list){fprintf(stderr, "failed to get IB devices list\n");rc = 1;goto resources_create_exit;}/* if there isn't any IB device in host */if (!num_devices){fprintf(stderr, "found %d device(s)\n", num_devices);rc = 1;goto resources_create_exit;}fprintf(stdout, "found %d device(s)\n", num_devices);/* search for the specific device we want to work with */for (i = 0; i < num_devices; i++){if (!config.dev_name){config.dev_name = strdup(ibv_get_device_name(dev_list[i]));fprintf(stdout, "device not specified, using first one found: %s\n", config.dev_name);}if (!strcmp(ibv_get_device_name(dev_list[i]), config.dev_name)){ib_dev = dev_list[i];break;}}/* if the device wasn't found in host */if (!ib_dev){fprintf(stderr, "IB device %s wasn't found\n", config.dev_name);rc = 1;goto resources_create_exit;}/* get device handle */res->ib_ctx = ibv_open_device(ib_dev);if (!res->ib_ctx){fprintf(stderr, "failed to open device %s\n", config.dev_name);rc = 1;goto resources_create_exit;}/* We are now done with device list, free it */ibv_free_device_list(dev_list);dev_list = NULL;ib_dev = NULL;/* query port properties */if (ibv_query_port(res->ib_ctx, config.ib_port, &res->port_attr)){fprintf(stderr, "ibv_query_port on port %u failed\n", config.ib_port);rc = 1;goto resources_create_exit;}/* allocate Protection Domain */res->pd = ibv_alloc_pd(res->ib_ctx);if (!res->pd){fprintf(stderr, "ibv_alloc_pd failed\n");rc = 1;goto resources_create_exit;}/* each side will send only one WR, so Completion Queue with 1 entry is enough */cq_size = 1;res->cq = ibv_create_cq(res->ib_ctx, cq_size, NULL, NULL, 0);if (!res->cq){fprintf(stderr, "failed to create CQ with %u entries\n", cq_size);rc = 1;goto resources_create_exit;}/* allocate the memory buffer that will hold the data */size = MSG_SIZE;res->buf = (char *)malloc(size);if (!res->buf){fprintf(stderr, "failed to malloc %Zu bytes to memory buffer\n", size);rc = 1;goto resources_create_exit;}memset(res->buf, 0, size);/* only in the server side put the message in the memory buffer */if (!config.server_name){strcpy(res->buf, MSG);fprintf(stdout, "going to send the message: '%s'\n", res->buf);}elsememset(res->buf, 0, size);/* register the memory buffer */mr_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE;res->mr = ibv_reg_mr(res->pd, res->buf, size, mr_flags);if (!res->mr){fprintf(stderr, "ibv_reg_mr failed with mr_flags=0x%x\n", mr_flags);rc = 1;goto resources_create_exit;}fprintf(stdout, "MR was registered with addr=%p, lkey=0x%x, rkey=0x%x, flags=0x%x\n",res->buf, res->mr->lkey, res->mr->rkey, mr_flags);/* create the Queue Pair */memset(&qp_init_attr, 0, sizeof(qp_init_attr));qp_init_attr.qp_type = IBV_QPT_RC;qp_init_attr.sq_sig_all = 1;qp_init_attr.send_cq = res->cq;qp_init_attr.recv_cq = res->cq;qp_init_attr.cap.max_send_wr = 1;qp_init_attr.cap.max_recv_wr = 1;qp_init_attr.cap.max_send_sge = 1;qp_init_attr.cap.max_recv_sge = 1;res->qp = ibv_create_qp(res->pd, &qp_init_attr);if (!res->qp){fprintf(stderr, "failed to create QP\n");rc = 1;goto resources_create_exit;}fprintf(stdout, "QP was created, QP number=0x%x\n", res->qp->qp_num); resources_create_exit:if (rc){/* Error encountered, cleanup */if (res->qp){ibv_destroy_qp(res->qp);res->qp = NULL;}if (res->mr){ibv_dereg_mr(res->mr);res->mr = NULL;}if (res->buf){free(res->buf);res->buf = NULL;}if (res->cq){ibv_destroy_cq(res->cq);res->cq = NULL;}if (res->pd){ibv_dealloc_pd(res->pd);res->pd = NULL;}if (res->ib_ctx){ibv_close_device(res->ib_ctx);res->ib_ctx = NULL;}if (dev_list){ibv_free_device_list(dev_list);dev_list = NULL;}if (res->sock >= 0){if (close(res->sock))fprintf(stderr, "failed to close socket\n");res->sock = -1;}}return rc; } /****************************************************************************** * Function: modify_qp_to_init * * Input * qp QP to transition * * Output * none * * Returns * 0 on success, ibv_modify_qp failure code on failure * * Description * Transition a QP from the RESET to INIT state ******************************************************************************/ static int modify_qp_to_init(struct ibv_qp *qp) {struct ibv_qp_attr attr;int flags;int rc;memset(&attr, 0, sizeof(attr));attr.qp_state = IBV_QPS_INIT;attr.port_num = config.ib_port;attr.pkey_index = 0;attr.qp_access_flags = IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_READ | IBV_ACCESS_REMOTE_WRITE;flags = IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS;rc = ibv_modify_qp(qp, &attr, flags);if (rc)fprintf(stderr, "failed to modify QP state to INIT\n");return rc; } /****************************************************************************** * Function: modify_qp_to_rtr * * Input * qp QP to transition * remote_qpn remote QP number * dlid destination LID * dgid destination GID (mandatory for RoCEE) * * Output * none * * Returns * 0 on success, ibv_modify_qp failure code on failure * * Description * Transition a QP from the INIT to RTR state, using the specified QP number ******************************************************************************/ static int modify_qp_to_rtr(struct ibv_qp *qp, uint32_t remote_qpn, uint16_t dlid, uint8_t *dgid) {struct ibv_qp_attr attr;int flags;int rc;memset(&attr, 0, sizeof(attr));attr.qp_state = IBV_QPS_RTR;attr.path_mtu = IBV_MTU_256;attr.dest_qp_num = remote_qpn;attr.rq_psn = 0;attr.max_dest_rd_atomic = 1;attr.min_rnr_timer = 0x12;attr.ah_attr.is_global = 0;attr.ah_attr.dlid = dlid;attr.ah_attr.sl = 0;attr.ah_attr.src_path_bits = 0;attr.ah_attr.port_num = config.ib_port;if (config.gid_idx >= 0){attr.ah_attr.is_global = 1;attr.ah_attr.port_num = 1;memcpy(&attr.ah_attr.grh.dgid, dgid, 16);attr.ah_attr.grh.flow_label = 0;attr.ah_attr.grh.hop_limit = 1;attr.ah_attr.grh.sgid_index = config.gid_idx;attr.ah_attr.grh.traffic_class = 0;}flags = IBV_QP_STATE | IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN |IBV_QP_RQ_PSN | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER;rc = ibv_modify_qp(qp, &attr, flags);if (rc)fprintf(stderr, "failed to modify QP state to RTR\n");return rc; } /****************************************************************************** * Function: modify_qp_to_rts * * Input * qp QP to transition * * Output * none * * Returns * 0 on success, ibv_modify_qp failure code on failure * * Description * Transition a QP from the RTR to RTS state ******************************************************************************/ static int modify_qp_to_rts(struct ibv_qp *qp) {struct ibv_qp_attr attr;int flags;int rc;memset(&attr, 0, sizeof(attr));attr.qp_state = IBV_QPS_RTS;attr.timeout = 0x12;attr.retry_cnt = 6;attr.rnr_retry = 0;attr.sq_psn = 0;attr.max_rd_atomic = 1;flags = IBV_QP_STATE | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT |IBV_QP_RNR_RETRY | IBV_QP_SQ_PSN | IBV_QP_MAX_QP_RD_ATOMIC;rc = ibv_modify_qp(qp, &attr, flags);if (rc)fprintf(stderr, "failed to modify QP state to RTS\n");return rc; } /****************************************************************************** * Function: connect_qp * * Input * res pointer to resources structure * * Output * none * * Returns * 0 on success, error code on failure * * Description * Connect the QP. Transition the server side to RTR, sender side to RTS ******************************************************************************/ static int connect_qp(struct resources *res) {struct cm_con_data_t local_con_data;struct cm_con_data_t remote_con_data;struct cm_con_data_t tmp_con_data;int rc = 0;char temp_char;union ibv_gid my_gid;if (config.gid_idx >= 0){rc = ibv_query_gid(res->ib_ctx, config.ib_port, config.gid_idx, &my_gid);if (rc){fprintf(stderr, "could not get gid for port %d, index %d\n", config.ib_port, config.gid_idx);return rc;}}elsememset(&my_gid, 0, sizeof my_gid);/* exchange using TCP sockets info required to connect QPs */local_con_data.addr = htonll((uintptr_t)res->buf);local_con_data.rkey = htonl(res->mr->rkey);local_con_data.qp_num = htonl(res->qp->qp_num);local_con_data.lid = htons(res->port_attr.lid);memcpy(local_con_data.gid, &my_gid, 16);fprintf(stdout, "\nLocal LID = 0x%x\n", res->port_attr.lid);if (sock_sync_data(res->sock, sizeof(struct cm_con_data_t), (char *)&local_con_data, (char *)&tmp_con_data) < 0){fprintf(stderr, "failed to exchange connection data between sides\n");rc = 1;goto connect_qp_exit;}remote_con_data.addr = ntohll(tmp_con_data.addr);remote_con_data.rkey = ntohl(tmp_con_data.rkey);remote_con_data.qp_num = ntohl(tmp_con_data.qp_num);remote_con_data.lid = ntohs(tmp_con_data.lid);memcpy(remote_con_data.gid, tmp_con_data.gid, 16);/* save the remote side attributes, we will need it for the post SR */res->remote_props = remote_con_data;fprintf(stdout, "Remote address = 0x%" PRIx64 "\n", remote_con_data.addr);fprintf(stdout, "Remote rkey = 0x%x\n", remote_con_data.rkey);fprintf(stdout, "Remote QP number = 0x%x\n", remote_con_data.qp_num);fprintf(stdout, "Remote LID = 0x%x\n", remote_con_data.lid);if (config.gid_idx >= 0){uint8_t *p = remote_con_data.gid;fprintf(stdout, "Remote GID =%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n ",p[0],p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);}/* modify the QP to init */rc = modify_qp_to_init(res->qp);if (rc){fprintf(stderr, "change QP state to INIT failed\n");goto connect_qp_exit;}/* let the client post RR to be prepared for incoming messages */if (config.server_name){rc = post_receive(res);if (rc){fprintf(stderr, "failed to post RR\n");goto connect_qp_exit;}}/* modify the QP to RTR */rc = modify_qp_to_rtr(res->qp, remote_con_data.qp_num, remote_con_data.lid, remote_con_data.gid);if (rc){fprintf(stderr, "failed to modify QP state to RTR\n");goto connect_qp_exit;}rc = modify_qp_to_rts(res->qp);if (rc){fprintf(stderr, "failed to modify QP state to RTR\n");goto connect_qp_exit;}fprintf(stdout, "QP state was change to RTS\n");/* sync to make sure that both sides are in states that they can connect to prevent packet loose */if (sock_sync_data(res->sock, 1, "Q", &temp_char)) /* just send a dummy char back and forth */{fprintf(stderr, "sync error after QPs are were moved to RTS\n");rc = 1;} connect_qp_exit:return rc; } /****************************************************************************** * Function: resources_destroy * * Input * res pointer to resources structure * * Output * none * * Returns * 0 on success, 1 on failure * * Description * Cleanup and deallocate all resources used ******************************************************************************/ static int resources_destroy(struct resources *res) {int rc = 0;if (res->qp)if (ibv_destroy_qp(res->qp)){fprintf(stderr, "failed to destroy QP\n");rc = 1;}if (res->mr)if (ibv_dereg_mr(res->mr)){fprintf(stderr, "failed to deregister MR\n");rc = 1;}if (res->buf)free(res->buf);if (res->cq)if (ibv_destroy_cq(res->cq)){fprintf(stderr, "failed to destroy CQ\n");rc = 1;}if (res->pd)if (ibv_dealloc_pd(res->pd)){fprintf(stderr, "failed to deallocate PD\n");rc = 1;}if (res->ib_ctx)if (ibv_close_device(res->ib_ctx)){fprintf(stderr, "failed to close device context\n");rc = 1;}if (res->sock >= 0)if (close(res->sock)){fprintf(stderr, "failed to close socket\n");rc = 1;}return rc; } /****************************************************************************** * Function: print_config * * Input * none * * Output * none * * Returns * none * * Description * Print out config information ******************************************************************************/ static void print_config(void) {fprintf(stdout, " ------------------------------------------------\n");fprintf(stdout, " Device name : \"%s\"\n", config.dev_name);fprintf(stdout, " IB port : %u\n", config.ib_port);if (config.server_name)fprintf(stdout, " IP : %s\n", config.server_name);fprintf(stdout, " TCP port : %u\n", config.tcp_port);if (config.gid_idx >= 0)fprintf(stdout, " GID index : %u\n", config.gid_idx);fprintf(stdout, " ------------------------------------------------\n\n"); }/****************************************************************************** * Function: usage * * Input * argv0 command line arguments * * Output * none * * Returns * none * * Description * print a description of command line syntax ******************************************************************************/ static void usage(const char *argv0) {fprintf(stdout, "Usage:\n");fprintf(stdout, " %s start a server and wait for connection\n", argv0);fprintf(stdout, " %s <host> connect to server at <host>\n", argv0);fprintf(stdout, "\n");fprintf(stdout, "Options:\n");fprintf(stdout, " -p, --port <port> listen on/connect to port <port> (default 18515)\n");fprintf(stdout, " -d, --ib-dev <dev> use IB device <dev> (default first device found)\n");fprintf(stdout, " -i, --ib-port <port> use port <port> of IB device (default 1)\n");fprintf(stdout, " -g, --gid_idx <git index> gid index to be used in GRH (default not used)\n"); } /****************************************************************************** * Function: main * * Input * argc number of items in argv * argv command line parameters * * Output * none * * Returns * 0 on success, 1 on failure * * Description * Main program code ******************************************************************************/ int main(int argc, char *argv[]) {struct resources res;int rc = 1;char temp_char;/* parse the command line parameters */while (1){int c;static struct option long_options[] = {{.name = "port", .has_arg = 1, .val = 'p'},{.name = "ib-dev", .has_arg = 1, .val = 'd'},{.name = "ib-port", .has_arg = 1, .val = 'i'},{.name = "gid-idx", .has_arg = 1, .val = 'g'},{.name = NULL, .has_arg = 0, .val = '\0'}};c = getopt_long(argc, argv, "p:d:i:g:", long_options, NULL);if (c == -1)break;switch (c){case 'p':config.tcp_port = strtoul(optarg, NULL, 0);break;case 'd':config.dev_name = strdup(optarg);break;case 'i':config.ib_port = strtoul(optarg, NULL, 0);if (config.ib_port < 0){usage(argv[0]);return 1;}break;case 'g':config.gid_idx = strtoul(optarg, NULL, 0);if (config.gid_idx < 0){usage(argv[0]);return 1;}break;default:usage(argv[0]);return 1;}}/* parse the last parameter (if exists) as the server name */if (optind == argc - 1)config.server_name = argv[optind];if(config.server_name){printf("servername=%s\n",config.server_name);}else if (optind < argc){usage(argv[0]);return 1;}/* print the used parameters for info*/print_config();/* init all of the resources, so cleanup will be easy */resources_init(&res);/* create resources before using them */if (resources_create(&res)){fprintf(stderr, "failed to create resources\n");goto main_exit;}/* connect the QPs */if (connect_qp(&res)){fprintf(stderr, "failed to connect QPs\n");goto main_exit;}/* let the server post the sr */if (!config.server_name)if (post_send(&res, IBV_WR_SEND)){fprintf(stderr, "failed to post sr\n");goto main_exit;}/* in both sides we expect to get a completion */if (poll_completion(&res)){fprintf(stderr, "poll completion failed\n");goto main_exit;}/* after polling the completion we have the message in the client buffer too */if (config.server_name)fprintf(stdout, "Message is: '%s'\n", res.buf);else{/* setup server buffer with read message */strcpy(res.buf, RDMAMSGR);}/* Sync so we are sure server side has data ready before client tries to read it */if (sock_sync_data(res.sock, 1, "R", &temp_char)) /* just send a dummy char back and forth */{fprintf(stderr, "sync error before RDMA ops\n");rc = 1;goto main_exit;}/* Now the client performs an RDMA read and then write on server. Note that the server has no idea these events have occured */if (config.server_name){/* First we read contens of server's buffer */if (post_send(&res, IBV_WR_RDMA_READ)){fprintf(stderr, "failed to post SR 2\n");rc = 1;goto main_exit;}if (poll_completion(&res)){fprintf(stderr, "poll completion failed 2\n");rc = 1;goto main_exit;}fprintf(stdout, "Contents of server's buffer: '%s'\n", res.buf);/* Now we replace what's in the server's buffer */strcpy(res.buf, RDMAMSGW);fprintf(stdout, "Now replacing it with: '%s'\n", res.buf);if (post_send(&res, IBV_WR_RDMA_WRITE)){fprintf(stderr, "failed to post SR 3\n");rc = 1;goto main_exit;}if (poll_completion(&res)){fprintf(stderr, "poll completion failed 3\n");rc = 1;goto main_exit;}}/* Sync so server will know that client is done mucking with its memory */if (sock_sync_data(res.sock, 1, "W", &temp_char)) /* just send a dummy char back and forth */{fprintf(stderr, "sync error after RDMA ops\n");rc = 1;goto main_exit;}if (!config.server_name)fprintf(stdout, "Contents of server buffer: '%s'\n", res.buf);rc = 0; main_exit:if (resources_destroy(&res)){fprintf(stderr, "failed to destroy resources\n");rc = 1;}if (config.dev_name)free((char *)config.dev_name);fprintf(stdout, "\ntest result is %d\n", rc);return rc; }

總結(jié)

以上是生活随笔為你收集整理的RDMA Mellanox官方使用VPI verbs API的例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

视频在线精品 | av看片网址 | 国产麻豆精品在线观看 | 久久这里 | 成人黄色大片在线免费观看 | 亚洲成av人片在线观看香蕉 | 丁香久久婷婷 | 亚洲欧美精品一区 | 日韩在线观看 | 国产成人精品av久久 | 精品亚洲免费 | 亚洲色视频 | 射综合网 | 国产精品一区二区三区在线免费观看 | 国产亚洲视频系列 | 久久视频这里只有精品 | 天天爽天天爽天天爽 | 国产精品美女久久久久久久 | 欧美精品三级在线观看 | 日本在线免费看 | 国产精品久久久久久久久久免费看 | 国产日韩精品一区二区 | 性日韩欧美在线视频 | 日韩av免费一区二区 | 人人玩人人添人人澡超碰 | 久久精品视频在线观看 | 国产精品激情 | 国产精品久久久久久久久久 | 色夜影院 | 美女视频永久黄网站免费观看国产 | 日韩中文字幕网站 | 国产精品毛片久久久久久久 | 欧美激情视频一区二区三区 | 国产成人精品一区二区三区网站观看 | 国产视频在线播放 | 成人欧美一区二区三区在线观看 | 久久国产精品网站 | 久久成电影 | 日韩精品2区 | 天天插天天色 | 视频成人免费 | www.啪啪.com| 人人澡人人干 | 国产激情小视频在线观看 | 国产中文字幕在线观看 | 国产精品自产拍在线观看 | 亚洲成av人片在线观看 | 久久电影日韩 | 91高清完整版在线观看 | 久久精品99久久 | 精品uu| 日韩国产精品一区 | 国产亚洲视频在线免费观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 成人免费在线视频观看 | 99热 精品在线 | 日韩区欠美精品av视频 | 波多野结衣一区 | 久久久久久久久久伊人 | 婷婷丁香色 | 国产专区视频 | 91看片麻豆 | 亚洲一区二区三区四区精品 | 香蕉蜜桃视频 | 久草精品视频在线播放 | 久久精品亚洲综合专区 | 91社区国产高清 | 久草在线资源观看 | 亚洲不卡av一区二区三区 | 超碰av在线播放 | 婷婷丁香六月天 | 日韩在线精品一区 | 日韩精品一卡 | 三级在线视频观看 | 国产小视频你懂的在线 | 国产精品日韩在线 | 婷婷伊人综合亚洲综合网 | 国产 欧美 日产久久 | 国产日韩中文字幕在线 | 成人av高清在线观看 | 国产在线精品一区二区 | 国产中文字幕久久 | 国产福利一区二区在线 | 激情五月婷婷网 | 日韩三级视频在线看 | 99国产在线观看 | 国产精品不卡一区 | 日韩av网站在线播放 | 色香网 | 天天做日日爱夜夜爽 | 成人毛片久久 | 色综合久久88色综合天天人守婷 | 999久久久久久久久久久 | 91精品视频一区二区三区 | 欧美成人影音 | 日韩电影一区二区三区在线观看 | 香蕉日日 | 久久久黄视频 | 免费男女网站 | 九九久久久久久久久激情 | 国产二区视频在线观看 | 三级a毛片 | 国产亚洲人成网站在线观看 | 久久精品99国产精品酒店日本 | 国产区精品 | 在线成人观看 | 天天av在线播放 | 国内精品久久久久久 | 日韩天天干 | 日日爽夜夜爽 | av看片网址 | 久久麻豆精品 | 国产91小视频 | 在线看欧美 | 国产精品成人一区二区三区吃奶 | 四虎海外影库www4hu | 超碰97人人射妻 | 中文字幕有码在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 91成人黄色 | 99精品国产视频 | 国产成人三级在线 | 国产老妇av | 久久精品成人欧美大片古装 | 国内成人av| 日韩中文在线观看 | 91精品啪在线观看国产 | 一区二区三区在线视频111 | 婷婷国产视频 | 国产精品正在播放 | 国产精品一区二区免费看 | 又长又大又黑又粗欧美 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 日韩午夜网站 | 精品99免费 | 97人人超碰在线 | 日韩中文字幕一区 | 免费视频一二三区 | 九九热视频在线免费观看 | 欧美日韩在线网站 | 免费日韩一区二区三区 | 福利视频入口 | 欧美日韩综合在线观看 | 黄色日视频 | 国产精品中文字幕在线播放 | 一级一片免费看 | 国产色拍拍拍拍在线精品 | 亚洲黄色三级 | 日韩三级视频在线观看 | 999久久久免费视频 午夜国产在线观看 | av电影av在线 | 亚洲天堂免费视频 | 性色av免费看 | 美女久久精品 | 久久99精品久久久久久 | 91完整版 | 久久国产麻豆 | 欧美日韩亚洲精品在线 | 波多野结衣在线播放一区 | 久久国产精品系列 | 人人精品| 激情久久一区二区三区 | 色婷婷99| 91超碰在线播放 | 国产综合婷婷 | 亚洲精品中文字幕视频 | 最新国产在线视频 | 99这里只有久久精品视频 | 又色又爽的网站 | 亚洲aⅴ久久精品 | 婷婷 中文字幕 | 黄色在线观看www | 91在线麻豆| 国产精品精品国产婷婷这里av | 亚洲精品小视频 | 人人插人人舔 | 狠狠狠色丁香婷婷综合久久五月 | 久久av中文字幕片 | 偷拍福利视频一区二区三区 | 日韩在线精品视频 | 国产一区在线精品 | 欧美日在线 | 国产很黄很色的视频 | 亚洲精品电影在线 | 色综合亚洲精品激情狠狠 | 国产精品视频免费在线观看 | 九九视频精品免费 | 亚洲精品免费在线观看 | 一级理论片在线观看 | av网站有哪些| 少妇视频在线播放 | 精品一二三四在线 | av高清免费 | 婷婷在线观看视频 | 丁香花中文字幕 | 亚洲专区视频在线观看 | 免费福利在线 | 高清av中文在线字幕观看1 | 又黄又刺激视频 | 亚洲在线黄色 | 在线播放日韩av | 91精品一区二区三区蜜桃 | 欧美另类xxxx| 亚洲视频在线播放 | 五月婷婷激情网 | 国产亚洲精品久久久久久电影 | 天天操夜夜干 | 久久在线精品视频 | 精品一区 在线 | 九草在线观看 | 国产一区精品在线 | 免费视频成人 | 久草a视频| 久久久片 | 97在线视频网站 | 99精品视频99 | 特级西西www44高清大胆图片 | 日韩r级在线 | 丁香六月伊人 | 日韩视频免费在线 | 91插插插免费视频 | 97国产大学生情侣白嫩酒店 | 中文字幕观看视频 | 91porny九色在线播放 | 成年人视频在线免费观看 | 国产精品久久久久久五月尺 | 欧美片网站yy | 国产中文字幕在线免费观看 | 久久久91精品国产一区二区三区 | 国产成人精品久久久久 | 亚洲人人网| 最近2019年日本中文免费字幕 | 中文字幕在线观看2018 | av一级久久| 成人av在线直播 | 久久www免费视频 | 国产精品久久久久久久久免费 | 亚洲国产网站 | 久久久久久久福利 | 欧美最猛性xxxx | 亚洲黄色av| 欧美午夜精品久久久久久浪潮 | 在线观看成人国产 | 国产黄色电影 | 三级视频国产 | 久草在线在线精品观看 | 国产高清视频免费在线观看 | 中文字幕久久久精品 | 国产免费成人 | 久久久久人人 | 99热这里只有精品久久 | 国产成人在线观看 | 日韩精品大片 | 国精产品一二三线999 | 国产色 在线 | 欧美色图一区 | av在观看 | 99久热在线精品视频 | 有码中文在线 | 国产精品成人免费一区久久羞羞 | 欧美日韩在线免费观看 | 午夜精品一二三区 | 又黄又爽又湿又无遮挡的在线视频 | 91在线看黄 | 麻豆视频在线免费 | www.啪啪.com| 亚洲国产一区在线观看 | 亚洲精品88欧美一区二区 | 国产亚洲永久域名 | 在线电影 一区 | 日韩视频一区二区在线 | 一区二区三区三区在线 | 国产一区在线视频播放 | 24小时日本在线www免费的 | 九九热免费在线观看 | 久久久国产一区二区 | 美女视频黄色免费 | 精品国产一区二区三区在线 | 久久国产精品99久久久久久老狼 | 91丨精品丨蝌蚪丨白丝jk | 99视频偷窥在线精品国自产拍 | 人人人爽 | 99视频在线观看免费 | 久久99亚洲精品 | 国产成人精品一区二区三区 | 婷婷丁香色| 国产麻豆精品久久一二三 | 国产成人久久av | 欧美日韩高清国产 | 五月婷婷中文字幕 | 亚洲精品短视频 | 美女网站视频免费都是黄 | 视频高清 | 日日夜夜免费精品视频 | 91成品人影院 | 国产在线a | 国偷自产视频一区二区久 | 98精品国产自产在线观看 | 国产韩国日本高清视频 | 99福利片| 中文字幕丝袜一区二区 | 国产专区一 | 国产精品精品国产婷婷这里av | 91视频久久久久久 | 最新av在线播放 | 国产欧美精品一区二区三区 | 在线亚洲成人 | 国产成人精品亚洲 | 日韩高清网站 | 91成人免费视频 | 久久久.com| 中文字幕在线资源 | 97国产情侣爱久久免费观看 | 美女av在线免费 | 国产黄色精品网站 | 狠狠色丁香 | 天天弄天天操 | 色偷偷网站视频 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久久精品久久99 | 婷婷av网站 | 五月激情丁香婷婷 | 久久久.com | 91成熟丰满女人少妇 | 精品嫩模福利一区二区蜜臀 | 久久精品99国产精品日本 | 成人动漫一区二区 | 人人澡人人草 | 成人啪啪18免费游戏链接 | 国产精品日韩久久久久 | 99视频精品视频高清免费 | 日本资源中文字幕在线 | 日韩视频免费观看高清 | av网站手机在线观看 | www.色综合.com| 99精品一区二区三区 | 天天色天天操天天爽 | 一区二区三区四区五区在线 | 91看片在线免费观看 | 视频一区二区国产 | www视频免费在线观看 | 亚洲爽爽网 | 日韩性色 | 久久久久成人精品免费播放动漫 | 久久综合五月 | 一区二区三区三区在线 | 91探花国产综合在线精品 | 亚洲精品动漫在线 | 不卡在线一区 | 少妇高潮流白浆在线观看 | 亚洲精品国精品久久99热 | 日韩av三区| 亚洲天天摸日日摸天天欢 | 69亚洲精品| 国产一区二区在线免费播放 | 97视频在线观看成人 | 夜夜躁日日躁狠狠躁 | 在线视频一二区 | 免费观看性生活大片 | 91在线操| av综合站| av电影中文字幕在线观看 | 91精品色| 婷婷丁香久久五月婷婷 | 91丨九色丨高潮 | 香蕉在线观看视频 | 在线香蕉视频 | 免费黄色一区 | 97狠狠干| 久草在线观看视频免费 | 中国一级片免费看 | 日韩在线观看网址 | 亚洲四虎| 在线观看va | 99精品国产免费久久久久久下载 | 欧美精品久久人人躁人人爽 | 国产一区二区精品 | 亚洲2019精品 | 久久久久www| 国产 欧美 日产久久 | 麻豆一二三精选视频 | 中文字幕888 | 女人高潮特级毛片 | 日韩肉感妇bbwbbwbbw | 91精品国产网站 | 99精品在线免费观看 | 国产黄色大全 | 91成人网在线播放 | 色a网| 国产亚洲欧美在线视频 | 69国产成人综合久久精品欧美 | 日韩久久精品一区二区三区 | 国产成人久久77777精品 | 精品免费观看 | 在线日韩精品视频 | 免费午夜在线视频 | 亚洲.www| 久久久久久久久久免费视频 | 色美女在线 | 国产永久免费高清在线观看视频 | 欧美日韩免费一区二区 | 欧美视频www| 国产一区二区三精品久久久无广告 | 韩日av在线| 亚洲 欧洲 国产 日本 综合 | 99精品在线观看 | 久久午夜影院 | 最新国产中文字幕 | 在线观看日韩一区 | 国产精品99精品 | 亚洲影视资源 | 97看片吧| 久草在线费播放视频 | 国产日韩精品一区二区三区 | 亚洲国产婷婷 | 午夜日b视频 | 日本在线免费看 | 国产伦理一区二区三区 | 国产999免费视频 | 久久久久免费观看 | 亚洲精品视频免费看 | 久草电影在线观看 | 成人动漫精品一区二区 | 中文字幕免费观看 | av电影在线播放 | 久影院 | 国产高清视频在线播放一区 | 久久久久免费精品 | 色偷偷人人澡久久超碰69 | 草久久av| 91中文字幕永久在线 | 一本一本久久a久久精品牛牛影视 | 又黄又爽又湿又无遮挡的在线视频 | 韩国av在线播放 | 亚洲国产精品小视频 | 亚洲国产成人久久 | 波多野结衣精品 | 涩涩网站在线播放 | 人九九精品 | 日韩精品一区二区在线 | 国产在线播放观看 | 综合久久久 | 国产91精品看黄网站在线观看动漫 | 亚洲天堂在线观看完整版 | av高清免费| 一区二区三区高清不卡 | 日韩精品视频在线观看网址 | 国产精品嫩草影院123 | 在线观看视频亚洲 | 久久免费成人网 | 亚洲欧洲国产视频 | 国产精品久久视频 | 69xxxx欧美| 人人干人人上 | 欧美另类交人妖 | 日韩在线免费不卡 | 国产一二三精品 | 精品国产久 | 黄色毛片一级 | 9在线观看免费高清完整版在线观看明 | 国产成人精品久久二区二区 | 久久久www成人免费毛片麻豆 | 久久综合久久综合这里只有精品 | 伊人www22综合色 | 一区二区在线影院 | 亚洲三级视频 | 国产一二三区av | www.久久爱.cn| 午夜在线观看 | 欧美在线日韩在线 | 99久久夜色精品国产亚洲96 | 久久99久久99精品中文字幕 | 成人免费一区二区三区在线观看 | 国产精品乱码一区二区视频 | 婷婷激情影院 | 激情视频网页 | 亚洲视频电影在线 | 天天摸天天干天天操天天射 | 国产成人在线观看免费 | 久久久免费视频播放 | 国产一区在线视频播放 | 国产色资源 | 天天天色综合 | 色视频在线观看 | 美女黄频视频大全 | 色综合久久88 | 可以免费看av | 日韩字幕在线 | 操操综合 | 毛片在线网 | 亚洲精品免费观看视频 | 97超碰人人模人人人爽人人爱 | 视频国产区 | 亚洲九九精品 | 国产成人精品一区二区在线观看 | 亚洲日本三级 | 久久精品久久久精品美女 | 7777xxxx| 欧美国产亚洲精品久久久8v | 国产一区私人高清影院 | 天天干天天操天天 | 亚洲 欧美 另类人妖 | 毛片3 | 亚洲精品一区二区三区在线观看 | 国产美女精品视频免费观看 | 韩国在线视频一区 | 亚洲成人av片 | 色老板在线视频 | 久久久亚洲影院 | 五月婷婷丁香网 | www视频在线观看 | 国产精品自产拍在线观看网站 | 欧美日韩一区二区三区免费视频 | 亚洲精品国精品久久99热 | 欧美成人猛片 | 国产69精品久久久久99 | 国产视频一区在线播放 | 久久精品99久久 | 久久精品视频免费观看 | 久久精品99国产精品酒店日本 | 国产精品国内免费一区二区三区 | 成人午夜剧场在线观看 | 久产久精国产品 | 亚洲综合在线视频 | 日韩av电影免费在线观看 | 天天草夜夜 | 成人免费视频播放 | 久久蜜臀一区二区三区av | 在线黄色免费 | 色网站视频 | 成人资源在线播放 | 91视视频在线直接观看在线看网页在线看 | 日韩免费视频观看 | 免费黄色网址网站 | 91看片淫黄大片91 | 在线观看视频97 | 成年人在线电影 | 婷婷伊人五月 | 黄色免费网站下载 | 黄污在线看 | 婷婷丁香久久五月婷婷 | 人人射人人爱 | 免费看av在线 | 91久久久久久久一区二区 | 在线免费高清一区二区三区 | 中文字幕在线观看播放 | 欧美日韩不卡一区二区三区 | 在线观看一 | 99久久免费看 | 日韩精品第一区 | 免费看黄电影 | 人人爽人人爱 | 丁香久久五月 | 亚洲精选视频在线 | 国产精品a久久 | 人人狠狠综合久久亚洲 | 国产一级电影在线 | 91精品免费在线观看 | 97视频在线免费播放 | 国产又粗又硬又长又爽的视频 | 欧美日韩国产在线精品 | 91爱爱免费观看 | 亚洲黄色免费在线看 | 日韩免费视频一区二区 | 国产最新视频在线观看 | 亚洲欧洲中文日韩久久av乱码 | 国产91免费在线 | 国产96精品 | av中文字幕电影 | 黄污在线观看 | 一区二区三区动漫 | 国产精品自产拍在线观看 | 国产成人99av超碰超爽 | 久久伊人精品一区二区三区 | 91视频啊啊啊 | 免费色视频网站 | 一区二区三区av在线 | 午夜一级免费电影 | 在线三级播放 | 黄色亚洲免费 | 国产成人精品久久久久 | 日韩免费在线视频 | 日韩在线视频免费播放 | 久久黄色美女 | 国内一区二区视频 | 美女视频黄免费网站 | 国产精品99久久久久久有的能看 | 精品欧美一区二区三区久久久 | 久久午夜剧场 | 99久久久成人国产精品 | 国产91区 | 高潮久久久久久 | 啪啪动态视频 | 婷婷av网站| 五月开心六月婷婷 | 中文字幕免费观看视频 | 久久国产精品精品国产色婷婷 | 毛片激情永久免费 | 天天干天天操天天做 | 岛国精品一区二区 | 九九热只有精品 | 天天久久综合 | 九九九九九九精品 | 午夜精品久久久久久久99无限制 | 91在线播放视频 | 亚洲美女免费精品视频在线观看 | 国产精品一区欧美 | 国产精品免费在线观看视频 | 亚洲三级黄色 | 五月婷婷综合激情网 | 久久国产热视频 | 国产精品99久久久精品免费观看 | 黄色.com| 国语精品免费视频 | 亚洲精品中文在线资源 | 国产精品免费久久久久 | 久久久免费在线观看 | 久久久亚洲麻豆日韩精品一区三区 | 亚洲理论影院 | 日韩精品电影在线播放 | 国产一级在线观看视频 | 免费在线观看黄色网 | 欧美日韩在线视频一区二区 | 91麻豆精品国产91久久久更新时间 | 808电影免费观看三年 | 久久黄色影院 | 国产流白浆高潮在线观看 | 久久久久久久久毛片精品 | 日本中文字幕观看 | 久草免费在线观看视频 | 在线观看成人一级片 | 精品在线观看一区二区三区 | 99精品欧美一区二区三区黑人哦 | 伊人婷婷久久 | 亚洲最新毛片 | 色综合www | 五月情婷婷 | 久久经典视频 | 国产一区二区久久 | 日韩电影一区二区三区在线观看 | 日本丰满少妇免费一区 | 欧美另类一二三四区 | 伊人热 | 婷婷色社区 | 色噜噜在线观看视频 | 激情av网址| 国产成人av电影在线观看 | 福利片视频区 | 国产精品美女在线 | 91亚洲狠狠婷婷综合久久久 | 国产在线高清视频 | 色视频网页| 久久久久网址 | 国产精品video | 日韩一区视频在线 | 99久久精品国产毛片 | 欧美精品久久久久久久久免 | 国产视频在线观看免费 | 国产精品久久久久久久久久久久午夜 | 亚洲精品乱码 | 国产成人99久久亚洲综合精品 | .国产精品成人自产拍在线观看6 | 在线亚洲天堂网 | av黄色免费在线观看 | 亚洲黄色在线播放 | 99爱爱| 日日夜操| 色婷婷久久久 | 国产精品入口a级 | 天天五月天色 | 色综合久久久久久久久五月 | 激情五月婷婷综合网 | 日韩一级黄色大片 | 男女啪啪网站 | 精品9999| 亚州国产精品视频 | 中文乱幕日产无线码1区 | 中文在线天堂资源 | 99精品国产成人一区二区 | 欧美色图另类 | 国内视频1区 | 免费黄色av.| av一区在线| 日本一区二区高清不卡 | 久久中文精品视频 | 日p视频| 91丝袜美腿| 中文字幕在线免费观看 | 色香蕉在线视频 | 成人久久18免费 | 91亚洲精品久久久中文字幕 | 久久深爱网 | 免费网站在线观看人 | 欧美激情精品久久久久久 | 天天色 天天 | 成人动漫精品一区二区 | 久久精品99国产精品 | 精品国产_亚洲人成在线 | 久久中文字幕视频 | 视频二区在线 | 欧美日韩免费一区 | 国产精品1区2区在线观看 | 激情www | 国产成人一区二区三区在线观看 | 成人精品一区二区三区电影免费 | 久久久久久久久久久久久9999 | 夜添久久精品亚洲国产精品 | 成人国产精品免费 | 日日爽天天操 | 有码中文字幕在线观看 | 亚洲免费视频观看 | 国产精品ⅴa有声小说 | 色99之美女主播在线视频 | 蜜桃麻豆www久久囤产精品 | 亚洲成a人片综合在线 | 在线视频手机国产 | 黄免费在线观看 | 久久福利在线 | 久久爽久久爽久久av东京爽 | 91精品婷婷国产综合久久蝌蚪 | 91视频在线播放视频 | 97日日碰人人模人人澡分享吧 | 久久这里只有精品1 | 久久亚洲人 | 美女黄频视频大全 | 国产色女人 | 2021国产在线 | 丁香花五月 | 久久久精品国产一区二区电影四季 | 色噜噜噜噜 | 精品一区二区三区香蕉蜜桃 | 黄色特级一级片 | 超碰在线97国产 | 欧美va天堂在线电影 | 3d黄动漫免费看 | a成人v| 激情av网| 五月天堂网 | avwww在线观看| 国产精品久久久久久久免费大片 | 久久精品成人欧美大片古装 | 日产乱码一二三区别免费 | 97超碰人人模人人人爽人人爱 | 黄色1级毛片 | 国产免费又粗又猛又爽 | 久久99久久99精品免视看婷婷 | 亚洲综合狠狠干 | 亚洲精品乱码久久 | 久久国产精品免费一区二区三区 | h网站免费在线观看 | 亚洲视频99 | 九九久久影院 | 深爱婷婷久久综合 | 国产色在线观看 | 国产91精品一区二区麻豆网站 | 国产一区免费在线 | av短片在线观看 | 人人狠狠综合久久亚洲婷 | 久久免费播放 | 免费观看视频的网站 | 在线国产一区二区 | 欧美日韩一区二区三区免费视频 | 欧美孕妇与黑人孕交 | 日韩中文字幕网站 | 最近中文字幕第一页 | 久久综合色一综合色88 | 插婷婷 | 久久黄色美女 | 狠狠的干狠狠的操 | 一区二区视频在线观看免费 | 日本中文字幕在线 | 欧美三级高清 | 日韩aⅴ视频 | 天天操天天射天天爱 | av中文天堂在线 | 激情五月六月婷婷 | 五月开心婷婷 | 亚洲在线色 | 日韩av一区二区三区在线观看 | 国产在线一区观看 | 最新国产在线 | 精品国产成人av在线免 | 狠狠狠操 | 国产69精品久久久久久久久久 | 国产精品午夜在线观看 | 欧美日韩一区二区视频在线观看 | 2020天天干夜夜爽 | 91精品婷婷国产综合久久蝌蚪 | 久久国产精品免费 | 免费三级黄色片 | 久久免费观看少妇a级毛片 久久久久成人免费 | 免费在线观看日韩欧美 | 欧美日韩在线视频一区 | 亚洲欧美怡红院 | 日韩免费在线一区 | 成人中文字幕在线 | 久久国产精品小视频 | 99久久精品国产欧美主题曲 | 婷婷色站| 97视频播放 | 在线国产不卡 | 久久网页 | 日韩精品一区二区三区丰满 | 天堂av一区二区 | 午夜免费电影院 | 69热国产视频 | 天天在线视频色 | 综合色在线观看 | 黄色片免费电影 | 国产精品免费不卡 | 久久久影院| 国产免费亚洲 | 天天色 天天 | www.久久成人 | 狠狠狠的干 | 久久精品一二三区 | 天天干天天碰 | 91精品久久久久久综合乱菊 | 国产精品免费视频一区二区 | 色婷婷激情四射 | 亚洲免费在线观看视频 | 精品国产一区二区三区久久久 | 国产18精品乱码免费看 | 国产精品乱码一区二三区 | 欧美成人影音 | 六月丁香在线视频 | 国产尤物一区二区三区 | 91精品在线观看入口 | 亚洲在线a | 久久精品直播 | 色久综合| 国产精品嫩草在线 | 国产精品美女在线 | 国产精品午夜在线观看 | 国产精品视频免费看 | 国产黄色av网站 | 国产伦精品一区二区三区四区视频 | 国产99精品在线观看 | 免费a一级 | www亚洲视频 | 午夜成人免费影院 | 亚洲欧美经典 | 91九色porny蝌蚪主页 | 中文字幕日韩在线播放 | 亚洲欧美怡红院 | 香蕉影院在线播放 | 久久久五月天 | 99精品国产兔费观看久久99 | 91黄视频在线观看 | 免费一级日韩欧美性大片 | 免费69视频| 日韩69av| 国内成人精品2018免费看 | 久草9视频 | 亚洲japanese制服美女 | 成人久久久精品国产乱码一区二区 | 久久都是精品 | 最近2019好看的中文字幕免费 | 亚洲最新视频在线 | 黄色免费观看 | 日本婷婷色 | 国产午夜精品久久久久久久久久 | 福利一区在线视频 | 天天干天天拍天天操 | av在线看片| 久久精品国产免费 | 久热电影 | 999在线视频 | 999国产在线 | 国产裸体视频bbbbb | 中文在线字幕观看电影 | 色国产精品一区在线观看 | 国产日本在线观看 | 碰超在线97人人 | 一区二区视频网站 | 欧美综合在线视频 | 亚洲精品国产综合99久久夜夜嗨 | 深夜免费福利视频 | 国产精品一区二区你懂的 | 成人黄色在线 | 国产综合在线观看视频 | 成 人 黄 色 片 在线播放 | 国产经典 欧美精品 | 亚洲国产精品激情在线观看 | 人人dvd| 五月香视频在线观看 | a久久久久久 | 久久婷婷视频 | 狠狠操综合网 | 天天曰天天爽 | 欧美色精品天天在线观看视频 | 国产精品99久久久久久宅男 | 久久兔费看a级 | 久久午夜精品视频 | 欧美日韩一区二区三区不卡 | 亚洲影视九九影院在线观看 | 国产精品久久亚洲 | 香蕉视频免费看 | 天堂va欧美va亚洲va老司机 | 亚洲精品毛片一级91精品 | 色干综合| 最新av网址在线观看 | 欧美成人精品欧美一级乱 | 欧美一区二区三区在线看 | 免费亚洲婷婷 | 男女精品久久 | 中文字幕亚洲国产 | 国产精品久久久久久久久久久久久久 | 不卡国产视频 | 国产成人99久久亚洲综合精品 | 中文字幕免费高 | 国产精品美女久久久久久久 | 免费看的av片| 日韩久久久 | 欧美激情在线网站 | 美女视频国产 | 精品久久久久久亚洲综合网站 | 日韩免费在线观看视频 | 国产色视频网站 | 黄污网站在线观看 | 欧美色综合天天久久综合精品 | 久久亚洲成人网 | 美女一二三区 | 视频在线观看一区 | 91精品国 | 国产精品女人久久久 | 成人91在线 | 色av资源网| 中文字幕精 | 99精品国产99久久久久久97 | 特级a老妇做爰全过程 | 黄色免费观看网址 | 日韩一级成人av | 成人黄色影片在线 | 国产精品美乳一区二区免费 | 欧美成人精品三级在线观看播放 | 免费成人在线视频网站 | 97在线观看免费观看高清 | 久久久91精品国产一区二区三区 | 亚州成人av在线 | 久久久久国产成人免费精品免费 | www.色婷婷 | 黄色电影在线免费观看 | 久久久久久久国产精品影院 | 欧美日韩性视频在线 | 波多野结衣在线观看一区二区三区 | 欧美专区国产专区 | 丁香六月色 | 在线观看 亚洲 | 超碰在线人人 | 欧美精品资源 | 99九九热只有国产精品 | 久久国产精品一国产精品 | 天天操天天射天天插 | 99久久99热这里只有精品 | 9在线观看免费高清完整 | 国产精品69久久久久 | 国产人成在线观看 | 久久婷婷色综合 | 婷婷久久五月天 | 激情久久久久久久久久久久久久久久 | 亚洲国产精品视频在线观看 | 在线综合 亚洲 欧美在线视频 | a在线一区 | 2019中文| 91视频电影 | 久久久亚洲电影 | 深夜福利视频一区二区 | 在线观看aa | 国产主播99| 日韩乱码中文字幕 | 麻豆91精品视频 | 国产高清视频在线观看 | 激情婷婷综合网 | 视频国产精品 | 久久久久国产免费免费 | 日韩视频一区二区在线观看 | 在线观看国产中文字幕 | 色偷偷av男人天堂 | 中文字幕免费高 | 欧美aaa级片 | 久久成人国产精品一区二区 | 亚洲色图av| 99精品国产99久久久久久福利 | 中文字幕在线观看免费高清电影 | 免费在线观看一区 | 人人干人人搞 | 精品在线一区二区 | 2018精品视频| 亚洲精品综合一二三区在线观看 | 国产小视频在线播放 | 亚洲精品乱码久久久久久久久久 | 欧美亚洲成人免费 | 国产精品综合在线 | 亚洲在线综合 | 免费av在线网 | 国产在线a视频 | 麻豆影音先锋 |