Skip to content

Commit 3e85de4

Browse files
committed
Intermediary step towards MaybeReadable updates.
1 parent 0df09a0 commit 3e85de4

File tree

1 file changed

+143
-20
lines changed

1 file changed

+143
-20
lines changed

lightning/src/routing/gossip.rs

+143-20
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHan
2828
use ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, GossipTimestampFilter};
2929
use ln::msgs::{QueryChannelRange, ReplyChannelRange, QueryShortChannelIds, ReplyShortChannelIdsEnd};
3030
use ln::msgs;
31-
use util::ser::{Readable, ReadableArgs, Writeable, Writer};
31+
use util::ser::{Readable, ReadableArgs, Writeable, Writer, MaybeReadable};
3232
use util::logger::{Logger, Level};
3333
use util::events::{Event, EventHandler, MessageSendEvent, MessageSendEventsProvider};
3434
use util::scid_utils::{block_from_scid, scid_from_parts, MAX_SCID_BLOCK};
@@ -628,15 +628,77 @@ impl fmt::Display for ChannelUpdateInfo {
628628
}
629629
}
630630

631-
impl_writeable_tlv_based!(ChannelUpdateInfo, {
632-
(0, last_update, required),
633-
(2, enabled, required),
634-
(4, cltv_expiry_delta, required),
635-
(6, htlc_minimum_msat, required),
636-
(8, htlc_maximum_msat, required),
637-
(10, fees, required),
638-
(12, last_update_message, required),
639-
});
631+
impl Writeable for ChannelUpdateInfo {
632+
fn write<W: ::util::ser::Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
633+
write_tlv_fields!(writer, {
634+
(0, self.last_update, required),
635+
(2, self.enabled, required),
636+
(4, self.cltv_expiry_delta, required),
637+
(6, self.htlc_minimum_msat, required),
638+
(8, self.htlc_maximum_msat, required),
639+
(10, self.fees, required),
640+
(12, self.last_update_message, required),
641+
});
642+
Ok(())
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+
}
666+
667+
impl MaybeReadable for ChannelUpdateInfo {
668+
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);
676+
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)
685+
});
686+
687+
if let Some(htlc_maximum_msat) = htlc_maximum_msat.0 {
688+
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),
696+
}))
697+
} else {
698+
Ok(None)
699+
}
700+
}
701+
}
640702

641703
#[derive(Clone, Debug, PartialEq)]
642704
/// Details about a channel (both directions).
@@ -715,16 +777,77 @@ impl fmt::Display for ChannelInfo {
715777
}
716778
}
717779

718-
impl_writeable_tlv_based!(ChannelInfo, {
719-
(0, features, required),
720-
(1, announcement_received_time, (default_value, 0)),
721-
(2, node_one, required),
722-
(4, one_to_two, required),
723-
(6, node_two, required),
724-
(8, two_to_one, required),
725-
(10, capacity_sats, required),
726-
(12, announcement_message, required),
727-
});
780+
impl Writeable for ChannelInfo {
781+
fn write<W: ::util::ser::Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
782+
write_tlv_fields!(writer, {
783+
(0, self.features, required),
784+
(1, self.announcement_received_time, (default_value, 0)),
785+
(2, self.node_one, required),
786+
(4, self.one_to_two, required),
787+
(6, self.node_two, required),
788+
(8, self.two_to_one, required),
789+
(10, self.capacity_sats, required),
790+
(12, self.announcement_message, required),
791+
});
792+
Ok(())
793+
}
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+
}
817+
818+
impl Readable for ChannelInfo {
819+
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
820+
init_tlv_field_var!(features, required);
821+
init_tlv_field_var!(announcement_received_time, (default_value, 0));
822+
init_tlv_field_var!(node_one, required);
823+
let mut one_to_two = None;
824+
init_tlv_field_var!(node_two, required);
825+
let mut two_to_one = None;
826+
init_tlv_field_var!(capacity_sats, required);
827+
init_tlv_field_var!(announcement_message, required);
828+
read_tlv_fields!(reader, {
829+
(0, features, required),
830+
(1, announcement_received_time, (default_value, 0)),
831+
(2, node_one, required),
832+
(4, one_to_two, ignorable),
833+
(6, node_two, required),
834+
(8, two_to_one, ignorable),
835+
(10, capacity_sats, required),
836+
(12, announcement_message, required),
837+
});
838+
839+
Ok(ChannelInfo {
840+
features: init_tlv_based_struct_field!(features, required),
841+
node_one: init_tlv_based_struct_field!(node_one, required),
842+
one_to_two,
843+
node_two: init_tlv_based_struct_field!(node_two, required),
844+
two_to_one,
845+
capacity_sats: init_tlv_based_struct_field!(capacity_sats, required),
846+
announcement_message: init_tlv_based_struct_field!(announcement_message, required),
847+
announcement_received_time: init_tlv_based_struct_field!(announcement_received_time, (default_value, 0)),
848+
})
849+
}
850+
}
728851

729852
/// A wrapper around [`ChannelInfo`] representing information about the channel as directed from a
730853
/// source node to a target node.

0 commit comments

Comments
 (0)