Lines Matching refs:ring
80 struct ring { struct
85 void (*walk)(int sock, struct ring *ring); argument
234 static void walk_v1_v2_rx(int sock, struct ring *ring) in walk_v1_v2_rx() argument
241 bug_on(ring->type != PACKET_RX_RING); in walk_v1_v2_rx()
253 while (__v1_v2_rx_kernel_ready(ring->rd[frame_num].iov_base, in walk_v1_v2_rx()
254 ring->version)) { in walk_v1_v2_rx()
255 ppd.raw = ring->rd[frame_num].iov_base; in walk_v1_v2_rx()
257 switch (ring->version) { in walk_v1_v2_rx()
274 __v1_v2_rx_user_ready(ppd.raw, ring->version); in walk_v1_v2_rx()
276 frame_num = (frame_num + 1) % ring->rd_num; in walk_v1_v2_rx()
286 ring->version, total_packets, NUM_PACKETS); in walk_v1_v2_rx()
368 static inline void *get_next_frame(struct ring *ring, int n) in get_next_frame() argument
370 uint8_t *f0 = ring->rd[0].iov_base; in get_next_frame()
372 switch (ring->version) { in get_next_frame()
375 return ring->rd[n].iov_base; in get_next_frame()
377 return f0 + (n * ring->req3.tp_frame_size); in get_next_frame()
383 static void walk_tx(int sock, struct ring *ring) in walk_tx() argument
401 if (ring->version <= TPACKET_V2) in walk_tx()
402 nframes = ring->rd_num; in walk_tx()
404 nframes = ring->req3.tp_frame_nr; in walk_tx()
406 bug_on(ring->type != PACKET_TX_RING); in walk_tx()
433 void *next = get_next_frame(ring, frame_num); in walk_tx()
435 while (__tx_kernel_ready(next, ring->version) && in walk_tx()
439 switch (ring->version) { in walk_tx()
477 __tx_user_ready(next, ring->version); in walk_tx()
507 ring->version, total_packets, NUM_PACKETS); in walk_tx()
514 static void walk_v1_v2(int sock, struct ring *ring) in walk_v1_v2() argument
516 if (ring->type == PACKET_RX_RING) in walk_v1_v2()
517 walk_v1_v2_rx(sock, ring); in walk_v1_v2()
519 walk_tx(sock, ring); in walk_v1_v2()
595 static void walk_v3_rx(int sock, struct ring *ring) in walk_v3_rx() argument
602 bug_on(ring->type != PACKET_RX_RING); in walk_v3_rx()
614 pbd = (struct block_desc *) ring->rd[block_num].iov_base; in walk_v3_rx()
622 block_num = (block_num + 1) % ring->rd_num; in walk_v3_rx()
636 static void walk_v3(int sock, struct ring *ring) in walk_v3() argument
638 if (ring->type == PACKET_RX_RING) in walk_v3()
639 walk_v3_rx(sock, ring); in walk_v3()
641 walk_tx(sock, ring); in walk_v3()
644 static void __v1_v2_fill(struct ring *ring, unsigned int blocks) in __v1_v2_fill() argument
646 ring->req.tp_block_size = getpagesize() << 2; in __v1_v2_fill()
647 ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7; in __v1_v2_fill()
648 ring->req.tp_block_nr = blocks; in __v1_v2_fill()
650 ring->req.tp_frame_nr = ring->req.tp_block_size / in __v1_v2_fill()
651 ring->req.tp_frame_size * in __v1_v2_fill()
652 ring->req.tp_block_nr; in __v1_v2_fill()
654 ring->mm_len = ring->req.tp_block_size * ring->req.tp_block_nr; in __v1_v2_fill()
655 ring->walk = walk_v1_v2; in __v1_v2_fill()
656 ring->rd_num = ring->req.tp_frame_nr; in __v1_v2_fill()
657 ring->flen = ring->req.tp_frame_size; in __v1_v2_fill()
660 static void __v3_fill(struct ring *ring, unsigned int blocks, int type) in __v3_fill() argument
663 ring->req3.tp_retire_blk_tov = 64; in __v3_fill()
664 ring->req3.tp_sizeof_priv = 0; in __v3_fill()
665 ring->req3.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH; in __v3_fill()
667 ring->req3.tp_block_size = getpagesize() << 2; in __v3_fill()
668 ring->req3.tp_frame_size = TPACKET_ALIGNMENT << 7; in __v3_fill()
669 ring->req3.tp_block_nr = blocks; in __v3_fill()
671 ring->req3.tp_frame_nr = ring->req3.tp_block_size / in __v3_fill()
672 ring->req3.tp_frame_size * in __v3_fill()
673 ring->req3.tp_block_nr; in __v3_fill()
675 ring->mm_len = ring->req3.tp_block_size * ring->req3.tp_block_nr; in __v3_fill()
676 ring->walk = walk_v3; in __v3_fill()
677 ring->rd_num = ring->req3.tp_block_nr; in __v3_fill()
678 ring->flen = ring->req3.tp_block_size; in __v3_fill()
681 static void setup_ring(int sock, struct ring *ring, int version, int type) in setup_ring() argument
686 ring->type = type; in setup_ring()
687 ring->version = version; in setup_ring()
694 __v1_v2_fill(ring, blocks); in setup_ring()
695 ret = setsockopt(sock, SOL_PACKET, type, &ring->req, in setup_ring()
696 sizeof(ring->req)); in setup_ring()
700 __v3_fill(ring, blocks, type); in setup_ring()
701 ret = setsockopt(sock, SOL_PACKET, type, &ring->req3, in setup_ring()
702 sizeof(ring->req3)); in setup_ring()
711 ring->rd_len = ring->rd_num * sizeof(*ring->rd); in setup_ring()
712 ring->rd = malloc(ring->rd_len); in setup_ring()
713 if (ring->rd == NULL) { in setup_ring()
722 static void mmap_ring(int sock, struct ring *ring) in mmap_ring() argument
726 ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE, in mmap_ring()
728 if (ring->mm_space == MAP_FAILED) { in mmap_ring()
733 memset(ring->rd, 0, ring->rd_len); in mmap_ring()
734 for (i = 0; i < ring->rd_num; ++i) { in mmap_ring()
735 ring->rd[i].iov_base = ring->mm_space + (i * ring->flen); in mmap_ring()
736 ring->rd[i].iov_len = ring->flen; in mmap_ring()
740 static void bind_ring(int sock, struct ring *ring) in bind_ring() argument
746 ring->ll.sll_family = PF_PACKET; in bind_ring()
747 ring->ll.sll_protocol = htons(ETH_P_ALL); in bind_ring()
748 ring->ll.sll_ifindex = if_nametoindex("lo"); in bind_ring()
749 ring->ll.sll_hatype = 0; in bind_ring()
750 ring->ll.sll_pkttype = 0; in bind_ring()
751 ring->ll.sll_halen = 0; in bind_ring()
753 ret = bind(sock, (struct sockaddr *) &ring->ll, sizeof(ring->ll)); in bind_ring()
760 static void walk_ring(int sock, struct ring *ring) in walk_ring() argument
762 ring->walk(sock, ring); in walk_ring()
765 static void unmap_ring(int sock, struct ring *ring) in unmap_ring() argument
767 munmap(ring->mm_space, ring->mm_len); in unmap_ring()
768 free(ring->rd); in unmap_ring()
819 struct ring ring; in test_tpacket() local
834 memset(&ring, 0, sizeof(ring)); in test_tpacket()
835 setup_ring(sock, &ring, version, type); in test_tpacket()
836 mmap_ring(sock, &ring); in test_tpacket()
837 bind_ring(sock, &ring); in test_tpacket()
838 walk_ring(sock, &ring); in test_tpacket()
839 unmap_ring(sock, &ring); in test_tpacket()