The hardware ringbuffer Understanding the RTL-8139 mechanism for packet reception Implementing a ringbuffer Start address Buffer length Buffer storage datum HEAD datum datum datum TAIL TAIL = where to insert the next datum HEAD = where to remove the next datum Some ringbuffer details • When HEAD == TAIL the buffer is empty • The HEAD and TAIL pointers advance to the end of the buffer, then ‘wrap around’ • Some storage always remains unused • When sizes of stored data-items are not uniform, then the size of each item must be stored somewhere – probably with the item itself RealTek’s implementation Receive Buffer Start Address Receive Configuration Register (includes size of the buffer) Buffer storage data data = packet header (4-bytes) = packet data (size varies) data CBR Current Buffer Register (4-byte aligned) CAPR Current Address of Packet to Read (minus 16 bytes) Packet-Header Format 15 14 13 5 4 M A R P A M B A R I S E R U N T reserved 3 L O N G 2 1 0 C R C F A E R O K Packet Status (least significant 16 bits) 31 16 Packet Length (most significant 16 bits) LEGEND MAR (Multicast Address Received) PAM (Physical Address Matched) BAR (Broadcast Address Received) ROK = Received OK FAE = Frame Alignment Error CRC = CRC Error LONG = Packet length exceeds 4KB RUNT = Packet size below 64 bytes ISE = Invalid Symbol Error Receive Algorithm • • • • • • • Reset controller (bit #4 in register CR) Allocate memory and program RBSTART Enable reception (bit #3 in register CR) Configure reception (RXCONFIG register) Adjust CAPR for size of allocated buffer Optionally unmask the receive interrupts Await received packet(s) (bit #0 in CR) Recall ‘RXCONFIG’ layout 32-bit register (offsets 0x44-0x47) 31 28 27 13 Rx FIFO Threshold 23 18 Early Receive Threshold reserved 15 24 12 11 Rx Buf Length 10 7 5 4 Max DMA Burse Size W R A P L O N G R U N T 0 16 Mult Rx ER ERR INT 8 reserved 8 17 3 B C A S T 2 1 0 M C A S T M A C A L L How to configure Rx • Buffer length is the most crucial parameter – 8KB (=00) with or without ‘wrap’ – 16KB (=01) with or without ‘wrap’ – 32KB (=10) with or without ‘wrap’ – 64KB (=11) (‘wrap’ is automatic) • Next is which packets to receive: – Broadcast, Multicast and MAC-Address Match – (You do NOT want to receive ALL packets) What about thresholds? • The Linux driver offers us guidance – Can use ‘none’ as Early Rx Threshold – Can use ‘none’ as Rx FIFO Threshold – Can use a ‘reserved’ DMA Burst size • So the Linux driver used: 0x0000E70E • But you can experiment with other values In-class exercise #1 • Install our ‘user8139.c’ device-driver, and take note of its buffer’s physical address • Install our ‘dram.c’ device-driver, and use ‘fileview’ to look at the NIC Receive Buffer • Then modify ‘nicstudy.cpp’ so that it will enable (and configure) packet-recption • Use ‘fileview’ to look at received packets In-class exercise #2 • Now enhance your modified version of the ‘nicstudy’ application so that it will display a succession of received packets (using both hexadecimal and ascii formats), in a manner similar to our ‘rxtester.cpp’ demo • Be sure you ‘disable’ the packet reception before you remove ‘user8139.ko’ from the kernel – or risk a system ‘crash’ (Why?) The ‘/etc/ethers’ file • This file describes the list of associations of Ethernet-addresses with IP-addresses • It’s a text file, created with a text editor • Each line describes one correspondence: xx:xx:xx:xx:xx:xx 138.202.171.30 • But comments start with a #-character • A sample ‘ethers’ file is on our website Dynamic Address Resolution • A standard Internet Protocol service exists which provides a dynamic way for stations to discover the Ethernet address that goes with a given IP-address • It is called ‘Address Resolution Protocol’ ARP request A B request C D E Station ‘A’ wants to know the Ethernet Address for station ‘B’ So ‘A’ broadcasts an ARP request-packet to all other stations ARP reply A B reply C D E Station ‘B’ recognizes that the request is for its Ethernet Address. So ‘B’ replies directly to ‘A’, and other stations ignore the request. ARP packet-format packet-header Dest’n MAC Source MAC 0806 HTYPE=0001 broadcast address for ARP request ARP packet-data PTYPE=0008 HLEN (01) PLEN=04 OPER=0001/0002 source hardware address (6 bytes) source protocol address (4 bytes) destination hardware address (6 bytes) destination protocol address (4 bytes) All zeros for an ARP request