changeset 91:bac1986b6e8f draft

Minimum message size is now 300 bytes for crappy DHCP servers :/
author Roy Marples <roy@marples.name>
date Wed, 11 Apr 2007 19:44:37 +0000
parents 5754214598b4
children 77214d06ca2a
files ChangeLog dhcp.c dhcp.h
diffstat 3 files changed, 55 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Apr 11 13:18:33 2007 +0000
+++ b/ChangeLog	Wed Apr 11 19:44:37 2007 +0000
@@ -1,3 +1,4 @@
+Minimum message size is now 300 bytes for crappy DHCP servers :/
 Compile ok on OpenBSD (thanks to icezimm and reb in #gentoo-bsd for testing)
 We check gcc supports -Wextra and friends before using them.
 We now restore the starting MTU value when we exit OR we don't receive a
--- a/dhcp.c	Wed Apr 11 13:18:33 2007 +0000
+++ b/dhcp.c	Wed Apr 11 19:44:37 2007 +0000
@@ -38,8 +38,6 @@
 #include "logger.h"
 #include "socket.h"
 
-#define BROADCAST_FLAG 0x8000
-
 static const char *dhcp_message[] = {
 	[DHCP_DISCOVER] 	= "DHCP_DISCOVER",
 	[DHCP_OFFER]		= "DHCP_OFFER",
@@ -248,7 +246,13 @@
 
 	*p++ = DHCP_END;
 
+#ifdef DHCP_MESSAGE_LENTH_MIN
+	while (p - m < DHCP_MESSAGE_LENTH_MIN)
+		*p++ = DHCP_PAD;
+#endif
+
 	message_length = p - m;
+	logger (LOG_DEBUG, "xx %d\n", message_length);
 
 	memset (&packet, 0, sizeof (struct udp_dhcp_packet));
 	make_dhcp_packet (&packet, (unsigned char *) &message, message_length,
--- a/dhcp.h	Wed Apr 11 13:18:33 2007 +0000
+++ b/dhcp.h	Wed Apr 11 19:44:37 2007 +0000
@@ -31,15 +31,17 @@
 #include "dhcpcd.h"
 #include "interface.h"
 
+
 /* Max MTU - defines dhcp option length */
-#define MTU_MAX			1500
-#define MTU_MIN			576
+#define MTU_MAX				1500
+#define MTU_MIN				576
 
 /* UDP port numbers for DHCP */
-#define DHCP_SERVER_PORT 67
-#define DHCP_CLIENT_PORT 68
+#define DHCP_SERVER_PORT 	67
+#define DHCP_CLIENT_PORT 	68
 
-#define MAGIC_COOKIE 0x63825363
+#define MAGIC_COOKIE		0x63825363
+#define BROADCAST_FLAG 		0x8000
 
 /* DHCP message OP code */
 #define DHCP_BOOTREQUEST	1
@@ -47,55 +49,54 @@
 
 /* DHCP message type */
 #define	DHCP_DISCOVER		1
-#define DHCP_OFFER		2
+#define DHCP_OFFER			2
 #define	DHCP_REQUEST		3
 #define	DHCP_DECLINE		4
-#define	DHCP_ACK		5
-#define DHCP_NAK		6
+#define	DHCP_ACK			5
+#define DHCP_NAK			6
 #define	DHCP_RELEASE		7
-#define DHCP_INFORM		8
-
+#define DHCP_INFORM			8
 
 /* DHCP options */
 enum DHCP_OPTIONS
 {
-	DHCP_PAD				=	0,
+	DHCP_PAD					=	0,
 	DHCP_NETMASK				=	1,
 	DHCP_TIMEROFFSET			=	2,
 	DHCP_ROUTERS				=	3,
-	DHCP_TIMESERVER			=	4,
-	DHCP_NAMESERVER			=	5,
-	DHCP_DNSSERVER			=	6,
-	DHCP_LOGSERVER			=	7,
+	DHCP_TIMESERVER				=	4,
+	DHCP_NAMESERVER				=	5,
+	DHCP_DNSSERVER				=	6,
+	DHCP_LOGSERVER				=	7,
 	DHCP_COOKIESERVER			=	8,
 	DHCP_HOSTNAME				=	12,
-	DHCP_DNSDOMAIN			=	15,
+	DHCP_DNSDOMAIN				=	15,
 	DHCP_ROOTPATH				=	17,
 	DHCP_DEFAULTIPTTL			=	23,
-	DHCP_MTU				=	26,
-	DHCP_BROADCAST			=	28,
+	DHCP_MTU					=	26,
+	DHCP_BROADCAST				=	28,
 	DHCP_MASKDISCOVERY			=	29,
-	DHCP_ROUTERDISCOVERY			=	31,
+	DHCP_ROUTERDISCOVERY		=	31,
 	DHCP_STATICROUTE			=	33,
-	DHCP_NISDOMAIN			=	40,
-	DHCP_NISSERVER			=	41,
-	DHCP_NTPSERVER			=	42,
+	DHCP_NISDOMAIN				=	40,
+	DHCP_NISSERVER				=	41,
+	DHCP_NTPSERVER				=	42,
 	DHCP_ADDRESS				=	50,
-	DHCP_LEASETIME			=	51,
+	DHCP_LEASETIME				=	51,
 	DHCP_MESSAGETYPE			=	53,
-	DHCP_SERVERIDENTIFIER			=	54,
-	DHCP_PARAMETERREQUESTLIST		=	55,
+	DHCP_SERVERIDENTIFIER		=	54,
+	DHCP_PARAMETERREQUESTLIST	=	55,
 	DHCP_MESSAGE				=	56,
 	DHCP_MAXMESSAGESIZE			=	57,
 	DHCP_RENEWALTIME			=	58,
-	DHCP_REBINDTIME			=	59,
+	DHCP_REBINDTIME				=	59,
 	DHCP_CLASSID				=	60,
 	DHCP_CLIENTID				=	61,
-	DHCP_USERCLASS			=	77,  /* RFC 3004 */
-	DHCP_FQDN				=	81,
-	DHCP_DNSSEARCH			=       119, /* RFC 3397 */
-	DHCP_CSR				=	121, /* RFC 3442 */
-	DHCP_END				=	255
+	DHCP_USERCLASS				=	77,  /* RFC 3004 */
+	DHCP_FQDN					=	81,
+	DHCP_DNSSEARCH				=	119, /* RFC 3397 */
+	DHCP_CSR					=	121, /* RFC 3442 */
+	DHCP_END					=	255
 };
 
 /* SetFQDNHostName values - lsnybble used in flags
@@ -103,7 +104,7 @@
  * and to allow 0x00 to mean disable
  */
 enum FQQN {
-	FQDN_DISABLE				=	0x00,
+	FQDN_DISABLE			=	0x00,
 	FQDN_NONE				=	0x18,
 	FQDN_PTR				=	0x20,
 	FQDN_BOTH				=	0x31
@@ -152,17 +153,22 @@
 	char *rootpath;
 } dhcp_t;
 
+
+
 /* Sizes for DHCP options */
-#define DHCP_CHADDR_LEN		16
-#define SERVERNAME_LEN		64
-#define BOOTFILE_LEN		128
-#define DHCP_UDP_LEN		(20 + 8)
-#define DHCP_BASE_LEN		(4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4)
-#define DHCP_RESERVE_LEN	(4 + 4 + 4 + 4 + 2)
-#define DHCP_FIXED_LEN		(DHCP_BASE_LEN + DHCP_CHADDR_LEN + \
-							 + SERVERNAME_LEN + BOOTFILE_LEN)
-#define DHCP_OPTION_LEN		(MTU_MAX - DHCP_FIXED_LEN - DHCP_UDP_LEN \
-							 - DHCP_RESERVE_LEN)
+#define DHCP_CHADDR_LEN			16
+#define SERVERNAME_LEN			64
+#define BOOTFILE_LEN			128
+#define DHCP_UDP_LEN			(20 + 8)
+#define DHCP_BASE_LEN			(4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4)
+#define DHCP_RESERVE_LEN		(4 + 4 + 4 + 4 + 2)
+#define DHCP_FIXED_LEN			(DHCP_BASE_LEN + DHCP_CHADDR_LEN + \
+							 	+ SERVERNAME_LEN + BOOTFILE_LEN)
+#define DHCP_OPTION_LEN			(MTU_MAX - DHCP_FIXED_LEN - DHCP_UDP_LEN \
+							 	- DHCP_RESERVE_LEN)
+
+/* Some crappy DHCP servers require the BOOTP minimum length */
+#define DHCP_MESSAGE_LENTH_MIN	300
 
 typedef struct dhcpmessage_t
 {