summaryrefslogtreecommitdiffhomepage
path: root/dhcpv4/option_userclass.go
diff options
context:
space:
mode:
Diffstat (limited to 'dhcpv4/option_userclass.go')
-rw-r--r--dhcpv4/option_userclass.go98
1 files changed, 0 insertions, 98 deletions
diff --git a/dhcpv4/option_userclass.go b/dhcpv4/option_userclass.go
deleted file mode 100644
index 69ceeba..0000000
--- a/dhcpv4/option_userclass.go
+++ /dev/null
@@ -1,98 +0,0 @@
-package dhcpv4
-
-import (
- "errors"
- "fmt"
- "strings"
-
- "github.com/u-root/u-root/pkg/uio"
-)
-
-// UserClass implements the user class option described by RFC 3004.
-type UserClass struct {
- UserClasses [][]byte
- RFC3004 bool
-}
-
-// OptUserClass returns a new user class option.
-func OptUserClass(v []byte) Option {
- return Option{
- Code: OptionUserClassInformation,
- Value: &UserClass{
- UserClasses: [][]byte{v},
- RFC3004: false,
- },
- }
-}
-
-// OptRFC3004UserClass returns a new user class option according to RFC 3004.
-func OptRFC3004UserClass(v [][]byte) Option {
- return Option{
- Code: OptionUserClassInformation,
- Value: &UserClass{
- UserClasses: v,
- RFC3004: true,
- },
- }
-}
-
-// ToBytes serializes the option and returns it as a sequence of bytes
-func (op *UserClass) ToBytes() []byte {
- buf := uio.NewBigEndianBuffer(nil)
- if !op.RFC3004 {
- buf.WriteBytes(op.UserClasses[0])
- } else {
- for _, uc := range op.UserClasses {
- buf.Write8(uint8(len(uc)))
- buf.WriteBytes(uc)
- }
- }
- return buf.Data()
-}
-
-// String returns a human-readable user class.
-func (op *UserClass) String() string {
- ucStrings := make([]string, 0, len(op.UserClasses))
- if !op.RFC3004 {
- ucStrings = append(ucStrings, string(op.UserClasses[0]))
- } else {
- for _, uc := range op.UserClasses {
- ucStrings = append(ucStrings, string(uc))
- }
- }
- return strings.Join(ucStrings, ", ")
-}
-
-// FromBytes parses data into op.
-func (op *UserClass) FromBytes(data []byte) error {
- buf := uio.NewBigEndianBuffer(data)
-
- // Check if option is Microsoft style instead of RFC compliant, issue #113
-
- // User-class options are, according to RFC3004, supposed to contain a set
- // of strings each with length UC_Len_i. Here we check that this is so,
- // by seeing if all the UC_Len_i lengths are consistent with the overall
- // option length. If the lengths don't add up, we assume that the option
- // is a single string and non RFC3004 compliant
- var counting int
- for counting < buf.Len() {
- // UC_Len_i does not include itself so add 1
- counting += int(data[counting]) + 1
- }
- if counting != buf.Len() {
- op.UserClasses = append(op.UserClasses, data)
- return nil
- }
- op.RFC3004 = true
- for buf.Has(1) {
- ucLen := buf.Read8()
- if ucLen == 0 {
- return fmt.Errorf("DHCP user class must have length greater than 0")
- }
- op.UserClasses = append(op.UserClasses, buf.CopyN(int(ucLen)))
- }
- if len(op.UserClasses) == 0 {
- return errors.New("ParseOptUserClass: at least one user class is required")
- }
- return buf.FinError()
-}