diff options
Diffstat (limited to 'dhcpv4/option_bootfile_name.go')
-rw-r--r-- | dhcpv4/option_bootfile_name.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/dhcpv4/option_bootfile_name.go b/dhcpv4/option_bootfile_name.go new file mode 100644 index 0000000..73ea625 --- /dev/null +++ b/dhcpv4/option_bootfile_name.go @@ -0,0 +1,54 @@ +package dhcpv4 + +import ( + "fmt" +) + +// This option implements the Bootfile name Option. +// https://tools.ietf.org/html/rfc2132 + +// OptBootfileName implements the BootFile Name option +type OptBootfileName struct { + BootfileName []byte +} + +// Code returns the option code +func (op *OptBootfileName) Code() OptionCode { + return OptionBootfileName +} + +// ToBytes serializes the option and returns it as a sequence of bytes +func (op *OptBootfileName) ToBytes() []byte { + return append([]byte{byte(op.Code()), byte(op.Length())}, op.BootfileName...) +} + +// Length returns the option length in bytes +func (op *OptBootfileName) Length() int { + return len(op.BootfileName) +} + +func (op *OptBootfileName) String() string { + return fmt.Sprintf("OptBootfileName{BootfileName=%s}", op.BootfileName) + +} + +// ParseOptBootfileName returns a new OptBootfile from a byte stream or error if any +func ParseOptBootfileName(data []byte) (*OptBootfileName, error) { + if len(data) < 3 { + return nil, ErrShortByteStream + } + code := OptionCode(data[0]) + if code != OptionBootfileName { + return nil, fmt.Errorf("ParseOptBootfileName: invalid code: %v; want %v", code, OptionBootfileName) + } + length := int(data[1]) + if length < 1 { + return nil, fmt.Errorf("Bootfile name has invalid length of %d", length) + } + bootFileNameData := data[2:] + if len(bootFileNameData) < length { + return nil, fmt.Errorf("ParseOptBootfileName: short data: %d bytes; want %d", + len(bootFileNameData), length) + } + return &OptBootfileName{BootfileName: bootFileNameData[:length]}, nil +} |