   page << PSTR("(") << setup_free_memory << PSTR(")") << BR;
   page << PSTR("Uptime (h:m:s): ") << h << ':' << m << ':' << s << BR;
   page << PSTR("Requests: ") << nr++ << BR;
-  page << PSTR("MAC: ") << addr.mac[0];
-  for (uint8_t i = 1; i < 6; i++) page << PSTR(":") << addr.mac[i];
-  page << BR;
-  page << PSTR("IP: ") << addr.ip[0];
-  for (uint8_t i = 1; i < 4; i++) page << PSTR(".") << addr.ip[i];
-  page << BR;
-  page << PSTR("PORT: ") << addr.port << BR;
+  page << PSTR("MAC: "); INET::print_mac(page, addr.mac); page << BR;
+  page << PSTR("IP: "); INET::print_addr(page, addr.ip, addr.port); page << BR;
   page << footer;
   page << flush;
 
   // Disconnect the client and allow new connection requests
  error:
-  TRACE(sock->disconnect());
-  TRACE(sock->listen());
+  sock->disconnect();
+  sock->listen();
 }

  // Bind the socket to an iostream
  IOStream page(sock);
  INET::addr_t addr;
  char buf[32];
  int res;

  // Get client connection information; MAC, IP address and port
  sock->get_src(addr);

  // Wait for the HTTP request
  while ((res = sock->available()) == 0);
  if (res < 0) goto error;
  TRACE(sock->available());

#ifndef NDEBUG
  // Read request and print in debug mode. Ignore contents
  trace << PSTR("Request#") << nr << endl;
  while ((res = sock->recv(buf, sizeof(buf) - 1)) > 0) {
    buf[res] = 0;
    trace << buf;
  }
  trace << endl;
#endif

  // Reply page; header and footer are static, contents dynamic
  static const char header[] PROGMEM = 

W5100 ethernet(mac);
Socket* sock;

// HTML end of line
#define CRLF "\r\n"

