Lines Matching refs:ring
66 struct ring {
71 void (*walk)(int sock, struct ring *ring);
220 static void walk_v1_v2_rx(int sock, struct ring *ring)
227 bug_on(ring->type != PACKET_RX_RING);
239 while (__v1_v2_rx_kernel_ready(ring->rd[frame_num].iov_base,
240 ring->version)) {
241 ppd.raw = ring->rd[frame_num].iov_base;
243 switch (ring->version) {
260 __v1_v2_rx_user_ready(ppd.raw, ring->version);
262 frame_num = (frame_num + 1) % ring->rd_num;
272 ring->version, total_packets, NUM_PACKETS);
354 static inline void *get_next_frame(struct ring *ring, int n)
356 uint8_t *f0 = ring->rd[0].iov_base;
358 switch (ring->version) {
361 return ring->rd[n].iov_base;
363 return f0 + (n * ring->req3.tp_frame_size);
369 static void walk_tx(int sock, struct ring *ring)
383 /* TPACKET_V{1,2} sets up the ring->rd* related variables based
387 if (ring->version <= TPACKET_V2)
388 nframes = ring->rd_num;
390 nframes = ring->req3.tp_frame_nr;
392 bug_on(ring->type != PACKET_TX_RING);
419 void *next = get_next_frame(ring, frame_num);
421 while (__tx_kernel_ready(next, ring->version) &&
425 switch (ring->version) {
463 __tx_user_ready(next, ring->version);
493 ring->version, total_packets, NUM_PACKETS);
500 static void walk_v1_v2(int sock, struct ring *ring)
502 if (ring->type == PACKET_RX_RING)
503 walk_v1_v2_rx(sock, ring);
505 walk_tx(sock, ring);
581 static void walk_v3_rx(int sock, struct ring *ring)
588 bug_on(ring->type != PACKET_RX_RING);
600 pbd = (struct block_desc *) ring->rd[block_num].iov_base;
608 block_num = (block_num + 1) % ring->rd_num;
622 static void walk_v3(int sock, struct ring *ring)
624 if (ring->type == PACKET_RX_RING)
625 walk_v3_rx(sock, ring);
627 walk_tx(sock, ring);
630 static void __v1_v2_fill(struct ring *ring, unsigned int blocks)
632 ring->req.tp_block_size = getpagesize() << 2;
633 ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7;
634 ring->req.tp_block_nr = blocks;
636 ring->req.tp_frame_nr = ring->req.tp_block_size /
637 ring->req.tp_frame_size *
638 ring->req.tp_block_nr;
640 ring->mm_len = ring->req.tp_block_size * ring->req.tp_block_nr;
641 ring->walk = walk_v1_v2;
642 ring->rd_num = ring->req.tp_frame_nr;
643 ring->flen = ring->req.tp_frame_size;
646 static void __v3_fill(struct ring *ring, unsigned int blocks, int type)
649 ring->req3.tp_retire_blk_tov = 64;
650 ring->req3.tp_sizeof_priv = 0;
651 ring->req3.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH;
653 ring->req3.tp_block_size = getpagesize() << 2;
654 ring->req3.tp_frame_size = TPACKET_ALIGNMENT << 7;
655 ring->req3.tp_block_nr = blocks;
657 ring->req3.tp_frame_nr = ring->req3.tp_block_size /
658 ring->req3.tp_frame_size *
659 ring->req3.tp_block_nr;
661 ring->mm_len = ring->req3.tp_block_size * ring->req3.tp_block_nr;
662 ring->walk = walk_v3;
663 ring->rd_num = ring->req3.tp_block_nr;
664 ring->flen = ring->req3.tp_block_size;
667 static void setup_ring(int sock, struct ring *ring, int version, int type)
672 ring->type = type;
673 ring->version = version;
680 __v1_v2_fill(ring, blocks);
681 ret = setsockopt(sock, SOL_PACKET, type, &ring->req,
682 sizeof(ring->req));
686 __v3_fill(ring, blocks, type);
687 ret = setsockopt(sock, SOL_PACKET, type, &ring->req3,
688 sizeof(ring->req3));
697 ring->rd_len = ring->rd_num * sizeof(*ring->rd);
698 ring->rd = malloc(ring->rd_len);
699 if (ring->rd == NULL) {
708 static void mmap_ring(int sock, struct ring *ring)
712 ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE,
714 if (ring->mm_space == MAP_FAILED) {
719 memset(ring->rd, 0, ring->rd_len);
720 for (i = 0; i < ring->rd_num; ++i) {
721 ring->rd[i].iov_base = ring->mm_space + (i * ring->flen);
722 ring->rd[i].iov_len = ring->flen;
726 static void bind_ring(int sock, struct ring *ring)
732 ring->ll.sll_family = PF_PACKET;
733 ring->ll.sll_protocol = htons(ETH_P_ALL);
734 ring->ll.sll_ifindex = if_nametoindex("lo");
735 ring->ll.sll_hatype = 0;
736 ring->ll.sll_pkttype = 0;
737 ring->ll.sll_halen = 0;
739 ret = bind(sock, (struct sockaddr *) &ring->ll, sizeof(ring->ll));
746 static void walk_ring(int sock, struct ring *ring)
748 ring->walk(sock, ring);
751 static void unmap_ring(int sock, struct ring *ring)
753 munmap(ring->mm_space, ring->mm_len);
754 free(ring->rd);
805 struct ring ring;
820 memset(&ring, 0, sizeof(ring));
821 setup_ring(sock, &ring, version, type);
822 mmap_ring(sock, &ring);
823 bind_ring(sock, &ring);
824 walk_ring(sock, &ring);
825 unmap_ring(sock, &ring);