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 #ifndef NETSERVER_H
screamer 0:7a64fbb4069d 2 #define NETSERVER_H
screamer 0:7a64fbb4069d 3
screamer 0:7a64fbb4069d 4 #include "ipv4/lwip/ip_addr.h"
screamer 0:7a64fbb4069d 5 #include "lwip/netif.h"
screamer 0:7a64fbb4069d 6 #include "netif/etharp.h"
screamer 0:7a64fbb4069d 7 #include "dns.h"
screamer 0:7a64fbb4069d 8 #include "mbed.h"
screamer 0:7a64fbb4069d 9
screamer 0:7a64fbb4069d 10 #include <list>
screamer 0:7a64fbb4069d 11
screamer 0:7a64fbb4069d 12 namespace mbed {
screamer 0:7a64fbb4069d 13 class TCPItem;
screamer 0:7a64fbb4069d 14 class TCPListener;
screamer 0:7a64fbb4069d 15 class TCPCallbackListener;
screamer 0:7a64fbb4069d 16 class TCPConnection;
screamer 0:7a64fbb4069d 17
screamer 0:7a64fbb4069d 18 /**
screamer 0:7a64fbb4069d 19 * Network main class
screamer 0:7a64fbb4069d 20 * provides the basic network features.
screamer 0:7a64fbb4069d 21 */
screamer 0:7a64fbb4069d 22 class NetServer {
screamer 0:7a64fbb4069d 23 public:
screamer 0:7a64fbb4069d 24 /**
screamer 0:7a64fbb4069d 25 * Returns you the NetServer instance.
screamer 0:7a64fbb4069d 26 * If there is no object it will create a new one.
screamer 0:7a64fbb4069d 27 * But it will not initialise it.
screamer 0:7a64fbb4069d 28 * Configure the object for DHCP.
screamer 0:7a64fbb4069d 29 */
screamer 0:7a64fbb4069d 30 static NetServer *create() {
screamer 0:7a64fbb4069d 31 if(!NetServer::singleton) {
screamer 0:7a64fbb4069d 32 NetServer::singleton = new NetServer();
screamer 0:7a64fbb4069d 33 }
screamer 0:7a64fbb4069d 34 return NetServer::singleton;
screamer 0:7a64fbb4069d 35 }
screamer 0:7a64fbb4069d 36
screamer 0:7a64fbb4069d 37 /**
screamer 0:7a64fbb4069d 38 * Returns you the NetServer instance.
screamer 0:7a64fbb4069d 39 * If there is no object it will create a new one.
screamer 0:7a64fbb4069d 40 * But it will not initialise it.
screamer 0:7a64fbb4069d 41 * You have to insert ipaddres, netmask and gateway.
screamer 0:7a64fbb4069d 42 */
screamer 0:7a64fbb4069d 43 inline static NetServer *create(const struct ip_addr &ip, const struct ip_addr &netmask, const struct ip_addr &gateway) {
screamer 0:7a64fbb4069d 44 if(!NetServer::singleton) {
screamer 0:7a64fbb4069d 45 NetServer::singleton = new NetServer(ip, netmask, gateway);
screamer 0:7a64fbb4069d 46 }
screamer 0:7a64fbb4069d 47 return NetServer::singleton;
screamer 0:7a64fbb4069d 48 }
screamer 0:7a64fbb4069d 49
screamer 0:7a64fbb4069d 50 /**
screamer 0:7a64fbb4069d 51 * Returns you the NetServer instance.
screamer 0:7a64fbb4069d 52 * If there is no object it will create a new one
screamer 0:7a64fbb4069d 53 * and it will initialise it.
screamer 0:7a64fbb4069d 54 * A new created object will ever use DHCP and the default MAC address
screamer 0:7a64fbb4069d 55 * and default hostname.
screamer 0:7a64fbb4069d 56 */
screamer 0:7a64fbb4069d 57 inline static NetServer *ready() {
screamer 0:7a64fbb4069d 58 if(!NetServer::singleton) {
screamer 0:7a64fbb4069d 59 NetServer::singleton = new NetServer();
screamer 0:7a64fbb4069d 60 }
screamer 0:7a64fbb4069d 61 if(!NetServer::singleton->netif->hwaddr_len) {
screamer 0:7a64fbb4069d 62 NetServer::singleton->init();
screamer 0:7a64fbb4069d 63 NetServer::singleton->waitUntilReady();
screamer 0:7a64fbb4069d 64 }
screamer 0:7a64fbb4069d 65 return NetServer::singleton;
screamer 0:7a64fbb4069d 66 }
screamer 0:7a64fbb4069d 67
screamer 0:7a64fbb4069d 68 /**
screamer 0:7a64fbb4069d 69 * Returns you the NetServer instance.
screamer 0:7a64fbb4069d 70 * Even if there is no one created.
screamer 0:7a64fbb4069d 71 * That means use with care and in combination with NetServer::ready().
screamer 0:7a64fbb4069d 72 * It is mutch quicker than NetServer::ready().
screamer 0:7a64fbb4069d 73 * First call one time NetServer::ready() and then NetServer::get()
screamer 0:7a64fbb4069d 74 * and you are save.
screamer 0:7a64fbb4069d 75 */
screamer 0:7a64fbb4069d 76 inline static NetServer *get() {
screamer 0:7a64fbb4069d 77 return NetServer::singleton;
screamer 0:7a64fbb4069d 78 }
screamer 0:7a64fbb4069d 79
screamer 0:7a64fbb4069d 80 /**
screamer 0:7a64fbb4069d 81 * Polls one time on the NetServer and all registert Interfaces.
screamer 0:7a64fbb4069d 82 * Even if there is no one created.
screamer 0:7a64fbb4069d 83 * That means use with care and in combination with NetServer::ready().
screamer 0:7a64fbb4069d 84 * It is mutch faster than NetServer::ready()->_poll().
screamer 0:7a64fbb4069d 85 * First call one time NetServer::ready() and then NetServer::poll()
screamer 0:7a64fbb4069d 86 * and you are save.
screamer 0:7a64fbb4069d 87 */
screamer 0:7a64fbb4069d 88 inline static void poll() {
screamer 0:7a64fbb4069d 89 singleton->_poll();
screamer 0:7a64fbb4069d 90 }
screamer 0:7a64fbb4069d 91
screamer 0:7a64fbb4069d 92 /**
screamer 0:7a64fbb4069d 93 * Default destructor.
screamer 0:7a64fbb4069d 94 */
screamer 0:7a64fbb4069d 95 ~NetServer();
screamer 0:7a64fbb4069d 96
screamer 0:7a64fbb4069d 97 /**
screamer 0:7a64fbb4069d 98 * Set MBed IP Address
screamer 0:7a64fbb4069d 99 */
screamer 0:7a64fbb4069d 100 void setIPAddr(const struct ip_addr &value) { netif->ip_addr = ipaddr = value; }
screamer 0:7a64fbb4069d 101 /**
screamer 0:7a64fbb4069d 102 * Get MBed IP Address
screamer 0:7a64fbb4069d 103 */
screamer 0:7a64fbb4069d 104 const struct ip_addr &getIPAddr() { return ipaddr = netif->ip_addr; }
screamer 0:7a64fbb4069d 105
screamer 0:7a64fbb4069d 106 /**
screamer 0:7a64fbb4069d 107 * Set Netmask
screamer 0:7a64fbb4069d 108 */
screamer 0:7a64fbb4069d 109 void setNetmask(const struct ip_addr &value) { netif->netmask = netmask = value; }
screamer 0:7a64fbb4069d 110
screamer 0:7a64fbb4069d 111 /**
screamer 0:7a64fbb4069d 112 * Get Netmask
screamer 0:7a64fbb4069d 113 */
screamer 0:7a64fbb4069d 114 const struct ip_addr &getNetmask() { return netmask = netif->netmask; }
screamer 0:7a64fbb4069d 115
screamer 0:7a64fbb4069d 116 /**
screamer 0:7a64fbb4069d 117 * Set default Gateway
screamer 0:7a64fbb4069d 118 */
screamer 0:7a64fbb4069d 119 void setGateway(const struct ip_addr &value) { netif->gw = gateway = value; }
screamer 0:7a64fbb4069d 120
screamer 0:7a64fbb4069d 121 /**
screamer 0:7a64fbb4069d 122 * Get default Gateway
screamer 0:7a64fbb4069d 123 */
screamer 0:7a64fbb4069d 124 const struct ip_addr &getGateway() { return gateway = netif->gw; }
screamer 0:7a64fbb4069d 125
screamer 0:7a64fbb4069d 126 /**
screamer 0:7a64fbb4069d 127 * Set first Domain Name Server
screamer 0:7a64fbb4069d 128 */
screamer 0:7a64fbb4069d 129 void setDNS1(const struct ip_addr &value) { firstdns = value; dns_setserver(0, &firstdns); }
screamer 0:7a64fbb4069d 130
screamer 0:7a64fbb4069d 131 /**
screamer 0:7a64fbb4069d 132 * Get first Domain Name Server
screamer 0:7a64fbb4069d 133 */
screamer 0:7a64fbb4069d 134 const struct ip_addr &getDNS1() { return firstdns = dns_getserver(0); }
screamer 0:7a64fbb4069d 135
screamer 0:7a64fbb4069d 136 /**
screamer 0:7a64fbb4069d 137 * Set second Domain Name Server
screamer 0:7a64fbb4069d 138 */
screamer 0:7a64fbb4069d 139 void setDNS2(const struct ip_addr &value) { seconddns = value; dns_setserver(1, &firstdns); }
screamer 0:7a64fbb4069d 140
screamer 0:7a64fbb4069d 141 /**
screamer 0:7a64fbb4069d 142 * Get second Domain Name Server
screamer 0:7a64fbb4069d 143 */
screamer 0:7a64fbb4069d 144 const struct ip_addr &getDNS2() { return seconddns = dns_getserver(1); }
screamer 0:7a64fbb4069d 145
screamer 0:7a64fbb4069d 146 /**
screamer 0:7a64fbb4069d 147 * Set MBed Hostname
screamer 0:7a64fbb4069d 148 */
screamer 0:7a64fbb4069d 149 void setHostname(char *value) { hostname = value; }
screamer 0:7a64fbb4069d 150
screamer 0:7a64fbb4069d 151 /**
screamer 0:7a64fbb4069d 152 * Get MBed Hostname
screamer 0:7a64fbb4069d 153 */
screamer 0:7a64fbb4069d 154 const char *getHostname() const { return hostname; }
screamer 0:7a64fbb4069d 155
screamer 0:7a64fbb4069d 156 /**
screamer 0:7a64fbb4069d 157 * Define if DHCP sould be used.
screamer 0:7a64fbb4069d 158 * @param value Bool if true dhcp is used else a static ip setting is assumed.
screamer 0:7a64fbb4069d 159 */
screamer 0:7a64fbb4069d 160 void setUseDHCP(const bool &value) { dhcp = value; }
screamer 0:7a64fbb4069d 161
screamer 0:7a64fbb4069d 162 /**
screamer 0:7a64fbb4069d 163 * Is the mbed board trying to use DHCP?
screamer 0:7a64fbb4069d 164 */
screamer 0:7a64fbb4069d 165 const bool &getUseDHCP() const { return dhcp; }
screamer 0:7a64fbb4069d 166
screamer 0:7a64fbb4069d 167 /**
screamer 0:7a64fbb4069d 168 * Initialise the network environment. Set up all services.
screamer 0:7a64fbb4069d 169 * Please call after configuration.
screamer 0:7a64fbb4069d 170 */
screamer 0:7a64fbb4069d 171 void init();
screamer 0:7a64fbb4069d 172
screamer 0:7a64fbb4069d 173 /**
screamer 0:7a64fbb4069d 174 * Set the network interface up.
screamer 0:7a64fbb4069d 175 * To enable the network interface after calling setDown()
screamer 0:7a64fbb4069d 176 * Automaticly called from init().
screamer 0:7a64fbb4069d 177 */
screamer 0:7a64fbb4069d 178 void setUp() const;
screamer 0:7a64fbb4069d 179
screamer 0:7a64fbb4069d 180 /**
screamer 0:7a64fbb4069d 181 * Set the network interface down.
screamer 0:7a64fbb4069d 182 * To disable the network interface temporary.
screamer 0:7a64fbb4069d 183 * To make the interface avalible again use setUp().
screamer 0:7a64fbb4069d 184 */
screamer 0:7a64fbb4069d 185 void setDown() const;
screamer 0:7a64fbb4069d 186
screamer 0:7a64fbb4069d 187 /**
screamer 0:7a64fbb4069d 188 * This function waits until the network interface is Up.
screamer 0:7a64fbb4069d 189 * To use to wait after init with DHCP. Helps continue work
screamer 0:7a64fbb4069d 190 * after the network interface is completly up.
screamer 0:7a64fbb4069d 191 */
screamer 0:7a64fbb4069d 192 void waitUntilReady();
screamer 0:7a64fbb4069d 193
screamer 0:7a64fbb4069d 194 /**
screamer 0:7a64fbb4069d 195 * Bind Callbackfunctions to a TCPPort.
screamer 0:7a64fbb4069d 196 * It provides a clean lowlevel Interface to the TCPLayer.
screamer 0:7a64fbb4069d 197 */
screamer 0:7a64fbb4069d 198 TCPCallbackListener *bindTCPPort(u16_t, err_t (*)(TCPCallbackListener *, struct tcp_pcb *, err_t)) const;
screamer 0:7a64fbb4069d 199
screamer 0:7a64fbb4069d 200 /**
screamer 0:7a64fbb4069d 201 * Frees TCPItems because they cant do it directly.
screamer 0:7a64fbb4069d 202 */
screamer 0:7a64fbb4069d 203 void free(TCPItem *item) const;
screamer 0:7a64fbb4069d 204
screamer 0:7a64fbb4069d 205 protected:
screamer 0:7a64fbb4069d 206 void _poll() const;
screamer 0:7a64fbb4069d 207
screamer 0:7a64fbb4069d 208 /**
screamer 0:7a64fbb4069d 209 * Default constructor tryes to bring the network interface up with dhcp.
screamer 0:7a64fbb4069d 210 */
screamer 0:7a64fbb4069d 211 NetServer();
screamer 0:7a64fbb4069d 212
screamer 0:7a64fbb4069d 213 /**
screamer 0:7a64fbb4069d 214 * Constructor for fix ip setting
screamer 0:7a64fbb4069d 215 */
screamer 0:7a64fbb4069d 216 NetServer(struct ip_addr me_ip, struct ip_addr netmask, struct ip_addr gateway);
screamer 0:7a64fbb4069d 217
screamer 0:7a64fbb4069d 218 private:
screamer 0:7a64fbb4069d 219 /**
screamer 0:7a64fbb4069d 220 * This is a singleton class.
screamer 0:7a64fbb4069d 221 * So we should not have a public copy constructor.
screamer 0:7a64fbb4069d 222 */
screamer 0:7a64fbb4069d 223 NetServer(NetServer const&) {}
screamer 0:7a64fbb4069d 224 // NetServer &operator=(NetServer const&) {}
screamer 0:7a64fbb4069d 225
screamer 0:7a64fbb4069d 226 struct netif *netif;
screamer 0:7a64fbb4069d 227 struct netif netif_data;
screamer 0:7a64fbb4069d 228
screamer 0:7a64fbb4069d 229 struct ip_addr ipaddr;
screamer 0:7a64fbb4069d 230 struct ip_addr netmask;
screamer 0:7a64fbb4069d 231 struct ip_addr gateway;
screamer 0:7a64fbb4069d 232
screamer 0:7a64fbb4069d 233 struct ip_addr firstdns;
screamer 0:7a64fbb4069d 234 struct ip_addr seconddns;
screamer 0:7a64fbb4069d 235
screamer 0:7a64fbb4069d 236 bool dhcp;
screamer 0:7a64fbb4069d 237
screamer 0:7a64fbb4069d 238 list<TCPItem *> *del;
screamer 0:7a64fbb4069d 239
screamer 0:7a64fbb4069d 240 Ticker tickARP, /*eth_tick,*/ dns_tick, dhcp_coarse, dhcp_fine;
screamer 0:7a64fbb4069d 241 char *hostname;
screamer 0:7a64fbb4069d 242 static NetServer *singleton;
screamer 0:7a64fbb4069d 243 };
screamer 0:7a64fbb4069d 244
screamer 0:7a64fbb4069d 245 };
screamer 0:7a64fbb4069d 246 #endif /* NETSERVER_H */