diff --git a/Cargo.lock b/Cargo.lock
index c1304bff3b985361e6b3eea67f8a90367928f7e7..28f8dd19711eb1db9ead461d53f207f347c34c51 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -376,9 +376,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -386,9 +386,9 @@ dependencies = [
 
 [[package]]
 name = "core-foundation-sys"
-version = "0.8.4"
+version = "0.8.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
 
 [[package]]
 name = "crc"
@@ -631,7 +631,7 @@ dependencies = [
 [[package]]
 name = "ham-cats"
 version = "0.1.0"
-source = "git+https://gitlab.scd31.com/cats/ham-cats#cccc04c1c96ebe64681a59d9c2a7c66e00418067"
+source = "git+https://gitlab.scd31.com/cats/ham-cats#25ed83d5eb68cd54f438f487c37f9059cd464e87"
 dependencies = [
  "arrayvec",
  "bitvec",
@@ -867,9 +867,9 @@ checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
 
 [[package]]
 name = "linux-raw-sys"
-version = "0.4.11"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
+checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
 
 [[package]]
 name = "log"
@@ -1266,15 +1266,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
 
 [[package]]
 name = "rustix"
-version = "0.38.25"
+version = "0.38.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e"
+checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a"
 dependencies = [
  "bitflags 2.4.1",
  "errno",
  "libc",
  "linux-raw-sys",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
diff --git a/src/gate.rs b/src/gate.rs
index 2334635a78f1c6aebec117d6c0ef90135afcaa77..1731132f1f5b776c686c7549aeb383fe0fff45aa 100644
--- a/src/gate.rs
+++ b/src/gate.rs
@@ -109,11 +109,11 @@ pub async fn packet_handler(
     ssid: u8,
     tx: broadcast::Sender<SemiPacketIn>,
     packet_send: mpsc::Sender<Vec<u8>>,
-    mut packet_receive: mpsc::Receiver<Vec<u8>>,
+    mut packet_receive: mpsc::Receiver<(Vec<u8>, f64)>,
     uuid: Uuid,
 ) -> anyhow::Result<()> {
     loop {
-        let packet = packet_receive
+        let (packet, rssi) = packet_receive
             .recv()
             .await
             .context("Packet receive channel died")?;
@@ -122,7 +122,7 @@ pub async fn packet_handler(
         if let Ok(mut packet) = attempt_decode(&packet, &mut buf) {
             let mut buf2 = [0; MAX_PACKET_LEN];
             let mut internet_packet = packet.clone_backing(&mut buf2);
-            match append_internet_to_packet_route(&callsign, ssid, &mut internet_packet) {
+            match append_internet_to_packet_route(&callsign, ssid, rssi, &mut internet_packet) {
                 Some(()) => match internet_packet.semi_encode() {
                     Ok(encoded) => {
                         let semi = SemiPacketIn {
@@ -146,7 +146,7 @@ pub async fn packet_handler(
 
             match packet.should_digipeat(&callsign, ssid) {
                 Ok(()) => {
-                    if let Err(e) = packet.append_to_route(&callsign, ssid) {
+                    if let Err(e) = packet.append_to_route(&callsign, ssid, Some(rssi)) {
                         eprintln!(
                             "Could not add routing to packet before digipeating: {e}. Skipping"
                         );
diff --git a/src/main.rs b/src/main.rs
index 1bf053d1744eda5a3048d9cd48defca88576b221..77343ba8be93ada3d4c0de0a6c335cdfb5dbdf59 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -105,7 +105,7 @@ async fn gate_forever(
     config: &Config,
     mut radio: RadioManager,
     packet_send: mpsc::Sender<Vec<u8>>,
-    packet_receive: mpsc::Receiver<Vec<u8>>,
+    packet_receive: mpsc::Receiver<(Vec<u8>, f64)>,
 ) -> anyhow::Result<()> {
     let uuid = Uuid::new_v4();
 
diff --git a/src/radio.rs b/src/radio.rs
index c60cdd9fd39b7ad34778b5eb51bceb2c141fe8e0..0d4d9e53b4ceddfc1b1775f206901ca221779522 100644
--- a/src/radio.rs
+++ b/src/radio.rs
@@ -14,13 +14,13 @@ pub const MAX_PACKET_LEN: usize = 8191;
 pub struct RadioManager {
     radio: Rf4463<Spi, OutputPin, OutputPin, Delay>,
 
-    tx: Sender<Vec<u8>>,
+    tx: Sender<(Vec<u8>, f64)>,
     rx: Receiver<Vec<u8>>,
     rx_buf: [u8; MAX_PACKET_LEN],
 }
 
 impl RadioManager {
-    pub fn new(tx: Sender<Vec<u8>>, rx: Receiver<Vec<u8>>) -> anyhow::Result<Self> {
+    pub fn new(tx: Sender<(Vec<u8>, f64)>, rx: Receiver<Vec<u8>>) -> anyhow::Result<Self> {
         let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 1_000_000, Mode::Mode0)?;
         let gpio = Gpio::new()?;
         let sdn = gpio.get(22)?.into_output();
@@ -87,7 +87,7 @@ impl RadioManager {
                 .map_err(|e| anyhow!("{e}"))?;
 
             self.tx
-                .send(data.data().to_vec())
+                .send((data.data().to_vec(), data.rssi()))
                 .await
                 .ok()
                 .context("TX channel died")?;
diff --git a/src/util.rs b/src/util.rs
index a8273c9e10ba0f4b0dbfd18f6afdf12da70f619b..832b092e037cc38df4ebe4356ce36d5e6724da63 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -3,7 +3,7 @@ use anyhow::anyhow;
 use colored::{Color, Colorize};
 use ham_cats::{
     packet::Packet,
-    whisker::{Route, RouteNode},
+    whisker::{Route, RouteIdentity, RouteNode},
 };
 
 pub fn print_packet(pkt: &Packet<MAX_PACKET_LEN>, is_rf: bool) {
@@ -31,8 +31,10 @@ pub fn print_packet(pkt: &Packet<MAX_PACKET_LEN>, is_rf: bool) {
             .iter()
             .map(|rn| match rn {
                 ham_cats::whisker::RouteNode::Internet => "[NET]".to_string(),
-                ham_cats::whisker::RouteNode::Identity(rc, rs, is_future) => {
-                    let s = if is_future { "*" } else { "" };
+                ham_cats::whisker::RouteNode::Identity(ident) => {
+                    let s = if ident.is_future() { "*" } else { "" };
+                    let rc = ident.callsign();
+                    let rs = ident.ssid();
                     format!("{rc}-{rs}{s}")
                 }
             })
@@ -86,40 +88,41 @@ pub fn attempt_decode<'a>(
 pub fn append_internet_to_packet_route(
     callsign: &str,
     ssid: u8,
+    rssi: f64,
     packet: &mut Packet<MAX_PACKET_LEN>,
 ) -> Option<()> {
     let mut route = packet.route().unwrap_or(Route::new(0));
 
     let first_future = route.iter().find_map(|rn| match rn {
-        RouteNode::Identity(rc, rs, is_future) if is_future => Some((rc, rs)),
+        RouteNode::Identity(ident) if ident.is_future() => Some((ident.callsign(), ident.ssid())),
         _ => None,
     });
 
     if let Some((rc, rs)) = first_future {
         if rc == callsign && rs == ssid {
             // we can just do the normal thing
-            route.append_node(callsign, ssid).ok()?;
+            route.append_node(callsign, ssid, Some(rssi)).ok()?;
         } else {
             // rip off all the futures and add ourselves
             let mut new_route = Route::new(route.max_hops);
             for r in route.iter() {
                 match r {
                     RouteNode::Internet => new_route.push_internet()?,
-                    RouteNode::Identity(rc, rs, is_future) => {
-                        if is_future {
+                    RouteNode::Identity(ident) => {
+                        if ident.is_future() {
                             break;
                         }
 
-                        new_route.push_callsign(rc, rs, false);
+                        new_route.push_callsign(ident);
                     }
                 }
             }
 
             route = new_route;
-            route.push_callsign(callsign, ssid, false);
+            route.push_callsign(RouteIdentity::new(callsign, ssid, Some(rssi), false));
         }
     } else {
-        route.append_node(callsign, ssid).ok()?;
+        route.append_node(callsign, ssid, Some(rssi)).ok()?;
     }
 
     route.push_internet()?;