NetBurner 3.1
dhcpinternals.h
1 /*NB_REVISION*/
2 
3 /*NB_COPYRIGHT*/
4 
5 #include <basictypes.h>
6 #include <netinterface.h>
7 #include <string.h>
8 
9 #ifndef _NB_DHCP_H
10 #define _NB_DHCP_H
11 
12 #define OPT_SIZE 255 // Size of options area
13 #define DHCP_OPT_OFFS 236 // Offset into DHCP Message for options data
14 #define DHCP_CLIENT_PORT 68 // Standard port assignment for client
15 #define DHCP_SERVER_PORT 67 // Standard port assignment for server
16 
17 //----- DHCP message types -----
18 #define DHCPDISCOVER 1
19 #define DHCPOFFER 2
20 #define DHCPREQUEST 3
21 #define DHCPDECLINE 4
22 #define DHCPACK 5
23 #define DHCPNAK 6
24 #define DHCPRELEASE 7
25 #define DHCPINFORM 8
26 #define DHCPERROR 99
27 
28 //----- DHCP message op codes -----
29 #define BOOTREQUEST 1
30 #define BOOTREPLY 2
31 
32 //----- DHCP option codes -----
33 #define DHCPOPT_SUBNET_MASK 1 // Client subnet mask
34 #define DHCPOPT_ROUTER 3 // Routers
35 #define DHCPOPT_TIME_SERVER 4 // Time Servers
36 #define DHCPOPT_DNS_SERVER 6 // DNS Server
37 #define DHCPOPT_LOG_SERVER 7 // Log Server
38 #define DHCPOPT_HOST_NAME 12 // Specifies name of client (Host Name Opt)
39 #define DHCPOPT_DOMAIN_NAME 15 // Domain Name for hosts
40 #define DHCPOPT_NTP_SERVER 42 // NTP Servers (different from tim)
41 #define DHCPOPT_REQ_IPADDR4 50 // Client requested IP address
42 #define DHCPOPT_LEASE_TIME 51 // IP addr lease time assigned by server
43 #define DHCPOPT_MSG_TYPE 53 // Type of DHCP message
44 #define DHCPOPT_SERVER_ID 54 // DHCP Server identifier
45 #define DHCPOPT_PARAM_REQ 55 // Parameter request list
46 #define DHCPOPT_RENEW_TIME 58 // # of seconds until client renewal state
47 #define DHCPOPT_REBIND_TIME 59 // # of seconds until client rebinding state
48 #define DHCPOPT_CLIENT_ID 61 // Unique client identifier
49 #define DHCPOPT_TFTP_SERVER 66 // TFTP Server name/IP
50 #define DHCPOPT_BOOTFILE 67 // TFTP Bootfile name
51 #define DHCPOPT_SMTP_SERVER 69 // SMTP Server name/IP
52 
53 #define DHCPOPT_END 255 // End of options marker
54 
55 #define DHCPCOOKIE0 (uint8_t)99 // DHCP message 4-byte cookie values
56 #define DHCPCOOKIE1 (uint8_t)130
57 #define DHCPCOOKIE2 (uint8_t)83
58 #define DHCPCOOKIE3 (uint8_t)99
59 
60 //----- ProcessDhcpMsg function return definitions -----
61 /*
62 #define PDM_DHCPOFFER 1 // Received DHCPOFFER message
63 #define PDM_DHCPACK 2 // Received DHCPACK message
64 #define PDM_DHCPNAK 3 // Received DHCPNAK message
65 #define PDM_COMPLETE 4 // DHCP configuration complete
66 #define PDM_ERROR 10 // Received unknown message
67 */
68 
69 //----- DHCP Message Structure -----
70 typedef struct dhcp_msg
71 {
72  uint8_t op; // Message opcode; 1=bootrequest, 2=bootreply
73  uint8_t htype; // Hardware address type; 1=10Mb ethernet
74  uint8_t hlen; // Hardware address length; 6=10Mb ethernet
75  uint8_t hops; // Client sets this to 0
76  beuint32_t xid; // Transaction ID; random number
77  beuint16_t secs; // Seconds elapsed since client request
78  beuint16_t flags; //
79  IPADDR4 ciaddr; // Clinet IP address if renew; filled by client
80  IPADDR4 yiaddr; // Assigned client IP address
81  IPADDR4 siaddr; // IP address of next server to use in bootstrap
82  IPADDR4 giaddr; // Relay agent IP address (Gateway)
83  uint8_t chaddr[16]; // Client hardware address
84  uint8_t sname[64]; // Optional server host name
85  uint8_t file[128]; // Boot file name, null terminated string
86  uint8_t options[OPT_SIZE]; // Optional parameters field
87 } __attribute__((packed)) DHCP_MESSAGE;
88 
89 class InterfaceBlock; // forward
90 
91 //----- DHCP message class -----
92 class DHCPMessage
93 {
94  private:
95  DHCP_MESSAGE Msg;
96 
97  public:
98  // constructors
99  DHCPMessage();
100  DHCPMessage(puint8_t pData);
101 
102  // member functions
103  void SetOp(uint8_t n) { Msg.op = n; }
104 
105  uint8_t GetMsgType() { return msg_type; }
106 
107  void SetHtype(uint8_t n) { Msg.htype = n; }
108  void SetHlen(uint8_t n) { Msg.hlen = n; }
109  void SetHops(uint8_t n) { Msg.hops = n; }
110 
111  void SetXid(uint32_t n) { Msg.xid = n; }
112 
113  void SetRandomXid(const MACADR &ma);
114 
115  void SetSecs(uint16_t n) { Msg.secs = n; }
116  void SetFlags(uint16_t n) { Msg.flags = n; }
117  void SetCiaddr(IPADDR4 i) { Msg.ciaddr = i; }
118  void SetYiaddr(IPADDR4 i) { Msg.yiaddr = i; }
119  void SetSiaddr(IPADDR4 i) { Msg.siaddr = i; }
120  void SetGiaddr(IPADDR4 i) { Msg.giaddr = i; }
121  void SetChaddr(MACADR ma)
122  {
123  memset(Msg.chaddr, 0x0, 16);
124  for (int i = 0; i < 6; i++)
125  {
126  Msg.chaddr[i] = ma.GetByte(i);
127  }
128  }
129 
130  void SetSname(char *s) { memcpy(Msg.sname, s, 64); }
131  void SetFile(char *s) { memcpy(Msg.file, s, 128); }
132  void SetOptions(char *s) { memcpy(Msg.options, s, OPT_SIZE); }
133 
134  void SetOptionsIp(int &offset, IPADDR4 &ip4)
135  {
136  uint32_t u32 = (uint32_t)ip4;
137  Msg.options[offset++] = ((u32 >> 24) & 0xff);
138  Msg.options[offset++] = ((u32 >> 16) & 0xff);
139  Msg.options[offset++] = ((u32 >> 8) & 0xff);
140  Msg.options[offset++] = (u32 & 0xff);
141  }
142 
143  void SetOptions(int i, uint8_t n) { Msg.options[i] = n; }
144 
145  uint32_t GetXid() { return Msg.xid; }
146  uint16_t GetSecs() { return Msg.secs; }
147  uint16_t GetFlags() { return Msg.flags; }
148  IPADDR4 GetCiaddr() { return Msg.ciaddr; }
149  IPADDR4 GetYiaddr() { return Msg.yiaddr; }
150  IPADDR4 GetGiaddr() { return Msg.giaddr; }
151  IPADDR4 GetSiaddr() { return Msg.siaddr; }
152  uint8_t GetChaddr(int i) { return Msg.chaddr[i]; }
153 
154  puint8_t GetDataPtr() { return (uint8_t *)(&Msg); }
155  int GetDataLen() { return sizeof(DHCP_MESSAGE); }
156  void ShowMsg(); // Displays DHCP message for debug purposes
157  void CreateReply(uint32_t xid, uint32_t yip); // Sets the message as a blank BOOTP reply
158  void ClearOptions(); // Clears options memory space and adds cookie
159  void ResetBytes(); // Clear chaddr, sname, file, and option fields
160  puint8_t GetOptionData(uint8_t code); // Returns option data for specified op code
161  puint8_t GetOptionData(uint8_t code, int &length);
162  void SendMsg(IPADDR4 IpAddr, InterfaceBlock *pIfb); // Send a DHPC message as a UDP packet
163  void SendServerMsg(IPADDR4 IpAddr, InterfaceBlock *pIfb); // Send a DHPC message as a UDP packet, as server
164  BOOL MsgForInterface(InterfaceBlock *pIfb);
165  uint8_t msg_type;
166 };
167 
168 //----- function prototypes -----
169 void CreateDhcpDiscoverMsg(DHCPMessage &NewMsg, InterfaceBlock *pIfb);
170 void CreateDhcpRequestMsg(DHCPMessage &OfferMsg, DHCPMessage &NewMsg, InterfaceBlock *pIfb);
171 void CreateDhcpReleaseMsg(DHCPMessage &NewMsg, InterfaceBlock *pIfb);
172 void ShowDhcpConfig(); // Show DHCP configuration paramters
173 void UpdateIPRuntimeVars(BOOLEAN release); // Update DHCP & IP runtime vars
174 void DHCPTimer(); // Tracks lease time
175 int ExecDHCPClient(int DhcpState); // Function that does the work
176 BOOLEAN ValidDhcpMsg(puint8_t pData); // Verify the UDP packet contains a DHCP message
177 BOOLEAN DhcpConfig(DHCPMessage &Msg); // Configure client from DHCPACK message
178 
179 /* function pointers to extend DHCP options */
180 extern void (*AddDhcpOptionsFunc)(DHCPMessage &NewMsg, int &opt, int MsgType);
181 extern void (*AddDhcpFieldsFunc)(DHCPMessage &NewMsg, int &opt, int MsgType);
182 extern void (*ParseDhcpOptions)(DHCPMessage &Msg);
183 
184 #endif