*/
/* FIXME: match response against chaddr */
-int arpping(u_int32_t yiaddr, u_int32_t ip, unsigned char *mac, char *interface)
+int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *mac, char *interface)
{
int timeout = 2;
if (recv(s, &arp, sizeof(arp), 0) < 0 ) rv = 0;
if (arp.operation == htons(ARPOP_REPLY) &&
bcmp(arp.tHaddr, mac, 6) == 0 &&
- *((u_int *) arp.sInaddr) == yiaddr) {
+ *((uint32_t *) arp.sInaddr) == yiaddr) {
DEBUG(LOG_INFO, "Valid arp reply receved for this address");
rv = 0;
break;
struct arpMsg {
struct ethhdr ethhdr; /* Ethernet header */
- u_short htype; /* hardware type (must be ARPHRD_ETHER) */
- u_short ptype; /* protocol type (must be ETH_P_IP) */
- u_char hlen; /* hardware address length (must be 6) */
- u_char plen; /* protocol address length (must be 4) */
- u_short operation; /* ARP opcode */
- u_char sHaddr[6]; /* sender's hardware address */
- u_char sInaddr[4]; /* sender's IP address */
- u_char tHaddr[6]; /* target's hardware address */
- u_char tInaddr[4]; /* target's IP address */
- u_char pad[18]; /* pad for min. Ethernet payload (60 bytes) */
+ uint16_t htype; /* hardware type (must be ARPHRD_ETHER) */
+ uint16_t ptype; /* protocol type (must be ETH_P_IP) */
+ uint8_t hlen; /* hardware address length (must be 6) */
+ uint8_t plen; /* protocol address length (must be 4) */
+ uint16_t operation; /* ARP opcode */
+ uint8_t sHaddr[6]; /* sender's hardware address */
+ uint8_t sInaddr[4]; /* sender's IP address */
+ uint8_t tHaddr[6]; /* target's hardware address */
+ uint8_t tInaddr[4]; /* target's IP address */
+ uint8_t pad[18]; /* pad for min. Ethernet payload (60 bytes) */
};
/* function prototypes */
-int arpping(u_int32_t yiaddr, u_int32_t ip, unsigned char *arp, char *interface);
+int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *arp, char *interface);
#endif
memcpy(packet->chaddr, client_config.arp, 6);
add_option_string(packet->options, client_config.clientid);
if (client_config.hostname) add_option_string(packet->options, client_config.hostname);
- add_option_string(packet->options, (unsigned char *) &vendor_id);
+ add_option_string(packet->options, (uint8_t *) &vendor_id);
}
{
int bytes;
struct udp_dhcp_packet packet;
- u_int32_t source, dest;
- u_int16_t check;
+ uint32_t source, dest;
+ uint16_t check;
memset(&packet, 0, sizeof(struct udp_dhcp_packet));
bytes = read(fd, &packet, sizeof(struct udp_dhcp_packet));
if (packet.ip.protocol != IPPROTO_UDP || packet.ip.version != IPVERSION ||
packet.ip.ihl != sizeof(packet.ip) >> 2 || packet.udp.dest != htons(CLIENT_PORT) ||
bytes > (int) sizeof(struct udp_dhcp_packet) ||
- ntohs(packet.udp.len) != (short) (bytes - sizeof(packet.ip))) {
+ ntohs(packet.udp.len) != (uint16_t) (bytes - sizeof(packet.ip))) {
DEBUG(LOG_INFO, "unrelated/bogus packet");
return -2;
}
int main(int argc, char *argv[])
#endif
{
- unsigned char *temp, *message;
+ uint8_t *temp, *message;
unsigned long t1 = 0, t2 = 0, xid = 0;
unsigned long start = 0, lease;
fd_set rfds;
char *interface; /* The name of the interface to use */
char *pidfile; /* Optionally store the process ID */
char *script; /* User script to run at dhcp events */
- unsigned char *clientid; /* Optional client id to use */
- unsigned char *hostname; /* Optional hostname to use */
+ uint8_t *clientid; /* Optional client id to use */
+ uint8_t *hostname; /* Optional hostname to use */
int ifindex; /* Index number of the interface to use */
- unsigned char arp[6]; /* Our arp address */
+ uint8_t arp[6]; /* Our arp address */
};
extern struct client_config_t client_config;
int server_socket = -1;
int bytes, retval;
struct dhcpMessage packet;
- unsigned char *state;
- unsigned char *server_id, *requested;
- u_int32_t server_id_align, requested_align;
+ uint8_t *state;
+ uint8_t *server_id, *requested;
+ uint32_t server_id_align, requested_align;
unsigned long timeout_end;
struct option_set *option;
struct dhcpOfferedAddr *lease;
#define SNAME_FIELD 2
/* miscellaneous defines */
-#define MAC_BCAST_ADDR (unsigned char *) "\xff\xff\xff\xff\xff\xff"
+#define MAC_BCAST_ADDR (uint8_t *) "\xff\xff\xff\xff\xff\xff"
#define OPT_CODE 0
#define OPT_LEN 1
#define OPT_DATA 2
struct option_set {
- unsigned char *data;
+ uint8_t *data;
struct option_set *next;
};
struct server_config_t {
- u_int32_t server; /* Our IP, in network order */
- u_int32_t start; /* Start address of leases, network order */
- u_int32_t end; /* End of leases, network order */
+ uint32_t server; /* Our IP, in network order */
+ uint32_t start; /* Start address of leases, network order */
+ uint32_t end; /* End of leases, network order */
struct option_set *options; /* List of DHCP options loaded from the config file */
char *interface; /* The name of the interface to use */
int ifindex; /* Index number of the interface to use */
- unsigned char arp[6]; /* Our arp address */
+ uint8_t arp[6]; /* Our arp address */
unsigned long lease; /* lease time in seconds (host order) */
unsigned long max_leases; /* maximum number of leases (including reserved address) */
char remaining; /* should the lease file be interpreted as lease time remaining, or
char *lease_file;
char *pidfile;
char *notify_file; /* What to run whenever leases are written */
- u_int32_t siaddr; /* next server bootp option */
+ uint32_t siaddr; /* next server bootp option */
char *sname; /* bootp server name */
char *boot_file; /* bootp boot file option */
};
static int read_u32(const char *line, void *arg)
{
- u_int32_t *dest = arg;
+ uint32_t *dest = arg;
char *endptr;
*dest = strtoul(line, &endptr, 0);
return endptr[0] == '\0';
int retval = 0, length;
char buffer[8];
char *line;
- u_int16_t *result_u16 = (u_int16_t *) buffer;
- u_int32_t *result_u32 = (u_int32_t *) buffer;
+ uint16_t *result_u16 = (uint16_t *) buffer;
+ uint32_t *result_u32 = (uint32_t *) buffer;
/* Cheat, the only const line we'll actually get is "" */
line = (char *) const_line;
#include "common.h"
-unsigned char blank_chaddr[] = {[0 ... 15] = 0};
+uint8_t blank_chaddr[] = {[0 ... 15] = 0};
/* clear every lease out that chaddr OR yiaddr matches and is nonzero */
-void clear_lease(u_int8_t *chaddr, u_int32_t yiaddr)
+void clear_lease(uint8_t *chaddr, uint32_t yiaddr)
{
unsigned int i, j;
/* add a lease into the table, clearing out any old ones */
-struct dhcpOfferedAddr *add_lease(u_int8_t *chaddr, u_int32_t yiaddr, unsigned long lease)
+struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease)
{
struct dhcpOfferedAddr *oldest;
/* Find the first lease that matches chaddr, NULL if no match */
-struct dhcpOfferedAddr *find_lease_by_chaddr(u_int8_t *chaddr)
+struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr)
{
unsigned int i;
/* Find the first lease that matches yiaddr, NULL is no match */
-struct dhcpOfferedAddr *find_lease_by_yiaddr(u_int32_t yiaddr)
+struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr)
{
unsigned int i;
/* check is an IP is taken, if it is, add it to the lease table */
-static int check_ip(u_int32_t addr)
+static int check_ip(uint32_t addr)
{
struct in_addr temp;
/* find an assignable address, it check_expired is true, we check all the expired leases as well.
* Maybe this should try expired leases by age... */
-u_int32_t find_address(int check_expired)
+uint32_t find_address(int check_expired)
{
- u_int32_t addr, ret;
+ uint32_t addr, ret;
struct dhcpOfferedAddr *lease = NULL;
addr = ntohl(server_config.start); /* addr is in host order here */
struct dhcpOfferedAddr {
- u_int8_t chaddr[16];
- u_int32_t yiaddr; /* network order */
- u_int32_t expires; /* host order */
+ uint8_t chaddr[16];
+ uint32_t yiaddr; /* network order */
+ uint32_t expires; /* host order */
};
-extern unsigned char blank_chaddr[];
+extern uint8_t blank_chaddr[];
-void clear_lease(u_int8_t *chaddr, u_int32_t yiaddr);
-struct dhcpOfferedAddr *add_lease(u_int8_t *chaddr, u_int32_t yiaddr, unsigned long lease);
+void clear_lease(uint8_t *chaddr, uint32_t yiaddr);
+struct dhcpOfferedAddr *add_lease(uint8_t *chaddr, uint32_t yiaddr, unsigned long lease);
int lease_expired(struct dhcpOfferedAddr *lease);
struct dhcpOfferedAddr *oldest_expired_lease(void);
-struct dhcpOfferedAddr *find_lease_by_chaddr(u_int8_t *chaddr);
-struct dhcpOfferedAddr *find_lease_by_yiaddr(u_int32_t yiaddr);
-u_int32_t find_address(int check_expired);
+struct dhcpOfferedAddr *find_lease_by_chaddr(uint8_t *chaddr);
+struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr);
+uint32_t find_address(int check_expired);
#endif
/* get an option with bounds checking (warning, not aligned). */
-unsigned char *get_option(struct dhcpMessage *packet, int code)
+uint8_t *get_option(struct dhcpMessage *packet, int code)
{
int i, length;
- unsigned char *optionptr;
+ uint8_t *optionptr;
int over = 0, done = 0, curr = OPTION_FIELD;
optionptr = packet->options;
/* return the position of the 'end' option (no bounds checking) */
-int end_option(unsigned char *optionptr)
+int end_option(uint8_t *optionptr)
{
int i = 0;
/* add an option string to the options (an option string contains an option code,
* length, then data) */
-int add_option_string(unsigned char *optionptr, unsigned char *string)
+int add_option_string(uint8_t *optionptr, uint8_t *string)
{
int end = end_option(optionptr);
/* add a one to four byte option to a packet */
-int add_simple_option(unsigned char *optionptr, unsigned char code, u_int32_t data)
+int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data)
{
char length = 0;
int i;
- unsigned char option[2 + 4];
- unsigned char *u8;
- u_int16_t *u16;
- u_int32_t *u32;
- u_int32_t aligned;
- u8 = (unsigned char *) &aligned;
- u16 = (u_int16_t *) &aligned;
+ uint8_t option[2 + 4];
+ uint8_t *u8;
+ uint16_t *u16;
+ uint32_t *u32;
+ uint32_t aligned;
+ u8 = (uint8_t *) &aligned;
+ u16 = (uint16_t *) &aligned;
u32 = &aligned;
for (i = 0; dhcp_options[i].code; i++)
struct dhcp_option {
char name[10];
char flags;
- unsigned char code;
+ uint8_t code;
};
extern struct dhcp_option dhcp_options[];
extern int option_lengths[];
-unsigned char *get_option(struct dhcpMessage *packet, int code);
-int end_option(unsigned char *optionptr);
-int add_option_string(unsigned char *optionptr, unsigned char *string);
-int add_simple_option(unsigned char *optionptr, unsigned char code, u_int32_t data);
+uint8_t *get_option(struct dhcpMessage *packet, int code);
+int end_option(uint8_t *optionptr);
+int add_option_string(uint8_t *optionptr, uint8_t *string);
+int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data);
struct option_set *find_option(struct option_set *opt_list, char code);
void attach_option(struct option_set **opt_list, struct dhcp_option *option, char *buffer, int length);
if (packet->op == BOOTREQUEST && (vendor = get_option(packet, DHCP_VENDOR))) {
for (i = 0; broken_vendors[i][0]; i++) {
- if (vendor[OPT_LEN - 2] == (unsigned char) strlen(broken_vendors[i]) &&
+ if (vendor[OPT_LEN - 2] == (uint8_t) strlen(broken_vendors[i]) &&
!strncmp(vendor, broken_vendors[i], vendor[OPT_LEN - 2])) {
DEBUG(LOG_INFO, "broken client (%s), forcing broadcast",
broken_vendors[i]);
}
-u_int16_t checksum(void *addr, int count)
+uint16_t checksum(void *addr, int count)
{
/* Compute Internet Checksum for "count" bytes
* beginning at location "addr".
*/
register int32_t sum = 0;
- u_int16_t *source = (u_int16_t *) addr;
+ uint16_t *source = (uint16_t *) addr;
while (count > 1) {
/* This is the inner loop */
if (count > 0) {
/* Make sure that the left-over byte is added correctly both
* with little and big endian hosts */
- u_int16_t tmp = 0;
- *(unsigned char *) (&tmp) = * (unsigned char *) source;
+ uint16_t tmp = 0;
+ *(uint8_t *) (&tmp) = * (uint8_t *) source;
sum += tmp;
}
/* Fold 32-bit sum to 16 bits */
/* Constuct a ip/udp header for a packet, and specify the source and dest hardware address */
-int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,
- u_int32_t dest_ip, int dest_port, unsigned char *dest_arp, int ifindex)
+int raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
+ uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex)
{
int fd;
int result;
/* Let the kernel do all the work for packet generation */
-int kernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,
- u_int32_t dest_ip, int dest_port)
+int kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
+ uint32_t dest_ip, int dest_port)
{
int n = 1;
int fd, result;
#include <netinet/ip.h>
struct dhcpMessage {
- u_int8_t op;
- u_int8_t htype;
- u_int8_t hlen;
- u_int8_t hops;
- u_int32_t xid;
- u_int16_t secs;
- u_int16_t flags;
- u_int32_t ciaddr;
- u_int32_t yiaddr;
- u_int32_t siaddr;
- u_int32_t giaddr;
- u_int8_t chaddr[16];
- u_int8_t sname[64];
- u_int8_t file[128];
- u_int32_t cookie;
- u_int8_t options[308]; /* 312 - cookie */
+ 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;
+ uint8_t chaddr[16];
+ uint8_t sname[64];
+ uint8_t file[128];
+ uint32_t cookie;
+ uint8_t options[308]; /* 312 - cookie */
};
struct udp_dhcp_packet {
void init_header(struct dhcpMessage *packet, char type);
int get_packet(struct dhcpMessage *packet, int fd);
-u_int16_t checksum(void *addr, int count);
-int raw_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,
- u_int32_t dest_ip, int dest_port, unsigned char *dest_arp, int ifindex);
-int kernel_packet(struct dhcpMessage *payload, u_int32_t source_ip, int source_port,
- u_int32_t dest_ip, int dest_port);
+uint16_t checksum(void *addr, int count);
+int raw_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
+ uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex);
+int kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_port,
+ uint32_t dest_ip, int dest_port);
#endif
}
-static int sprintip(char *dest, char *pre, unsigned char *ip)
+static int sprintip(char *dest, char *pre, uint8_t *ip)
{
return sprintf(dest, "%s%d.%d.%d.%d", pre, ip[0], ip[1], ip[2], ip[3]);
}
/* Fill dest with the text of option 'option'. */
-static void fill_options(char *dest, unsigned char *option, struct dhcp_option *type_p)
+static void fill_options(char *dest, uint8_t *option, struct dhcp_option *type_p)
{
int type, optlen;
- u_int16_t val_u16;
+ uint16_t val_u16;
int16_t val_s16;
- u_int32_t val_u32;
+ uint32_t val_u32;
int32_t val_s32;
int len = option[OPT_LEN - 2];
int num_options = 0;
int i, j;
char **envp;
- unsigned char *temp;
+ uint8_t *temp;
struct in_addr subnet;
char over = 0;
if (packet == NULL) return envp;
envp[j] = xmalloc(sizeof("ip=255.255.255.255"));
- sprintip(envp[j++], "ip=", (unsigned char *) &packet->yiaddr);
+ sprintip(envp[j++], "ip=", (uint8_t *) &packet->yiaddr);
for (i = 0; dhcp_options[i].code; i++) {
}
if (packet->siaddr) {
envp[j] = xmalloc(sizeof("siaddr=255.255.255.255"));
- sprintip(envp[j++], "siaddr=", (unsigned char *) &packet->siaddr);
+ sprintip(envp[j++], "siaddr=", (uint8_t *) &packet->siaddr);
}
if (!(over & FILE_FIELD) && packet->file[0]) {
/* watch out for invalid packets */
/* send a packet to a specific arp address and ip address by creating our own ip packet */
static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcast)
{
- unsigned char *chaddr;
- u_int32_t ciaddr;
+ uint8_t *chaddr;
+ uint32_t ciaddr;
if (force_broadcast) {
DEBUG(LOG_INFO, "broadcasting packet to client (NAK)");
{
struct dhcpMessage packet;
struct dhcpOfferedAddr *lease = NULL;
- u_int32_t req_align, lease_time_align = server_config.lease;
- unsigned char *req, *lease_time;
+ uint32_t req_align, lease_time_align = server_config.lease;
+ uint8_t *req, *lease_time;
struct option_set *curr;
struct in_addr addr;
}
-int sendACK(struct dhcpMessage *oldpacket, u_int32_t yiaddr)
+int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr)
{
struct dhcpMessage packet;
struct option_set *curr;
- unsigned char *lease_time;
- u_int32_t lease_time_align = server_config.lease;
+ uint8_t *lease_time;
+ uint32_t lease_time_align = server_config.lease;
struct in_addr addr;
init_packet(&packet, oldpacket, DHCPACK);
int sendOffer(struct dhcpMessage *oldpacket);
int sendNAK(struct dhcpMessage *oldpacket);
-int sendACK(struct dhcpMessage *oldpacket, u_int32_t yiaddr);
+int sendACK(struct dhcpMessage *oldpacket, uint32_t yiaddr);
int send_inform(struct dhcpMessage *oldpacket);
#include "socket.h"
#include "common.h"
-int read_interface(char *interface, int *ifindex, u_int32_t *addr, unsigned char *arp)
+int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp)
{
int fd;
struct ifreq ifr;
}
-int listen_socket(unsigned int ip, int port, char *inf)
+int listen_socket(uint32_t ip, int port, char *inf)
{
struct ifreq interface;
int fd;
#ifndef _SOCKET_H
#define _SOCKET_H
-int read_interface(char *interface, int *ifindex, u_int32_t *addr, unsigned char *arp);
-int listen_socket(unsigned int ip, int port, char *inf);
+int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp);
+int listen_socket(uint32_t ip, int port, char *inf);
#endif