mirror of
https://github.com/arduino/Arduino.git
synced 2025-02-08 02:54:24 +01:00
A no brainer update. Expose optional timeout parameter values of dhcp for user to adjust on their code. Currently if dhcp server is not available, code will block inside DhcpClass::request_DHCP_lease() for 60s. Having this parameters exposed user can specify their timeout requirements without changing the lib code. Change is backward compatible as parameters are optional and defaults to existing values.
137 lines
3.8 KiB
C++
137 lines
3.8 KiB
C++
#include "utility/w5100.h"
|
|
#include "Ethernet.h"
|
|
#include "Dhcp.h"
|
|
|
|
// XXX: don't make assumptions about the value of MAX_SOCK_NUM.
|
|
uint8_t EthernetClass::_state[MAX_SOCK_NUM] = {
|
|
0, 0, 0, 0 };
|
|
uint16_t EthernetClass::_server_port[MAX_SOCK_NUM] = {
|
|
0, 0, 0, 0 };
|
|
|
|
int EthernetClass::begin(uint8_t *mac_address, unsigned long timeout, unsigned long responseTimeout)
|
|
{
|
|
static DhcpClass s_dhcp;
|
|
_dhcp = &s_dhcp;
|
|
|
|
|
|
// Initialise the basic info
|
|
W5100.init();
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.setMACAddress(mac_address);
|
|
W5100.setIPAddress(IPAddress(0,0,0,0).raw_address());
|
|
SPI.endTransaction();
|
|
|
|
// Now try to get our config info from a DHCP server
|
|
int ret = _dhcp->beginWithDHCP(mac_address, timeout, responseTimeout);
|
|
if(ret == 1)
|
|
{
|
|
// We've successfully found a DHCP server and got our configuration info, so set things
|
|
// accordingly
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.setIPAddress(_dhcp->getLocalIp().raw_address());
|
|
W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address());
|
|
W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address());
|
|
SPI.endTransaction();
|
|
_dnsServerAddress = _dhcp->getDnsServerIp();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip)
|
|
{
|
|
// Assume the DNS server will be the machine on the same network as the local IP
|
|
// but with last octet being '1'
|
|
IPAddress dns_server = local_ip;
|
|
dns_server[3] = 1;
|
|
begin(mac_address, local_ip, dns_server);
|
|
}
|
|
|
|
void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server)
|
|
{
|
|
// Assume the gateway will be the machine on the same network as the local IP
|
|
// but with last octet being '1'
|
|
IPAddress gateway = local_ip;
|
|
gateway[3] = 1;
|
|
begin(mac_address, local_ip, dns_server, gateway);
|
|
}
|
|
|
|
void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway)
|
|
{
|
|
IPAddress subnet(255, 255, 255, 0);
|
|
begin(mac_address, local_ip, dns_server, gateway, subnet);
|
|
}
|
|
|
|
void EthernetClass::begin(uint8_t *mac, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet)
|
|
{
|
|
W5100.init();
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.setMACAddress(mac);
|
|
W5100.setIPAddress(local_ip.raw_address());
|
|
W5100.setGatewayIp(gateway.raw_address());
|
|
W5100.setSubnetMask(subnet.raw_address());
|
|
SPI.endTransaction();
|
|
_dnsServerAddress = dns_server;
|
|
}
|
|
|
|
int EthernetClass::maintain(){
|
|
int rc = DHCP_CHECK_NONE;
|
|
if(_dhcp != NULL){
|
|
//we have a pointer to dhcp, use it
|
|
rc = _dhcp->checkLease();
|
|
switch ( rc ){
|
|
case DHCP_CHECK_NONE:
|
|
//nothing done
|
|
break;
|
|
case DHCP_CHECK_RENEW_OK:
|
|
case DHCP_CHECK_REBIND_OK:
|
|
//we might have got a new IP.
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.setIPAddress(_dhcp->getLocalIp().raw_address());
|
|
W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address());
|
|
W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address());
|
|
SPI.endTransaction();
|
|
_dnsServerAddress = _dhcp->getDnsServerIp();
|
|
break;
|
|
default:
|
|
//this is actually a error, it will retry though
|
|
break;
|
|
}
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
IPAddress EthernetClass::localIP()
|
|
{
|
|
IPAddress ret;
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.getIPAddress(ret.raw_address());
|
|
SPI.endTransaction();
|
|
return ret;
|
|
}
|
|
|
|
IPAddress EthernetClass::subnetMask()
|
|
{
|
|
IPAddress ret;
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.getSubnetMask(ret.raw_address());
|
|
SPI.endTransaction();
|
|
return ret;
|
|
}
|
|
|
|
IPAddress EthernetClass::gatewayIP()
|
|
{
|
|
IPAddress ret;
|
|
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
|
|
W5100.getGatewayIp(ret.raw_address());
|
|
SPI.endTransaction();
|
|
return ret;
|
|
}
|
|
|
|
IPAddress EthernetClass::dnsServerIP()
|
|
{
|
|
return _dnsServerAddress;
|
|
}
|
|
|
|
EthernetClass Ethernet;
|