Lines Matching +full:device +full:- +full:handle
33 #include "pcap-int.h"
34 #include "pcap-rdmasniff.h"
65 rdmasniff_stats(pcap_t *handle, struct pcap_stat *stat) in rdmasniff_stats() argument
67 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_stats()
69 stat->ps_recv = priv->packets_recv; in rdmasniff_stats()
70 stat->ps_drop = 0; in rdmasniff_stats()
71 stat->ps_ifdrop = 0; in rdmasniff_stats()
77 rdmasniff_cleanup(pcap_t *handle) in rdmasniff_cleanup() argument
79 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_cleanup()
81 ibv_dereg_mr(priv->mr); in rdmasniff_cleanup()
82 ibv_destroy_flow(priv->flow); in rdmasniff_cleanup()
83 ibv_destroy_qp(priv->qp); in rdmasniff_cleanup()
84 ibv_destroy_cq(priv->cq); in rdmasniff_cleanup()
85 ibv_dealloc_pd(priv->pd); in rdmasniff_cleanup()
86 ibv_destroy_comp_channel(priv->channel); in rdmasniff_cleanup()
87 ibv_close_device(priv->context); in rdmasniff_cleanup()
88 free(priv->oneshot_buffer); in rdmasniff_cleanup()
90 pcapint_cleanup_live_common(handle); in rdmasniff_cleanup()
94 rdmasniff_post_recv(pcap_t *handle, uint64_t wr_id) in rdmasniff_post_recv() argument
96 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_post_recv()
101 sg_entry.addr = (uintptr_t) handle->buffer + RDMASNIFF_RECEIVE_SIZE * wr_id; in rdmasniff_post_recv()
102 sg_entry.lkey = priv->mr->lkey; in rdmasniff_post_recv()
109 ibv_post_recv(priv->qp, &wr, &bad_wr); in rdmasniff_post_recv()
113 rdmasniff_read(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user) in rdmasniff_read() argument
115 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_read()
123 if (!priv->cq_event) { in rdmasniff_read()
124 while (ibv_get_cq_event(priv->channel, &ev_cq, &ev_ctx) < 0) { in rdmasniff_read()
128 if (handle->break_loop) { in rdmasniff_read()
129 handle->break_loop = 0; in rdmasniff_read()
133 ibv_ack_cq_events(priv->cq, 1); in rdmasniff_read()
134 ibv_req_notify_cq(priv->cq, 0); in rdmasniff_read()
135 priv->cq_event = 1; in rdmasniff_read()
144 * return a too-low count. in rdmasniff_read()
154 if (ibv_poll_cq(priv->cq, 1, &wc) != 1) { in rdmasniff_read()
155 priv->cq_event = 0; in rdmasniff_read()
167 pkth.caplen = min(pkth.len, (u_int)handle->snapshot); in rdmasniff_read()
170 pktd = (u_char *) handle->buffer + wc.wr_id * RDMASNIFF_RECEIVE_SIZE; in rdmasniff_read()
172 if (handle->fcode.bf_insns == NULL || in rdmasniff_read()
173 pcapint_filter(handle->fcode.bf_insns, pktd, pkth.len, pkth.caplen)) { in rdmasniff_read()
175 ++priv->packets_recv; in rdmasniff_read()
179 rdmasniff_post_recv(handle, wc.wr_id); in rdmasniff_read()
181 if (handle->break_loop) { in rdmasniff_read()
182 handle->break_loop = 0; in rdmasniff_read()
194 pcap_t *handle = sp->pd; in rdmasniff_oneshot() local
195 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_oneshot()
197 *sp->hdr = *h; in rdmasniff_oneshot()
198 memcpy(priv->oneshot_buffer, bytes, h->caplen); in rdmasniff_oneshot()
199 *sp->pkt = priv->oneshot_buffer; in rdmasniff_oneshot()
203 rdmasniff_activate(pcap_t *handle) in rdmasniff_activate() argument
205 struct pcap_rdmasniff *priv = handle->priv; in rdmasniff_activate()
212 priv->context = ibv_open_device(priv->rdma_device); in rdmasniff_activate()
213 if (!priv->context) { in rdmasniff_activate()
214 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
215 "Failed to open device %s", handle->opt.device); in rdmasniff_activate()
219 priv->pd = ibv_alloc_pd(priv->context); in rdmasniff_activate()
220 if (!priv->pd) { in rdmasniff_activate()
221 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
222 "Failed to alloc PD for device %s", handle->opt.device); in rdmasniff_activate()
226 priv->channel = ibv_create_comp_channel(priv->context); in rdmasniff_activate()
227 if (!priv->channel) { in rdmasniff_activate()
228 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
229 "Failed to create comp channel for device %s", handle->opt.device); in rdmasniff_activate()
233 priv->cq = ibv_create_cq(priv->context, RDMASNIFF_NUM_RECEIVES, in rdmasniff_activate()
234 NULL, priv->channel, 0); in rdmasniff_activate()
235 if (!priv->cq) { in rdmasniff_activate()
236 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
237 "Failed to create CQ for device %s", handle->opt.device); in rdmasniff_activate()
241 ibv_req_notify_cq(priv->cq, 0); in rdmasniff_activate()
244 qp_init_attr.send_cq = qp_init_attr.recv_cq = priv->cq; in rdmasniff_activate()
248 priv->qp = ibv_create_qp(priv->pd, &qp_init_attr); in rdmasniff_activate()
249 if (!priv->qp) { in rdmasniff_activate()
250 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
251 "Failed to create QP for device %s", handle->opt.device); in rdmasniff_activate()
257 qp_attr.port_num = priv->port_num; in rdmasniff_activate()
258 if (ibv_modify_qp(priv->qp, &qp_attr, IBV_QP_STATE | IBV_QP_PORT)) { in rdmasniff_activate()
259 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
260 "Failed to modify QP to INIT for device %s", handle->opt.device); in rdmasniff_activate()
266 if (ibv_modify_qp(priv->qp, &qp_attr, IBV_QP_STATE)) { in rdmasniff_activate()
267 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
268 "Failed to modify QP to RTR for device %s", handle->opt.device); in rdmasniff_activate()
275 flow_attr.port = priv->port_num; in rdmasniff_activate()
276 priv->flow = ibv_create_flow(priv->qp, &flow_attr); in rdmasniff_activate()
277 if (!priv->flow) { in rdmasniff_activate()
278 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
279 "Failed to create flow for device %s", handle->opt.device); in rdmasniff_activate()
283 handle->bufsize = RDMASNIFF_NUM_RECEIVES * RDMASNIFF_RECEIVE_SIZE; in rdmasniff_activate()
284 handle->buffer = malloc(handle->bufsize); in rdmasniff_activate()
285 if (!handle->buffer) { in rdmasniff_activate()
286 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
287 "Failed to allocate receive buffer for device %s", handle->opt.device); in rdmasniff_activate()
291 priv->oneshot_buffer = malloc(RDMASNIFF_RECEIVE_SIZE); in rdmasniff_activate()
292 if (!priv->oneshot_buffer) { in rdmasniff_activate()
293 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
294 "Failed to allocate oneshot buffer for device %s", handle->opt.device); in rdmasniff_activate()
298 priv->mr = ibv_reg_mr(priv->pd, handle->buffer, handle->bufsize, IBV_ACCESS_LOCAL_WRITE); in rdmasniff_activate()
299 if (!priv->mr) { in rdmasniff_activate()
300 snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, in rdmasniff_activate()
301 "Failed to register MR for device %s", handle->opt.device); in rdmasniff_activate()
307 rdmasniff_post_recv(handle, i); in rdmasniff_activate()
310 if (!ibv_query_port(priv->context, priv->port_num, &port_attr) && in rdmasniff_activate()
312 handle->linktype = DLT_INFINIBAND; in rdmasniff_activate()
314 handle->linktype = DLT_EN10MB; in rdmasniff_activate()
317 if (handle->snapshot <= 0 || handle->snapshot > RDMASNIFF_RECEIVE_SIZE) in rdmasniff_activate()
318 handle->snapshot = RDMASNIFF_RECEIVE_SIZE; in rdmasniff_activate()
320 handle->offset = 0; in rdmasniff_activate()
321 handle->read_op = rdmasniff_read; in rdmasniff_activate()
322 handle->stats_op = rdmasniff_stats; in rdmasniff_activate()
323 handle->cleanup_op = rdmasniff_cleanup; in rdmasniff_activate()
324 handle->setfilter_op = pcapint_install_bpf_program; in rdmasniff_activate()
325 handle->setdirection_op = NULL; in rdmasniff_activate()
326 handle->set_datalink_op = NULL; in rdmasniff_activate()
327 handle->getnonblock_op = pcapint_getnonblock_fd; in rdmasniff_activate()
328 handle->setnonblock_op = pcapint_setnonblock_fd; in rdmasniff_activate()
329 handle->oneshot_callback = rdmasniff_oneshot; in rdmasniff_activate()
330 handle->selectable_fd = priv->channel->fd; in rdmasniff_activate()
335 if (priv->mr) { in rdmasniff_activate()
336 ibv_dereg_mr(priv->mr); in rdmasniff_activate()
339 if (priv->flow) { in rdmasniff_activate()
340 ibv_destroy_flow(priv->flow); in rdmasniff_activate()
343 if (priv->qp) { in rdmasniff_activate()
344 ibv_destroy_qp(priv->qp); in rdmasniff_activate()
347 if (priv->cq) { in rdmasniff_activate()
348 ibv_destroy_cq(priv->cq); in rdmasniff_activate()
351 if (priv->channel) { in rdmasniff_activate()
352 ibv_destroy_comp_channel(priv->channel); in rdmasniff_activate()
355 if (priv->pd) { in rdmasniff_activate()
356 ibv_dealloc_pd(priv->pd); in rdmasniff_activate()
359 if (priv->context) { in rdmasniff_activate()
360 ibv_close_device(priv->context); in rdmasniff_activate()
363 if (priv->oneshot_buffer) { in rdmasniff_activate()
364 free(priv->oneshot_buffer); in rdmasniff_activate()
371 rdmasniff_create(const char *device, char *ebuf, int *is_ours) in rdmasniff_create() argument
393 namelen = strlen(device); in rdmasniff_create()
395 port = strchr(device, ':'); in rdmasniff_create()
399 namelen = port - device; in rdmasniff_create()
408 if (strlen(dev_list[i]->name) == namelen && in rdmasniff_create()
409 !strncmp(device, dev_list[i]->name, namelen)) { in rdmasniff_create()
414 p->activate_op = rdmasniff_activate; in rdmasniff_create()
415 priv = p->priv; in rdmasniff_create()
416 priv->rdma_device = dev_list[i]; in rdmasniff_create()
417 priv->port_num = port_num; in rdmasniff_create()
442 * XXX - do the notions of "up", "running", or in rdmasniff_findalldevs()
445 if (!pcapint_add_dev(devlistp, dev_list[i]->name, 0, "RDMA sniffer", err_str)) { in rdmasniff_findalldevs()
446 ret = -1; in rdmasniff_findalldevs()