PERFORCE change 185371 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Thu Nov 4 12:33:51 UTC 2010
http://p4web.freebsd.org/@@185371?ac=10
Change 185371 by afiveg at cottonmouth on 2010/11/04 12:33:13
Changes in the libppcap:
- the new data structure pcap_ringmap inserted into pcap structure.
All variables that are related to ringmap are now members of pcap_ringmap.
- include "ringmap.h" is moved into pcap-int.h
Affected files ...
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#20 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#20 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#24 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap/pcap.h#4 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#37 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#53 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#52 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#35 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#36 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#30 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#20 (text+ko) ====
@@ -163,7 +163,6 @@
#ifdef RINGMAP
#include <machine/bus.h>
-#include "../../sys/net/ringmap.h"
extern void uninit_mmapped_capturing(pcap_t *);
#endif
@@ -1142,7 +1141,7 @@
#endif
#ifdef RINGMAP
- if (p->ringmap_flags == 1){
+ if (p->rp.status == 1) {
uninit_mmapped_capturing(p);
}
#endif
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#20 (text+ko) ====
@@ -56,6 +56,10 @@
#include <io.h>
#endif
+#ifdef RINGMAP
+#include "../../sys/net/ringmap.h"
+#endif
+
#if (defined(_MSC_VER) && (_MSC_VER <= 1200)) /* we are compiling with Visual Studio 6, that doesn't support the LL suffix*/
/*
@@ -333,8 +337,9 @@
struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
#ifdef RINGMAP
- int ringmap_flags;
- struct ring *ring;
+ struct pcap_ringmap rp;
+// int ringmap_flags;
+// struct ring *ring;
#endif
};
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#24 (text+ko) ====
@@ -72,11 +72,10 @@
#endif
#ifdef RINGMAP
-#include "../../sys/net/ringmap.h"
#include <sys/ioccom.h>
extern int init_mmapped_capturing(const char *device, pcap_t *);
-extern void ringmap_setfilter(struct bpf_program *);
+extern void ringmap_setfilter(struct bpf_program *, pcap_t *);
extern int pcap_read_ringmap(pcap_t *, int , pcap_handler , u_char *);
#endif
@@ -280,10 +279,10 @@
* requires the modification of these application. Thats why I set
* ringmap_flags staticaly here
*/
- p->ringmap_flags = set_ringmap_flags(1);
+ p->rp.status = set_ringmap_status(1, p);
/* Replace 1 with RINGMAP_ACTIVE macro */
- if (p->ringmap_flags == 1){
+ if (p->rp.status == 1) {
if (init_mmapped_capturing(source, p) < 0)
goto fail;
p->read_op = pcap_read_ringmap;
@@ -1022,9 +1021,9 @@
#ifdef RINGMAP
int err = p->setfilter_op(p, fp);
- if (p->ringmap_flags == 1){
+ if (p->rp.status == 1) {
if (err == 0)
- ringmap_setfilter(fp);
+ ringmap_setfilter(fp, p);
}
return (err);
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap/pcap.h#4 (text+ko) ====
@@ -340,7 +340,7 @@
void bpf_dump(struct bpf_program *, int);
#ifdef RINGMAP
-int set_ringmap_flags(int val);
+int set_ringmap_status(int val, pcap_t *p);
#endif
#if defined(WIN32)
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#37 (text+ko) ====
@@ -22,38 +22,25 @@
#include "pcap.h"
#include "pcap-int.h"
-#include "../../sys/net/ringmap.h"
-
-
-/* TODO: That's dirty! Place the next into the pcap structure */
-/* File descriptor of /dev/iface */
-int ringmap_cdev_fd = -1;
-int ringmap_active_status = 0;
-
-/*** F U N C T I O N S ***/
int init_mmapped_capturing(const char *device, pcap_t *);
void uninit_mmapped_capturing(pcap_t *);
int pcap_read_ringmap(pcap_t *, int , pcap_handler , u_char *);
-void ringmap_setfilter(struct bpf_program *);
+void ringmap_setfilter(struct bpf_program *, pcap_t *);
-
-
-
int
-set_ringmap_flags(int val)
+set_ringmap_status(int val, pcap_t *p)
{
/* If active status already set do nothing */
- if (ringmap_active_status == 0)
- ringmap_active_status = val;
-
- return (ringmap_active_status);
+ if (p->rp.status == 0)
+ p->rp.status = val;
+ return (p->rp.status);
}
-/********************************************************
+/*
* Open (/dev/iface) device to communicate with
- * kernel. Map buffers by calling mmap (/dev/mem, ...)
+ * kernel. Map buffers by calling mmap(/dev/mem, ...)
* in space of our user process.
- ********************************************************/
+ */
int
init_mmapped_capturing(const char *device, pcap_t *p)
{
@@ -68,39 +55,41 @@
sprintf(dev_path, "/dev/%s", device);
/* Open /dev/ device for communication with our driver */
- if ((ringmap_cdev_fd = open(dev_path, O_RDWR)) == -1) {
+ if ((p->rp.cdev_fd = open(dev_path, O_RDWR)) == -1) {
printf("[%s] Error by opening %s \n", __func__, dev_path);
perror("/dev/" RINGMAP_DEVICE);
- return(-1);
+ return (-1);
}
+ /* Set queue number we want to attach to our thread */
+ queue_num = DEFAULT_QUEUE;
+
+ /* Associate our thread with the queue_num */
+ ioctl(p->rp.cdev_fd, IOCTL_ATTACH_RING, &queue_num);
+
/*
* Open mem device for mmaping of kernel memory regions into space of our
* process
*/
- if ((devmem_fd = open("/dev/mem", O_RDWR)) == -1){
+ if ((devmem_fd = open("/dev/mem", O_RDWR)) == -1) {
perror("/dev/mem");
return (-1);
}
/**
- ** Here we map the ring structure into the
- ** memory space of current process.
+ ** Get the physical address of the ring
**/
- if (read(ringmap_cdev_fd, &ring, sizeof(vm_paddr_t)) == -1) {
- RINGMAP_ERROR(Can not read phys addr of ring from kernel);
+ if (read(p->rp.cdev_fd, &ring, sizeof(vm_paddr_t)) == -1) {
+ RINGMAP_ERROR(Can not get phys addr of ring!);
return (-1);
}
- /* TODO: extend this for multiple queue case */
- queue_num = DEFAULT_QUEUE;
- /* Attach and init the ring to our thread */
- ioctl(ringmap_cdev_fd, IOCTL_ATTACH_RING, &queue_num);
#if (__RINGMAP_DEB)
printf("[%s] Phys addr of ring 0x%X\n", __func__, ring);
#endif
+ /* Map ring into our address space */
tmp_addr = mmap(0, /* Kernel gives us the address */
sizeof(struct ring), /* Number of bytes we are mapping */
PROT_WRITE|PROT_READ, /* We want both read and write */
@@ -112,31 +101,30 @@
return (-1);
}
- p->ring = (struct ring *)tmp_addr;
- if (p->ring->size != SLOTS_NUMBER){
+ p->rp.ring = (struct ring *)tmp_addr;
+ if (p->rp.ring->size != SLOTS_NUMBER) {
RINGMAP_ERROR("Wrong size of ring buffer!");
- return -1;
+ return (-1);
}
#if (__RINGMAP_DEB)
- printf("Virtual address of ring is 0x%X\n", p->ring);
- printf("Ring Size = %d \n", p->ring->size);
+ printf("Virtual address of ring is 0x%X\n", p->rp.ring);
+ printf("Ring Size = %d \n", p->rp.ring->size);
- for(i=0 ;i < SLOTS_NUMBER; i++){
- PRINT_PACKET_ADDR(p->ring, i);
+ for (i=0 ;i < SLOTS_NUMBER; i++) {
+ PACKET_ADDR_DEB(p->rp.ring, i);
}
- PRINT_RING_PTRS(p->ring);
+ PRINT_RING_PTRS(p->rp.ring);
#endif
/*
* Mapping mbufs and packet buffers from kern into userspace.
*/
for (i = 0; i < SLOTS_NUMBER; i++) {
-
/* Map mbuf */
- memoffset = (off_t)p->ring->slot[i].mbuf.phys;
- tmp_addr = mmap (0, /* System will choose the addrress */
+ memoffset = (off_t)p->rp.ring->slot[i].mbuf.phys;
+ tmp_addr = mmap(0, /* System will choose the addrress */
sizeof(struct mbuf), /* Size of mapped region (mbuf) */
PROT_WRITE|PROT_READ, /* protection: write & read */
MAP_SHARED, /* shared maping */
@@ -146,12 +134,12 @@
if (tmp_addr == MAP_FAILED) {
printf(ERR_PREFIX"[%s] Mapping of mbuf %d failed!\n",
__func__, i);
- return -1;
+ return (-1);
}
- p->ring->slot[i].mbuf.user = (vm_offset_t)tmp_addr;
+ U_MBUF(p->rp.ring, i) = (vm_offset_t)tmp_addr;
/* Map packet data */
- memoffset = (off_t)p->ring->slot[i].packet.phys;
+ memoffset = (off_t)p->rp.ring->slot[i].packet.phys;
tmp_addr =
mmap( 0,
MCLBYTES,
@@ -159,20 +147,18 @@
MAP_SHARED,
devmem_fd,
memoffset);
- if (tmp_addr == MAP_FAILED){
+ if (tmp_addr == MAP_FAILED) {
printf(ERR_PREFIX"[%s] Mapping of packets buffer %d failed!\n",
__func__, i);
- return -1;
+ return (-1);
}
- p->ring->slot[i].packet.user = (vm_offset_t)tmp_addr;
+ U_PACKET(p->rp.ring, i) = (vm_offset_t)tmp_addr;
-#if (__RINGMAP_DEB)
- PRINT_PACKET_ADDR(p->ring, i);
-#endif
+ PACKET_ADDR_DEB(p->rp.ring, i);
}
/* Close memory device */
- if (close(devmem_fd) == -1){
+ if (close(devmem_fd) == -1) {
perror("close()");
}
@@ -197,35 +183,37 @@
goto out;
}
- if (p->ring == NULL) {
+ if (p->rp.ring == NULL) {
RINGMAP_FUNC_DEBUG(NULL pointer to ringstructure);
goto out;
}
+ p->rp.status = 0;
+
/* Unmap slots */
- for (i = 0; i < SLOTS_NUMBER; i++){
- tmp_res = munmap((void *)p->ring->slot[i].mbuf.user,
+ for (i = 0; i < SLOTS_NUMBER; i++) {
+ tmp_res = munmap((void *)U_MBUF(p->rp.ring, i),
sizeof(struct mbuf));
if (tmp_res == -1)
printf(ERR_PREFIX"[%s] Error by unmapping of mbuf %d\n",
__func__, i);
- tmp_res = munmap((void *)p->ring->slot[i].packet.user, MCLBYTES);
+ tmp_res = munmap((void *)U_PACKET(p->rp.ring, i), MCLBYTES);
if (tmp_res == -1)
printf(ERR_PREFIX"[%s] Error by unmapping of packet buffer %d\n",
__func__, i);
}
/* Unmap ring */
- tmp_res = munmap(p->ring, sizeof(struct ring));
+ tmp_res = munmap(p->rp.ring, sizeof(struct ring));
if (tmp_res == -1) {
RINGMAP_ERROR(Unmaping the ring pointer);
}
out:
- if (ringmap_cdev_fd >= 0){
- if ( close(ringmap_cdev_fd) == -1 )
+ if (p->rp.cdev_fd >= 0) {
+ if (close(p->rp.cdev_fd) == -1)
perror("close()");
}
@@ -233,9 +221,9 @@
}
void
-ringmap_setfilter(struct bpf_program *fp)
+ringmap_setfilter(struct bpf_program *fp, pcap_t *p)
{
- if (ioctl(ringmap_cdev_fd, IOCTL_SETFILTER, (caddr_t)fp) == 0) {
+ if (ioctl(p->rp.cdev_fd, IOCTL_SETFILTER, (caddr_t)fp) == 0) {
RINGMAP_FUNC_DEBUG(Filter is set);
} else {
RINGMAP_WARN(Filter is not set!);
@@ -261,22 +249,21 @@
return (-2);
}
- if (p->ring == NULL){
+ if (p->rp.ring == NULL) {
RINGMAP_ERROR(Ring is not allocated);
exit (1);
}
- ring = p->ring;
+ ring = p->rp.ring;
- /* stay here as long as the ring is empty */
+ /* stay here while the ring is empty */
while (RING_IS_EMPTY(ring)) {
-#if (__RINGMAP_DEB)
- PRINT_RING_PTRS(ring);
+ RING_PTRS_DEB(ring);
RINGMAP_FUNC_DEBUG(Ring is empty. Sleep...);
-#endif
+
/* Sleep and wait for new incoming packets */
- err_sleep = ioctl(ringmap_cdev_fd, IOCTL_SLEEP_WAIT);
+ err_sleep = ioctl(p->rp.cdev_fd, IOCTL_SLEEP_WAIT);
/* catching signals */
if (err_sleep) {
@@ -288,16 +275,13 @@
}
/* Ok, if we are here the ring shouldn't be empty, let's capture */
-#if (__RINGMAP_DEB)
- RINGMAP_FUNC_DEBUG(Ring is NOT empty:);
- PRINT_RING_PTRS(ring);
-#endif
+ RINGMAP_FUNC_DEBUG(Ring is NOT empty:);
+ RING_PTRS_DEB(ring);
- if ( (cnt == -1) || (cnt == 0) )
- cnt = SW_TAIL_TO_HEAD_DIST(p->ring);
+ if ((cnt == -1) || (cnt == 0))
+ cnt = SW_TAIL_TO_HEAD_DIST(p->rp.ring);
- for (ws = cnt ; ( (ws) && (RING_NOT_EMPTY(p->ring)) ) ; )
- {
+ for (ws = cnt; ((ws) && (RING_NOT_EMPTY(p->rp.ring)));) {
if (p->break_loop) {
p->break_loop = 0;
if (!(cnt - ws))
@@ -307,7 +291,8 @@
}
/* Slot we want to check */
- curr_slot = R_MODULO( SW_TAIL(ring) + 1 );
+ curr_slot = R_MODULO(SW_TAIL(ring) + 1);
+
/*
* ringmap-Driver tell us whether the slot contains
* a good packet
@@ -343,19 +328,15 @@
ring->pkt_counter++;
--ws;
-#if (__RINGMAP_DEB)
- PRINT_PKT_BYTES(datap, curr_slot);
-#endif
+ PKT_BYTES_DEB(datap, curr_slot);
/* callback function */
(*callback)(user, &pkthdr, datap);
-#if (__RINGMAP_DEB)
- PRINT_SLOT(ring, curr_slot);
-#endif
+ PRINT_SLOT_DEB(ring, curr_slot);
out:
- SW_INCR_TAIL(ring);
+ INCR_TAIL(ring);
ring->slot[curr_slot].filtered = 0;
ring->slot[curr_slot].is_ok = 0;
@@ -375,11 +356,11 @@
{
int err = 0;
- if (p->ring == NULL)
+ if (p->rp.ring == NULL)
return (-1);
- printf("HEAD Pointer (kern) = %d\n", SW_HEAD(p->ring));
- printf("TAIL Pointer (user) = %d\n", SW_TAIL(p->ring));
+ printf("HEAD Pointer (kern) = %d\n", SW_HEAD(p->rp.ring));
+ printf("TAIL Pointer (user) = %d\n", SW_TAIL(p->rp.ring));
return (err);
}
@@ -390,17 +371,15 @@
{
int err = 0;
- if (p->ring == NULL){
+ if (p->rp.ring == NULL) {
RINGMAP_ERROR(Ring is not allocated!);
return (-1);
}
- printf("Ring-Full counter: %llu\n", p->ring->kern_wait_user);
- printf("Ring-Empty counter: %llu\n", p->ring->user_wait_kern);
- printf("Interrupt counter: %llu\n", p->ring->intr_num);
- printf("Pkts per interrupt: %llu\n",
- (p->ring->pkt_counter / p->ring->intr_num));
+ printf("Ring-Full counter: %llu\n", p->rp.ring->kern_wait_user);
+ printf("Ring-Empty counter: %llu\n", p->rp.ring->user_wait_kern);
+ printf("Interrupt counter: %llu\n", p->rp.ring->intr_num);
return (err);
}
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#53 (text+ko) ====
@@ -33,7 +33,7 @@
#include <vm/vm_param.h>
#include <vm/vm_kern.h>
-#include <dev/pci/pcivar.h> /* For pci_get macros! */
+#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
#include "ringmap.h"
@@ -54,7 +54,6 @@
d_close_t ringmap_close;
d_ioctl_t ringmap_ioctl;
d_read_t ringmap_read;
-d_mmap_single_t ringmap_mmap_single;
static struct cdevsw ringmap_devsw = {
.d_version = D_VERSION,
@@ -62,7 +61,6 @@
.d_close = ringmap_close,
.d_ioctl = ringmap_ioctl,
.d_read = ringmap_read, /* Tell to user ring physical addr */
- .d_mmap_single = ringmap_mmap_single, /* Doesn't work yet */
.d_name = "ringmap_cdev"
};
@@ -72,7 +70,7 @@
/*
* The function should be called from the attach function of generic network
- * driver. Here the ringmap structure is allocated and the character special
+ * driver. Here the ringmap structure is allocated and the character special
* device for the communication with user is created. Also default ringmap
* functions are set.
*/
@@ -116,11 +114,11 @@
/*
* Initialize the list of capturing objects. Each object represents the
- * thread that capture traffic and its ring.
+ * thread that capture traffic and its ring. The objects werden created
+ * by open(2): see ringmap_open() further.
*/
SLIST_INIT(&rm->object_list);
- /* Insert ringmap structure into the list */
SLIST_INSERT_HEAD(&ringmap_list_head, rm, entries);
/* Init the mutex for protecting our data */
@@ -165,6 +163,7 @@
return (-1);
}
+again:
/* Remove all capturing objects associated with ringmap */
while (!SLIST_EMPTY(&rm->object_list)) {
co = SLIST_FIRST(&rm->object_list);
@@ -172,9 +171,11 @@
}
RINGMAP_LOCK(rm);
- /* To be sure */
+ /* To be sure . This is dirty:(. TODO: do in other way */
if (!SLIST_EMPTY(&rm->object_list)) {
RINGMAP_WARN(There are still active capturing objects);
+ RINGMAP_UNLOCK(rm);
+ goto again;
}
/* Destroy char device associated with ringmap */
if (rm->cdev != NULL)
@@ -212,7 +213,7 @@
printf(RINGMAP_PREFIX"[%s] pid = %d\n", __func__, td->td_proc->p_pid);
#endif
rm = cdev2ringmap(cdev);
- if ( rm == NULL ) {
+ if (rm == NULL) {
RINGMAP_ERROR(Could not get the pointer to ringmap structure);
return (EIO);
}
@@ -222,7 +223,8 @@
/* TODO: set max number of threads in the ringmap struct as a member */
if (rm->open_cnt == RINGMAP_MAX_THREADS) {
RINGMAP_ERROR(Can not open device!);
- err = EIO; goto out;
+ err = EIO;
+ goto out;
}
/* First stop receive and interupts while we allocate our data */
@@ -234,7 +236,8 @@
SLIST_FOREACH(co, &rm->object_list, objects) {
if (co->td == td) {
RINGMAP_ERROR(Device is opened!);
- err = EIO; goto out;
+ err = EIO;
+ goto out;
}
}
@@ -246,7 +249,8 @@
M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
if (ring == NULL) {
RINGMAP_ERROR(Can not allocate space for ring);
- err = EIO; goto out;
+ err = EIO;
+ goto out;
}
ring->size = SLOTS_NUMBER;
@@ -267,7 +271,7 @@
SLIST_INSERT_HEAD(&rm->object_list, co, objects);
/*
- * Store capturing object as private data. So we can access our capturing
+ * Store capturing object as private data. So we can access it
* object in other syscalls, e.g. read, close, etc...
*/
if (devfs_set_cdevpriv((void *)co, clear_capt_object)) {
@@ -284,7 +288,9 @@
rm->funcs->receive_enable(rm);
RINGMAP_UNLOCK(rm);
+
RINGMAP_FUNC_DEBUG(end);
+
return (err);
}
@@ -341,53 +347,6 @@
}
-/* doesn't work yet */
-int
-ringmap_mmap_single(struct cdev *cdev, vm_ooffset_t *offset,
- vm_size_t size, struct vm_object **object, int nprot)
-{
- struct ringmap *rm = NULL;
- struct capt_object *co = NULL;
- vm_object_t obj;
- vm_map_entry_t entry;
- vm_pindex_t pindex;
- vm_prot_t prot;
- boolean_t wired;
-
- rm = cdev2ringmap(cdev);
- if ( rm == NULL ) {
- RINGMAP_ERROR(Null pointer to ringmap structure);
-
- return (EIO);
- }
-
- SLIST_FOREACH(co, &rm->object_list, objects) {
- if (co->td == curthread) {
- break;
- }
- }
-
- if ((co == NULL) || (co->ring == NULL)) {
- RINGMAP_ERROR(Null pointer);
- return (EIO);
- }
-
- vm_map_lookup(&kmem_map, (vm_offset_t)co->ring, VM_PROT_ALL,
- &entry, &obj, &pindex, &prot, &wired);
- vm_map_lookup_done(kmem_map, entry);
-
- if (obj == kmem_object) {
- RINGMAP_ERROR(Got kmem_object);
- } else {
- RINGMAP_FUNC_DEBUG(Got other obj);
- }
-
- object = &obj;
-
- return (0);
-}
-
-
/*
* Tells usre the physical addres of ring. User process will
* use this addres in order to map the buffer in its address
@@ -539,9 +498,7 @@
err = EINVAL;
goto xxx;
}
-#if (__RINGMAP_DEB)
- PRINT_SLOT(co->ring, i);
-#endif
+ PRINT_SLOT_DEB(co->ring, i);
}
xxx:
rm->funcs->intr_enable(rm);
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#52 (text+ko) ====
@@ -28,6 +28,11 @@
*/
#define RINGMAP_MAX_THREADS 8
+/*
+ * TODO:
+ * Somehow I don't like this addres stuff. We can get by whithout it.
+ * I am looking how to eliminate it.
+ */
struct address {
vm_paddr_t volatile phys;
vm_offset_t volatile kern;
@@ -35,13 +40,11 @@
};
/*
- * This structure represents the ring slot. Each slot contains two entities:
- * mbuf and packet. Mbuf represents the kernel view of packet. The packet
- * represents the buffer where the packet data is placed.
- *
- * Each entity is of type 'struct address'. Struct 'address' contains
- * three addresses: physical-, kernel- and user-address. We need to store
- * the physical addresses to be able to do memory mapping.
+ * This structure represents the ring slot. "mbuf" represents the kernel view
+ * of packet. The "packet" represents the buffer where the packet data is
+ * placed. Both are of type 'struct address'. Struct 'address' contains three
+ * addresses: physical-, kernel- and user-address. We need to store the
+ * physical addresses to be able to do memory mapping.
*/
struct ring_slot {
@@ -54,10 +57,6 @@
/* 1 if accepted by driver and contains no errors */
int volatile is_ok;
- /*
- * Next fields are for statistics:
- */
-
/* Time stamp of packet stored in this slot */
struct timeval ts;
@@ -130,6 +129,13 @@
struct ring_slot volatile slot[SLOTS_NUMBER];
};
+/* For libpcap. To be set in the pcap structure */
+struct pcap_ringmap {
+ int cdev_fd;
+ int status;
+ int flags;
+ struct ring *ring;
+};
/* *************************************
* IOCTL ' s system calls *
@@ -211,7 +217,7 @@
((SW_TAIL(ringp) == SW_HEAD(ringp)) ? SLOTS_NUMBER : \
R_DISTANCE(SW_TAIL(ringp), SW_HEAD(ringp)))
-#define SW_INCR_TAIL(ringp) \
+#define INCR_TAIL(ringp) \
(SW_TAIL(ringp)) = R_MODULO(SW_TAIL(ringp) + 1);
#define RING_IS_EMPTY(ringp) \
@@ -294,13 +300,13 @@
printf("=+= [%s] SOME BYTES FROM PKT: %hhu %hhu %hhu %hhu %hhu %hhu %hhu\n", \
__func__, pktp[0], pktp[1], pktp[2], pktp[30], pktp[31], pktp[32], pktp[33]);
-#define PRINT_PACKET_ADDR(ring, i) \
- do { \
+#define PACKET_ADDR_DEB(ring, i) \
+ if (__RINGMAP_DEB) { \
printf("=+= packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n",\
(unsigned int)ring->slot[i].packet.user, \
(unsigned int)ring->slot[i].packet.phys, \
(unsigned int)ring->slot[i].packet.kern); \
- } while (0);
+ };
#define PRINT_MBUF_ADDR(ring, i) \
do { \
@@ -311,7 +317,7 @@
} while (0);
#define PRINT_SLOT(ring, i) \
- if (((ring) != NULL) && ((i) < SLOTS_NUMBER)){ \
+ if ((ring) != NULL) { \
printf("\n=+= ==================================\n"); \
printf("=+= Slot Number: %d \n", (i)); \
printf("=+= Intrr num: %llu\n", (ring)->slot[(i)].intr_num); \
@@ -321,27 +327,34 @@
printf("=+= Accepted: %d\n", (ring)->slot[(i)].is_ok); \
printf("=+= -------------------------\n"); \
PRINT_MBUF_ADDR(ring, i); \
- PRINT_PACKET_ADDR(ring, i); \
+ PACKET_ADDR_DEB(ring, i); \
printf("=+= -------------------------\n"); \
printf("=+= ==================================\n\n"); \
- } else { \
- RINGMAP_ERROR(Print failed!); \
- }
-
-#define PRINT_SLOT_DEB(ring, i) \
- if (__RINGMAP_DEB) { \
- PRINT_SLOT((ring), (i)) \
};
-
#define PRINT_TAIL(ring) \
printf("=+= [%s] tail = %d\n", __func__, SW_TAIL(ring));
#define PRINT_HEAD(ring) \
printf("=+= [%s] head = %d\n", __func__, SW_HEAD(ring));
+#define PRINT_SLOT_DEB(ring, i) \
+ if (__RINGMAP_DEB) { \
+ PRINT_SLOT((ring), (i)) \
+ };
+
#define PRINT_RING_PTRS(ring) \
do { \
PRINT_TAIL(ring) \
PRINT_HEAD(ring) \
} while (0);
+
+#define RING_PTRS_DEB(ring) \
+if (__RINGMAP_DEB) { \
+ PRINT_RING_PTRS(ring) \
+};
+
+#define PKT_BYTES_DEB(pktp, i) \
+if (__RINGMAP_DEB) { \
+ PRINT_PKT_BYTES(pktp, i); \
+};
==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#35 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#36 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#30 (text+ko) ====
More information about the p4-projects
mailing list