1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
diff -ur isc-dhcp-4.1.1-P1/includes/dhcpd.h isc-dhcp-4.1.1-P1.patched//includes/dhcpd.h
--- isc-dhcp-4.1.1-P1/includes/dhcpd.h 2012-04-04 16:49:44.000000000 +0200
+++ isc-dhcp-4.1.1-P1.patched//includes/dhcpd.h 2012-04-04 14:56:43.000000000 +0200
@@ -626,6 +626,7 @@
#define SV_LIMIT_PREFS_PER_IA 57
#define SV_DELAYED_ACK 58
#define SV_MAX_ACK_DELAY 59
+#define SV_NEVER_BROADCAST 60
#if !defined (DEFAULT_PING_TIMEOUT)
# define DEFAULT_PING_TIMEOUT 1
diff -ur isc-dhcp-4.1.1-P1/server/bootp.c isc-dhcp-4.1.1-P1.patched//server/bootp.c
--- isc-dhcp-4.1.1-P1/server/bootp.c 2009-07-25 00:04:52.000000000 +0200
+++ isc-dhcp-4.1.1-P1.patched//server/bootp.c 2012-04-04 14:55:21.000000000 +0200
@@ -283,6 +283,15 @@
&lease -> scope, oc, MDL))
raw.flags |= htons (BOOTP_BROADCAST);
+ /* The inverse. */
+ if ((oc = lookup_option (&server_universe,
+ options, SV_NEVER_BROADCAST)) &&
+ evaluate_boolean_option_cache (&ignorep, packet, lease,
+ (struct client_state *)0,
+ packet -> options, options,
+ &lease -> scope, oc, MDL))
+ raw.flags &= htons (~BOOTP_BROADCAST);
+
/* Figure out the address of the next server. */
memset (&d1, 0, sizeof d1);
oc = lookup_option (&server_universe, options, SV_NEXT_SERVER);
diff -ur isc-dhcp-4.1.1-P1/server/dhcp.c isc-dhcp-4.1.1-P1.patched//server/dhcp.c
--- isc-dhcp-4.1.1-P1/server/dhcp.c 2012-04-04 16:48:46.000000000 +0200
+++ isc-dhcp-4.1.1-P1.patched//server/dhcp.c 2012-04-04 14:55:45.000000000 +0200
@@ -2482,6 +2482,15 @@
&lease -> scope, oc, MDL))
state -> bootp_flags |= htons (BOOTP_BROADCAST);
+ /* The inverse. */
+ if ((oc = lookup_option (&server_universe, state -> options,
+ SV_NEVER_BROADCAST)) &&
+ evaluate_boolean_option_cache (&ignorep, packet, lease,
+ (struct client_state *)0,
+ packet -> options, state -> options,
+ &lease -> scope, oc, MDL))
+ state -> bootp_flags &= htons (~BOOTP_BROADCAST);
+
/* Get the Maximum Message Size option from the packet, if one
was sent. */
oc = lookup_option (&dhcp_universe, packet -> options,
diff -ur isc-dhcp-4.1.1-P1/server/dhcpd.conf.5 isc-dhcp-4.1.1-P1.patched//server/dhcpd.conf.5
--- isc-dhcp-4.1.1-P1/server/dhcpd.conf.5 2012-04-04 16:48:46.000000000 +0200
+++ isc-dhcp-4.1.1-P1.patched//server/dhcpd.conf.5 2012-04-04 16:45:44.000000000 +0200
@@ -1914,6 +1914,24 @@
.RE
.PP
The
+.I never-broadcast
+statement
+.RS 0.25i
+.PP
+.B never-broadcast \fIflag\fR\fB;\fR
+.PP
+When using DHCP in routed networks, the router has to participate in rewriting
+and sending DHCP replies on to the user. Unfortunately, some devices,
+in particular Cisco's Nexus series of switches, drop such DHCP reply packets
+with the broadcast bit in the flags field of the DHCP message header set.
+Thi means that some operating systems, in particular Microsoft Windows Vista,
+can have problems getting DHCP to work in such environments. If you enable
+this flag, the DHCP server will never set the broadcast flags in the replies
+it sends, even if the client set the broadcast flag. This flag overrides
+the never-broadcast flag if both are set.
+.RE
+.PP
+The
.I always-reply-rfc1048
statement
.RS 0.25i
diff -ur isc-dhcp-4.1.1-P1/server/stables.c isc-dhcp-4.1.1-P1.patched//server/stables.c
--- isc-dhcp-4.1.1-P1/server/stables.c 2012-04-04 16:49:44.000000000 +0200
+++ isc-dhcp-4.1.1-P1.patched//server/stables.c 2012-04-04 14:56:43.000000000 +0200
@@ -203,6 +203,7 @@
{ "always-reply-rfc1048", "f", &server_universe, 20, 1 },
{ "site-option-space", "X", &server_universe, 21, 1 },
{ "always-broadcast", "f", &server_universe, 22, 1 },
+ { "never-broadcast", "f", &server_universe, 60, 1 },
{ "ddns-domainname", "t", &server_universe, 23, 1 },
{ "ddns-hostname", "t", &server_universe, 24, 1 },
{ "ddns-rev-domainname", "t", &server_universe, 25, 1 },
|