@@ -286,7 +286,7 @@ func NewWriteBroadcastDistributionTable(opts ...func(*WriteBroadcastDistribution
286286 return b , nil
287287}
288288
289- func WithWriteBroadcastDistributionTable (bdt ... * Address ) func (* WriteBroadcastDistributionTable ) {
289+ func WithWriteBroadcastDistributionTableBDT (bdt ... * Address ) func (* WriteBroadcastDistributionTable ) {
290290 return func (b * WriteBroadcastDistributionTable ) {
291291 b .bvlciBDT = bdt
292292 }
@@ -417,27 +417,101 @@ func (w *ReadBroadcastDistributionTable) String() string {
417417 return fmt .Sprintf ("ReadBroadcastDistributionTable{%v}" , w ._BVLPDU )
418418}
419419
420- // TODO: finish
421420type ReadBroadcastDistributionTableAck struct {
422421 * _BVLPDU
422+ bvlciBDT []* Address
423423}
424424
425425var _ BVLPDU = (* ReadBroadcastDistributionTableAck )(nil )
426426
427- func NewReadBroadcastDistributionTableAck () ( BVLPDU , error ) {
427+ func NewReadBroadcastDistributionTableAck (opts ... func ( * ReadBroadcastDistributionTableAck )) ( * ReadBroadcastDistributionTableAck , error ) {
428428 b := & ReadBroadcastDistributionTableAck {}
429- b ._BVLPDU = NewBVLPDU (nil ).(* _BVLPDU )
429+ for _ , opt := range opts {
430+ opt (b )
431+ }
432+ b ._BVLPDU = NewBVLPDU (readWriteModel .NewBVLCReadBroadcastDistributionTableAck (b .produceBroadcastDistributionTable (), 0 )).(* _BVLPDU )
430433 return b , nil
431434}
432435
433- func (b * ReadBroadcastDistributionTableAck ) Encode (pdu Arg ) error {
434- // TODO: finish
435- return nil
436+ func WithReadBroadcastDistributionTableAckBDT (bdt ... * Address ) func (* ReadBroadcastDistributionTableAck ) {
437+ return func (b * ReadBroadcastDistributionTableAck ) {
438+ b .bvlciBDT = bdt
439+ }
436440}
437441
438- func (b * ReadBroadcastDistributionTableAck ) Decode (pdu Arg ) error {
439- // TODO: finish
440- return nil
442+ func (w * ReadBroadcastDistributionTableAck ) GetBvlciBDT () []* Address {
443+ return w .bvlciBDT
444+ }
445+
446+ func (w * ReadBroadcastDistributionTableAck ) produceBroadcastDistributionTable () (entries []readWriteModel.BVLCBroadcastDistributionTableEntry ) {
447+ for _ , address := range w .bvlciBDT {
448+ addr := address .AddrAddress [:4 ]
449+ port := uint16 (47808 )
450+ if address .AddrPort != nil {
451+ port = * address .AddrPort
452+ }
453+ mask := make ([]byte , 4 )
454+ if address .AddrMask != nil {
455+ binary .BigEndian .PutUint32 (mask , * address .AddrMask )
456+ }
457+ entries = append (entries , readWriteModel .NewBVLCBroadcastDistributionTableEntry (addr , port , mask ))
458+ }
459+ return
460+ }
461+
462+ func (w * ReadBroadcastDistributionTableAck ) produceBvlciBDT (entries []readWriteModel.BVLCBroadcastDistributionTableEntry ) (bvlciBDT []* Address ) {
463+ for _ , entry := range entries {
464+ addr := entry .GetIp ()
465+ port := entry .GetPort ()
466+ var portArray = make ([]byte , 2 )
467+ binary .BigEndian .PutUint16 (portArray , port )
468+ address , _ := NewAddress (zerolog .Nop (), append (addr , portArray ... ))
469+ mask := binary .BigEndian .Uint32 (entry .GetBroadcastDistributionMap ())
470+ address .AddrMask = & mask
471+ bvlciBDT = append (bvlciBDT , address )
472+ }
473+ return
474+ }
475+
476+ func (w * ReadBroadcastDistributionTableAck ) Encode (bvlpdu Arg ) error {
477+ switch bvlpdu := bvlpdu .(type ) {
478+ case BVLPDU :
479+ if err := bvlpdu .Update (w ); err != nil {
480+ return errors .Wrap (err , "error updating BVLPDU" )
481+ }
482+ for _ , bdte := range w .bvlciBDT {
483+ bvlpdu .PutData (bdte .AddrAddress ... )
484+ bvlpdu .PutLong (* bdte .AddrMask )
485+ }
486+ bvlpdu .setBVLC (w .bvlc )
487+ return nil
488+ default :
489+ return errors .Errorf ("invalid BVLPDU type %T" , bvlpdu )
490+ }
491+ }
492+
493+ func (w * ReadBroadcastDistributionTableAck ) Decode (bvlpdu Arg ) error {
494+ switch bvlpdu := bvlpdu .(type ) {
495+ case BVLPDU :
496+ if err := w .Update (bvlpdu ); err != nil {
497+ return errors .Wrap (err , "error updating BVLPDU" )
498+ }
499+ switch pduUserData := bvlpdu .GetPDUUserData ().(type ) {
500+ case readWriteModel.BVLCReadBroadcastDistributionTableAckExactly :
501+ switch bvlc := pduUserData .(type ) {
502+ case readWriteModel.BVLCReadBroadcastDistributionTableAck :
503+ w .setBVLC (bvlc )
504+ w .bvlciBDT = w .produceBvlciBDT (bvlc .GetTable ())
505+ }
506+ }
507+ return nil
508+ default :
509+ return errors .Errorf ("invalid BVLPDU type %T" , bvlpdu )
510+ }
511+ }
512+
513+ func (w * ReadBroadcastDistributionTableAck ) String () string {
514+ return fmt .Sprintf ("ReadBroadcastDistributionTableAck{%v, bvlciBDT: %v}" , w ._BVLPDU , w .bvlciBDT )
441515}
442516
443517// TODO: finish
0 commit comments