LRSD stephane / Mbed 2 deprecated WEBserver0-lrsd

Dependencies:   mbed

Committer:
geiineuville
Date:
Fri Sep 02 08:36:24 2011 +0000
Revision:
0:441400ffd086
V0

Who changed what in which revision?

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