///|
/// 低四位按接收规则忽略;原始编码仍保存在 raw_attributes 中。
fn validate_attribute_flags(
flags : Int,
code : Int,
position : Int,
) -> Unit raise ParseError {
let optional = (flags & 128) != 0
let transitive = (flags & 64) != 0
let partial = (flags & 32) != 0
if partial && (!optional || !transitive) {
raise Invalid(
position, "Partial 标志仅适用于 optional transitive 属性",
)
}
let expected = match code {
1 | 2 | 3 | 5 | 6 => Some(64)
4 | 14 | 15 => Some(128)
7 | 8 | 17 | 18 | 32 => Some(192)
_ => None
}
match expected {
Some(value) =>
if (flags & 192) != value {
raise Invalid(position, "BGP 属性 Optional/Transitive 标志错误")
}
None =>
if !optional {
raise Invalid(position, "未知 well-known BGP 属性")
}
}
}