@@ -635,64 +635,84 @@ impl Writeable for ChannelUpdateInfo {
635
635
( 2 , self . enabled, required) ,
636
636
( 4 , self . cltv_expiry_delta, required) ,
637
637
( 6 , self . htlc_minimum_msat, required) ,
638
- ( 8 , self . htlc_maximum_msat, required) ,
638
+ ( 8 , Some ( self . htlc_maximum_msat) , required) ,
639
639
( 10 , self . fees, required) ,
640
640
( 12 , self . last_update_message, required) ,
641
641
} ) ;
642
642
Ok ( ( ) )
643
643
}
644
-
645
- #[ inline]
646
- fn serialized_length ( & self ) -> usize {
647
- use util:: ser:: BigSize ;
648
- let len = {
649
- #[ allow( unused_mut) ]
650
- let mut len = :: util:: ser:: LengthCalculatingWriter ( 0 ) ;
651
- get_varint_length_prefixed_tlv_length ! ( len, 0 , self . last_update, required) ;
652
- get_varint_length_prefixed_tlv_length ! ( len, 2 , self . enabled, required) ;
653
- get_varint_length_prefixed_tlv_length ! ( len, 4 , self . cltv_expiry_delta, required) ;
654
- get_varint_length_prefixed_tlv_length ! ( len, 6 , self . htlc_minimum_msat, required) ;
655
- get_varint_length_prefixed_tlv_length ! ( len, 8 , self . htlc_maximum_msat, required) ;
656
- get_varint_length_prefixed_tlv_length ! ( len, 10 , self . fees, required) ;
657
- get_varint_length_prefixed_tlv_length ! ( len, 12 , self . last_update_message, required) ;
658
- len. 0
659
- } ;
660
- let mut len_calc = :: util:: ser:: LengthCalculatingWriter ( 0 ) ;
661
- BigSize ( len as u64 ) . write ( & mut len_calc) . expect ( "No in-memory data may fail to serialize" ) ;
662
- len + len_calc. 0
663
- }
664
-
665
644
}
666
645
667
646
impl MaybeReadable for ChannelUpdateInfo {
668
647
fn read < R : io:: Read > ( reader : & mut R ) -> Result < Option < Self > , DecodeError > {
669
- init_tlv_field_var ! ( last_update, required) ;
670
- init_tlv_field_var ! ( enabled, required) ;
671
- init_tlv_field_var ! ( cltv_expiry_delta, required) ;
672
- init_tlv_field_var ! ( htlc_minimum_msat, required) ;
673
- init_tlv_field_var ! ( htlc_maximum_msat, required) ;
674
- init_tlv_field_var ! ( fees, required) ;
675
- init_tlv_field_var ! ( last_update_message, required) ;
648
+ macro_rules! read_channel_update_tlv_fields {
649
+ ( $reader: expr, { $( ( $type: expr, $field: ident) ) ,* $( , ) * } ) => { {
650
+ let mut stream_ref = $reader;
651
+ $( {
652
+ if stream_ref. bytes_remain( ) {
653
+ let tlv_type_res: Result <:: util:: ser:: BigSize , DecodeError > = :: util:: ser:: Readable :: read( stream_ref) ;
654
+ $field = if let Ok ( ref tlv_type) = tlv_type_res {
655
+ println!( "GOT TYPE: {}" , tlv_type. 0 ) ;
656
+ assert_eq!( tlv_type. 0 , $type) ;
657
+
658
+ let tlv_len_res: Result <:: util:: ser:: BigSize , DecodeError > = :: util:: ser:: Readable :: read( & mut stream_ref) ;
659
+ if let Ok ( ref tlv_len) = tlv_len_res {
660
+ println!( "GOT LEN: {}" , tlv_len. 0 ) ;
661
+ let mut s = :: util:: ser:: FixedLengthReader :: new( & mut stream_ref, tlv_len. 0 ) ;
662
+ let tlv_value_res = :: util:: ser:: Readable :: read( & mut s) ;
663
+ let _ = s. eat_remaining( ) ;
664
+ tlv_value_res. ok( )
665
+ } else {
666
+ None
667
+ }
668
+ } else {
669
+ None
670
+ } ;
671
+ }
672
+ } ) *
673
+ } } ;
674
+ }
676
675
677
- read_tlv_fields ! ( reader, {
678
- ( 0 , last_update, required) ,
679
- ( 2 , enabled, required) ,
680
- ( 4 , cltv_expiry_delta, required) ,
681
- ( 6 , htlc_minimum_msat, required) ,
682
- ( 8 , htlc_maximum_msat, required) ,
683
- ( 10 , fees, required) ,
684
- ( 12 , last_update_message, required)
676
+ let outer_tlv_len: :: util:: ser:: BigSize = :: util:: ser:: Readable :: read ( reader) ?;
677
+ if outer_tlv_len. 0 == 0 {
678
+ return Ok ( None ) ;
679
+ }
680
+ let mut outer_fixed_reader = :: util:: ser:: FixedLengthReader :: new ( reader, outer_tlv_len. 0 ) ;
681
+
682
+
683
+ let mut last_update: Option < u32 > = None ;
684
+ let mut enabled: Option < bool > = None ;
685
+ let mut cltv_expiry_delta: Option < u16 > = None ;
686
+ let mut htlc_minimum_msat: Option < u64 > = None ;
687
+ let mut htlc_maximum_msat: Option < Option < u64 > > = None ;
688
+ let mut fees: Option < RoutingFees > = None ;
689
+ let mut last_update_message: Option < Option < ChannelUpdate > > = None ;
690
+
691
+ read_channel_update_tlv_fields ! ( & mut outer_fixed_reader, {
692
+ ( 0 , last_update) ,
693
+ ( 2 , enabled) ,
694
+ ( 4 , cltv_expiry_delta) ,
695
+ ( 6 , htlc_minimum_msat) ,
696
+ ( 8 , htlc_maximum_msat) ,
697
+ ( 10 , fees) ,
698
+ ( 12 , last_update_message) ,
685
699
} ) ;
686
-
687
- if let Some ( htlc_maximum_msat) = htlc_maximum_msat. 0 {
700
+ let decoding_success = last_update. is_some ( ) && enabled. is_some ( ) &&
701
+ cltv_expiry_delta. is_some ( ) && htlc_minimum_msat. is_some ( ) &&
702
+ htlc_maximum_msat. is_some ( ) && fees. is_some ( ) &&
703
+ last_update_message. is_some ( ) ;
704
+
705
+ outer_fixed_reader. eat_remaining ( ) ?;
706
+ if decoding_success {
707
+ println ! ( "DECODING SUCCESS" ) ;
688
708
Ok ( Some ( ChannelUpdateInfo {
689
- last_update : init_tlv_based_struct_field ! ( last_update, required ) ,
690
- enabled : init_tlv_based_struct_field ! ( enabled, required ) ,
691
- cltv_expiry_delta : init_tlv_based_struct_field ! ( cltv_expiry_delta, required ) ,
692
- htlc_minimum_msat : init_tlv_based_struct_field ! ( htlc_minimum_msat, required ) ,
693
- htlc_maximum_msat,
694
- fees : init_tlv_based_struct_field ! ( fees, required ) ,
695
- last_update_message : init_tlv_based_struct_field ! ( last_update_message, required ) ,
709
+ last_update : last_update. unwrap ( ) ,
710
+ enabled : enabled. unwrap ( ) ,
711
+ cltv_expiry_delta : cltv_expiry_delta. unwrap ( ) ,
712
+ htlc_minimum_msat : htlc_minimum_msat. unwrap ( ) ,
713
+ htlc_maximum_msat : htlc_maximum_msat . unwrap ( ) . unwrap ( ) ,
714
+ fees : fees. unwrap ( ) ,
715
+ last_update_message : last_update_message. unwrap ( ) ,
696
716
} ) )
697
717
} else {
698
718
Ok ( None )
@@ -791,28 +811,6 @@ impl Writeable for ChannelInfo {
791
811
} ) ;
792
812
Ok ( ( ) )
793
813
}
794
-
795
- #[ inline]
796
- fn serialized_length ( & self ) -> usize {
797
- use util:: ser:: BigSize ;
798
- let len = {
799
- #[ allow( unused_mut) ]
800
- let mut len = :: util:: ser:: LengthCalculatingWriter ( 0 ) ;
801
- get_varint_length_prefixed_tlv_length ! ( len, 0 , self . features, required) ;
802
- get_varint_length_prefixed_tlv_length ! ( len, 1 , self . announcement_received_time, ( default_value, 0 ) ) ;
803
- get_varint_length_prefixed_tlv_length ! ( len, 2 , self . node_one, required) ;
804
- get_varint_length_prefixed_tlv_length ! ( len, 4 , self . one_to_two, required) ;
805
- get_varint_length_prefixed_tlv_length ! ( len, 6 , self . node_two, required) ;
806
- get_varint_length_prefixed_tlv_length ! ( len, 8 , self . two_to_one, required) ;
807
- get_varint_length_prefixed_tlv_length ! ( len, 10 , self . capacity_sats, required) ;
808
- get_varint_length_prefixed_tlv_length ! ( len, 12 , self . announcement_message, required) ;
809
- len. 0
810
- } ;
811
- let mut len_calc = :: util:: ser:: LengthCalculatingWriter ( 0 ) ;
812
- BigSize ( len as u64 ) . write ( & mut len_calc) . expect ( "No in-memory data may fail to serialize" ) ;
813
- len + len_calc. 0
814
- }
815
-
816
814
}
817
815
818
816
impl Readable for ChannelInfo {
@@ -1799,7 +1797,7 @@ mod tests {
1799
1797
use chain;
1800
1798
use ln:: PaymentHash ;
1801
1799
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1802
- use routing:: gossip:: { P2PGossipSync , NetworkGraph , NetworkUpdate , NodeAlias , MAX_EXCESS_BYTES_FOR_RELAY } ;
1800
+ use routing:: gossip:: { P2PGossipSync , NetworkGraph , NetworkUpdate , NodeAlias , MAX_EXCESS_BYTES_FOR_RELAY , NodeId , RoutingFees , ChannelUpdateInfo , ChannelInfo } ;
1803
1801
use ln:: msgs:: { Init , RoutingMessageHandler , UnsignedNodeAnnouncement , NodeAnnouncement ,
1804
1802
UnsignedChannelAnnouncement , ChannelAnnouncement , UnsignedChannelUpdate , ChannelUpdate ,
1805
1803
ReplyChannelRange , QueryChannelRange , QueryShortChannelIds , MAX_VALUE_MSAT } ;
@@ -2925,6 +2923,71 @@ mod tests {
2925
2923
assert_eq ! ( format_bytes_alias( b"\xFF I <heart>\0 LDK!" ) , "\u{FFFD} I <heart>" ) ;
2926
2924
assert_eq ! ( format_bytes_alias( b"\xFF I <heart>\t LDK!" ) , "\u{FFFD} I <heart>\u{FFFD} LDK!" ) ;
2927
2925
}
2926
+
2927
+ #[ test]
2928
+ fn written_channel_info_is_readable ( ) {
2929
+ let chanmon_cfgs = :: ln:: functional_test_utils:: create_chanmon_cfgs ( 2 ) ;
2930
+ let node_cfgs = :: ln:: functional_test_utils:: create_node_cfgs ( 2 , & chanmon_cfgs) ;
2931
+ let node_chanmgrs = :: ln:: functional_test_utils:: create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None , None , None ] ) ;
2932
+ let nodes = :: ln:: functional_test_utils:: create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2933
+
2934
+ // First make sure we can encode/decode ChannelUpdateInfo.
2935
+ let chan_update_info = ChannelUpdateInfo {
2936
+ last_update : 23 ,
2937
+ enabled : true ,
2938
+ cltv_expiry_delta : 42 ,
2939
+ htlc_minimum_msat : 1234 ,
2940
+ htlc_maximum_msat : 5678 ,
2941
+ fees : RoutingFees { base_msat : 9 , proportional_millionths : 10 } ,
2942
+ last_update_message : None ,
2943
+ } ;
2944
+
2945
+ let mut buf: Vec < u8 > = Vec :: new ( ) ;
2946
+ assert ! ( chan_update_info. write( & mut buf) . is_ok( ) ) ;
2947
+
2948
+ let read_chan_update_info_result: Option < ChannelUpdateInfo > = :: util:: ser:: MaybeReadable :: read ( & mut buf. as_slice ( ) ) . unwrap ( ) ;
2949
+ if let Some ( read_chan_update_info) = read_chan_update_info_result {
2950
+ assert_eq ! ( chan_update_info, read_chan_update_info) ;
2951
+ } else {
2952
+ panic ! ( ) ;
2953
+ }
2954
+
2955
+ // Then check we can encode/decode ChannelInfo without ChannelUpdateInfo fields present.
2956
+ let chan_info_none_updates = ChannelInfo {
2957
+ features : ChannelFeatures :: known ( ) ,
2958
+ node_one : NodeId :: from_pubkey ( & nodes[ 0 ] . node . get_our_node_id ( ) ) ,
2959
+ one_to_two : None ,
2960
+ node_two : NodeId :: from_pubkey ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ,
2961
+ two_to_one : None ,
2962
+ capacity_sats : None ,
2963
+ announcement_message : None ,
2964
+ announcement_received_time : 87654 ,
2965
+ } ;
2966
+
2967
+ let mut buf: Vec < u8 > = Vec :: new ( ) ;
2968
+ assert ! ( chan_info_none_updates. write( & mut buf) . is_ok( ) ) ;
2969
+
2970
+ let read_chan_info: ChannelInfo = :: util:: ser:: Readable :: read ( & mut buf. as_slice ( ) ) . unwrap ( ) ;
2971
+ assert_eq ! ( chan_info_none_updates, read_chan_info) ;
2972
+
2973
+ // Finally check we can encode/decode ChannelInfo with ChannelUpdateInfo fields present.
2974
+ let chan_info_some_updates = ChannelInfo {
2975
+ features : ChannelFeatures :: known ( ) ,
2976
+ node_one : NodeId :: from_pubkey ( & nodes[ 0 ] . node . get_our_node_id ( ) ) ,
2977
+ one_to_two : Some ( chan_update_info. clone ( ) ) ,
2978
+ node_two : NodeId :: from_pubkey ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ,
2979
+ two_to_one : Some ( chan_update_info. clone ( ) ) ,
2980
+ capacity_sats : None ,
2981
+ announcement_message : None ,
2982
+ announcement_received_time : 87654 ,
2983
+ } ;
2984
+
2985
+ let mut buf: Vec < u8 > = Vec :: new ( ) ;
2986
+ assert ! ( chan_info_some_updates. write( & mut buf) . is_ok( ) ) ;
2987
+
2988
+ let read_chan_info: ChannelInfo = :: util:: ser:: Readable :: read ( & mut buf. as_slice ( ) ) . unwrap ( ) ;
2989
+ assert_eq ! ( chan_info_some_updates, read_chan_info) ;
2990
+ }
2928
2991
}
2929
2992
2930
2993
#[ cfg( all( test, feature = "_bench_unstable" ) ) ]
0 commit comments