Lines Matching refs:d

54 nmport_push_cleanup(struct nmport_d *d, struct nmport_cleanup_d *c)  in nmport_push_cleanup()  argument
56 c->next = d->clist; in nmport_push_cleanup()
57 d->clist = c; in nmport_push_cleanup()
61 nmport_pop_cleanup(struct nmport_d *d) in nmport_pop_cleanup() argument
65 top = d->clist; in nmport_pop_cleanup()
66 d->clist = d->clist->next; in nmport_pop_cleanup()
67 (*top->cleanup)(top, d); in nmport_pop_cleanup()
68 nmctx_free(d->ctx, top); in nmport_pop_cleanup()
71 void nmport_do_cleanup(struct nmport_d *d) in nmport_do_cleanup() argument
73 while (d->clist != NULL) { in nmport_do_cleanup()
74 nmport_pop_cleanup(d); in nmport_do_cleanup()
81 struct nmport_d *d; in nmport_new_with_ctx() local
84 d = nmctx_malloc(ctx, sizeof(*d)); in nmport_new_with_ctx()
85 if (d == NULL) { in nmport_new_with_ctx()
89 memset(d, 0, sizeof(*d)); in nmport_new_with_ctx()
91 nmreq_header_init(&d->hdr, NETMAP_REQ_REGISTER, &d->reg); in nmport_new_with_ctx()
93 d->ctx = ctx; in nmport_new_with_ctx()
94 d->fd = -1; in nmport_new_with_ctx()
97 return d; in nmport_new_with_ctx()
109 nmport_delete(struct nmport_d *d) in nmport_delete() argument
111 nmctx_free(d->ctx, d); in nmport_delete()
115 nmport_extmem_cleanup(struct nmport_cleanup_d *c, struct nmport_d *d) in nmport_extmem_cleanup() argument
119 if (d->extmem == NULL) in nmport_extmem_cleanup()
122 nmreq_remove_option(&d->hdr, &d->extmem->nro_opt); in nmport_extmem_cleanup()
123 nmctx_free(d->ctx, d->extmem); in nmport_extmem_cleanup()
124 d->extmem = NULL; in nmport_extmem_cleanup()
129 nmport_extmem(struct nmport_d *d, void *base, size_t size) in nmport_extmem() argument
131 struct nmctx *ctx = d->ctx; in nmport_extmem()
134 if (d->register_done) { in nmport_extmem()
135 nmctx_ferror(ctx, "%s: cannot set extmem of an already registered port", d->hdr.nr_name); in nmport_extmem()
140 if (d->extmem != NULL) { in nmport_extmem()
141 nmctx_ferror(ctx, "%s: extmem already in use", d->hdr.nr_name); in nmport_extmem()
153 d->extmem = nmctx_malloc(ctx, sizeof(*d->extmem)); in nmport_extmem()
154 if (d->extmem == NULL) { in nmport_extmem()
155 nmctx_ferror(ctx, "%s: cannot allocate extmem option", d->hdr.nr_name); in nmport_extmem()
160 memset(d->extmem, 0, sizeof(*d->extmem)); in nmport_extmem()
161 d->extmem->nro_usrptr = (uintptr_t)base; in nmport_extmem()
162 d->extmem->nro_opt.nro_reqtype = NETMAP_REQ_OPT_EXTMEM; in nmport_extmem()
163 d->extmem->nro_info.nr_memsize = size; in nmport_extmem()
164 nmreq_push_option(&d->hdr, &d->extmem->nro_opt); in nmport_extmem()
167 nmport_push_cleanup(d, clnup); in nmport_extmem()
179 struct nmport_d *d) in nmport_extmem_from_file_cleanup() argument
188 nmport_extmem_from_file(struct nmport_d *d, const char *fname) in nmport_extmem_from_file() argument
190 struct nmctx *ctx = d->ctx; in nmport_extmem_from_file()
223 nmport_push_cleanup(d, &clnup->up); in nmport_extmem_from_file()
225 if (nmport_extmem(d, p, mapsize) < 0) in nmport_extmem_from_file()
235 nmport_pop_cleanup(d); in nmport_extmem_from_file()
243 nmport_extmem_getinfo(struct nmport_d *d) in nmport_extmem_getinfo() argument
245 if (d->extmem == NULL) in nmport_extmem_getinfo()
247 return &d->extmem->nro_info; in nmport_extmem_getinfo()
336 struct nmport_d *d = p->token; in NPOPT_PARSER() local
343 if (d->reg.nr_mem_id && d->reg.nr_mem_id != mem_id) { in NPOPT_PARSER()
345 mem_id, d->reg.nr_mem_id); in NPOPT_PARSER()
349 d->reg.nr_mem_id = mem_id; in NPOPT_PARSER()
356 struct nmport_d *d; in NPOPT_PARSER() local
360 d = p->token; in NPOPT_PARSER()
362 if (nmport_extmem_from_file(d, nmport_key(p, extmem, file)) < 0) in NPOPT_PARSER()
365 pi = &d->extmem->nro_info; in NPOPT_PARSER()
395 struct nmport_d *d; in NPOPT_PARSER() local
397 d = p->token; in NPOPT_PARSER()
401 d->reg.nr_tx_rings = nr_rings; in NPOPT_PARSER()
402 d->reg.nr_rx_rings = nr_rings; in NPOPT_PARSER()
406 d->reg.nr_host_tx_rings = nr_rings; in NPOPT_PARSER()
407 d->reg.nr_host_rx_rings = nr_rings; in NPOPT_PARSER()
411 d->reg.nr_tx_slots = nr_slots; in NPOPT_PARSER()
412 d->reg.nr_rx_slots = nr_slots; in NPOPT_PARSER()
415 d->reg.nr_tx_rings = atoi(nmport_key(p, conf, tx_rings)); in NPOPT_PARSER()
418 d->reg.nr_rx_rings = atoi(nmport_key(p, conf, rx_rings)); in NPOPT_PARSER()
421 d->reg.nr_host_tx_rings = atoi(nmport_key(p, conf, host_tx_rings)); in NPOPT_PARSER()
424 d->reg.nr_host_rx_rings = atoi(nmport_key(p, conf, host_rx_rings)); in NPOPT_PARSER()
427 d->reg.nr_tx_slots = atoi(nmport_key(p, conf, tx_slots)); in NPOPT_PARSER()
430 d->reg.nr_rx_slots = atoi(nmport_key(p, conf, rx_slots)); in NPOPT_PARSER()
464 nmport_parse(struct nmport_d *d, const char *ifname) in nmport_parse() argument
468 if (nmreq_header_decode(&scan, &d->hdr, d->ctx) < 0) { in nmport_parse()
473 if (nmreq_register_decode(&scan, &d->reg, d->ctx) < 0) { in nmport_parse()
478 if (nmreq_options_decode(scan, nmport_opt_parsers, d, d->ctx) < 0) { in nmport_parse()
484 nmport_undo_parse(d); in nmport_parse()
489 nmport_undo_parse(struct nmport_d *d) in nmport_undo_parse() argument
491 nmport_do_cleanup(d); in nmport_undo_parse()
492 memset(&d->reg, 0, sizeof(d->reg)); in nmport_undo_parse()
493 memset(&d->hdr, 0, sizeof(d->hdr)); in nmport_undo_parse()
499 struct nmport_d *d; in nmport_prepare() local
502 d = nmport_new(); in nmport_prepare()
503 if (d == NULL) in nmport_prepare()
507 if (nmport_parse(d, ifname) < 0) in nmport_prepare()
510 return d; in nmport_prepare()
513 nmport_undo_prepare(d); in nmport_prepare()
518 nmport_undo_prepare(struct nmport_d *d) in nmport_undo_prepare() argument
520 if (d == NULL) in nmport_undo_prepare()
522 nmport_undo_parse(d); in nmport_undo_prepare()
523 nmport_delete(d); in nmport_undo_prepare()
527 nmport_register(struct nmport_d *d) in nmport_register() argument
529 struct nmctx *ctx = d->ctx; in nmport_register()
531 if (d->register_done) { in nmport_register()
533 nmctx_ferror(ctx, "%s: already registered", d->hdr.nr_name); in nmport_register()
537 d->fd = open("/dev/netmap", O_RDWR); in nmport_register()
538 if (d->fd < 0) { in nmport_register()
543 if (ioctl(d->fd, NIOCCTRL, &d->hdr) < 0) { in nmport_register()
547 nmreq_foreach_option(&d->hdr, o) { in nmport_register()
550 d->hdr.nr_name, in nmport_register()
558 nmctx_ferror(ctx, "%s: %s", d->hdr.nr_name, strerror(errno)); in nmport_register()
562 d->register_done = 1; in nmport_register()
567 nmport_undo_register(d); in nmport_register()
572 nmport_undo_register(struct nmport_d *d) in nmport_undo_register() argument
574 if (d->fd >= 0) in nmport_undo_register()
575 close(d->fd); in nmport_undo_register()
576 d->fd = -1; in nmport_undo_register()
577 d->register_done = 0; in nmport_undo_register()
584 nmport_mmap(struct nmport_d *d) in nmport_mmap() argument
586 struct nmctx *ctx = d->ctx; in nmport_mmap()
591 if (d->mmap_done) { in nmport_mmap()
593 nmctx_ferror(ctx, "%s: already mapped", d->hdr.nr_name); in nmport_mmap()
597 if (!d->register_done) { in nmport_mmap()
606 if (m->mem_id == d->reg.nr_mem_id) in nmport_mmap()
616 if (d->extmem != NULL) { in nmport_mmap()
617 m->mem = (void *)((uintptr_t)d->extmem->nro_usrptr); in nmport_mmap()
618 m->size = d->extmem->nro_info.nr_memsize; in nmport_mmap()
621 m->mem = mmap(NULL, d->reg.nr_memsize, PROT_READ|PROT_WRITE, in nmport_mmap()
622 MAP_SHARED, d->fd, 0); in nmport_mmap()
627 m->size = d->reg.nr_memsize; in nmport_mmap()
629 m->mem_id = d->reg.nr_mem_id; in nmport_mmap()
639 d->mem = m; in nmport_mmap()
641 d->nifp = NETMAP_IF(m->mem, d->reg.nr_offset); in nmport_mmap()
643 num_tx = d->reg.nr_tx_rings + d->nifp->ni_host_tx_rings; in nmport_mmap()
644 for (i = 0; i < num_tx && !d->nifp->ring_ofs[i]; i++) in nmport_mmap()
646 d->first_tx_ring = i; in nmport_mmap()
647 for ( ; i < num_tx && d->nifp->ring_ofs[i]; i++) in nmport_mmap()
649 d->last_tx_ring = i - 1; in nmport_mmap()
651 num_rx = d->reg.nr_rx_rings + d->nifp->ni_host_rx_rings; in nmport_mmap()
652 for (i = 0; i < num_rx && !d->nifp->ring_ofs[i + num_tx]; i++) in nmport_mmap()
654 d->first_rx_ring = i; in nmport_mmap()
655 for ( ; i < num_rx && d->nifp->ring_ofs[i + num_tx]; i++) in nmport_mmap()
657 d->last_rx_ring = i - 1; in nmport_mmap()
659 d->mmap_done = 1; in nmport_mmap()
665 nmport_undo_mmap(d); in nmport_mmap()
670 nmport_undo_mmap(struct nmport_d *d) in nmport_undo_mmap() argument
673 struct nmctx *ctx = d->ctx; in nmport_undo_mmap()
675 m = d->mem; in nmport_undo_mmap()
691 d->mem = NULL; in nmport_undo_mmap()
694 d->mmap_done = 0; in nmport_undo_mmap()
695 d->mem = NULL; in nmport_undo_mmap()
696 d->nifp = NULL; in nmport_undo_mmap()
697 d->first_tx_ring = 0; in nmport_undo_mmap()
698 d->last_tx_ring = 0; in nmport_undo_mmap()
699 d->first_rx_ring = 0; in nmport_undo_mmap()
700 d->last_rx_ring = 0; in nmport_undo_mmap()
701 d->cur_tx_ring = 0; in nmport_undo_mmap()
702 d->cur_rx_ring = 0; in nmport_undo_mmap()
706 nmport_open_desc(struct nmport_d *d) in nmport_open_desc() argument
708 if (nmport_register(d) < 0) in nmport_open_desc()
711 if (nmport_mmap(d) < 0) in nmport_open_desc()
716 nmport_undo_open_desc(d); in nmport_open_desc()
721 nmport_undo_open_desc(struct nmport_d *d) in nmport_undo_open_desc() argument
723 nmport_undo_mmap(d); in nmport_undo_open_desc()
724 nmport_undo_register(d); in nmport_undo_open_desc()
731 struct nmport_d *d; in nmport_open() local
734 d = nmport_prepare(ifname); in nmport_open()
735 if (d == NULL) in nmport_open()
739 if (nmport_open_desc(d) < 0) in nmport_open()
742 return d; in nmport_open()
745 nmport_close(d); in nmport_open()
750 nmport_close(struct nmport_d *d) in nmport_close() argument
752 if (d == NULL) in nmport_close()
754 nmport_undo_open_desc(d); in nmport_close()
755 nmport_undo_prepare(d); in nmport_close()
759 nmport_clone(struct nmport_d *d) in nmport_clone() argument
764 ctx = d->ctx; in nmport_clone()
766 if (d->extmem != NULL && !d->register_done) { in nmport_clone()
776 c->hdr = d->hdr; in nmport_clone()
781 c->reg = d->reg; /* this also copies the mem_id */ in nmport_clone()
800 nmport_inject(struct nmport_d *d, const void *buf, size_t size) in nmport_inject() argument
802 u_int c, n = d->last_tx_ring - d->first_tx_ring + 1, in nmport_inject()
803 ri = d->cur_tx_ring; in nmport_inject()
811 if (ri > d->last_tx_ring) in nmport_inject()
812 ri = d->first_tx_ring; in nmport_inject()
813 ring = NETMAP_TXRING(d->nifp, ri); in nmport_inject()
836 d->cur_tx_ring = ri; in nmport_inject()