An access controller for man doors at our facility. It receives Wiegand signals from a keypad/card reader and activates a relay to open the door. Access codes are stored in EEPROM. The active code list is updated from TFTP on a local server.

Dependencies:   24LCxx_I2C CardReader USBHOST

DHCPOptions.h

Committer:
acesrobertm
Date:
2017-09-25
Revision:
0:a56239ae90c2

File content as of revision 0:a56239ae90c2:


#ifndef DHCPOPTIONS_H_
#define DHCPOPTIONS_H_

#include <cstdint>
#include "EthernetInterface.h"
#include "NetworkStack.h"
#include "UDPSocket.h"
#include <inet.h>

using std::uint8_t;
using std::uint16_t;
using std::uint32_t;

#define MAC_STRING_LENGTH 17
#define DHCP_BROADCAST_ADDRESS "255.255.255.255"
#define DHCP_SERVER_PORT 67
#define DHCP_CLIENT_PORT 68
#define DHCP_DEFAULT_TIMEOUT 1000
#define DHCP_PACKET_SIZE 576

#define DHCP_OP_REQUEST 1 // Request op
#define DHCP_HTYPE 1 // Ethernet
#define DHCP_HLEN 6 // MAC 6 octet
#define DHCP_HOPS 0
#define DHCP_SECS 0
#define DHCP_FLAGS 0
#define DHCP_CIADDR 0
#define DHCP_YIADDR 0
#define DHCP_SIADDR 0
#define DHCP_GIADDR 0
#define DHCP_MAGIC_COOKIE 0x63825363 // See, it is magic after all!
#define DHCP_PREQLIST 55
#define DHCP_OPTION_TFTPSERVER 66
#define DHCP_OPTION_STOP 255

#define DHCP_CHADDR_SIZE      16
#define DHCP_SNAME_SIZE       64
#define DHCP_FILE_SIZE        128
#define DHCP_OPTIONS_SIZE     312

class DHCPOptions
{
public:
    DHCPOptions(EthernetInterface *stack) : m_eth(stack) {}

    /* Get DHCP Options from the server. Blocks until completion. */
    int getOptions(char* tftp_server, const char* mac_address, const uint32_t timeout = DHCP_DEFAULT_TIMEOUT); //Blocking

private:
    EthernetInterface *m_eth;
    UDPSocket m_sock;
    
    struct DHCPPacket
    {
        uint8_t op;
        uint8_t htype;
        uint8_t hlen;
        uint8_t hops;
        uint32_t xid;
        uint16_t secs;
        uint16_t flags;
        uint32_t ciaddr;
        uint32_t yiaddr;
        uint32_t siaddr;
        uint32_t giaddr;
        char chaddr[DHCP_CHADDR_SIZE];
        char sname[DHCP_SNAME_SIZE];
        char file[DHCP_FILE_SIZE];
        
        //Options
        uint32_t magic; // magic cookie
        uint8_t op_mtype; // message type
        uint8_t mtype_len;
        uint8_t mtype;
        char options[DHCP_OPTIONS_SIZE];
        
    } __attribute__ ((packed));
    
    int decodeOptions(char* tftp_server, DHCPPacket& pkt);
    int macStrToBin(char* macBin, const char* macStr);
    unsigned char charToNum(const char input);
};

#endif /* DHCPOPTIONS_H_ */