Skip to content
263 changes: 220 additions & 43 deletions flow-filter/src/lib.rs

Large diffs are not rendered by default.

61 changes: 53 additions & 8 deletions flow-filter/src/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
// Copyright Open Network Fabric Authors

use crate::FlowFilterTable;
use crate::tables::{NatRequirement, RemoteData};
use config::ConfigError;
use config::external::overlay::Overlay;
use config::external::overlay::vpc::{Peering, Vpc};
use config::external::overlay::vpcpeering::{VpcExpose, VpcExposeNat};
use config::internal::interfaces::interface::InterfaceConfigTable;
use config::utils::{ConfigUtilError, collapse_prefixes_peering};
use net::packet::VpcDiscriminant;
Expand Down Expand Up @@ -40,15 +42,16 @@ impl FlowFilterTable {
for remote_expose in &peering.remote.exposes {
if remote_expose.default {
for local_expose in &peering.local.exposes {
let dst_data = build_dst_data(dst_vpcd, local_expose, remote_expose);
if local_expose.default {
// Both the local and remote expose are default exposes
self.insert_default_source_to_default_remote(local_vpcd, dst_vpcd)?;
self.insert_default_source_to_default_remote(local_vpcd, dst_data.clone())?;
} else {
// Only the remote expose is a default expose
for local_prefix in &local_expose.ips {
self.insert_default_remote(
local_vpcd,
dst_vpcd,
dst_data.clone(),
local_prefix.prefix(),
local_prefix.ports(),
)?;
Expand All @@ -57,12 +60,13 @@ impl FlowFilterTable {
}
} else {
for local_expose in &peering.local.exposes {
let dst_data = build_dst_data(dst_vpcd, local_expose, remote_expose);
if local_expose.default {
// Only the local expose is a default expose
for remote_prefix in remote_expose.public_ips() {
self.insert_default_source(
local_vpcd,
dst_vpcd,
dst_data.clone(),
remote_prefix.prefix(),
remote_prefix.ports(),
)?;
Expand All @@ -73,7 +77,7 @@ impl FlowFilterTable {
for remote_prefix in remote_expose.public_ips() {
self.insert(
local_vpcd,
dst_vpcd,
dst_data.clone(),
local_prefix.prefix(),
local_prefix.ports(),
remote_prefix.prefix(),
Expand Down Expand Up @@ -118,6 +122,33 @@ fn clone_skipping_peerings(vpc: &Vpc) -> Vpc {
}
}

fn build_dst_data(
dst_vpcd: VpcDiscriminant,
local_expose: &VpcExpose,
remote_expose: &VpcExpose,
) -> RemoteData {
RemoteData::new(
dst_vpcd,
get_nat_requirement(&local_expose.nat),
get_nat_requirement(&remote_expose.nat),
)
}

fn get_nat_requirement(nat: &Option<VpcExposeNat>) -> NatRequirement {
match nat {
Some(nat) => {
if nat.is_stateful() {
NatRequirement::StatefulNatRequired
} else if nat.is_stateless() {
NatRequirement::StatelessNatRequired
} else {
unreachable!("Unknown NAT mode")
}
}
None => NatRequirement::NoNat,
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down Expand Up @@ -168,8 +199,15 @@ mod tests {
let src_addr = "10.0.0.5".parse().unwrap();
let dst_addr = "20.0.0.5".parse().unwrap();

let dst_vpcd = table.lookup(src_vpcd, &src_addr, &dst_addr, None);
assert_eq!(dst_vpcd, Some(VpcDiscriminant::VNI(vni2)));
let dst_data = table.lookup(src_vpcd, &src_addr, &dst_addr, None);
assert_eq!(
dst_data,
Some(&RemoteData::new(
VpcDiscriminant::VNI(vni2),
NatRequirement::NoNat,
NatRequirement::NoNat,
))
);
}

#[test]
Expand Down Expand Up @@ -244,7 +282,14 @@ mod tests {
let src_addr = "10.0.0.5".parse().unwrap();
let dst_addr = "20.0.0.5".parse().unwrap();

let dst_vpcd = table.lookup(src_vpcd, &src_addr, &dst_addr, None);
assert_eq!(dst_vpcd, Some(VpcDiscriminant::VNI(vni2)));
let dst_data = table.lookup(src_vpcd, &src_addr, &dst_addr, None);
assert_eq!(
dst_data,
Some(&RemoteData::new(
VpcDiscriminant::VNI(vni2),
NatRequirement::NoNat,
NatRequirement::NoNat,
))
);
}
}
Loading
Loading