Lines Matching refs:d

258 #define IS_NETMAP_DESC(d)	((d) && P2NMD(d)->self == P2NMD(d))  argument
259 #define NETMAP_FD(d) (P2NMD(d)->fd) argument
296 typedef void (*nm_cb_t)(u_char *, const struct nm_pkthdr *, const u_char *d);
611 struct nm_desc *d = NULL; in nm_open() local
631 if (namelen >= sizeof(d->req.nr_name)) { in nm_open()
730 d = (struct nm_desc *)calloc(1, sizeof(*d)); in nm_open()
731 if (d == NULL) { in nm_open()
736 d->self = d; /* set this early so nm_close() works */ in nm_open()
737 d->fd = open(NETMAP_DEVICE_NAME, O_RDWR); in nm_open()
738 if (d->fd < 0) { in nm_open()
744 d->req = *req; in nm_open()
745 d->req.nr_version = NETMAP_API; in nm_open()
746 d->req.nr_ringid &= ~NETMAP_RING_MASK; in nm_open()
749 d->req.nr_ringid |= nr_ringid; in nm_open()
750 d->req.nr_flags |= nr_flags; in nm_open()
751 memcpy(d->req.nr_name, ifname, namelen); in nm_open()
752 d->req.nr_name[namelen] = '\0'; in nm_open()
757 d->req.nr_arg1 = new_flags & NM_OPEN_ARG1 ? in nm_open()
761 d->req.nr_arg2 = new_flags & NM_OPEN_ARG2 ? in nm_open()
765 d->req.nr_arg3 = new_flags & NM_OPEN_ARG3 ? in nm_open()
769 d->req.nr_tx_slots = parent->req.nr_tx_slots; in nm_open()
770 d->req.nr_rx_slots = parent->req.nr_rx_slots; in nm_open()
771 d->req.nr_tx_rings = parent->req.nr_tx_rings; in nm_open()
772 d->req.nr_rx_rings = parent->req.nr_rx_rings; in nm_open()
778 memcpy(d->req.nr_name, parent->req.nr_name, in nm_open()
779 sizeof(d->req.nr_name)); in nm_open()
780 d->req.nr_ringid = parent->req.nr_ringid; in nm_open()
781 d->req.nr_flags = parent->req.nr_flags; in nm_open()
785 d->req.nr_ringid |= new_flags & (NETMAP_NO_TX_POLL | NETMAP_DO_RX_POLL); in nm_open()
787 if (ioctl(d->fd, NIOCREGIF, &d->req)) { in nm_open()
793 if ((!(new_flags & NM_OPEN_NO_MMAP) || parent) && nm_mmap(d, parent)) { in nm_open()
798 nr_reg = d->req.nr_flags & NR_REG_MASK; in nm_open()
801 d->first_tx_ring = d->last_tx_ring = d->req.nr_tx_rings; in nm_open()
802 d->first_rx_ring = d->last_rx_ring = d->req.nr_rx_rings; in nm_open()
804 d->first_tx_ring = 0; in nm_open()
805 d->first_rx_ring = 0; in nm_open()
806 d->last_tx_ring = d->req.nr_tx_rings - 1; in nm_open()
807 d->last_rx_ring = d->req.nr_rx_rings - 1; in nm_open()
809 d->first_tx_ring = 0; in nm_open()
810 d->first_rx_ring = 0; in nm_open()
811 d->last_tx_ring = d->req.nr_tx_rings; in nm_open()
812 d->last_rx_ring = d->req.nr_rx_rings; in nm_open()
815 d->first_tx_ring = d->last_tx_ring = in nm_open()
816 d->first_rx_ring = d->last_rx_ring = d->req.nr_ringid & NETMAP_RING_MASK; in nm_open()
818 d->first_tx_ring = d->last_tx_ring = 0; in nm_open()
819 d->first_rx_ring = d->last_rx_ring = 0; in nm_open()
827 d->first_tx_ring, d->last_tx_ring, d->req.nr_tx_rings, in nm_open()
828 d->first_rx_ring, d->last_rx_ring, d->req.nr_rx_rings); in nm_open()
829 for (i = 0; i <= d->req.nr_tx_rings; i++) { in nm_open()
830 struct netmap_ring *r = NETMAP_TXRING(d->nifp, i); in nm_open()
833 for (i = 0; i <= d->req.nr_rx_rings; i++) { in nm_open()
834 struct netmap_ring *r = NETMAP_RXRING(d->nifp, i); in nm_open()
840 d->cur_tx_ring = d->first_tx_ring; in nm_open()
841 d->cur_rx_ring = d->first_rx_ring; in nm_open()
842 return d; in nm_open()
845 nm_close(d); in nm_open()
855 nm_close(struct nm_desc *d) in nm_close() argument
864 if (d == NULL || d->self != d) in nm_close()
866 if (d->done_mmap && d->mem) in nm_close()
867 munmap(d->mem, d->memsize); in nm_close()
868 if (d->fd != -1){ in nm_close()
869 close(d->fd); in nm_close()
872 bzero(d, sizeof(*d)); in nm_close()
873 free(d); in nm_close()
879 nm_mmap(struct nm_desc *d, const struct nm_desc *parent) in nm_mmap() argument
884 parent->req.nr_arg2 == d->req.nr_arg2) { in nm_mmap()
887 d->memsize = parent->memsize; in nm_mmap()
888 d->mem = parent->mem; in nm_mmap()
891 d->memsize = d->req.nr_memsize; in nm_mmap()
892 d->mem = mmap(0, d->memsize, PROT_WRITE | PROT_READ, MAP_SHARED, in nm_mmap()
893 d->fd, 0); in nm_mmap()
894 if (d->mem == MAP_FAILED) { in nm_mmap()
897 d->done_mmap = 1; in nm_mmap()
900 struct netmap_if *nifp = NETMAP_IF(d->mem, d->req.nr_offset); in nm_mmap()
903 *(struct netmap_if **)(uintptr_t)&(d->nifp) = nifp; in nm_mmap()
904 *(struct netmap_ring **)(uintptr_t)&d->some_ring = r; in nm_mmap()
905 *(void **)(uintptr_t)&d->buf_start = NETMAP_BUF(r, 0); in nm_mmap()
906 *(void **)(uintptr_t)&d->buf_end = in nm_mmap()
907 (char *)d->mem + d->memsize; in nm_mmap()
920 nm_inject(struct nm_desc *d, const void *buf, size_t size) in nm_inject() argument
922 u_int c, n = d->last_tx_ring - d->first_tx_ring + 1; in nm_inject()
928 uint32_t ri = d->cur_tx_ring + c; in nm_inject()
930 if (ri > d->last_tx_ring) in nm_inject()
931 ri = d->first_tx_ring; in nm_inject()
932 ring = NETMAP_TXRING(d->nifp, ri); in nm_inject()
940 d->cur_tx_ring = ri; in nm_inject()
952 nm_dispatch(struct nm_desc *d, int cnt, nm_cb_t cb, u_char *arg) in nm_dispatch() argument
954 int n = d->last_rx_ring - d->first_rx_ring + 1; in nm_dispatch()
955 int c, got = 0, ri = d->cur_rx_ring; in nm_dispatch()
967 ri = d->cur_rx_ring + c; in nm_dispatch()
968 if (ri > d->last_rx_ring) in nm_dispatch()
969 ri = d->first_rx_ring; in nm_dispatch()
970 ring = NETMAP_RXRING(d->nifp, ri); in nm_dispatch()
977 d->hdr.len = d->hdr.caplen = ring->slot[i].len; in nm_dispatch()
978 d->hdr.ts = ring->ts; in nm_dispatch()
979 cb(arg, &d->hdr, buf); in nm_dispatch()
983 d->cur_rx_ring = ri; in nm_dispatch()
988 nm_nextpkt(struct nm_desc *d, struct nm_pkthdr *hdr) in nm_nextpkt() argument
990 int ri = d->cur_rx_ring; in nm_nextpkt()
994 struct netmap_ring *ring = NETMAP_RXRING(d->nifp, ri); in nm_nextpkt()
1009 d->cur_rx_ring = ri; in nm_nextpkt()
1013 if (ri > d->last_rx_ring) in nm_nextpkt()
1014 ri = d->first_rx_ring; in nm_nextpkt()
1015 } while (ri != d->cur_rx_ring); in nm_nextpkt()