Lines 25-30
Link Here
|
25 |
*/ |
25 |
*/ |
26 |
|
26 |
|
27 |
|
27 |
|
|
|
28 |
#include <stdio.h> |
28 |
#include <stdlib.h> |
29 |
#include <stdlib.h> |
29 |
#include <unistd.h> |
30 |
#include <unistd.h> |
30 |
#include <string.h> |
31 |
#include <string.h> |
Lines 38-43
Link Here
|
38 |
#include <net/ethernet.h> |
39 |
#include <net/ethernet.h> |
39 |
#include <netinet/ip.h> |
40 |
#include <netinet/ip.h> |
40 |
#include <netinet/udp.h> |
41 |
#include <netinet/udp.h> |
|
|
42 |
#include <sys/utsname.h> |
41 |
#include <sys/time.h> |
43 |
#include <sys/time.h> |
42 |
#include <time.h> |
44 |
#include <time.h> |
43 |
#include <fcntl.h> |
45 |
#include <fcntl.h> |
Lines 49-54
Link Here
|
49 |
#include "frontend.h" |
51 |
#include "frontend.h" |
50 |
|
52 |
|
51 |
#include "dhcp.h" |
53 |
#include "dhcp.h" |
|
|
54 |
#include "version.h" |
52 |
|
55 |
|
53 |
|
56 |
|
54 |
typedef int bp_int32; |
57 |
typedef int bp_int32; |
Lines 68-73
typedef short bp_int16;
Link Here
|
68 |
#define DHCP_OPTION_SERVER 54 |
71 |
#define DHCP_OPTION_SERVER 54 |
69 |
#define DHCP_OPTION_OPTIONREQ 55 |
72 |
#define DHCP_OPTION_OPTIONREQ 55 |
70 |
#define DHCP_OPTION_MAXSIZE 57 |
73 |
#define DHCP_OPTION_MAXSIZE 57 |
|
|
74 |
#define DHCP_OPTION_VENDORCLASS 60 |
75 |
|
76 |
#define DHCP_VENDOR_CLASS_ID_PREFIX "ALT-Propagator" |
71 |
|
77 |
|
72 |
#define BOOTP_CLIENT_PORT 68 |
78 |
#define BOOTP_CLIENT_PORT 68 |
73 |
#define BOOTP_SERVER_PORT 67 |
79 |
#define BOOTP_SERVER_PORT 67 |
Lines 101-106
struct bootp_request {
Link Here
|
101 |
|
107 |
|
102 |
static const char vendor_cookie[] = { 99, 130, 83, 99, 255 }; |
108 |
static const char vendor_cookie[] = { 99, 130, 83, 99, 255 }; |
103 |
|
109 |
|
|
|
110 |
// This function's return value needs to be freed after use. |
111 |
static char* get_vendor_class_id() { |
112 |
// mimicking dhcpcd |
113 |
char* ret; |
114 |
struct utsname u; |
115 |
unsigned int sz = sizeof(DHCP_VENDOR_CLASS_ID_PREFIX) + |
116 |
sizeof(VERSION); |
117 |
if (uname(&u) != 0) { |
118 |
if ((ret = malloc(sz)) == NULL) { |
119 |
log_perror("malloc"); |
120 |
return ret; |
121 |
} |
122 |
sprintf(ret, "%s-%s", DHCP_VENDOR_CLASS_ID_PREFIX, VERSION); |
123 |
} |
124 |
else { |
125 |
sz += sizeof(DHCP_VENDOR_CLASS_ID_PREFIX) + |
126 |
strlen(u.sysname) + 1 + |
127 |
strlen(u.release) + 1 + |
128 |
strlen(u.machine) + 1; |
129 |
if ((ret = malloc(sz)) == NULL) { |
130 |
log_perror("malloc"); |
131 |
return ret; |
132 |
} |
133 |
sprintf(ret, "%s-%s:%s-%s:%s", DHCP_VENDOR_CLASS_ID_PREFIX, VERSION, |
134 |
u.sysname, u.release, u.machine); |
135 |
} |
136 |
return ret; |
137 |
} |
104 |
|
138 |
|
105 |
static unsigned int verify_checksum(void * buf2, int length2) |
139 |
static unsigned int verify_checksum(void * buf2, int length2) |
106 |
{ |
140 |
{ |
Lines 523-528
enum return_type perform_dhcp(struct interface_info * intf)
Link Here
|
523 |
struct sockaddr_in broadcast_addr; |
557 |
struct sockaddr_in broadcast_addr; |
524 |
struct bootp_request breq, bresp; |
558 |
struct bootp_request breq, bresp; |
525 |
unsigned char messageType; |
559 |
unsigned char messageType; |
|
|
560 |
char* vendorClass; |
526 |
unsigned int lease; |
561 |
unsigned int lease; |
527 |
short aShort; |
562 |
short aShort; |
528 |
int num_options; |
563 |
int num_options; |
Lines 565-570
enum return_type perform_dhcp(struct interface_info * intf)
Link Here
|
565 |
broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ |
600 |
broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ |
566 |
memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */ |
601 |
memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */ |
567 |
|
602 |
|
|
|
603 |
vendorClass = get_vendor_class_id(); |
604 |
add_vendor_code(&breq, DHCP_OPTION_VENDORCLASS, |
605 |
strlen(vendorClass), |
606 |
vendorClass); |
607 |
|
568 |
log_message("DHCP: sending DISCOVER"); |
608 |
log_message("DHCP: sending DISCOVER"); |
569 |
|
609 |
|
570 |
wait_message("Sending DHCP request..."); |
610 |
wait_message("Sending DHCP request..."); |
Lines 574-579
enum return_type perform_dhcp(struct interface_info * intf)
Link Here
|
574 |
if (i != 0) { |
614 |
if (i != 0) { |
575 |
stg1_info_message("No DHCP reply received."); |
615 |
stg1_info_message("No DHCP reply received."); |
576 |
close(s); |
616 |
close(s); |
|
|
617 |
free(vendorClass); |
577 |
return RETURN_ERROR; |
618 |
return RETURN_ERROR; |
578 |
} |
619 |
} |
579 |
|
620 |
|
Lines 582-593
enum return_type perform_dhcp(struct interface_info * intf)
Link Here
|
582 |
if (get_vendor_code(&bresp, DHCP_OPTION_SERVER, &server_addr.sin_addr)) { |
623 |
if (get_vendor_code(&bresp, DHCP_OPTION_SERVER, &server_addr.sin_addr)) { |
583 |
close(s); |
624 |
close(s); |
584 |
log_message("DHCPOFFER didn't include server address"); |
625 |
log_message("DHCPOFFER didn't include server address"); |
|
|
626 |
free(vendorClass); |
585 |
return RETURN_ERROR; |
627 |
return RETURN_ERROR; |
586 |
} |
628 |
} |
587 |
|
629 |
|
588 |
init_vendor_codes(&breq); |
630 |
init_vendor_codes(&breq); |
589 |
messageType = DHCP_TYPE_REQUEST; |
631 |
messageType = DHCP_TYPE_REQUEST; |
590 |
add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); |
632 |
add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); |
|
|
633 |
add_vendor_code(&breq, DHCP_OPTION_VENDORCLASS, |
634 |
strlen(vendorClass), |
635 |
vendorClass); |
591 |
add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); |
636 |
add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); |
592 |
add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); |
637 |
add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); |
593 |
|
638 |
|
Lines 613-628
enum return_type perform_dhcp(struct interface_info * intf)
Link Here
|
613 |
|
658 |
|
614 |
if (i != 0) { |
659 |
if (i != 0) { |
615 |
close(s); |
660 |
close(s); |
|
|
661 |
free(vendorClass); |
616 |
return RETURN_ERROR; |
662 |
return RETURN_ERROR; |
617 |
} |
663 |
} |
618 |
|
664 |
|
619 |
if (get_vendor_code(&bresp, DHCP_OPTION_LEASE, &lease)) { |
665 |
if (get_vendor_code(&bresp, DHCP_OPTION_LEASE, &lease)) { |
620 |
log_message("failed to get lease time\n"); |
666 |
log_message("failed to get lease time\n"); |
|
|
667 |
free(vendorClass); |
621 |
return RETURN_ERROR; |
668 |
return RETURN_ERROR; |
622 |
} |
669 |
} |
623 |
lease = ntohl(lease); |
670 |
lease = ntohl(lease); |
624 |
|
671 |
|
625 |
close(s); |
672 |
close(s); |
|
|
673 |
free(vendorClass); |
626 |
|
674 |
|
627 |
intf->netmask.s_addr = 0; |
675 |
intf->netmask.s_addr = 0; |
628 |
intf->broadcast.s_addr = 0; |
676 |
intf->broadcast.s_addr = 0; |
629 |
- |
|
|