My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Tue Nov 20 12:18:53 2012 +0000
Revision:
1:284f2df30cf9
Parent:
0:7a64fbb4069d
local changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:7a64fbb4069d 1 #include "lwip/opt.h"
screamer 0:7a64fbb4069d 2 #include "lwip/stats.h"
screamer 0:7a64fbb4069d 3 #include "lwip/sys.h"
screamer 0:7a64fbb4069d 4 #include "lwip/pbuf.h"
screamer 0:7a64fbb4069d 5 #include "lwip/udp.h"
screamer 0:7a64fbb4069d 6 #include "lwip/tcp.h"
screamer 0:7a64fbb4069d 7 #include "lwip/dns.h"
screamer 0:7a64fbb4069d 8 #include "lwip/dhcp.h"
screamer 0:7a64fbb4069d 9 #include "lwip/init.h"
screamer 0:7a64fbb4069d 10 #include "lwip/netif.h"
screamer 0:7a64fbb4069d 11 #include "netif/etharp.h"
screamer 0:7a64fbb4069d 12 #include "netif/loopif.h"
screamer 0:7a64fbb4069d 13 #include "device.h"
screamer 0:7a64fbb4069d 14 #include "Ethernet.h"
screamer 0:7a64fbb4069d 15
screamer 0:7a64fbb4069d 16 #include "NetServer.h"
screamer 0:7a64fbb4069d 17 #include "TCPListener.h"
screamer 0:7a64fbb4069d 18 #include "TCPCallbackListener.h"
screamer 0:7a64fbb4069d 19 #include "TCPConnection.h"
screamer 0:7a64fbb4069d 20
screamer 0:7a64fbb4069d 21 using namespace std;
screamer 0:7a64fbb4069d 22 using namespace mbed;
screamer 0:7a64fbb4069d 23
screamer 0:7a64fbb4069d 24 NetServer *NetServer::singleton = NULL;
screamer 0:7a64fbb4069d 25
screamer 0:7a64fbb4069d 26 NetServer::NetServer() : netif(&netif_data), dhcp(true), hostname(HOSTNAME) {
screamer 0:7a64fbb4069d 27 IP4_ADDR(&netmask, 255,255,255,255);
screamer 0:7a64fbb4069d 28 IP4_ADDR(&gateway, 0,0,0,0);
screamer 0:7a64fbb4069d 29 IP4_ADDR(&ipaddr, 0,0,0,0);
screamer 0:7a64fbb4069d 30 netif->hwaddr_len = 0;
screamer 0:7a64fbb4069d 31 del = new list<TCPItem *>();
screamer 0:7a64fbb4069d 32 }
screamer 0:7a64fbb4069d 33
screamer 0:7a64fbb4069d 34 NetServer::NetServer(struct ip_addr ip, struct ip_addr nm, struct ip_addr gw)
screamer 0:7a64fbb4069d 35 : netif(&netif_data), ipaddr(ip), netmask(nm), gateway(gw), dhcp(false), hostname(HOSTNAME) {
screamer 0:7a64fbb4069d 36 netif->hwaddr_len = 0;
screamer 0:7a64fbb4069d 37 del = new list<TCPItem *>();
screamer 0:7a64fbb4069d 38 }
screamer 0:7a64fbb4069d 39
screamer 0:7a64fbb4069d 40 NetServer::~NetServer() {
screamer 0:7a64fbb4069d 41
screamer 0:7a64fbb4069d 42 }
screamer 0:7a64fbb4069d 43
screamer 0:7a64fbb4069d 44 void NetServer::_poll() const {
screamer 0:7a64fbb4069d 45 while(!del->empty()) {
screamer 0:7a64fbb4069d 46 TCPItem *item = del->front();
screamer 0:7a64fbb4069d 47 del->pop_front();
screamer 0:7a64fbb4069d 48 delete item;
screamer 0:7a64fbb4069d 49 }
screamer 0:7a64fbb4069d 50 device_poll();
screamer 0:7a64fbb4069d 51 tcp_tmr();
screamer 0:7a64fbb4069d 52 }
screamer 0:7a64fbb4069d 53
screamer 0:7a64fbb4069d 54 void NetServer::init() {
screamer 0:7a64fbb4069d 55 lwip_init();
screamer 0:7a64fbb4069d 56
screamer 0:7a64fbb4069d 57 netif->hwaddr_len = ETHARP_HWADDR_LEN;
screamer 0:7a64fbb4069d 58 device_address((char *)netif->hwaddr);
screamer 0:7a64fbb4069d 59
screamer 0:7a64fbb4069d 60 netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, device_init, ip_input);
screamer 0:7a64fbb4069d 61 netif->hostname = this->hostname;
screamer 0:7a64fbb4069d 62 netif_set_default(netif);
screamer 0:7a64fbb4069d 63 if(!dhcp) {
screamer 0:7a64fbb4069d 64 netif_set_up(netif);
screamer 0:7a64fbb4069d 65 } else {
screamer 0:7a64fbb4069d 66 dhcp_start(netif);
screamer 0:7a64fbb4069d 67 }
screamer 0:7a64fbb4069d 68
screamer 0:7a64fbb4069d 69 tickARP.attach_us( &etharp_tmr, ARP_TMR_INTERVAL * 1000);
screamer 0:7a64fbb4069d 70 //eth_tick.attach_us<NetServer>(this,&emac_tmr, TCP_FAST_INTERVAL * 1000);
screamer 0:7a64fbb4069d 71 dns_tick.attach_us(&dns_tmr, DNS_TMR_INTERVAL * 1000);
screamer 0:7a64fbb4069d 72 if(dhcp) {
screamer 0:7a64fbb4069d 73 dhcp_coarse.attach_us(&dhcp_coarse_tmr, DHCP_COARSE_TIMER_MSECS * 1000);
screamer 0:7a64fbb4069d 74 dhcp_fine.attach_us(&dhcp_fine_tmr, DHCP_FINE_TIMER_MSECS * 1000);
screamer 0:7a64fbb4069d 75 }
screamer 0:7a64fbb4069d 76 }
screamer 0:7a64fbb4069d 77
screamer 0:7a64fbb4069d 78 void NetServer::setUp() const {
screamer 0:7a64fbb4069d 79 netif_set_up(netif);
screamer 0:7a64fbb4069d 80 }
screamer 0:7a64fbb4069d 81
screamer 0:7a64fbb4069d 82 void NetServer::setDown() const {
screamer 0:7a64fbb4069d 83 netif_set_down(netif);
screamer 0:7a64fbb4069d 84 }
screamer 0:7a64fbb4069d 85
screamer 0:7a64fbb4069d 86 void NetServer::waitUntilReady() {
screamer 0:7a64fbb4069d 87 while(!netif_is_up(netif)) {
screamer 0:7a64fbb4069d 88 _poll();
screamer 0:7a64fbb4069d 89 wait_ms(1);
screamer 0:7a64fbb4069d 90 }
screamer 0:7a64fbb4069d 91 ipaddr = netif->ip_addr;
screamer 0:7a64fbb4069d 92 printf("IP: %hhu.%hhu.%hhu.%hhu\n", (ipaddr.addr)&0xFF, (ipaddr.addr>>8)&0xFF, (ipaddr.addr>>16)&0xFF, (ipaddr.addr>>24)&0xFF);
screamer 0:7a64fbb4069d 93 }
screamer 0:7a64fbb4069d 94
screamer 0:7a64fbb4069d 95 TCPCallbackListener *NetServer::bindTCPPort(u16_t port, err_t (*accept)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const {
screamer 0:7a64fbb4069d 96 TCPCallbackListener *listener = new TCPCallbackListener(port, accept);
screamer 0:7a64fbb4069d 97 listener->bind();
screamer 0:7a64fbb4069d 98 return listener;
screamer 0:7a64fbb4069d 99 }
screamer 0:7a64fbb4069d 100
screamer 0:7a64fbb4069d 101 void NetServer::free(TCPItem *item) const {
screamer 0:7a64fbb4069d 102 del->push_back(item);
screamer 0:7a64fbb4069d 103 }