Date: Tue, 22 Jun 2010 23:42:32 GMT From: Alexandre Fiveg <afiveg@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 180133 for review Message-ID: <201006222342.o5MNgWus097324@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180133?ac=10 Change 180133 by afiveg@cottonmouth on 2010/06/22 23:42:15 ringmap is ported to current. Affected files ... .. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#3 edit .. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#3 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#8 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#6 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#12 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#12 edit .. //depot/projects/soc2010/ringmap/tests/libpcap/easy_pcap.c#2 edit .. //depot/projects/soc2010/ringmap/tests/libpcap/test_pcap.c#2 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#3 (text+ko) ==== @@ -164,6 +164,8 @@ #ifdef RINGMAP #include <machine/bus.h> #include "../../sys/net/ringmap.h" +extern void uninit_mmapped_capturing(pcap_t *); +extern int pcap_read_ringmap(pcap_t *, int, pcap_handler, u_char *); #endif static int pcap_can_set_rfmon_bpf(pcap_t *p); @@ -214,6 +216,9 @@ static void pcap_cleanup_zbuf(pcap_t *p) { +#ifdef RINGMAP + RINGMAP_FUNC_DEBUG(start); +#endif /* * Delete the mappings. Note that p->buffer gets initialized to one * of the mmapped regions in this case, so do not try and free it @@ -1140,6 +1145,11 @@ struct ifreq ifr; #endif +#ifdef RINGMAP + RINGMAP_FUNC_DEBUG(start); + + uninit_mmapped_capturing(p); +#endif if (p->md.must_clear != 0) { /* * There's something we have to do when closing this @@ -1641,9 +1651,6 @@ goto bad; } -#ifdef RINGMAP - RINGMAP_FUNC_DEBUG(BIOCGDLT syscall done); -#endif #ifdef _AIX /* @@ -1799,9 +1806,6 @@ } } #elif defined(HAVE_BSD_IEEE80211) -#ifdef RINGMAP - RINGMAP_FUNC_DEBUG(2); -#endif /* * *BSD with the new 802.11 ioctls. * Do we want monitor mode? @@ -2078,7 +2082,11 @@ } } +#ifndef RINGMAP p->read_op = pcap_read_bpf; +#else + p->read_op = pcap_read_ringmap; +#endif p->inject_op = pcap_inject_bpf; p->setfilter_op = pcap_setfilter_bpf; p->setdirection_op = pcap_setdirection_bpf; ==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#3 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#8 (text+ko) ==== @@ -42,7 +42,7 @@ adapter = (struct adapter *)device_get_softc(dev); ring->kernrp = RINGMAP_HW_READ_HEAD(adapter); - RINGMAP_HW_WRITE_TAIL(adapter, ring); + RINGMAP_HW_SYNC_TAIL(adapter, ring); adapter->rm->ring->hw_RDT = ring->userrp; } @@ -126,8 +126,11 @@ ring->kern_wait_user = 0; ring->user_wait_kern = 0; ring->interrupts_counter = 0; + RINGMAP_HW_WRITE_TAIL(adapter, SLOTS_NUMBER - 1); + ring->userrp = RINGMAP_HW_READ_TAIL(adapter); ring->size = SLOTS_NUMBER; + /* Set ring pointers */ for (slot_num = 0 ; slot_num < SLOTS_NUMBER ; slot_num ++){ if (rm_8254_set_slot(ring, adapter, slot_num) == -1){ ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#6 (text+ko) ==== @@ -20,12 +20,17 @@ #define RINGMAP_HW_READ_REG E1000_READ_REG #define RINGMAP_HW_WRITE_REG E1000_WRITE_REG + + #define RINGMAP_HW_READ_HEAD(adapter) \ RINGMAP_HW_READ_REG(&adapter->hw, E1000_RDH(0)) -#define RINGMAP_HW_WRITE_TAIL(adapter, ring) \ +#define RINGMAP_HW_SYNC_TAIL(adapter, ring) \ RINGMAP_HW_WRITE_REG(&adapter->hw, E1000_RDT(0), ring->userrp) - + +#define RINGMAP_HW_WRITE_TAIL(adapter, val) \ + RINGMAP_HW_WRITE_REG(&adapter->hw, E1000_RDT(0), val) + #define RINGMAP_HW_READ_TAIL(adapter) \ RINGMAP_HW_READ_REG(&adapter->hw, E1000_RDT(0)) ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#12 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#12 (text+ko) ==== @@ -206,11 +206,20 @@ /* Distance from KERN to USER pointer */ #define KERN_TO_USER_RING_DISTANCE(ringp) \ - (((ringp)->userrp == (ringp)->kernrp) ? SLOTS_NUMBER : R_DISTANCE((ringp)->kernrp, (ringp)->userrp, SLOTS_NUMBER)) + (((ringp)->userrp == (ringp)->kernrp) ? 0 : R_DISTANCE((ringp)->kernrp, (ringp)->userrp, SLOTS_NUMBER)) /* Distance from USER to KERN pointer */ #define USER_TO_KERN_RING_DISTANCE(ringp) \ - (R_DISTANCE((ringp)->userrp, (ringp)->kernrp, SLOTS_NUMBER)) + (((ringp)->userrp == (ringp)->kernrp) ? SLOTS_NUMBER : R_DISTANCE((ringp)->userrp, (ringp)->kernrp, SLOTS_NUMBER)) + +#define RING_IS_EMPTY(ringp) \ + ((USER_TO_KERN_RING_DISTANCE(ringp)) == 1) + +#define RING_NOT_EMPTY(ringp) \ + ((USER_TO_KERN_RING_DISTANCE(ringp)) > 1) + +#define RING_IS_FULL(ringp) \ + ((KERN_TO_USER_RING_DISTANCE(ringp)) == 0) /* Increment of USER pointer. (KERN pointer is incremented by Hardware) */ #define INC_USER_POINTER(ringp) \ ==== //depot/projects/soc2010/ringmap/tests/libpcap/easy_pcap.c#2 (text+ko) ==== @@ -17,11 +17,15 @@ int capture_pkts (const char*); +void got_packet(u_char *, const struct pcap_pkthdr *, const u_char *); pcap_t *handle; +#define HOWMANY 20 + + int main(int argc, char **argv) { @@ -49,9 +53,20 @@ fprintf(stderr, "pcap handle = NULL!: %s\n", errbuf); return (-1); } + + pcap_loop(handle, HOWMANY, got_packet, NULL); if (handle != NULL) pcap_close(handle); return (0); } + +/* + * Callback function. Will called for each captured packet + */ +void +got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) +{ + printf("got :) \n"); +} ==== //depot/projects/soc2010/ringmap/tests/libpcap/test_pcap.c#2 (text+ko) ====
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006222342.o5MNgWus097324>