PERFORCE change 180673 for review
Alexandre Fiveg
afiveg at FreeBSD.org
Thu Jul 8 23:40:45 UTC 2010
http://p4web.freebsd.org/@@180673?ac=10
Change 180673 by afiveg at cottonmouth on 2010/07/08 23:39:49
new small designe chages: from now ringmap doesn't try to find out the type of controller and set hardware-dependent functions. The generic drivers attach() function calls ringmap_attach() and passes in the pointer to ringmap_functions as parameter.
Affected files ...
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#7 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#7 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#9 edit
.. //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#14 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#22 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#21 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#19 edit
.. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#11 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#25 edit
.. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#25 edit
.. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#9 edit
.. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#10 edit
.. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#5 edit
Differences ...
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-bpf.c#7 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap-int.h#7 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/pcap.c#9 (text+ko) ====
@@ -75,7 +75,6 @@
#include <machine/bus.h>
#include "../../sys/net/ringmap.h"
-extern int check_module(const char *);
extern int init_mmapped_capturing(const char *device, pcap_t *);
#endif
@@ -275,9 +274,6 @@
goto fail;
#ifdef RINGMAP
- if (check_module(source) < 0){
- goto fail;
- }
if (init_mmapped_capturing(source, p) < 0){
goto fail;
}
==== //depot/projects/soc2010/ringmap/current/contrib/libpcap/ringmap_pcap.c#14 (text+ko) ====
@@ -32,70 +32,15 @@
#include "../../sys/net/ringmap.h"
-/* File descriptor of fiveg_cdev */
+/* File descriptor of /dev/ringmap */
int ringmap_cdev_fd = -1;
/*** F U N C T I O N S ***/
-int check_module (const char *);
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 *);
-/*
- * Check if module is loaded.
- * Get descripor of /dev/ringmap (open)
- *
- * The name of linker file: MOD_NAME (ringmap.h)
- * Return: fileid - of kld file on success.
- * <0 - otherwise
- */
-int
-check_module (const char *device)
-{
- int error = 0;
- kvm_t *kd;
- struct nlist nl[]={ {NULL}, {NULL}, };
- char dev_path[1024], cmd[1024];
- char errbuf[_POSIX2_LINE_MAX];
-
- RINGMAP_FUNC_DEBUG(start);
-
- /* Try to find our module */
- error = kldfind(MOD_NAME);
- if (error == -1){
- /* Module seems to be not loaded */
- printf("[%s] Module %s is not loaded\n", __func__, MOD_NAME);
- return(-1);
- } else {
-
- RINGMAP_FUNC_DEBUG(ringmap module is loaded);
-
- sprintf(cmd, "ls /dev/| grep %s > /dev/null",RINGMAP_DEVICE);
- if (system(cmd)){
- printf("[%s] ringmap driver is NOT loaded\n", __func__);
- return (-1);
- }
-
- RINGMAP_FUNC_DEBUG(/dev/ringmap_cdev is created);
-
- /* dev_path = "/dev/RINGMAP_DEVICE_em[0,1]" */
- sprintf(dev_path, "/dev/"RINGMAP_DEVICE"1");
-
- /* Open fiveg_cdev device for communication with our driver */
- if ((ringmap_cdev_fd = open(dev_path, O_RDWR)) == -1) {
- printf("[%s] Error by opening %s \n", __func__, dev_path);
- perror("/dev/" RINGMAP_DEVICE);
- return(-2);
- }
- }
-
- printf(RINGMAP_PREFIX"ringmap-Driver %s is loaded!\n", MOD_NAME);
-
- return (error);
-}
-
-
/********************************************************
* Open (/dev/ringmap) device to communicate with
* kernel. Map buffers by calling mmap (/dev/mem, ...)
@@ -108,66 +53,64 @@
int devmem_fd, i;
long num_of_bytes;
void *tmp_addr;
+ char dev_path[1024];
struct ring tmp_ring;
-
- /* temp variable for save physical addresses (for mmap(/dev/mem)) */
off_t memoffset = 0;
-
- /* Physical addres of ring structure */
- bus_addr_t nic_statspp, rspp;
+ bus_addr_t rspp;
RINGMAP_FUNC_DEBUG(start);
- if ( p == NULL ){
- RINGMAP_ERROR(NULL pointer to the pcap structure);
- return (-1);
+ sprintf(dev_path, "/dev/%s",device);
+
+ /* Open /dev/ringmap device for communication with our driver */
+ if ((ringmap_cdev_fd = open(dev_path, O_RDWR)) == -1) {
+ printf("[%s] Error by opening %s \n", __func__, dev_path);
+ perror("/dev/" RINGMAP_DEVICE);
+ return(-1);
}
-
- p->ring = NULL;
- /* Open mem device for mmaping of kernel memory regions in space of our process */
+ /*
+ * Open mem device for mmaping of kernel memory regions in space of our
+ * process
+ */
if ((devmem_fd = open("/dev/mem", O_RDWR)) == -1){
perror("/dev/mem");
return (-1);
}
- if (ringmap_cdev_fd < 0){
- RINGMAP_ERROR(ringmap char device is not open);
- return (-1);
- }
- tmp_addr = mmap(0, sizeof(struct ring), PROT_WRITE|PROT_READ, MAP_SHARED, ringmap_cdev_fd, 0);
+ /**
+ ** !!! Very important piece of code !!!
+ **
+ ** Here we map the ring structure into the
+ ** memory space of current process.
+ **/
+ 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 */
+ MAP_SHARED, /* Changes shoud be visible in kernel */
+ ringmap_cdev_fd, /* file decriptor */
+ 0);
if (tmp_addr == MAP_FAILED){
RINGMAP_ERROR("Mapping of Ring Pointers structure failed! Exit!");
return -1;
}
-#if (__RINGMAP_DEB)
- printf("Virtual address of ring is 0x%X\n", tmp_addr);
-#endif
p->ring = (struct ring *)tmp_addr;
- if (p->ring->size == 0){
- RINGMAP_ERROR("Wrong size of ring buffer! Exit!");
+ if (p->ring->size != SLOTS_NUMBER){
+ RINGMAP_ERROR("Wrong size of ring buffer!");
return -1;
}
#if (__RINGMAP_DEB)
+ printf("Virtual address of ring is 0x%X\n", p->ring);
printf("Ring Size = %d \n", p->ring->size);
-#endif
for(i=0 ;i < SLOTS_NUMBER; i++){
- printf("%d. packet.phys=0x%X\n ", i, p->ring->slot[i].packet.phys);
-
+ PRINT_PACKET_ADDR(p->ring, i);
}
-// memoffset = (off_t)p->ring->hw_stats.phys;
-// tmp_addr = mmap(0, sizeof(struct e1000_hw_stats), PROT_WRITE|PROT_READ, MAP_SHARED, devmem_fd, memoffset);
-// if (tmp_addr == MAP_FAILED){
-// RINGMAP_ERROR("Mapping of Statistics structure failed! Exit!");
-// return -1;
-// }
-// p->nic_statistics = (struct e1000_hw_stats *)tmp_addr;
-
+#endif
-
/*
* Mapping mbufs from kern to userspace.
* mbufs internal pointers contain kernel space addresses -
@@ -179,72 +122,42 @@
/* Map mbuf */
memoffset = (off_t)p->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 */
- devmem_fd, /* device is /dev/mem */
- memoffset /* offset is physical addres */
- );
+ 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 */
+ devmem_fd, /* device is /dev/mem */
+ memoffset /* offset is physical addres */
+ );
if (tmp_addr == MAP_FAILED){
- printf(ERR_PREFIX"[%s] Mapping of mbuf %d failed! Exit!\n",
+ printf(ERR_PREFIX"[%s] Mapping of mbuf %d failed!\n",
__func__, i);
return -1;
}
p->ring->slot[i].mbuf.user = (vm_offset_t)tmp_addr;
-
/* Map packet data */
memoffset = (off_t)p->ring->slot[i].packet.phys;
tmp_addr =
- mmap(0, MCLBYTES, PROT_WRITE|PROT_READ, MAP_SHARED,
- devmem_fd, memoffset);
+ mmap( 0,
+ MCLBYTES,
+ PROT_WRITE|PROT_READ,
+ MAP_SHARED,
+ devmem_fd,
+ memoffset);
if (tmp_addr == MAP_FAILED){
- printf(ERR_PREFIX"[%s] Mapping of packets buffer %d failed! Exit!\n", __func__, i);
+ printf(ERR_PREFIX"[%s] Mapping of packets buffer %d failed!\n",
+ __func__, i);
return -1;
}
p->ring->slot[i].packet.user = (vm_offset_t)tmp_addr;
-
-// /* Map descriptor structure */
-// memoffset = (off_t)p->ring->slot[i].descriptor.phys;
-// tmp_addr =
-// mmap (
-// 0, /* System will choose the addrress */
-// 16, /* Size of region = descr struct */
-// PROT_WRITE|PROT_READ, /* protection: write & read */
-// MAP_SHARED, /* shared maping */
-// devmem_fd, /* device is /dev/mem */
-// memoffset /* offset is physical addres */
-// );
-// if (tmp_addr == MAP_FAILED){
-// printf(ERR_PREFIX"[%s] Mapping of descriptor structure %d failed! Exit!\n", __func__, i);
-// return -1;
-// }
-// p->ring->slot[i].descriptor.user = (vm_offset_t)tmp_addr;
-
-
#if (__RINGMAP_DEB)
- printf("[%s] %d packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n ",
- __func__, i,
- (unsigned int)p->ring->slot[i].packet.user,
- p->ring->slot[i].packet.phys, p->ring->slot[i].packet.kern);
+ PRINT_PACKET_ADDR(p->ring, i);
#endif
}
- /* Init our pcap variables */
-// p->pkt_counter = 0;
-// p->buffer_fill = 0;
-// p->buffer_0 = 0;
-// p->buffer_128 = 0;
-// p->buffer_256 = 0;
-// p->buffer_512 = 0;
-// p->buffer_1024 = 0;
-// p->buffer_2048 = 0;
-// p->buffer_4096 = 0;
-
-
/* Close memory device */
if (close(devmem_fd) == -1){
perror("close()");
@@ -255,6 +168,7 @@
return (0);
}
+
/*
* Unmap buffers and free mem alocations
*/
@@ -284,17 +198,11 @@
__func__, i);
}
- if (p->ring != NULL){
- tmp_res = munmap(p->ring, sizeof(struct ring));
- if (tmp_res == -1)
- printf(ERR_PREFIX"[%s] Error by unmapping of ring pointer structure %d\n", __func__, i);
+ tmp_res = munmap(p->ring, sizeof(struct ring));
+ if (tmp_res == -1) {
+ RINGMAP_ERROR(Unmaping the ring pointer);
}
- //if (p->nic_statistics != NULL){
- // tmp_res = munmap(p->nic_statistics, sizeof(struct e1000_hw_stats));
- // if (tmp_res == -1)
- // printf(ERR_PREFIX"[%s] Error by unmapping of statistic structure %d\n", __func__, i);
- //}
out:
if (ringmap_cdev_fd >= 0){
if ( close(ringmap_cdev_fd) == -1 )
@@ -304,6 +212,7 @@
RINGMAP_FUNC_DEBUG(end);
}
+
int
pcap_read_ringmap(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
{
@@ -331,12 +240,8 @@
again:
-#ifdef __RINGMAP_DEB
-// printf("[%s] user to kern distance = %d\n", __func__,
- // SW_TAIL_TO_HEAD_DIST(ring));
-#endif
-
if ( RING_IS_EMPTY(ring) ) {
+ RINGMAP_FUNC_DEBUG(Ring is empty. Sleep...);
/* Sleep and wait for new incoming packets */
ioctl(ringmap_cdev_fd, IOCTL_SLEEP_WAIT);
goto again;
@@ -370,6 +275,7 @@
pkthdr.caplen = pkthdr.len = mb->m_len;
datap = (caddr_t)U_PACKET(ring, curr_slot);
+ ring->slot[curr_slot].is_ok=0;
ring->pkt_counter++;
--ws;
@@ -410,6 +316,7 @@
return (err);
}
+
int
print_ring_stats(pcap_t *p)
{
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#22 (text+ko) ====
@@ -82,7 +82,7 @@
#include "e1000_api.h"
#ifdef RINGMAP
-#include <net/ringmap.h>
+#include <../../net/ringmap.h>
#endif
#include "if_lem.h"
@@ -273,8 +273,10 @@
#ifdef RINGMAP
-extern int ringmap_attach (device_t);
+extern int ringmap_attach (device_t, struct ringmap_functions *);
extern int ringmap_detach (device_t);
+
+extern struct ringmap_functions ringmap_f;
#endif
#ifdef DEVICE_POLLING
@@ -684,7 +686,7 @@
device_get_nameunit(dev));
#ifdef RINGMAP
- ringmap_attach (dev);
+ ringmap_attach (dev, &ringmap_f);
#endif
INIT_DEBUGOUT("lem_attach: end");
@@ -1383,7 +1385,7 @@
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
#ifdef RINGMAP
- if (adapter->rm != NULL) {
+ if ((adapter->rm != NULL) && (adapter->rm->open_cnt > 0)) {
adapter->rm->funcs->delayed_isr(context);
#endif
if (lem_rxeof(adapter, adapter->rx_process_limit) != 0)
@@ -1395,6 +1397,7 @@
}
#endif
+#ifdef RINGMAP
#if (RINGMAP_TX_ENABLE)
EM_TX_LOCK(adapter);
lem_txeof(adapter);
@@ -1402,6 +1405,7 @@
lem_start_locked(ifp);
EM_TX_UNLOCK(adapter);
#endif
+#endif
}
lem_enable_intr(adapter);
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#21 (text+ko) ====
@@ -41,6 +41,21 @@
extern void ringmap_print_slot(struct ring *, unsigned int);
+struct ringmap_functions ringmap_f = {
+ rm_8254_set_ringmap_to_adapter,
+ rm_8254_enable_intr,
+ rm_8254_disable_intr,
+ rm_8254_init_slots,
+ rm_8254_interrupt,
+ rm_8254_delayed_interrupt,
+ rm_8254_delayed_interrupt_per_packet,
+ rm_8254_sync_head_tail,
+ rm_8254_sync_tail,
+ rm_8254_sync_head,
+ rm_8254_alloc_ring,
+ rm_8254_get_ringmap_p,
+ rm_8254_get_device_p
+};
/*
@@ -247,8 +262,8 @@
return (-1);
}
- RINGMAP_HW_WRITE_TAIL(adapter,
- (R_MODULO(RINGMAP_HW_READ_HEAD(adapter) - 1)));
+// RINGMAP_HW_WRITE_TAIL(adapter,
+// (R_MODULO(RINGMAP_HW_READ_HEAD(adapter) - 1)));
SW_TAIL(ring) = RINGMAP_HW_READ_TAIL(adapter);
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.h#19 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_e1000.h#11 (text+ko) ====
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#25 (text+ko) ====
@@ -33,30 +33,16 @@
#include "ringmap.h"
-int ringmap_attach (device_t);
+int ringmap_attach (device_t, struct ringmap_functions *);
int ringmap_detach (device_t);
-int is_supported (unsigned int);
-int set_ringmap_funcs (struct ringmap *, unsigned int);
void ringmap_close_cb (void *data);
void ringmap_print_slot(struct ring *, unsigned int);
void clear_capt_instance(void *);
+void print_capt_inst(struct capt_instance *);
struct ringmap *(*get_ringmap_p)(device_t);
device_t (*get_device_p)(struct cdev *);
-extern int rm_8254_set_ringmap_to_adapter(device_t, struct ringmap *);
-extern struct ringmap * rm_8254_get_ringmap_p(device_t);
-extern device_t rm_8254_get_device_p(struct cdev *);
-extern void rm_8254_enable_intr(device_t);
-extern void rm_8254_disable_intr(device_t);
-extern void rm_8254_interrupt(void *);
-extern void rm_8254_delayed_interrupt(void *);
-extern void rm_8254_sync_head_tail(device_t, struct ring *);
-extern void rm_8254_sync_tail(device_t, struct ring *);
-extern void rm_8254_sync_head(device_t);
-extern void rm_8254_delayed_interrupt_per_packet(device_t, int);
-extern struct ring *rm_8254_alloc_ring(device_t);
-
d_open_t ringmap_open;
d_close_t ringmap_close;
d_ioctl_t ringmap_ioctl;
@@ -74,98 +60,18 @@
.d_name = "ringmap_cdev"
};
-struct device_type supported_devices[] =
-{
- /* PCI ID, Controller */
-
- { 0x1079 , 8254 }, /* 8254GB, COPPER, Dual Port */
- { 0x105E , 8257 }, /* 82571EB, COPPER, PCIe Dual Port */
- { 0, 0} /* last entry */
-};
-
-/*
- * If pci_dev_id is supported by ringmap, then controller_type related to this
- * pci_dev_id will be returned. Look for device_type structure in ringmap.h!
- * Im -curent branch only 8254* controllers are supported. The list of
- * supported controllers doesn't include all of them, but only the controllers
- * that I've tested.
- */
-int
-is_supported (unsigned int pci_dev_id)
-{
- struct device_type *dt;
-
- dt = supported_devices;
- while (dt->pci_device_id != 0) {
- if (pci_dev_id == dt->pci_device_id){
- return (dt->controller_type);
- }
- dt++;
- }
- return (0);
-}
-
-/*
- * Set hardware-dependent functions
- */
-int
-set_ringmap_funcs (struct ringmap *rm, unsigned int controller_type)
-{
-
- switch(controller_type) {
- case 8254:
- RINGMAP_FUNC_DEBUG(Controller Type: 8254);
-
- rm->funcs->set_ringmap_to_adapter =
- rm_8254_set_ringmap_to_adapter;
- rm->funcs->enable_intr = rm_8254_enable_intr;
- rm->funcs->disable_intr = rm_8254_disable_intr;
- rm->funcs->isr = rm_8254_interrupt;
- rm->funcs->delayed_isr = rm_8254_delayed_interrupt;
- rm->funcs->delayed_isr_per_packet =
- rm_8254_delayed_interrupt_per_packet;
- rm->funcs->sync_head_tail = rm_8254_sync_head_tail;
- rm->funcs->sync_tail = rm_8254_sync_tail;
- rm->funcs->sync_head = rm_8254_sync_head;
- rm->funcs->alloc_ring = rm_8254_alloc_ring;
-
- get_ringmap_p = rm_8254_get_ringmap_p;
- get_device_p = rm_8254_get_device_p;
- break;
-
- case 8257:
- RINGMAP_FUNC_DEBUG(Controller Type: 8257);
- RINGMAP_FUNC_DEBUG(Now not supported!);
-
- break;
-
- default:
- RINGMAP_FUNC_DEBUG(Unsupported Controller Type!);
- }
- return (0);
-}
/*
* Will called from if_em.c before returning from
* em_attach() function.
*/
int
-ringmap_attach(device_t dev)
+ringmap_attach(device_t dev, struct ringmap_functions *rf)
{
- struct ringmap *rm;
- struct ringmap_functions *funcs;
- unsigned int pci_dev_id = 0;
- unsigned int controller_type = 0;
+ struct ringmap *rm = NULL;
RINGMAP_FUNC_DEBUG(begin);
- pci_dev_id = pci_get_device(dev);
-
- /* Make sure we are support this controller */
- controller_type = is_supported(pci_dev_id);
- if (!(controller_type))
- return (-1);
-
rm = (struct ringmap *) contigmalloc (sizeof(struct ringmap),
M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0);
if (rm == NULL) {
@@ -173,24 +79,15 @@
return (-1);
}
- funcs = (struct ringmap_functions *) contigmalloc
- (
- sizeof (struct ringmap_functions),
- M_DEVBUF, M_ZERO, 0, -1L, PAGE_SIZE, 0
- );
- if (funcs == NULL) {
- RINGMAP_ERROR(Can not allocate space for ringmap_functions structure);
- return (-1);
- }
- rm->funcs = funcs;
- /* Set functions for ringmap functionality depending on controller type */
- set_ringmap_funcs(rm, controller_type);
+ rm->funcs = rf;
+
+ get_ringmap_p = rf->dev_to_ringmap;
+ get_device_p = rf->cdev_to_dev;
/*
* Create char device for communication with user-space. The user-space
- * process wich want to capture should first open this device. Then, by
- * syscalls
- * on this device it will:
+ * process wich want to capture packets should first open this device.
+ * Then, by syscalls on this device it will:
* - get physical adresses of packet buffers for mapping them in its
* virtual memory space
*
@@ -207,7 +104,7 @@
/* Store adapters device structure */
rm->dev = dev;
- /* Initialize our list of capturing instances */
+ /* Initialize the list of capturing instances */
SLIST_INIT(&rm->instance_list);
/* Init the mutex to protecting our data */
@@ -246,7 +143,7 @@
RINGMAP_LOCK_DESTROY(rm);
- contigfree(rm->funcs, sizeof(struct ringmap_functions), M_DEVBUF);
+ // contigfree(rm->funcs, sizeof(struct ringmap_functions), M_DEVBUF);
contigfree(rm, sizeof(struct ringmap), M_DEVBUF);
RINGMAP_FUNC_DEBUG(end);
@@ -256,10 +153,9 @@
/******************************************************************
- * Open device and get the pointer of user process structure.
- * We will use the address space of this process to map there
- * the mbufs and buffers with packets data. So it all will
- * be accesseble in this user proccess.
+ * This func will called as result of open(2). Here we allocate
+ * the memory for the new packets ring that will associated with
+ * current thread.
******************************************************************/
int
ringmap_open(struct cdev *cdev, int flag, int otyp, struct thread *td)
@@ -270,11 +166,6 @@
RINGMAP_FUNC_DEBUG(start);
-#if (__RINGMAP_DEB)
- printf("[%s]: dev_t=%d, flag=%x, otyp=%x\n",
- __func__, dev2udev(cdev), flag, otyp);
-#endif
-
/* a little magic */
rm = get_ringmap_p(get_device_p(cdev));
if ( rm == NULL ) {
@@ -283,6 +174,10 @@
return (EIO);
}
+ /*
+ * crete the capturing instance wich will presents
+ * current thread and packets ring
+ */
MALLOC(ci, struct capt_instance *,
sizeof(struct capt_instance), M_DEVBUF, (M_ZERO | M_WAITOK));
if ( ci == NULL ){
@@ -300,7 +195,7 @@
/* Allocate ring */
ci->ring = rm->funcs->alloc_ring(rm->dev);
if ( ci->ring == NULL ) {
- RINGMAP_ERROR(Error! Please debug!);
+ RINGMAP_ERROR(The ring is not allocated);
err = EIO; goto out;
}
@@ -311,16 +206,14 @@
SLIST_INSERT_HEAD(&rm->instance_list, ci, next_instance);
if ( devfs_set_cdevpriv((void *)ci, clear_capt_instance) ) {
- RINGMAP_ERROR(Ooooooooooooooohhhhhhhh !!!!!);
+ RINGMAP_ERROR(The pointer to the private data is not set!);
err = EIO; goto out;
}
rm->open_cnt++;
+
#ifdef __RINGMAP_DEB
- printf("[%s] currthread->proc->pid: %d \n", __func__, curthread->td_proc->p_pid);
- printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
-
- printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+ print_capt_inst(ci);
#endif
out:
@@ -333,7 +226,6 @@
return (err);
}
-
int
ringmap_close(struct cdev *cdev, int flag, int otyp, struct thread *td)
{
@@ -350,17 +242,14 @@
devfs_get_cdevpriv((void **)&ci);
#ifdef __RINGMAP_DEB
- printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
- printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+ print_capt_inst(ci);
#endif
- rm->open_cnt--;
#ifdef __RINGMAP_DEB
SLIST_FOREACH(ki, &rm->instance_list, next_instance) {
- printf("[%s] Aufter dealocation: ", __func__);
- printf("[%s] ki->td->proc->pid: %d\n", __func__, ki->td->td_proc->p_pid);
- printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ki->ring);
+ printf("[%s] Aufter dealocation: ", __func__);
+ print_capt_inst(ki);
}
#endif
@@ -395,7 +284,6 @@
err = ERESTART; goto out;
}
- /* -> Critical Section: begin */
RINGMAP_LOCK(rm);
if (devfs_get_cdevpriv((void **)&ci)) {
@@ -426,6 +314,7 @@
RINGMAP_IOCTL(start);
+ /* Eliminate it */
ringmap = get_ringmap_p(get_device_p(cdev));
if ( ringmap == NULL ){
RINGMAP_ERROR(NULL pointer. ioctl can not be accomplished);
@@ -494,17 +383,18 @@
clear_capt_instance(void * data)
{
struct capt_instance *ci = NULL;
+ struct ringmap *rm = NULL;
RINGMAP_FUNC_DEBUG(start);
if ( data != NULL ) {
ci = (struct capt_instance *)data;
- RINGMAP_LOCK(ci->rm);
+ rm = ci->rm;
+
+ RINGMAP_LOCK(rm);
#ifdef __RINGMAP_DEB
- printf("[%s] ci->td->proc->pid: %d\n", __func__, ci->td->td_proc->p_pid);
- printf("[%s] Ring Kernel Addr:0x%X\n", __func__, (unsigned int)ci->ring);
+ print_capt_inst(ci);
#endif
-
if ( ci->ring != NULL ){
contigfree(ci->ring, sizeof(struct ring), M_DEVBUF);
SLIST_REMOVE(&ci->rm->instance_list, ci, capt_instance, next_instance);
@@ -515,7 +405,9 @@
RINGMAP_FUNC_DEBUG(NULL pointer to the capturing instance!);
}
- RINGMAP_UNLOCK(ci->rm);
+ rm->open_cnt--;
+
+ RINGMAP_UNLOCK(rm);
RINGMAP_FUNC_DEBUG(end);
}
@@ -546,3 +438,16 @@
printf("---------------- \n");
}
+
+
+void
+print_capt_inst(struct capt_instance *ci)
+{
+ if (ci != NULL) {
+ printf("[%s] ci->td->proc->pid: %d\n",
+ __func__, ci->td->td_proc->p_pid);
+
+ printf("[%s] Ring Kernel Addr:0x%X\n",
+ __func__, (unsigned int)ci->ring);
+ }
+}
==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#25 (text+ko) ====
@@ -6,7 +6,7 @@
/*
* Prefix for name of device (for example /dev/ringmap_cdev0 will full name)
*/
-#define RINGMAP_DEVICE "ringmap_cdev"
+#define RINGMAP_DEVICE "ringmap"
/* Name of module to be loaded*/
#define MOD_NAME "if_ringmap.ko"
@@ -147,11 +147,6 @@
#ifdef _KERNEL
struct ringmap_functions;
-struct device_type {
- unsigned int pci_device_id;
- unsigned int controller_type;
-};
-
struct capt_instance {
struct thread *td;
struct ring *ring;
@@ -260,6 +255,9 @@
/* Alloc memory for our ring and initialize the slots */
struct ring *(*alloc_ring)(device_t);
+
+ struct ringmap *(*dev_to_ringmap)(device_t);
+ device_t (*cdev_to_dev)(struct cdev *);
};
/* MUTEX */
@@ -460,3 +458,10 @@
PRINT_SOME_BYTES_FROM_PKT((arg), (i)); \
printf("=+= =============================\n\n"); \
}
+
+#define PRINT_PACKET_ADDR(ring, i) \
+printf("[%s] %d packet.user=0x%X, packet.phys=0x%X, packet.kern=0x%X\n ", \
+ __func__, i, \
+ (unsigned int)ring->slot[i].packet.user, \
+ ring->slot[i].packet.phys, \
+ ring->slot[i].packet.kern);
==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#9 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#10 (text+ko) ====
==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#5 (text+ko) ====
More information about the p4-projects
mailing list