This is an old revision of the document!
=== Week 2 [ 31 May - 6 Jun 2010 ]: Discuss TCP and memory changes, update jme driver === == jme driver == * From Joshua Oreman * jme_check_link(struct net_device *netdev, int testonly)\\ * In this function, I believe the code and string data used in constructing linkmsg will make it into even non-debug versions of the executable. If that's true it would be better if you could perform all the manipulations in the final DBG() line, using the ?: operator and such. It's possible the compiler is clever enough to know what strcat() does and see that linkmsg[] is not used in non-debug, though, so this may be moot. * From Michael Brown * if (memcmp(addr, netdev->hw_addr, ETH_ALEN)) * No need for this compare; just always write the MAC address. (This code will fail if you set the MAC to a non-default value, then try to set it back.) * Code cleanups * gPXE dose not use any DMA address that is above 4G <code C> #if __x86_64__ rxdesc->desc1.flags = RXFLAG_64BIT; #endif </code> * Use struct ethhdr and eth_ntoa(). * Drivers should generally not try to parse the packets they transmit and receive. * This code will break if/when software VLAN support is added. <code C> DBG2("Received packet: " "from %02x:%02x:%02x:%02x:%02x:%02x " "to %02x:%02x:%02x:%02x:%02x:%02x " "type %04x\n", *(uint8_t *)(rxbi->data + 6), *(uint8_t *)(rxbi->data + 7), *(uint8_t *)(rxbi->data + 8), *(uint8_t *)(rxbi->data + 9), *(uint8_t *)(rxbi->data + 10), *(uint8_t *)(rxbi->data + 11), *(uint8_t *)(rxbi->data + 0), *(uint8_t *)(rxbi->data + 1), *(uint8_t *)(rxbi->data + 2), *(uint8_t *)(rxbi->data + 3), *(uint8_t *)(rxbi->data + 4), *(uint8_t *)(rxbi->data + 5), be16_to_cpu(*(uint16_t *)(rxbi->data + 12))); </code> * %p should be used for printing out pointer values. <code C> DBG2("TX buffer address: %08lx(%08lx+%x)\n", (unsigned long)iob->data, mapping, len); </code> * This will behave poorly when memory runs out. Better is to have a refill routine that runs after the poll(), and always attempts to refill up to a specified level. <code C> rxdesc += idx; if (jme_make_new_rx_buf(rxring->bufinf + idx)) { DBG("Dropped packet due to memory allocation error.\n"); netdev_rx_err(netdev, NULL, -ENOMEM); } else { </code> == TCP / memory topic == * Current heap size is fixed at 128K. * Although it only uses 128K, all-drivers image already overlapped with heap address. * Trying to figure out a way to obtain more memory, and report it to OS. * See if it is possiable to know how much heap size we can use out of code and stack. Before start the discussion, I'm going to trace how the gPXE boot/relocate/fill segment info. And try to understand how Michael Brown removes the even megabyte limit.