X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=77d0fa4529fb2ea526682079229b81fa9165ddf6;hb=7527e4b7df674fc2f5442514bb7b1d2294e59ce8;hp=e8a3e6d26facd524c3ae3036ed87ec54a08b8937;hpb=a257906743d528c32c862b053b652d4b728aa990;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index e8a3e6d2..77d0fa45 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -157,6 +157,7 @@ mod sealed { // Byte 2 BasicMPP, ]); + define_context!(OfferContext, []); // This isn't a "real" feature context, and is only used in the channel_type field in an // `OpenChannel` message. define_context!(ChannelTypeContext, [ @@ -366,7 +367,7 @@ mod sealed { supports_keysend, requires_keysend); #[cfg(test)] - define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext, InvoiceContext], + define_feature!(123456789, UnknownFeature, [NodeContext, ChannelContext, InvoiceContext, OfferContext], "Feature flags for an unknown feature used in testing.", set_unknown_feature_optional, set_unknown_feature_required, supports_unknown_test_feature, requires_unknown_test_feature); } @@ -425,6 +426,8 @@ pub type NodeFeatures = Features; pub type ChannelFeatures = Features; /// Features used within an invoice. pub type InvoiceFeatures = Features; +/// Features used within an offer. +pub type OfferFeatures = Features; /// Features used within the channel_type field in an OpenChannel message. /// @@ -684,6 +687,15 @@ impl Features { } } +#[cfg(test)] +impl Features { + pub(crate) fn unknown() -> Self { + let mut features = Self::empty(); + features.set_unknown_feature_required(); + features + } +} + macro_rules! impl_feature_len_prefixed_write { ($features: ident) => { impl Writeable for $features { @@ -704,21 +716,26 @@ impl_feature_len_prefixed_write!(ChannelFeatures); impl_feature_len_prefixed_write!(NodeFeatures); impl_feature_len_prefixed_write!(InvoiceFeatures); -// Because ChannelTypeFeatures only appears inside of TLVs, it doesn't have a length prefix when -// serialized. Thus, we can't use `impl_feature_len_prefixed_write`, above, and have to write our -// own serialization. -impl Writeable for ChannelTypeFeatures { - fn write(&self, w: &mut W) -> Result<(), io::Error> { - self.write_be(w) - } -} -impl Readable for ChannelTypeFeatures { - fn read(r: &mut R) -> Result { - let v = io_extras::read_to_end(r)?; - Ok(Self::from_be_bytes(v)) +// Some features only appear inside of TLVs, so they don't have a length prefix when serialized. +macro_rules! impl_feature_tlv_write { + ($features: ident) => { + impl Writeable for $features { + fn write(&self, w: &mut W) -> Result<(), io::Error> { + self.write_be(w) + } + } + impl Readable for $features { + fn read(r: &mut R) -> Result { + let v = io_extras::read_to_end(r)?; + Ok(Self::from_be_bytes(v)) + } + } } } +impl_feature_tlv_write!(ChannelTypeFeatures); +impl_feature_tlv_write!(OfferFeatures); + #[cfg(test)] mod tests { use super::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, InvoiceFeatures, NodeFeatures, sealed};