Lines Matching refs:ring
78 struct ring { struct
83 void (*walk)(int sock, struct ring *ring); argument
232 static void walk_v1_v2_rx(int sock, struct ring *ring) in walk_v1_v2_rx() argument
239 bug_on(ring->type != PACKET_RX_RING); in walk_v1_v2_rx()
252 while (__v1_v2_rx_kernel_ready(ring->rd[frame_num].iov_base, in walk_v1_v2_rx()
253 ring->version)) { in walk_v1_v2_rx()
254 ppd.raw = ring->rd[frame_num].iov_base; in walk_v1_v2_rx()
256 switch (ring->version) { in walk_v1_v2_rx()
273 __v1_v2_rx_user_ready(ppd.raw, ring->version); in walk_v1_v2_rx()
275 frame_num = (frame_num + 1) % ring->rd_num; in walk_v1_v2_rx()
285 ring->version, total_packets, NUM_PACKETS); in walk_v1_v2_rx()
351 static void walk_v1_v2_tx(int sock, struct ring *ring) in walk_v1_v2_tx() argument
364 bug_on(ring->type != PACKET_TX_RING); in walk_v1_v2_tx()
365 bug_on(ring->rd_num < NUM_PACKETS); in walk_v1_v2_tx()
391 while (__v1_v2_tx_kernel_ready(ring->rd[frame_num].iov_base, in walk_v1_v2_tx()
392 ring->version) && in walk_v1_v2_tx()
394 ppd.raw = ring->rd[frame_num].iov_base; in walk_v1_v2_tx()
396 switch (ring->version) { in walk_v1_v2_tx()
421 __v1_v2_tx_user_ready(ppd.raw, ring->version); in walk_v1_v2_tx()
423 frame_num = (frame_num + 1) % ring->rd_num; in walk_v1_v2_tx()
451 ring->version, total_packets, NUM_PACKETS); in walk_v1_v2_tx()
458 static void walk_v1_v2(int sock, struct ring *ring) in walk_v1_v2() argument
460 if (ring->type == PACKET_RX_RING) in walk_v1_v2()
461 walk_v1_v2_rx(sock, ring); in walk_v1_v2()
463 walk_v1_v2_tx(sock, ring); in walk_v1_v2()
539 static void walk_v3_rx(int sock, struct ring *ring) in walk_v3_rx() argument
546 bug_on(ring->type != PACKET_RX_RING); in walk_v3_rx()
559 pbd = (struct block_desc *) ring->rd[block_num].iov_base; in walk_v3_rx()
567 block_num = (block_num + 1) % ring->rd_num; in walk_v3_rx()
581 static void walk_v3(int sock, struct ring *ring) in walk_v3() argument
583 if (ring->type == PACKET_RX_RING) in walk_v3()
584 walk_v3_rx(sock, ring); in walk_v3()
589 static void __v1_v2_fill(struct ring *ring, unsigned int blocks) in __v1_v2_fill() argument
591 ring->req.tp_block_size = getpagesize() << 2; in __v1_v2_fill()
592 ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7; in __v1_v2_fill()
593 ring->req.tp_block_nr = blocks; in __v1_v2_fill()
595 ring->req.tp_frame_nr = ring->req.tp_block_size / in __v1_v2_fill()
596 ring->req.tp_frame_size * in __v1_v2_fill()
597 ring->req.tp_block_nr; in __v1_v2_fill()
599 ring->mm_len = ring->req.tp_block_size * ring->req.tp_block_nr; in __v1_v2_fill()
600 ring->walk = walk_v1_v2; in __v1_v2_fill()
601 ring->rd_num = ring->req.tp_frame_nr; in __v1_v2_fill()
602 ring->flen = ring->req.tp_frame_size; in __v1_v2_fill()
605 static void __v3_fill(struct ring *ring, unsigned int blocks) in __v3_fill() argument
607 ring->req3.tp_retire_blk_tov = 64; in __v3_fill()
608 ring->req3.tp_sizeof_priv = 0; in __v3_fill()
609 ring->req3.tp_feature_req_word = TP_FT_REQ_FILL_RXHASH; in __v3_fill()
611 ring->req3.tp_block_size = getpagesize() << 2; in __v3_fill()
612 ring->req3.tp_frame_size = TPACKET_ALIGNMENT << 7; in __v3_fill()
613 ring->req3.tp_block_nr = blocks; in __v3_fill()
615 ring->req3.tp_frame_nr = ring->req3.tp_block_size / in __v3_fill()
616 ring->req3.tp_frame_size * in __v3_fill()
617 ring->req3.tp_block_nr; in __v3_fill()
619 ring->mm_len = ring->req3.tp_block_size * ring->req3.tp_block_nr; in __v3_fill()
620 ring->walk = walk_v3; in __v3_fill()
621 ring->rd_num = ring->req3.tp_block_nr; in __v3_fill()
622 ring->flen = ring->req3.tp_block_size; in __v3_fill()
625 static void setup_ring(int sock, struct ring *ring, int version, int type) in setup_ring() argument
630 ring->type = type; in setup_ring()
631 ring->version = version; in setup_ring()
638 __v1_v2_fill(ring, blocks); in setup_ring()
639 ret = setsockopt(sock, SOL_PACKET, type, &ring->req, in setup_ring()
640 sizeof(ring->req)); in setup_ring()
644 __v3_fill(ring, blocks); in setup_ring()
645 ret = setsockopt(sock, SOL_PACKET, type, &ring->req3, in setup_ring()
646 sizeof(ring->req3)); in setup_ring()
655 ring->rd_len = ring->rd_num * sizeof(*ring->rd); in setup_ring()
656 ring->rd = malloc(ring->rd_len); in setup_ring()
657 if (ring->rd == NULL) { in setup_ring()
666 static void mmap_ring(int sock, struct ring *ring) in mmap_ring() argument
670 ring->mm_space = mmap(0, ring->mm_len, PROT_READ | PROT_WRITE, in mmap_ring()
672 if (ring->mm_space == MAP_FAILED) { in mmap_ring()
677 memset(ring->rd, 0, ring->rd_len); in mmap_ring()
678 for (i = 0; i < ring->rd_num; ++i) { in mmap_ring()
679 ring->rd[i].iov_base = ring->mm_space + (i * ring->flen); in mmap_ring()
680 ring->rd[i].iov_len = ring->flen; in mmap_ring()
684 static void bind_ring(int sock, struct ring *ring) in bind_ring() argument
688 ring->ll.sll_family = PF_PACKET; in bind_ring()
689 ring->ll.sll_protocol = htons(ETH_P_ALL); in bind_ring()
690 ring->ll.sll_ifindex = if_nametoindex("lo"); in bind_ring()
691 ring->ll.sll_hatype = 0; in bind_ring()
692 ring->ll.sll_pkttype = 0; in bind_ring()
693 ring->ll.sll_halen = 0; in bind_ring()
695 ret = bind(sock, (struct sockaddr *) &ring->ll, sizeof(ring->ll)); in bind_ring()
702 static void walk_ring(int sock, struct ring *ring) in walk_ring() argument
704 ring->walk(sock, ring); in walk_ring()
707 static void unmap_ring(int sock, struct ring *ring) in unmap_ring() argument
709 munmap(ring->mm_space, ring->mm_len); in unmap_ring()
710 free(ring->rd); in unmap_ring()
761 struct ring ring; in test_tpacket() local
776 memset(&ring, 0, sizeof(ring)); in test_tpacket()
777 setup_ring(sock, &ring, version, type); in test_tpacket()
778 mmap_ring(sock, &ring); in test_tpacket()
779 bind_ring(sock, &ring); in test_tpacket()
780 walk_ring(sock, &ring); in test_tpacket()
781 unmap_ring(sock, &ring); in test_tpacket()