blob: de624981af7e5015ce2a8929013202f3a5eb2c32 [file] [log] [blame]
Shad Ansari1106b022019-01-16 22:22:35 -08001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package core
18
19import (
20 "encoding/binary"
21 "errors"
Keita NISHIMOTO21853b32019-01-25 19:29:59 +090022 "fmt"
Matteo Scandoloa0026812019-08-20 11:01:32 -070023 log "github.com/sirupsen/logrus"
Shad Ansari1106b022019-01-16 22:22:35 -080024)
25
26type OmciMsgHandler func(class OmciClass, content OmciContent, key OnuKey) ([]byte, error)
27
28var Handlers = map[OmciMsgType]OmciMsgHandler{
Zdravko Bozakovf56cca42019-04-29 10:06:47 +020029 MibReset: mibReset,
30 MibUpload: mibUpload,
31 MibUploadNext: mibUploadNext,
32 Set: set,
33 Create: create,
34 Get: get,
35 GetAllAlarms: getAllAlarms,
36 GetAllAlarmsNext: getAllAlarmsNext,
37 SynchronizeTime: syncTime,
38 Delete: delete,
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +020039 Reboot: reboot,
Matteo Scandoloc53377d2019-12-04 14:46:19 -080040 Test: testHandler,
Shad Ansari1106b022019-01-16 22:22:35 -080041}
42
43func mibReset(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
44 var pkt []byte
45
Matteo Scandoloa0026812019-08-20 11:01:32 -070046 log.WithFields(log.Fields{
47 "IntfId": key.IntfId,
48 "OnuId": key.OnuId,
49 }).Tracef("Omci MibReset")
William Kurkian3687c572019-10-11 15:29:17 -040050 OnuOmciStateMapLock.RLock()
Zdravko Bozakovf56cca42019-04-29 10:06:47 +020051 if state, ok := OnuOmciStateMap[key]; ok {
Matteo Scandoloa0026812019-08-20 11:01:32 -070052 log.WithFields(log.Fields{
53 "IntfId": key.IntfId,
54 "OnuId": key.OnuId,
55 }).Tracef("Reseting OnuOmciState")
Mahir Gunyeled7b07b2019-02-11 12:06:02 -080056 state.ResetOnuOmciState()
57 }
William Kurkian3687c572019-10-11 15:29:17 -040058 OnuOmciStateMapLock.RUnlock()
Shad Ansari1106b022019-01-16 22:22:35 -080059
60 pkt = []byte{
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
67 return pkt, nil
68}
69
70func mibUpload(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
71 var pkt []byte
72
Matteo Scandoloa0026812019-08-20 11:01:32 -070073 log.WithFields(log.Fields{
74 "IntfId": key.IntfId,
75 "OnuId": key.OnuId,
76 }).Tracef("Omci MibUpload")
Shad Ansari1106b022019-01-16 22:22:35 -080077
78 pkt = []byte{
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
85
Zdravko Bozakov3d762142019-07-15 16:57:17 +020086 pkt[8] = NumMibUploadsHigherByte
87 pkt[9] = NumMibUploadsLowerByte
Shad Ansari1106b022019-01-16 22:22:35 -080088
89 return pkt, nil
90}
91
92func mibUploadNext(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
93 var pkt []byte
William Kurkian3687c572019-10-11 15:29:17 -040094 OnuOmciStateMapLock.RLock()
Shad Ansari1106b022019-01-16 22:22:35 -080095 state := OnuOmciStateMap[key]
William Kurkian3687c572019-10-11 15:29:17 -040096 OnuOmciStateMapLock.RUnlock()
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +020097 // commandNumber is the "Command number" attribute received in "MIB Upload Next" OMCI message
Zdravko Bozakov3d762142019-07-15 16:57:17 +020098 commandNumber := (uint16(content[1])) | (uint16(content[0])<<8)
Matteo Scandoloa0026812019-08-20 11:01:32 -070099 log.WithFields(log.Fields{
100 "IntfId": key.IntfId,
101 "OnuId": key.OnuId,
102 "CommandNumber": commandNumber,
103 }).Tracef("Omci MibUploadNext")
Shad Ansari1106b022019-01-16 22:22:35 -0800104
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200105 switch commandNumber {
Shad Ansari1106b022019-01-16 22:22:35 -0800106 case 0:
107 // ONT Data (2)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200108 // log.Println("ONT DATA")
Shad Ansari1106b022019-01-16 22:22:35 -0800109 pkt = []byte{
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
111 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
116 case 1:
117 // Circuit Pack (6) - #1
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200118 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800119 pkt = []byte{
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
121 0x00, 0x06, 0x01, 0x01, 0xf0, 0x00, 0x2f, 0x04,
122 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
126 case 2:
127 // Circuit Pack (6) - #2
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200128 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800129 pkt = []byte{
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
131 0x00, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x42, 0x52,
132 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
136 case 3:
137 // Circuit Pack (6) - #3
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200138 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800139 pkt = []byte{
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
141 0x00, 0x06, 0x01, 0x01, 0x00, 0xf8, 0x20, 0x20,
142 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
143 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
144 0x20, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
146 case 4:
147 // Circuit Pack (6) - #4
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200148 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800149 pkt = []byte{
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
151 0x00, 0x06, 0x01, 0x01, 0x00, 0x04, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
156 case 5:
157 // Circuit Pack (6) - #5
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200158 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800159 pkt = []byte{
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
161 0x00, 0x06, 0x01, 0x80, 0xf0, 0x00, 0xee, 0x01,
162 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
166 case 6:
167 // Circuit Pack (6) - #6
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200168 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800169 pkt = []byte{
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
171 0x00, 0x06, 0x01, 0x80, 0x0f, 0x00, 0x42, 0x52,
172 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
176 case 7:
177 // Circuit Pack (6) - #7
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200178 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800179 pkt = []byte{
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
181 0x00, 0x06, 0x01, 0x80, 0x00, 0xf8, 0x20, 0x20,
182 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
183 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
184 0x20, 0x20, 0x00, 0x08, 0x40, 0x10, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
186 case 8:
187 // Circuit Pack (6) - #8
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200188 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800189 pkt = []byte{
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
191 0x00, 0x06, 0x01, 0x80, 0x00, 0x04, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
196 case 9, 10, 11, 12:
197 // PPTP (11)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200198 // log.Println("PPTP")
Shad Ansari1106b022019-01-16 22:22:35 -0800199 pkt = []byte{
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
201 0x00, 0x0b, 0x01, 0x01, 0xff, 0xfe, 0x00, 0x2f,
202 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
203 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
206 pkt[11] = state.pptpInstance // ME Instance
207 state.pptpInstance++
208 case 13, 14, 15, 16, 17, 18, 19, 20:
209 // T-CONT (262)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200210 // log.Println("T-CONT")
Shad Ansari1106b022019-01-16 22:22:35 -0800211 pkt = []byte{
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
213 0x01, 0x06, 0x80, 0x00, 0xe0, 0x00, 0xff, 0xff,
214 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200218
Shad Ansari1106b022019-01-16 22:22:35 -0800219 state.tcontInstance++
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200220 pkt[11] = state.tcontInstance // TCONT ME Instance
221
Shad Ansari1106b022019-01-16 22:22:35 -0800222 case 21:
223 // ANI-G (263)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200224 // log.Println("ANI-G")
Shad Ansari1106b022019-01-16 22:22:35 -0800225 pkt = []byte{
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
227 0x01, 0x07, 0x80, 0x01, 0xff, 0xff, 0x01, 0x00,
228 0x08, 0x00, 0x30, 0x00, 0x00, 0x05, 0x09, 0x00,
229 0x00, 0xe0, 0x54, 0xff, 0xff, 0x00, 0x00, 0x0c,
230 0x63, 0x81, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
232 case 22, 23, 24, 25:
233 // UNI-G (264)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200234 // log.Println("UNI-G")
Shad Ansari1106b022019-01-16 22:22:35 -0800235 pkt = []byte{
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
237 0x01, 0x08, 0x01, 0x01, 0xf8, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
242 pkt[11] = state.uniGInstance // UNI-G ME Instance
243 state.uniGInstance++
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200244
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200245 case 26, 30, 34, 38, 42, 46, 50, 54,
246 58, 62, 66, 70, 74, 78, 82, 86,
247 90, 94, 98, 102, 106, 110, 114, 118,
248 122, 126, 130, 134, 138, 142, 146, 150,
249 154, 158, 162, 166, 170, 174, 178, 182,
250 186, 190, 194, 198, 202, 206, 210, 214,
251 218, 222, 226, 230, 234, 238, 242, 246,
252 250, 254, 258, 262, 266, 270, 274, 278:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200253 // Prior-Q with mask downstream
Matteo Scandoloa0026812019-08-20 11:01:32 -0700254 log.Tracef("Mib-upload for prior-q with mask")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200255 // For downstream PQ, pkt[10] is 0x00
256 // So the instanceId will be like 0x0001, 0x0002,... etc
257 pkt = []byte{
258 0x00, 0x42, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
259 0x01, 0x15, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
260 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
261 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 }
265 state.priorQInstance++
266 pkt[11] = state.priorQInstance
267
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200268 case 27, 31, 35, 39, 43, 47, 51, 55,
269 59, 63, 67, 71, 75, 79, 83, 87,
270 91, 95, 99, 103, 107, 111, 115, 119,
271 123, 127, 131, 135, 139, 143, 147, 151,
272 155, 159, 163, 167, 171, 175, 179, 183,
273 187, 191, 195, 199, 203, 207, 211, 215,
274 219, 223, 227, 231, 235, 239, 243, 247,
275 251, 255, 259, 263, 267, 271, 275, 279:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200276 // Prior-Q with attribute list downstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200277 // log.Println("Mib-upload for prior-q with attribute list")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200278 pkt = []byte{
279 0x00, 0x43, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
280 0x01, 0x15, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x01,
281 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
282 0x20, 0x00, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 }
286
287 pkt[11] = state.priorQInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200288
289 // Group 8 PriorQ to point to a particular TCONT
290 // Priority for each group of PriorQ is 0 - 7
291 if state.priorQPriority % NumPriorQPerTcont == 0 {
292 state.tcontPointer++
293 }
294
295 // Only for verification. To be removed
296 if state.tcontPointer > state.tcontInstance {
Matteo Scandoloa0026812019-08-20 11:01:32 -0700297 log.Tracef("Error: Invalid TcontPointer")
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200298 break
299 }
300
301 pkt[24] = state.tcontPointer
302 pkt[26] = state.priorQPriority % NumPriorQPerTcont
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200303 pkt[28] = state.tcontInstance
304
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200305 case 28, 32, 36, 40, 44, 48, 52, 56,
306 60, 64, 68, 72, 76, 80, 84, 88,
307 92, 96, 100, 104, 108, 112, 116, 120,
308 124, 128, 132, 136, 140, 144, 148, 152,
309 156, 160, 164, 168, 172, 176, 180, 184,
310 188, 192, 196, 200, 204, 208, 212, 216,
311 220, 224, 228, 232, 236, 240, 244, 248,
312 252, 256, 260, 264, 268, 272, 276, 280:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200313 // Prior-Q with mask upstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200314 // log.Println("Mib-upload for prior-q with mask")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200315 pkt = []byte{
316 0x00, 0x42, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
317 0x01, 0x15, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xff,
318 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
319 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322 }
323 pkt[11] = state.priorQInstance
324
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200325 case 29, 33, 37, 41, 45, 49, 53, 57,
326 61, 65, 69, 73, 77, 81, 85, 89,
327 93, 97, 101, 105, 109, 113, 117, 121,
328 125, 129, 133, 137, 141, 145, 149, 153,
329 157, 161, 165, 169, 173, 177, 181, 185,
330 189, 193, 197, 201, 205, 209, 213, 217,
331 221, 225, 229, 233, 237, 241, 245, 249,
332 253, 257, 261, 265, 269, 273, 277, 281:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200333 // Prior-Q with attribute list upstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200334 // log.Println("Mib-upload for prior-q with attribute list")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200335 // For upstream pkt[10] is fixed as 80
336 // So for upstream PQ, instanceId will be like 0x8001, 0x8002 ... etc
337 pkt = []byte{
338 0x00, 0x43, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
339 0x01, 0x15, 0x80, 0x00, 0xff, 0xf0, 0x00, 0x01,
340 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
341 0x20, 0x00, 0x00, 0x80, 0x20, 0x01, 0x00, 0x01,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
344 }
345
346 pkt[11] = state.priorQInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200347 pkt[24] = state.tcontPointer
348 pkt[26] = state.priorQPriority % NumPriorQPerTcont // Priority of this PriorQ
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200349 pkt[28] = state.tcontInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200350 state.priorQPriority++
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200351
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200352
353 case 282, 283, 284, 285, 286, 287, 288, 289:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200354 // Traffic Scheduler
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200355 // log.Println("Traffic Scheduler")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200356 pkt = []byte{
357 0x02, 0xa4, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
358 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x00,
359 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 }
364
365 pkt[15] = state.tcontInstance
366 state.tcontInstance++
367
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200368 case 290:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200369 // ONT-2G
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200370 // log.Println("ONT-2G")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200371 pkt = []byte{
372 0x00, 0x16, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
373 0x01, 0x01, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x40,
374 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x01, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 }
379
Shad Ansari1106b022019-01-16 22:22:35 -0800380 default:
Mahir Gunyeled7b07b2019-02-11 12:06:02 -0800381 state.extraMibUploadCtr++
Matteo Scandoloa0026812019-08-20 11:01:32 -0700382 errstr := fmt.Sprintf("%v - Invalid MibUpload request: %d, extras: %d", key, state.mibUploadCtr, state)
Keita NISHIMOTO21853b32019-01-25 19:29:59 +0900383 return nil, errors.New(errstr)
Shad Ansari1106b022019-01-16 22:22:35 -0800384 }
385
386 state.mibUploadCtr++
387 return pkt, nil
388}
389
390func set(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
391 var pkt []byte
392
393 pkt = []byte{
394 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
400
Matteo Scandoloa0026812019-08-20 11:01:32 -0700401 log.WithFields(log.Fields{
402 "IntfId": key.IntfId,
403 "OnuId": key.OnuId,
404 }).Tracef("Omci Set")
Shad Ansari1106b022019-01-16 22:22:35 -0800405
406 return pkt, nil
407}
408
409func create(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
410 var pkt []byte
411
412 if class == GEMPortNetworkCTP {
William Kurkian3687c572019-10-11 15:29:17 -0400413 OnuOmciStateMapLock.RLock()
414 defer OnuOmciStateMapLock.RUnlock()
Shad Ansari1106b022019-01-16 22:22:35 -0800415 if onuOmciState, ok := OnuOmciStateMap[key]; !ok {
Matteo Scandoloa0026812019-08-20 11:01:32 -0700416 log.WithFields(log.Fields{
417 "IntfId": key.IntfId,
418 "OnuId": key.OnuId,
419 }).Tracef("ONU Key Error")
Shad Ansari1106b022019-01-16 22:22:35 -0800420 return nil, errors.New("ONU Key Error")
421 } else {
422 onuOmciState.gemPortId = binary.BigEndian.Uint16(content[:2])
Matteo Scandoloa0026812019-08-20 11:01:32 -0700423 log.WithFields(log.Fields{
424 "IntfId": key.IntfId,
425 "OnuId": key.OnuId,
426 }).Tracef("Gem Port Id %d", key, onuOmciState)
Shad Ansari1106b022019-01-16 22:22:35 -0800427 // FIXME
428 OnuOmciStateMap[key].state = DONE
Matteo Scandolo203314b2019-08-26 14:28:42 -0700429 omciCh <- OmciChMessage{
430 Type: GemPortAdded,
431 Data: OmciChMessageData{
432 OnuId: key.OnuId,
433 IntfId: key.IntfId,
434 },
435 }
Shad Ansari1106b022019-01-16 22:22:35 -0800436 }
437 }
438
439 pkt = []byte{
440 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01,
441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
446
Matteo Scandoloa0026812019-08-20 11:01:32 -0700447 log.WithFields(log.Fields{
448 "IntfId": key.IntfId,
449 "OnuId": key.OnuId,
450 }).Tracef("Omci Create")
Shad Ansari1106b022019-01-16 22:22:35 -0800451
452 return pkt, nil
453}
454
455func get(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
456 var pkt []byte
457
458 pkt = []byte{
459 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x02, 0x01,
460 0x00, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
463 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
464 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
465
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200466 pkt = GetAttributes(class, content, key, pkt)
Shad Ansari1106b022019-01-16 22:22:35 -0800467
Matteo Scandoloa0026812019-08-20 11:01:32 -0700468 log.WithFields(log.Fields{
469 "IntfId": key.IntfId,
470 "OnuId": key.OnuId,
471 }).Tracef("Omci Get")
Shad Ansari1106b022019-01-16 22:22:35 -0800472 return pkt, nil
473}
474
475func getAllAlarms(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
476 var pkt []byte
477
478 pkt = []byte{
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
480 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
485
Matteo Scandoloa0026812019-08-20 11:01:32 -0700486 log.WithFields(log.Fields{
487 "IntfId": key.IntfId,
488 "OnuId": key.OnuId,
489 }).Tracef("Omci GetAllAlarms")
Shad Ansari1106b022019-01-16 22:22:35 -0800490
491 return pkt, nil
492}
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800493
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800494func syncTime(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
495 var pkt []byte
496
497 pkt = []byte{
498 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
499 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
504
Matteo Scandoloa0026812019-08-20 11:01:32 -0700505 log.WithFields(log.Fields{
506 "IntfId": key.IntfId,
507 "OnuId": key.OnuId,
508 }).Tracef("Omci syncTime")
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800509
510 return pkt, nil
511}
512
513func getAllAlarmsNext(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
514 var pkt []byte
515
516 pkt = []byte{
517 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200518 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800519 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
523
Matteo Scandoloa0026812019-08-20 11:01:32 -0700524 log.WithFields(log.Fields{
525 "IntfId": key.IntfId,
526 "OnuId": key.OnuId,
527 }).Tracef("Omci GetAllAlarmsNext")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200528
529 return pkt, nil
530}
531
532func delete(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
533 var pkt []byte
534
535 pkt = []byte{
536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x0b, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
539 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
540 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
541 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
542
Matteo Scandoloa0026812019-08-20 11:01:32 -0700543 log.WithFields(log.Fields{
544 "IntfId": key.IntfId,
545 "OnuId": key.OnuId,
546 }).Tracef("Omci Delete")
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800547
548 return pkt, nil
549}
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200550
551func reboot(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
552 var pkt []byte
553 pkt = []byte{
554 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
555 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
556 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
560
Matteo Scandoloa0026812019-08-20 11:01:32 -0700561 log.WithFields(log.Fields{
562 "IntfId": key.IntfId,
563 "OnuId": key.OnuId,
564 }).Tracef("Omci Reboot")
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200565 return pkt, nil
566}
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200567
Matteo Scandoloc53377d2019-12-04 14:46:19 -0800568func testHandler(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
569 var pkt []byte
570 pkt = []byte{
571 0x20, 0x52, 0x45, 0x43, 0x56, 0x00, 0x20, 0x53,
572 0x45, 0x4e, 0x44, 0x00, 0x88, 0xb5, 0x02, 0x3f,
573 0x1b, 0x0a, 0x01, 0x07, 0x80, 0x01, 0x01, 0x00,
574 0xa5, 0x03, 0xe0, 0x0b, 0x05, 0x0b, 0x2b, 0x09,
575 0x1c, 0xd0, 0x0c, 0x32, 0x80, 0x00, 0x00, 0x00,
576 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578 0x00, 0x28, 0xf8, 0x13, 0x1b, 0x36,}
579
580 log.WithFields(log.Fields{
581 "IntfId": key.IntfId,
582 "OnuId": key.OnuId,
583 }).Trace("Omci Test")
584 return pkt, nil
585}
586