dhcp/dhcp4.h

101 lines
2.3 KiB
C++

#pragma once
#include <stdint.h>
#include <assert.h>
namespace dhcp4 {
struct __attribute__((packed)) message {
uint8_t op; // message type
uint8_t htype; // hardware type
uint8_t hlen; // hardware address length
uint8_t hops;
uint32_t xid; // transaction id
uint16_t secs; // seconds elapsed
uint16_t flags;
uint32_t ciaddr; // client IP address
uint32_t yiaddr; // your (client) IP address
uint32_t siaddr; // next server IP address
uint32_t giaddr; // relay agent IP address
uint8_t chaddr[16]; // client hardware address
uint8_t sname[64];
uint8_t file[128];
uint8_t options[];
};
struct options {
int message_type; // 53
uint32_t subnet_mask; // 1
uint32_t router; // 3
uint32_t domain_name_server; // 6
uint32_t requested_ip_address; // 50
};
struct op {
enum {
bootrequest = 1,
bootreply = 2,
};
};
struct htype {
enum {
ethernet = 1,
};
};
static_assert((sizeof (message)) == 236);
struct option {
enum {
subnet_mask = 1,
router = 3,
domain_name_server = 6,
broadcast_address = 28,
requested_ip_address = 50,
ip_address_lease_time = 51,
option_overload = 52,
message_type = 53,
server_identifier = 54,
parameter_request_list = 55,
maximum_message_size = 57,
client_identifier = 61,
end = 255,
};
};
struct message_type {
enum {
dhcpdiscover = 1,
dhcpoffer = 2,
dhcprequest = 3,
dhcpdecline = 4,
dhcpack = 5,
dhcpnak = 6,
dhcprelease = 7,
dhcpinform = 8,
};
};
struct message_parameters {
uint32_t your_ip_address;
uint32_t next_server_ip_address;
uint32_t server_identifier;
uint32_t subnet_mask;
uint32_t router;
uint32_t domain_name_server;
uint32_t requested_ip_address;
};
int make_message(void * buf,
uint32_t bootp_message_type,
uint32_t transaction_id,
uint8_t const * chaddr,
uint32_t dhcp_message_type,
message_parameters const * params);
char const * message_type_tostr(int message_type);
void parse_options(message const * m, int options_length, options * o);
}