Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions flow-filter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,16 @@ impl FlowFilter {
});
let log_str = format_packet_addrs_ports(&src_ip, &dst_ip, ports);

let Some(VpcdLookupResult::Single(dst_vpcd)) =
tablesr.lookup(src_vpcd, &src_ip, &dst_ip, ports)
else {
debug!("{nfi}: Flow not allowed, dropping packet: {log_str}");
packet.done(DoneReason::Filtered);
return;
};

debug!("{nfi}: Flow allowed: {log_str}, setting packet dst_vpcd to {dst_vpcd}");
packet.meta.dst_vpcd = Some(dst_vpcd);
match tablesr.lookup(src_vpcd, &src_ip, &dst_ip, ports) {
Some(VpcdLookupResult::Single(dst_vpcd) | VpcdLookupResult::Default(dst_vpcd)) => {
debug!("{nfi}: Flow allowed: {log_str}, setting packet dst_vpcd to {dst_vpcd}");
packet.meta.dst_vpcd = Some(dst_vpcd);
}
None => {
debug!("{nfi}: Flow not allowed, dropping packet: {log_str}");
packet.done(DoneReason::Filtered);
}
}
}
}

Expand Down Expand Up @@ -188,7 +188,7 @@ mod tests {
table
.insert(
src_vpcd,
VpcdLookupResult::Single(dst_vpcd),
dst_vpcd,
Prefix::from("10.0.0.0/24"),
OptionalPortRange::NoPortRangeMeansAllPorts,
Prefix::from("20.0.0.0/24"),
Expand Down Expand Up @@ -227,7 +227,7 @@ mod tests {
table
.insert(
src_vpcd,
VpcdLookupResult::Single(dst_vpcd),
dst_vpcd,
Prefix::from("10.0.0.0/24"),
OptionalPortRange::NoPortRangeMeansAllPorts,
Prefix::from("20.0.0.0/24"),
Expand Down Expand Up @@ -288,7 +288,7 @@ mod tests {
table
.insert(
src_vpcd,
VpcdLookupResult::Single(dst_vpcd),
dst_vpcd,
Prefix::from("10.0.0.0/24"),
OptionalPortRange::NoPortRangeMeansAllPorts,
Prefix::from("20.0.0.0/24"),
Expand Down Expand Up @@ -326,7 +326,7 @@ mod tests {
table
.insert(
src_vpcd,
VpcdLookupResult::Single(dst_vpcd),
dst_vpcd,
Prefix::from("2001:db8::/32"),
OptionalPortRange::NoPortRangeMeansAllPorts,
Prefix::from("2001:db9::/32"),
Expand Down Expand Up @@ -365,7 +365,7 @@ mod tests {
table
.insert(
src_vpcd,
VpcdLookupResult::Single(dst_vpcd),
dst_vpcd,
Prefix::from("10.0.0.0/24"),
OptionalPortRange::NoPortRangeMeansAllPorts,
Prefix::from("20.0.0.0/24"),
Expand Down
45 changes: 35 additions & 10 deletions flow-filter/src/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Copyright Open Network Fabric Authors

use crate::FlowFilterTable;
use crate::tables::VpcdLookupResult;
use config::ConfigError;
use config::external::overlay::Overlay;
use config::external::overlay::vpc::{Peering, Vpc};
Expand Down Expand Up @@ -42,20 +41,46 @@ impl FlowFilterTable {
.remote
.exposes
.iter()
.flat_map(|expose| expose.public_ips());

// For each local prefix, add one entry for each associated remote prefix
for local_prefix in local_prefixes {
for remote_prefix in remote_prefixes.clone() {
self.insert(
.flat_map(|expose| expose.public_ips())
.collect::<Vec<_>>();
// We support one default at most for now
let remote_has_default = peering.remote.exposes.iter().any(|expose| expose.default);

if remote_prefixes.is_empty() && !remote_has_default {
return Err(ConfigError::FailureApply(
"No remote prefixes found".to_string(),
));
} else if remote_prefixes.is_empty() && remote_has_default {
// Corner case: all prefixes go to the default remote. In this case we need to build
// entries for the source prefixes, so that we can validate that packets come from
// legitimate source prefixes, but we do not associate any destination (we'll fall back
// to the default destination)
for local_prefix in local_prefixes {
self.insert_default_only(
local_vpcd,
VpcdLookupResult::Single(dst_vpcd),
local_prefix.prefix(),
local_prefix.ports().into(),
remote_prefix.prefix(),
remote_prefix.ports().into(),
)?;
}
} else {
// remote_prefixes is not empty: for each local prefix, add one entry for each
// associated remote prefix
for local_prefix in local_prefixes {
for remote_prefix in &remote_prefixes {
self.insert(
local_vpcd,
dst_vpcd,
local_prefix.prefix(),
local_prefix.ports().into(),
remote_prefix.prefix(),
remote_prefix.ports().into(),
)?;
}
}
}

if remote_has_default {
self.add_default_remote(local_vpcd, dst_vpcd)?;
}
Ok(())
}
Expand Down
Loading
Loading