blob: 67a57e79015224bbdb53ce066a32d1f5144cbb32 [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,
Shad Ansari1106b022019-01-16 22:22:35 -080040}
41
42func mibReset(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
43 var pkt []byte
44
Matteo Scandoloa0026812019-08-20 11:01:32 -070045 log.WithFields(log.Fields{
46 "IntfId": key.IntfId,
47 "OnuId": key.OnuId,
48 }).Tracef("Omci MibReset")
William Kurkian3687c572019-10-11 15:29:17 -040049 OnuOmciStateMapLock.RLock()
Zdravko Bozakovf56cca42019-04-29 10:06:47 +020050 if state, ok := OnuOmciStateMap[key]; ok {
Matteo Scandoloa0026812019-08-20 11:01:32 -070051 log.WithFields(log.Fields{
52 "IntfId": key.IntfId,
53 "OnuId": key.OnuId,
54 }).Tracef("Reseting OnuOmciState")
Mahir Gunyeled7b07b2019-02-11 12:06:02 -080055 state.ResetOnuOmciState()
56 }
William Kurkian3687c572019-10-11 15:29:17 -040057 OnuOmciStateMapLock.RUnlock()
Shad Ansari1106b022019-01-16 22:22:35 -080058
59 pkt = []byte{
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 return pkt, nil
67}
68
69func mibUpload(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
70 var pkt []byte
71
Matteo Scandoloa0026812019-08-20 11:01:32 -070072 log.WithFields(log.Fields{
73 "IntfId": key.IntfId,
74 "OnuId": key.OnuId,
75 }).Tracef("Omci MibUpload")
Shad Ansari1106b022019-01-16 22:22:35 -080076
77 pkt = []byte{
78 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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
Zdravko Bozakov3d762142019-07-15 16:57:17 +020085 pkt[8] = NumMibUploadsHigherByte
86 pkt[9] = NumMibUploadsLowerByte
Shad Ansari1106b022019-01-16 22:22:35 -080087
88 return pkt, nil
89}
90
91func mibUploadNext(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
92 var pkt []byte
William Kurkian3687c572019-10-11 15:29:17 -040093 OnuOmciStateMapLock.RLock()
Shad Ansari1106b022019-01-16 22:22:35 -080094 state := OnuOmciStateMap[key]
William Kurkian3687c572019-10-11 15:29:17 -040095 OnuOmciStateMapLock.RUnlock()
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +020096 // commandNumber is the "Command number" attribute received in "MIB Upload Next" OMCI message
Zdravko Bozakov3d762142019-07-15 16:57:17 +020097 commandNumber := (uint16(content[1])) | (uint16(content[0])<<8)
Matteo Scandoloa0026812019-08-20 11:01:32 -070098 log.WithFields(log.Fields{
99 "IntfId": key.IntfId,
100 "OnuId": key.OnuId,
101 "CommandNumber": commandNumber,
102 }).Tracef("Omci MibUploadNext")
Shad Ansari1106b022019-01-16 22:22:35 -0800103
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200104 switch commandNumber {
Shad Ansari1106b022019-01-16 22:22:35 -0800105 case 0:
106 // ONT Data (2)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200107 // log.Println("ONT DATA")
Shad Ansari1106b022019-01-16 22:22:35 -0800108 pkt = []byte{
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
110 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 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 case 1:
116 // Circuit Pack (6) - #1
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200117 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800118 pkt = []byte{
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
120 0x00, 0x06, 0x01, 0x01, 0xf0, 0x00, 0x2f, 0x04,
121 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
125 case 2:
126 // Circuit Pack (6) - #2
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200127 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800128 pkt = []byte{
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
130 0x00, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x42, 0x52,
131 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 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 case 3:
136 // Circuit Pack (6) - #3
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200137 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800138 pkt = []byte{
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
140 0x00, 0x06, 0x01, 0x01, 0x00, 0xf8, 0x20, 0x20,
141 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
142 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
143 0x20, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
145 case 4:
146 // Circuit Pack (6) - #4
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200147 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800148 pkt = []byte{
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
150 0x00, 0x06, 0x01, 0x01, 0x00, 0x04, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 case 5:
156 // Circuit Pack (6) - #5
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200157 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800158 pkt = []byte{
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
160 0x00, 0x06, 0x01, 0x80, 0xf0, 0x00, 0xee, 0x01,
161 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
165 case 6:
166 // Circuit Pack (6) - #6
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200167 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800168 pkt = []byte{
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
170 0x00, 0x06, 0x01, 0x80, 0x0f, 0x00, 0x42, 0x52,
171 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 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 case 7:
176 // Circuit Pack (6) - #7
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200177 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800178 pkt = []byte{
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
180 0x00, 0x06, 0x01, 0x80, 0x00, 0xf8, 0x20, 0x20,
181 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
182 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
183 0x20, 0x20, 0x00, 0x08, 0x40, 0x10, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
185 case 8:
186 // Circuit Pack (6) - #8
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200187 // log.Println("Circuit Pack")
Shad Ansari1106b022019-01-16 22:22:35 -0800188 pkt = []byte{
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
190 0x00, 0x06, 0x01, 0x80, 0x00, 0x04, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 case 9, 10, 11, 12:
196 // PPTP (11)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200197 // log.Println("PPTP")
Shad Ansari1106b022019-01-16 22:22:35 -0800198 pkt = []byte{
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
200 0x00, 0x0b, 0x01, 0x01, 0xff, 0xfe, 0x00, 0x2f,
201 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
202 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
205 pkt[11] = state.pptpInstance // ME Instance
206 state.pptpInstance++
207 case 13, 14, 15, 16, 17, 18, 19, 20:
208 // T-CONT (262)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200209 // log.Println("T-CONT")
Shad Ansari1106b022019-01-16 22:22:35 -0800210 pkt = []byte{
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
212 0x01, 0x06, 0x80, 0x00, 0xe0, 0x00, 0xff, 0xff,
213 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200217
Shad Ansari1106b022019-01-16 22:22:35 -0800218 state.tcontInstance++
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200219 pkt[11] = state.tcontInstance // TCONT ME Instance
220
Shad Ansari1106b022019-01-16 22:22:35 -0800221 case 21:
222 // ANI-G (263)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200223 // log.Println("ANI-G")
Shad Ansari1106b022019-01-16 22:22:35 -0800224 pkt = []byte{
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
226 0x01, 0x07, 0x80, 0x01, 0xff, 0xff, 0x01, 0x00,
227 0x08, 0x00, 0x30, 0x00, 0x00, 0x05, 0x09, 0x00,
228 0x00, 0xe0, 0x54, 0xff, 0xff, 0x00, 0x00, 0x0c,
229 0x63, 0x81, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
231 case 22, 23, 24, 25:
232 // UNI-G (264)
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200233 // log.Println("UNI-G")
Shad Ansari1106b022019-01-16 22:22:35 -0800234 pkt = []byte{
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
236 0x01, 0x08, 0x01, 0x01, 0xf8, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 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 pkt[11] = state.uniGInstance // UNI-G ME Instance
242 state.uniGInstance++
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200243
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200244 case 26, 30, 34, 38, 42, 46, 50, 54,
245 58, 62, 66, 70, 74, 78, 82, 86,
246 90, 94, 98, 102, 106, 110, 114, 118,
247 122, 126, 130, 134, 138, 142, 146, 150,
248 154, 158, 162, 166, 170, 174, 178, 182,
249 186, 190, 194, 198, 202, 206, 210, 214,
250 218, 222, 226, 230, 234, 238, 242, 246,
251 250, 254, 258, 262, 266, 270, 274, 278:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200252 // Prior-Q with mask downstream
Matteo Scandoloa0026812019-08-20 11:01:32 -0700253 log.Tracef("Mib-upload for prior-q with mask")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200254 // For downstream PQ, pkt[10] is 0x00
255 // So the instanceId will be like 0x0001, 0x0002,... etc
256 pkt = []byte{
257 0x00, 0x42, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
258 0x01, 0x15, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff,
259 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
260 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 }
264 state.priorQInstance++
265 pkt[11] = state.priorQInstance
266
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200267 case 27, 31, 35, 39, 43, 47, 51, 55,
268 59, 63, 67, 71, 75, 79, 83, 87,
269 91, 95, 99, 103, 107, 111, 115, 119,
270 123, 127, 131, 135, 139, 143, 147, 151,
271 155, 159, 163, 167, 171, 175, 179, 183,
272 187, 191, 195, 199, 203, 207, 211, 215,
273 219, 223, 227, 231, 235, 239, 243, 247,
274 251, 255, 259, 263, 267, 271, 275, 279:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200275 // Prior-Q with attribute list downstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200276 // log.Println("Mib-upload for prior-q with attribute list")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200277 pkt = []byte{
278 0x00, 0x43, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
279 0x01, 0x15, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x01,
280 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
281 0x20, 0x00, 0x00, 0x01, 0x20, 0x01, 0x00, 0x01,
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 }
285
286 pkt[11] = state.priorQInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200287
288 // Group 8 PriorQ to point to a particular TCONT
289 // Priority for each group of PriorQ is 0 - 7
290 if state.priorQPriority % NumPriorQPerTcont == 0 {
291 state.tcontPointer++
292 }
293
294 // Only for verification. To be removed
295 if state.tcontPointer > state.tcontInstance {
Matteo Scandoloa0026812019-08-20 11:01:32 -0700296 log.Tracef("Error: Invalid TcontPointer")
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200297 break
298 }
299
300 pkt[24] = state.tcontPointer
301 pkt[26] = state.priorQPriority % NumPriorQPerTcont
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200302 pkt[28] = state.tcontInstance
303
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200304 case 28, 32, 36, 40, 44, 48, 52, 56,
305 60, 64, 68, 72, 76, 80, 84, 88,
306 92, 96, 100, 104, 108, 112, 116, 120,
307 124, 128, 132, 136, 140, 144, 148, 152,
308 156, 160, 164, 168, 172, 176, 180, 184,
309 188, 192, 196, 200, 204, 208, 212, 216,
310 220, 224, 228, 232, 236, 240, 244, 248,
311 252, 256, 260, 264, 268, 272, 276, 280:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200312 // Prior-Q with mask upstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200313 // log.Println("Mib-upload for prior-q with mask")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200314 pkt = []byte{
315 0x00, 0x42, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
316 0x01, 0x15, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xff,
317 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
318 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 }
322 pkt[11] = state.priorQInstance
323
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200324 case 29, 33, 37, 41, 45, 49, 53, 57,
325 61, 65, 69, 73, 77, 81, 85, 89,
326 93, 97, 101, 105, 109, 113, 117, 121,
327 125, 129, 133, 137, 141, 145, 149, 153,
328 157, 161, 165, 169, 173, 177, 181, 185,
329 189, 193, 197, 201, 205, 209, 213, 217,
330 221, 225, 229, 233, 237, 241, 245, 249,
331 253, 257, 261, 265, 269, 273, 277, 281:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200332 // Prior-Q with attribute list upstream
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200333 // log.Println("Mib-upload for prior-q with attribute list")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200334 // For upstream pkt[10] is fixed as 80
335 // So for upstream PQ, instanceId will be like 0x8001, 0x8002 ... etc
336 pkt = []byte{
337 0x00, 0x43, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
338 0x01, 0x15, 0x80, 0x00, 0xff, 0xf0, 0x00, 0x01,
339 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
340 0x20, 0x00, 0x00, 0x80, 0x20, 0x01, 0x00, 0x01,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 }
344
345 pkt[11] = state.priorQInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200346 pkt[24] = state.tcontPointer
347 pkt[26] = state.priorQPriority % NumPriorQPerTcont // Priority of this PriorQ
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200348 pkt[28] = state.tcontInstance
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200349 state.priorQPriority++
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200350
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200351
352 case 282, 283, 284, 285, 286, 287, 288, 289:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200353 // Traffic Scheduler
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200354 // log.Println("Traffic Scheduler")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200355 pkt = []byte{
356 0x02, 0xa4, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
357 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x00,
358 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 }
363
364 pkt[15] = state.tcontInstance
365 state.tcontInstance++
366
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200367 case 290:
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200368 // ONT-2G
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200369 // log.Println("ONT-2G")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200370 pkt = []byte{
371 0x00, 0x16, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
372 0x01, 0x01, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x40,
373 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x01, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 }
378
Shad Ansari1106b022019-01-16 22:22:35 -0800379 default:
Mahir Gunyeled7b07b2019-02-11 12:06:02 -0800380 state.extraMibUploadCtr++
Matteo Scandoloa0026812019-08-20 11:01:32 -0700381 errstr := fmt.Sprintf("%v - Invalid MibUpload request: %d, extras: %d", key, state.mibUploadCtr, state)
Keita NISHIMOTO21853b32019-01-25 19:29:59 +0900382 return nil, errors.New(errstr)
Shad Ansari1106b022019-01-16 22:22:35 -0800383 }
384
385 state.mibUploadCtr++
386 return pkt, nil
387}
388
389func set(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
390 var pkt []byte
391
392 pkt = []byte{
393 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700400 log.WithFields(log.Fields{
401 "IntfId": key.IntfId,
402 "OnuId": key.OnuId,
403 }).Tracef("Omci Set")
Shad Ansari1106b022019-01-16 22:22:35 -0800404
405 return pkt, nil
406}
407
408func create(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
409 var pkt []byte
410
411 if class == GEMPortNetworkCTP {
William Kurkian3687c572019-10-11 15:29:17 -0400412 OnuOmciStateMapLock.RLock()
413 defer OnuOmciStateMapLock.RUnlock()
Shad Ansari1106b022019-01-16 22:22:35 -0800414 if onuOmciState, ok := OnuOmciStateMap[key]; !ok {
Matteo Scandoloa0026812019-08-20 11:01:32 -0700415 log.WithFields(log.Fields{
416 "IntfId": key.IntfId,
417 "OnuId": key.OnuId,
418 }).Tracef("ONU Key Error")
Shad Ansari1106b022019-01-16 22:22:35 -0800419 return nil, errors.New("ONU Key Error")
420 } else {
421 onuOmciState.gemPortId = binary.BigEndian.Uint16(content[:2])
Matteo Scandoloa0026812019-08-20 11:01:32 -0700422 log.WithFields(log.Fields{
423 "IntfId": key.IntfId,
424 "OnuId": key.OnuId,
425 }).Tracef("Gem Port Id %d", key, onuOmciState)
Shad Ansari1106b022019-01-16 22:22:35 -0800426 // FIXME
427 OnuOmciStateMap[key].state = DONE
Matteo Scandolo203314b2019-08-26 14:28:42 -0700428 omciCh <- OmciChMessage{
429 Type: GemPortAdded,
430 Data: OmciChMessageData{
431 OnuId: key.OnuId,
432 IntfId: key.IntfId,
433 },
434 }
Shad Ansari1106b022019-01-16 22:22:35 -0800435 }
436 }
437
438 pkt = []byte{
439 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01,
440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700446 log.WithFields(log.Fields{
447 "IntfId": key.IntfId,
448 "OnuId": key.OnuId,
449 }).Tracef("Omci Create")
Shad Ansari1106b022019-01-16 22:22:35 -0800450
451 return pkt, nil
452}
453
454func get(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
455 var pkt []byte
456
457 pkt = []byte{
458 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x02, 0x01,
459 0x00, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
460 0x00, 0x00, 0x00, 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
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200465 pkt = GetAttributes(class, content, key, pkt)
Shad Ansari1106b022019-01-16 22:22:35 -0800466
Matteo Scandoloa0026812019-08-20 11:01:32 -0700467 log.WithFields(log.Fields{
468 "IntfId": key.IntfId,
469 "OnuId": key.OnuId,
470 }).Tracef("Omci Get")
Shad Ansari1106b022019-01-16 22:22:35 -0800471 return pkt, nil
472}
473
474func getAllAlarms(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
475 var pkt []byte
476
477 pkt = []byte{
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
479 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700485 log.WithFields(log.Fields{
486 "IntfId": key.IntfId,
487 "OnuId": key.OnuId,
488 }).Tracef("Omci GetAllAlarms")
Shad Ansari1106b022019-01-16 22:22:35 -0800489
490 return pkt, nil
491}
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800492
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800493func syncTime(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
494 var pkt []byte
495
496 pkt = []byte{
497 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
498 0x00, 0x00, 0x00, 0x00, 0x00, 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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700504 log.WithFields(log.Fields{
505 "IntfId": key.IntfId,
506 "OnuId": key.OnuId,
507 }).Tracef("Omci syncTime")
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800508
509 return pkt, nil
510}
511
512func getAllAlarmsNext(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
513 var pkt []byte
514
515 pkt = []byte{
516 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200517 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800518 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
519 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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700523 log.WithFields(log.Fields{
524 "IntfId": key.IntfId,
525 "OnuId": key.OnuId,
526 }).Tracef("Omci GetAllAlarmsNext")
Zdravko Bozakovf56cca42019-04-29 10:06:47 +0200527
528 return pkt, nil
529}
530
531func delete(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
532 var pkt []byte
533
534 pkt = []byte{
535 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x0b, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700542 log.WithFields(log.Fields{
543 "IntfId": key.IntfId,
544 "OnuId": key.OnuId,
545 }).Tracef("Omci Delete")
Mahir Gunyel5b89e5e2019-02-15 09:34:14 -0800546
547 return pkt, nil
548}
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200549
550func reboot(class OmciClass, content OmciContent, key OnuKey) ([]byte, error) {
551 var pkt []byte
552 pkt = []byte{
553 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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
Matteo Scandoloa0026812019-08-20 11:01:32 -0700560 log.WithFields(log.Fields{
561 "IntfId": key.IntfId,
562 "OnuId": key.OnuId,
563 }).Tracef("Omci Reboot")
Zdravko Bozakov8e9d85a2019-05-27 21:02:59 +0200564 return pkt, nil
565}
Zdravko Bozakov3d762142019-07-15 16:57:17 +0200566