summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/modifiers.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4/modifiers.go')
-rw-r--r--dhcpv4/modifiers.go46
1 files changed, 42 insertions, 4 deletions
diff --git a/dhcpv4/modifiers.go b/dhcpv4/modifiers.go
index bc19219..3b6ce70 100644
--- a/dhcpv4/modifiers.go
+++ b/dhcpv4/modifiers.go
@@ -1,11 +1,49 @@
package dhcpv4
-// WithUserClass adds a user class option to the packet
-func WithUserClass(uc []byte) Modifier {
+// WithUserClass adds a user class option to the packet.
+// The rfc parameter allows you to specify if the userclass should be
+// rfc compliant or not. More details in issue #113
+func WithUserClass(uc []byte, rfc bool) Modifier {
// TODO let the user specify multiple user classes
return func(d *DHCPv4) *DHCPv4 {
- ouc := OptUserClass{UserClasses: [][]byte{uc}}
+ ouc := OptUserClass{
+ UserClasses: [][]byte{uc},
+ Rfc3004: rfc,
+ }
d.AddOption(&ouc)
return d
}
-} \ No newline at end of file
+}
+
+// WithNetboot adds bootfile URL and bootfile param options to a DHCPv4 packet.
+func WithNetboot(d *DHCPv4) *DHCPv4 {
+ params := d.GetOneOption(OptionParameterRequestList)
+
+ var (
+ OptParams *OptParameterRequestList
+ foundOptionTFTPServerName bool
+ foundOptionBootfileName bool
+ )
+ if params != nil {
+ OptParams = params.(*OptParameterRequestList)
+ for _, option := range OptParams.RequestedOpts {
+ if option == OptionTFTPServerName {
+ foundOptionTFTPServerName = true
+ } else if option == OptionBootfileName {
+ foundOptionBootfileName = true
+ }
+ }
+ if !foundOptionTFTPServerName {
+ OptParams.RequestedOpts = append(OptParams.RequestedOpts, OptionTFTPServerName)
+ }
+ if !foundOptionBootfileName {
+ OptParams.RequestedOpts = append(OptParams.RequestedOpts, OptionBootfileName)
+ }
+ } else {
+ OptParams = &OptParameterRequestList{
+ RequestedOpts: []OptionCode{OptionTFTPServerName, OptionBootfileName},
+ }
+ d.AddOption(OptParams)
+ }
+ return d
+}