Deserializes a chunk from a stream by reading the bytes at the current position of the stream.
The current stream position is updated according to the length of the returned chunk.
219 auto pimPacket = makeShared<PimPacket>();
222 pimPacket->setVersion(stream.readNBitsToUint64Be(4));
223 pimPacket->setType(
static_cast<PimPacketType>(stream.readNBitsToUint64Be(4)));
224 pimPacket->setReserved(stream.readByte());
225 pimPacket->setCrc(stream.readUint16Be());
228 switch (pimPacket->getType()) {
230 auto pimHello = makeShared<PimHello>();
231 pimHello->setType(pimPacket->getType());
232 pimHello->setVersion(pimPacket->getVersion());
233 pimHello->setReserved(pimPacket->getReserved());
234 pimHello->setCrc(pimPacket->getCrc());
235 pimHello->setCrcMode(pimPacket->getCrcMode());
238 while (stream.getRemainingLength().get() > 0) {
242 uint16_t size = stream.readUint16Be();
244 pimHello->markIncorrect();
245 pimHello->setOptionsArraySize(++i);
246 HoldtimeOption *holdtimeOption =
new HoldtimeOption();
247 holdtimeOption->setHoldTime(stream.readUint16Be());
248 pimHello->setOptions(i - 1, holdtimeOption);
253 uint16_t size = stream.readUint16Be();
254 bool T = stream.readBit();
256 pimHello->markIncorrect();
257 pimHello->setOptionsArraySize(++i);
258 LanPruneDelayOption *lanPruneDelayOption =
new LanPruneDelayOption();
259 lanPruneDelayOption->setPropagationDelay(stream.readNBitsToUint64Be(15));
260 lanPruneDelayOption->setOverrideInterval(stream.readUint16Be());
261 pimHello->setOptions(i - 1, lanPruneDelayOption);
266 uint16_t size = stream.readUint16Be();
268 pimHello->markIncorrect();
269 pimHello->setOptionsArraySize(++i);
270 DrPriorityOption *drPriorityOption =
new DrPriorityOption();
271 drPriorityOption->setPriority(stream.readUint32Be());
272 pimHello->setOptions(i - 1, drPriorityOption);
277 uint16_t size = stream.readUint16Be();
279 pimHello->markIncorrect();
280 pimHello->setOptionsArraySize(++i);
281 GenerationIdOption *generationIdOption =
new GenerationIdOption();
282 generationIdOption->setGenerationID(stream.readUint32Be());
283 pimHello->setOptions(i - 1, generationIdOption);
288 throw cRuntimeError(
"Cannot deserialize Hello options: type %d not supported.",
type);
291 pimHello->setChunkLength(length);
295 auto pimRegister = makeShared<PimRegister>();
296 pimRegister->setType(pimPacket->getType());
297 pimRegister->setVersion(pimPacket->getVersion());
298 pimRegister->setReserved(pimPacket->getReserved());
299 pimRegister->setCrc(pimPacket->getCrc());
300 pimRegister->setCrcMode(pimPacket->getCrcMode());
301 pimRegister->setB(stream.readBit());
302 pimRegister->setN(stream.readBit());
303 stream.readNBitsToUint64Be(30);
305 pimRegister->setChunkLength(length);
309 auto pimRegisterStop = makeShared<PimRegisterStop>();
310 pimRegisterStop->setType(pimPacket->getType());
311 pimRegisterStop->setVersion(pimPacket->getVersion());
312 pimRegisterStop->setReserved(pimPacket->getReserved());
313 pimRegisterStop->setCrc(pimPacket->getCrc());
314 pimRegisterStop->setCrcMode(pimPacket->getCrcMode());
315 deserializeEncodedGroupAddress(stream, pimRegisterStop, pimRegisterStop->getGroupAddressForUpdate());
317 deserializeEncodedUnicastAddress(stream, pimRegisterStop, pimRegisterStop->getSourceAddressForUpdate());
319 pimRegisterStop->setChunkLength(length);
320 return pimRegisterStop;
325 auto pimJoinPrune = makeShared<PimJoinPrune>();
326 if (pimPacket->getType() ==
Graft || pimPacket->getType() ==
GraftAck)
327 pimJoinPrune = makeShared<PimGraft>();
328 pimJoinPrune->setType(pimPacket->getType());
329 pimJoinPrune->setVersion(pimPacket->getVersion());
330 pimJoinPrune->setReserved(pimPacket->getReserved());
331 pimJoinPrune->setCrc(pimPacket->getCrc());
332 pimJoinPrune->setCrcMode(pimPacket->getCrcMode());
333 deserializeEncodedUnicastAddress(stream, pimJoinPrune, pimJoinPrune->getUpstreamNeighborAddressForUpdate());
335 pimJoinPrune->setReserved2(stream.readByte());
336 pimJoinPrune->setJoinPruneGroupsArraySize(stream.readByte());
337 pimJoinPrune->setHoldTime(stream.readUint16Be());
339 if ((pimPacket->getType() ==
Graft || pimPacket->getType() ==
GraftAck) && pimJoinPrune->getHoldTime() != 0)
340 pimJoinPrune->markIncorrect();
341 for (
size_t i = 0; i < pimJoinPrune->getJoinPruneGroupsArraySize(); ++i) {
342 deserializeEncodedGroupAddress(stream, pimJoinPrune, pimJoinPrune->getJoinPruneGroupsForUpdate(i).getGroupAddressForUpdate());
344 auto& joinPruneGroup = pimJoinPrune->getJoinPruneGroupsForUpdate(i);
345 joinPruneGroup.setJoinedSourceAddressArraySize(stream.readUint16Be());
346 joinPruneGroup.setPrunedSourceAddressArraySize(stream.readUint16Be());
348 for (
size_t k = 0;
k < joinPruneGroup.getJoinedSourceAddressArraySize(); ++
k) {
349 deserializeEncodedSourceAddress(stream, pimJoinPrune, joinPruneGroup.getJoinedSourceAddressForUpdate(
k));
352 for (
size_t k = 0;
k < pimJoinPrune->getJoinPruneGroups(i).getPrunedSourceAddressArraySize(); ++
k) {
353 deserializeEncodedSourceAddress(stream, pimJoinPrune, joinPruneGroup.getPrunedSourceAddressForUpdate(
k));
357 pimJoinPrune->setChunkLength(length);
361 auto pimAssert = makeShared<PimAssert>();
362 pimAssert->setType(pimPacket->getType());
363 pimAssert->setVersion(pimPacket->getVersion());
364 pimAssert->setReserved(pimPacket->getReserved());
365 pimAssert->setCrc(pimPacket->getCrc());
366 pimAssert->setCrcMode(pimPacket->getCrcMode());
367 deserializeEncodedGroupAddress(stream, pimAssert, pimAssert->getGroupAddressForUpdate());
369 deserializeEncodedUnicastAddress(stream, pimAssert, pimAssert->getSourceAddressForUpdate());
371 pimAssert->setR(stream.readBit());
372 pimAssert->setMetricPreference(stream.readNBitsToUint64Be(31));
373 pimAssert->setMetric(stream.readUint32Be());
378 auto pimStateRefresh = makeShared<PimStateRefresh>();
379 pimStateRefresh->setType(pimPacket->getType());
380 pimStateRefresh->setVersion(pimPacket->getVersion());
381 pimStateRefresh->setReserved(pimPacket->getReserved());
382 pimStateRefresh->setCrc(pimPacket->getCrc());
383 pimStateRefresh->setCrcMode(pimPacket->getCrcMode());
384 deserializeEncodedGroupAddress(stream, pimStateRefresh, pimStateRefresh->getGroupAddressForUpdate());
386 deserializeEncodedUnicastAddress(stream, pimStateRefresh, pimStateRefresh->getSourceAddressForUpdate());
388 deserializeEncodedUnicastAddress(stream, pimStateRefresh, pimStateRefresh->getOriginatorAddressForUpdate());
391 pimStateRefresh->setMetricPreference(stream.readNBitsToUint64Be(31));
392 pimStateRefresh->setMetric(stream.readUint32Be());
393 pimStateRefresh->setMaskLen(stream.readByte());
394 pimStateRefresh->setTtl(stream.readByte());
395 pimStateRefresh->setP(stream.readBit());
396 pimStateRefresh->setN(stream.readBit());
397 pimStateRefresh->setO(stream.readBit());
398 pimStateRefresh->setReserved2(stream.readNBitsToUint64Be(5));
399 pimStateRefresh->setInterval(stream.readByte());
401 return pimStateRefresh;
404 throw cRuntimeError(
"Cannot serialize PIM packet: type %d not supported.", pimPacket->getType());