Lines Matching refs:d

235 	struct nm_desc *d;  member
294 #define IS_NETMAP_DESC(d) ((d) && P2NMD(d)->self == P2NMD(d)) argument
295 #define NETMAP_FD(d) (P2NMD(d)->fd) argument
300 typedef void (*nm_cb_t)(u_char *, const struct nm_pkthdr *, const u_char *d);
612 nm_parse(const char *ifname, struct nm_desc *d, char *err) in nm_parse() argument
656 if (namelen >= sizeof(d->req.nr_name)) { in nm_parse()
660 memcpy(d->req.nr_name, ifname, namelen); in nm_parse()
661 d->req.nr_name[namelen] = '\0'; in nm_parse()
785 d->req.nr_flags |= nr_flags; in nm_parse()
786 d->req.nr_ringid |= nr_ringid; in nm_parse()
787 d->req.nr_arg2 = nr_arg2; in nm_parse()
789 d->self = d; in nm_parse()
815 struct nm_desc *d = NULL; in nm_open() local
826 d = (struct nm_desc *)calloc(1, sizeof(*d)); in nm_open()
827 if (d == NULL) { in nm_open()
832 d->self = d; /* set this early so nm_close() works */ in nm_open()
833 d->fd = open(NETMAP_DEVICE_NAME, O_RDWR); in nm_open()
834 if (d->fd < 0) { in nm_open()
840 d->req = *req; in nm_open()
843 if (nm_parse(ifname, d, errmsg) < 0) in nm_open()
847 d->req.nr_version = NETMAP_API; in nm_open()
848 d->req.nr_ringid &= NETMAP_RING_MASK; in nm_open()
854 d->req.nr_arg1 = new_flags & NM_OPEN_ARG1 ? in nm_open()
858 d->req.nr_arg2 = parent->req.nr_arg2; in nm_open()
862 d->req.nr_arg3 = new_flags & NM_OPEN_ARG3 ? in nm_open()
866 d->req.nr_tx_slots = parent->req.nr_tx_slots; in nm_open()
867 d->req.nr_rx_slots = parent->req.nr_rx_slots; in nm_open()
868 d->req.nr_tx_rings = parent->req.nr_tx_rings; in nm_open()
869 d->req.nr_rx_rings = parent->req.nr_rx_rings; in nm_open()
875 memcpy(d->req.nr_name, parent->req.nr_name, in nm_open()
876 sizeof(d->req.nr_name)); in nm_open()
877 d->req.nr_ringid = parent->req.nr_ringid; in nm_open()
878 d->req.nr_flags = parent->req.nr_flags; in nm_open()
882 d->req.nr_ringid |= new_flags & (NETMAP_NO_TX_POLL | NETMAP_DO_RX_POLL); in nm_open()
884 if (ioctl(d->fd, NIOCREGIF, &d->req)) { in nm_open()
889 nr_reg = d->req.nr_flags & NR_REG_MASK; in nm_open()
892 d->first_tx_ring = d->last_tx_ring = d->req.nr_tx_rings; in nm_open()
893 d->first_rx_ring = d->last_rx_ring = d->req.nr_rx_rings; in nm_open()
895 d->first_tx_ring = 0; in nm_open()
896 d->first_rx_ring = 0; in nm_open()
897 d->last_tx_ring = d->req.nr_tx_rings - 1; in nm_open()
898 d->last_rx_ring = d->req.nr_rx_rings - 1; in nm_open()
900 d->first_tx_ring = 0; in nm_open()
901 d->first_rx_ring = 0; in nm_open()
902 d->last_tx_ring = d->req.nr_tx_rings; in nm_open()
903 d->last_rx_ring = d->req.nr_rx_rings; in nm_open()
906 d->first_tx_ring = d->last_tx_ring = in nm_open()
907 d->first_rx_ring = d->last_rx_ring = d->req.nr_ringid & NETMAP_RING_MASK; in nm_open()
909 d->first_tx_ring = d->last_tx_ring = 0; in nm_open()
910 d->first_rx_ring = d->last_rx_ring = 0; in nm_open()
914 if ((!(new_flags & NM_OPEN_NO_MMAP) || parent) && nm_mmap(d, parent)) { in nm_open()
924 d->first_tx_ring, d->last_tx_ring, d->req.nr_tx_rings, in nm_open()
925 d->first_rx_ring, d->last_rx_ring, d->req.nr_rx_rings); in nm_open()
926 for (i = 0; i <= d->req.nr_tx_rings; i++) { in nm_open()
927 struct netmap_ring *r = NETMAP_TXRING(d->nifp, i); in nm_open()
930 for (i = 0; i <= d->req.nr_rx_rings; i++) { in nm_open()
931 struct netmap_ring *r = NETMAP_RXRING(d->nifp, i); in nm_open()
937 d->cur_tx_ring = d->first_tx_ring; in nm_open()
938 d->cur_rx_ring = d->first_rx_ring; in nm_open()
939 return d; in nm_open()
942 nm_close(d); in nm_open()
951 nm_close(struct nm_desc *d) in nm_close() argument
960 if (d == NULL || d->self != d) in nm_close()
962 if (d->done_mmap && d->mem) in nm_close()
963 munmap(d->mem, d->memsize); in nm_close()
964 if (d->fd != -1) { in nm_close()
965 close(d->fd); in nm_close()
968 bzero(d, sizeof(*d)); in nm_close()
969 free(d); in nm_close()
974 nm_mmap(struct nm_desc *d, const struct nm_desc *parent) in nm_mmap() argument
976 if (d->done_mmap) in nm_mmap()
980 parent->req.nr_arg2 == d->req.nr_arg2) { in nm_mmap()
983 d->memsize = parent->memsize; in nm_mmap()
984 d->mem = parent->mem; in nm_mmap()
987 d->memsize = d->req.nr_memsize; in nm_mmap()
988 d->mem = mmap(0, d->memsize, PROT_WRITE | PROT_READ, MAP_SHARED, in nm_mmap()
989 d->fd, 0); in nm_mmap()
990 if (d->mem == MAP_FAILED) { in nm_mmap()
993 d->done_mmap = 1; in nm_mmap()
996 struct netmap_if *nifp = NETMAP_IF(d->mem, d->req.nr_offset); in nm_mmap()
997 struct netmap_ring *r = NETMAP_RXRING(nifp, d->first_rx_ring); in nm_mmap()
1000 r = NETMAP_TXRING(nifp, d->first_tx_ring); in nm_mmap()
1003 *(struct netmap_if **)(uintptr_t)&(d->nifp) = nifp; in nm_mmap()
1004 *(struct netmap_ring **)(uintptr_t)&d->some_ring = r; in nm_mmap()
1005 *(void **)(uintptr_t)&d->buf_start = NETMAP_BUF(r, 0); in nm_mmap()
1006 *(void **)(uintptr_t)&d->buf_end = in nm_mmap()
1007 (char *)d->mem + d->memsize; in nm_mmap()
1020 nm_inject(struct nm_desc *d, const void *buf, size_t size) in nm_inject() argument
1022 u_int c, n = d->last_tx_ring - d->first_tx_ring + 1, in nm_inject()
1023 ri = d->cur_tx_ring; in nm_inject()
1031 if (ri > d->last_tx_ring) in nm_inject()
1032 ri = d->first_tx_ring; in nm_inject()
1033 ring = NETMAP_TXRING(d->nifp, ri); in nm_inject()
1056 d->cur_tx_ring = ri; in nm_inject()
1066 nm_dispatch(struct nm_desc *d, int cnt, nm_cb_t cb, u_char *arg) in nm_dispatch() argument
1068 int n = d->last_rx_ring - d->first_rx_ring + 1; in nm_dispatch()
1069 int c, got = 0, ri = d->cur_rx_ring; in nm_dispatch()
1070 d->hdr.buf = NULL; in nm_dispatch()
1071 d->hdr.flags = NM_MORE_PKTS; in nm_dispatch()
1072 d->hdr.d = d; in nm_dispatch()
1084 if (ri > d->last_rx_ring) in nm_dispatch()
1085 ri = d->first_rx_ring; in nm_dispatch()
1086 ring = NETMAP_RXRING(d->nifp, ri); in nm_dispatch()
1091 if (d->hdr.buf) { /* from previous round */ in nm_dispatch()
1092 cb(arg, &d->hdr, d->hdr.buf); in nm_dispatch()
1099 d->cur_rx_ring = ri; in nm_dispatch()
1100 d->hdr.slot = slot; in nm_dispatch()
1101 oldbuf = d->hdr.buf = (u_char *)NETMAP_BUF(ring, idx); in nm_dispatch()
1103 d->hdr.len = d->hdr.caplen = slot->len; in nm_dispatch()
1109 d->hdr.len += slot->len; in nm_dispatch()
1113 d->hdr.caplen += slot->len; in nm_dispatch()
1119 d->hdr.ts = ring->ts; in nm_dispatch()
1123 if (d->hdr.buf) { /* from previous round */ in nm_dispatch()
1124 d->hdr.flags = 0; in nm_dispatch()
1125 cb(arg, &d->hdr, d->hdr.buf); in nm_dispatch()
1131 nm_nextpkt(struct nm_desc *d, struct nm_pkthdr *hdr) in nm_nextpkt() argument
1133 int ri = d->cur_rx_ring; in nm_nextpkt()
1137 struct netmap_ring *ring = NETMAP_RXRING(d->nifp, ri); in nm_nextpkt()
1152 d->cur_rx_ring = ri; in nm_nextpkt()
1156 if (ri > d->last_rx_ring) in nm_nextpkt()
1157 ri = d->first_rx_ring; in nm_nextpkt()
1158 } while (ri != d->cur_rx_ring); in nm_nextpkt()