From f9928a1a08c57fe853888119a996c3acc98ee09d Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Fri, 14 Jan 2022 23:51:05 +0100 Subject: Initial version of nodemcuv2 dhcp server Able to offer IP address + DNS/Gateway ... Worked with devices at my hand. --- doc/dhcp.txt | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 doc/dhcp.txt (limited to 'doc') diff --git a/doc/dhcp.txt b/doc/dhcp.txt new file mode 100644 index 0000000..686137b --- /dev/null +++ b/doc/dhcp.txt @@ -0,0 +1,134 @@ +dhcp protocol: https://datatracker.ietf.org/doc/html/rfc2131 +dhcp options : https://datatracker.ietf.org/doc/html/rfc2132 + +dhcp message: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | op (1) | htype (1) | hlen (1) | hops (1) | + +---------------+---------------+---------------+---------------+ + | xid (4) | + +-------------------------------+-------------------------------+ + | secs (2) | flags (2) | + +-------------------------------+-------------------------------+ + | ciaddr (4) | + +---------------------------------------------------------------+ + | yiaddr (4) | + +---------------------------------------------------------------+ + | siaddr (4) | + +---------------------------------------------------------------+ + | giaddr (4) | + +---------------------------------------------------------------+ + | | + | chaddr (16) | + | | + | | + +---------------------------------------------------------------+ + | | + | sname (64) | + +---------------------------------------------------------------+ + | | + | file (128) | + +---------------------------------------------------------------+ + | | + | options (variable) | + +---------------------------------------------------------------+ + +dhcp message flags field: + + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |B| MBZ | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + B: BROADCAST flag + MBZ: MUST BE ZERO (reserved for future use) + +dhcp message field description: + + FIELD OCTETS DESCRIPTION + ----- ------ ----------- + op 1 Message op code / message type. + 1 = BOOTREQUEST, 2 = BOOTREPLY + htype 1 Hardware address type, see ARP section in "Assigned + Numbers" RFC; e.g., '1' = 10mb ethernet. + hlen 1 Hardware address length (e.g. '6' for 10mb + ethernet). + hops 1 Client sets to zero, optionally used by relay agents + when booting via a relay agent. + xid 4 Transaction ID, a random number chosen by the + client, used by the client and server to associate + messages and responses between a client and a + server. + secs 2 Filled in by client, seconds elapsed since client + began address acquisition or renewal process. + flags 2 Flags ([0]: broadcast flag). + ciaddr 4 Client IP address; only filled in if client is in + BOUND, RENEW or REBINDING state and can respond + to ARP requests. + yiaddr 4 'your' (client) IP address. + siaddr 4 IP address of next server to use in bootstrap; + returned in DHCPOFFER, DHCPACK by server. + giaddr 4 Relay agent IP address, used in booting via a + relay agent. + chaddr 16 Client hardware address. + sname 64 Optional server host name, null terminated string. + file 128 Boot file name, null terminated string; "generic" + name or null in DHCPDISCOVER, fully qualified + directory-path name in DHCPOFFER. + options var Optional parameters field. See the options + documents for a list of defined options. + +- A DHCP server always returns its own address in the 'server identifier' + option. + +- Client must accept DHCP of at least 576 octets (312 octects of option) + +- Time values (eg lease) are relative times in seconds and should be treated + relative wo each nodes clock. + +- Services: + - Parameter repository (2.1), used for persistent storage of network + parameters. + - Dynamic nw address allocation (2.2) + +- Protocol + - op == BOOTREQUEST client -> server message + - op == BOOTREPLY server -> client message + - options[0:4] -> magic cookie {0x63, 0x82, 0x53, 0x63} + - option (53 - DHCP Message Type) required in all dhcp messages + + 1. Client broadcasts DHCPDISCOVER (53). + 2. Server respond with DHCPOFFER (53). + - yiaddr -> allocated address + - additional options + 3. Client broadcasts DHCPREQUEST (53). + - must include 'server identifier' option + - 'requested ip address' option must be set to 'yiaddr' offerened in 2. + 4. Server sends DHCPACK (53) to client. + - fill 'yiaddr' with allocated address + - add configuration parameters + 5. Client may send DHCPDECLINE (53) if it detects addr already in use. + 6. Client may send DHCPRELEASE (53). + +- Constructing dhcp message + - variable options must end with 'end (255)' option + - client -> server udp port 67 + - server -> client udp port 68 + - @server (msg received by client) + - giaddr !=0 -> using BOOTP relay -> send resp to @giaddr:67 + - giaddr == 0 && ciaddr != 0 -> send resp to @ciaddr:68 + - giaddr == 0 && ciaddr == 0 && flags.b == 1 -> send resp to broadcast 0xffff_ffff + - giaddr == 0 && ciaddr == 0 && flags.b == 0 -> send resp to client hw addr + yiaddr + +- Options: + - 'maximum DHCP message size' + - Client may negotiate lager dhcp messages. + - 'server identifier' + - A DHCP server always returns its own address in the option. + - 'client identifier' + - Client may pass explicit client identifier to server. + - 'DHCP message type' (REQUIRED) + - type of dhcp message -- cgit v1.2.3