1 / 7

Who’s listening?

Who’s listening?. Some experiments with an ‘echo’ service on our anchor-cluster’s local network of 82573L nic’s. ‘nicecho.c’. Module uses a set of eight packet-buffers Same buffer is used for both RX and TX The NIC operates in “promiscuous” mode

Download Presentation

Who’s listening?

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Who’s listening? Some experiments with an ‘echo’ service on our anchor-cluster’s local network of 82573L nic’s

  2. ‘nicecho.c’ • Module uses a set of eight packet-buffers • Same buffer is used for both RX and TX • The NIC operates in “promiscuous” mode • Interrupt-hander ‘reflects’ each received packet back to the station it came from • Pseudo-file shows both descriptor-queues

  3. Memory-layout #define KMEM_SIZE (4<<12) // 16KB kernel memory allocation 12KB 4KB rxring txring kmem Each of the 8 packet-buffers has size 1536 bytes (=0x600) Each of descriptor-table occupies 8*(16 bytes) =128 bytes

  4. Sharing of packet-buffers Tx-descriptors Rx-descriptors

  5. Interrupt-processing irqreturn_t my_isr(int irq, void *dev_id ) { int intr_cause = ioread32( io + E1000_ICR ); if ( intr_cause == 0 ) return IRQ_NONE; if ( intr_cause & (1<<7) ) // receiver timeout: a new packet arrived { int index = ioread32( io + E1000_TDT ); unsigned long where = txring[ index ].base_address; unsigned char *cp = phys_to_virt( where ); memcpy( cp+0, cp+6, 6 ); // source becomes destination memcpy( cp+6, mac, 6 ); // our station becomes source txring[ index ].desc_status = 0; txring[ index ].packet_length = rxring[ index ].packet_length; index = (1 + index) % 8;’ // ring-buffer index advances iowrite32( io + E1000_TDT ); // start sending packet back } iowrite32( intr_cause, io + E1000_ICR ); // clear the interrupts return IRQ_HANDLED; }

  6. Packet-processing …then our station becomes source source becomes destination… mac[6] destn-address source-address TYPE/ LENGTH -- data -- -- data -- -- data – -- data -- -- data -- -- data --

  7. In-class experiments • Let’s compile and install our ‘nicecho.c’ module on one (or more) anchor stations • Then let’s transmit a ‘broadcast’ packet from a different anchor station, while we simultaneously listen for any replies • Then let’s see what happens if we ‘omit’ our processing of the station-addresses

More Related