dhcp.c: Provide a DHCP vendor class identifier in requests

This commit is contained in:
Arseny Maslennikov 2017-12-11 20:30:09 +03:00
parent 2440a17fbe
commit 41519b564d

35
dhcp.c
View File

@ -25,6 +25,7 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
@ -38,6 +39,7 @@
#include <net/ethernet.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <sys/utsname.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
@ -49,6 +51,7 @@
#include "frontend.h"
#include "dhcp.h"
#include "version.h"
typedef int bp_int32;
@ -68,6 +71,9 @@ typedef short bp_int16;
#define DHCP_OPTION_SERVER 54
#define DHCP_OPTION_OPTIONREQ 55
#define DHCP_OPTION_MAXSIZE 57
#define DHCP_OPTION_VENDORCLASS 60
#define DHCP_VENDOR_CLASS_ID_PREFIX "ALT-Propagator"
#define BOOTP_CLIENT_PORT 68
#define BOOTP_SERVER_PORT 67
@ -101,6 +107,25 @@ struct bootp_request {
static const char vendor_cookie[] = { 99, 130, 83, 99, 255 };
static char vendor_class_id[
sizeof(DHCP_VENDOR_CLASS_ID_PREFIX) +
sizeof(VERSION) +
sizeof(((struct utsname*)0)->sysname) + 1 +
sizeof(((struct utsname*)0)->release) + 1 +
sizeof(((struct utsname*)0)->machine) + 1
] = { 0 };
static void make_vendor_class_id(void) {
struct utsname u;
uname(&u);
/* mimicking dhcpcd */
snprintf(vendor_class_id, sizeof(vendor_class_id),
"%s-%s:%s-%s:%s",
DHCP_VENDOR_CLASS_ID_PREFIX, VERSION,
u.sysname, u.release, u.machine);
}
static unsigned int verify_checksum(void * buf2, int length2)
{
@ -535,6 +560,8 @@ enum return_type perform_dhcp(struct interface_info * intf)
}
*/
make_vendor_class_id();
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0) {
log_perror("socket");
@ -567,6 +594,10 @@ enum return_type perform_dhcp(struct interface_info * intf)
broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */
memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */
add_vendor_code(&breq, DHCP_OPTION_VENDORCLASS,
strlen(vendor_class_id),
vendor_class_id);
log_message("DHCP: sending DISCOVER");
wait_message("Sending DHCP request...");
@ -593,6 +624,10 @@ enum return_type perform_dhcp(struct interface_info * intf)
add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr);
add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr);
add_vendor_code(&breq, DHCP_OPTION_VENDORCLASS,
strlen(vendor_class_id),
vendor_class_id);
aShort = ntohs(sizeof(struct bootp_request));
add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort);