LRSD stephane / Mbed 2 deprecated WEBserverv3

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 08 08:57:21 2011 +0000
Revision:
0:9cf1d79ebe04
v0 v1 v2   \"v3\"

Who changed what in which revision?

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