forked from medallia/goipmi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dcmi.go
130 lines (117 loc) · 3.09 KB
/
dcmi.go
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package ipmi
const (
MAX_MC_ID_STRING_LEN = 16
DCMI_GROUP_EXTENSION_ID = 0xDC
)
// DcmiGetMcIdRequest per section 6.4.6.1
type DcmiGetMcIdRequest struct {
GroupExtensionId uint8
Offset uint8
NumBytes uint8
}
// DcmiGetMcIdResponse per section 6.4.6.1
type DcmiGetMcIdResponse struct {
CompletionCode
GroupExtensionId uint8
NumBytes uint8
Data string
}
// DcmiSetMcIdRequest per section 6.4.6.2
type DcmiSetMcIdRequest struct {
GroupExtensionId uint8
Offset uint8
NumBytes uint8
Data string
}
// DcmiSetMcIdResponse per section 6.4.6.2
type DcmiSetMcIdResponse struct {
CompletionCode
GroupExtensionId uint8
LastOffsetWritten uint8
}
// MarshalBinary implementation to handle variable length Data
func (r *DcmiGetMcIdRequest) MarshalBinary() ([]byte, error) {
buf := make([]byte, 3)
buf[0] = r.GroupExtensionId
buf[1] = r.Offset
buf[2] = r.NumBytes
return buf, nil
}
// UnmarshalBinary implementation to handle variable length Data
func (r *DcmiGetMcIdRequest) UnmarshalBinary(buf []byte) error {
if len(buf) < 3 {
return ErrShortPacket
}
r.GroupExtensionId = buf[0]
r.Offset = buf[1]
r.NumBytes = buf[2]
return nil
}
// MarshalBinary implementation to handle variable length Data
func (r *DcmiGetMcIdResponse) MarshalBinary() ([]byte, error) {
buf := make([]byte, 3+len(r.Data))
buf[0] = byte(r.CompletionCode)
buf[1] = r.GroupExtensionId
buf[2] = r.NumBytes
copy(buf[3:], r.Data)
return buf, nil
}
// UnmarshalBinary implementation to handle variable length Data
func (r *DcmiGetMcIdResponse) UnmarshalBinary(buf []byte) error {
if len(buf) < 4 {
return ErrShortPacket
}
r.CompletionCode = CompletionCode(buf[0])
r.GroupExtensionId = buf[1]
r.NumBytes = buf[2]
ending := len(buf)
for idx, b := range buf[3:] {
if b == 0x00 {
ending = idx + 3
break
}
}
r.Data = string(buf[3:ending])
return nil
}
// MarshalBinary implementation to handle variable length Data
func (r *DcmiSetMcIdRequest) MarshalBinary() ([]byte, error) {
buf := make([]byte, 3+MAX_MC_ID_STRING_LEN)
buf[0] = r.GroupExtensionId
buf[1] = r.Offset
buf[2] = MAX_MC_ID_STRING_LEN
copy(buf[3:], r.Data)
for i := 3 + len(r.Data); i < MAX_MC_ID_STRING_LEN; i++ {
buf[i] = 0x00
}
return buf, nil
}
// UnmarshalBinary implementation to handle variable length Data
func (r *DcmiSetMcIdRequest) UnmarshalBinary(buf []byte) error {
if len(buf) < 4 {
return ErrShortPacket
}
r.GroupExtensionId = buf[0]
r.Offset = buf[1]
r.NumBytes = buf[2]
r.Data = string(buf[3 : 3+r.NumBytes])
return nil
}
// MarshalBinary implementation to handle variable length Data
func (r *DcmiSetMcIdResponse) MarshalBinary() ([]byte, error) {
buf := make([]byte, 3)
buf[0] = byte(r.CompletionCode)
buf[1] = r.GroupExtensionId
buf[2] = r.LastOffsetWritten
return buf, nil
}
// UnmarshalBinary implementation to handle variable length Data
func (r *DcmiSetMcIdResponse) UnmarshalBinary(buf []byte) error {
if len(buf) < 3 {
return ErrShortPacket
}
r.CompletionCode = CompletionCode(buf[0])
r.GroupExtensionId = buf[1]
r.LastOffsetWritten = buf[2]
return nil
}