hopr_transport_protocol/msg/
packet.rs

1use hopr_db_api::protocol::TransportPacketWithChainData;
2use hopr_transport_identity::PeerId;
3
4use hopr_crypto_types::prelude::*;
5use hopr_internal_types::protocol::Acknowledgement;
6
7use crate::errors::ProtocolError;
8
9pub enum IncomingPacket {
10    /// Packet is intended for us
11    Final {
12        packet_tag: PacketTag,
13        previous_hop: PeerId,
14        plain_text: Box<[u8]>,
15        ack_key: HalfKey,
16        no_ack: bool,
17    },
18    /// Packet must be forwarded
19    Forwarded {
20        packet_tag: PacketTag,
21        previous_hop: PeerId,
22        next_hop: PeerId,
23        data: Box<[u8]>,
24        ack: Acknowledgement,
25    },
26}
27
28impl TryFrom<TransportPacketWithChainData> for IncomingPacket {
29    type Error = ProtocolError;
30
31    fn try_from(value: TransportPacketWithChainData) -> std::result::Result<Self, ProtocolError> {
32        match value {
33            TransportPacketWithChainData::Final {
34                packet_tag,
35                previous_hop,
36                plain_text,
37                ack_key,
38                no_ack,
39            } => Ok(IncomingPacket::Final {
40                packet_tag,
41                previous_hop: previous_hop.into(),
42                plain_text,
43                ack_key,
44                no_ack,
45            }),
46            TransportPacketWithChainData::Forwarded {
47                packet_tag,
48                previous_hop,
49                next_hop,
50                data,
51                ack,
52            } => Ok(IncomingPacket::Forwarded {
53                packet_tag,
54                previous_hop: previous_hop.into(),
55                next_hop: next_hop.into(),
56                data,
57                ack,
58            }),
59            TransportPacketWithChainData::Outgoing { .. } => Err(ProtocolError::Logic(
60                "Outgoing packet received when processing incoming packets".to_string(),
61            )),
62        }
63    }
64}
65
66/// Packet that is being sent out by us
67pub struct OutgoingPacket {
68    pub next_hop: PeerId,
69    pub ack_challenge: HalfKeyChallenge,
70    pub data: Box<[u8]>,
71}
72
73impl TryFrom<TransportPacketWithChainData> for OutgoingPacket {
74    type Error = ProtocolError;
75
76    fn try_from(value: TransportPacketWithChainData) -> std::result::Result<Self, Self::Error> {
77        match value {
78            TransportPacketWithChainData::Final { .. } | TransportPacketWithChainData::Forwarded { .. } => Err(
79                ProtocolError::Logic("Incoming packet received when processing outgoing packets".to_string()),
80            ),
81            TransportPacketWithChainData::Outgoing {
82                next_hop,
83                ack_challenge,
84                data,
85            } => Ok(OutgoingPacket {
86                next_hop: next_hop.into(),
87                ack_challenge,
88                data,
89            }),
90        }
91    }
92}
93
94pub enum TransportPacket {
95    /// Packet is intended for us
96    Final {
97        packet_tag: PacketTag,
98        previous_hop: PeerId,
99        plain_text: Box<[u8]>,
100        ack_key: HalfKey,
101        no_ack: bool,
102    },
103    /// Packet must be forwarded
104    Forwarded {
105        packet_tag: PacketTag,
106        previous_hop: PeerId,
107        next_hop: PeerId,
108        data: Box<[u8]>,
109        ack: Acknowledgement,
110    },
111    /// Packet that is being sent out by us
112    Outgoing {
113        next_hop: PeerId,
114        ack_challenge: HalfKeyChallenge,
115        data: Box<[u8]>,
116    },
117}
118
119impl From<IncomingPacket> for TransportPacket {
120    fn from(value: IncomingPacket) -> Self {
121        match value {
122            IncomingPacket::Final {
123                packet_tag,
124                previous_hop,
125                plain_text,
126                ack_key,
127                no_ack,
128            } => TransportPacket::Final {
129                packet_tag,
130                previous_hop,
131                plain_text,
132                ack_key,
133                no_ack,
134            },
135            IncomingPacket::Forwarded {
136                packet_tag,
137                previous_hop,
138                next_hop,
139                data,
140                ack,
141            } => TransportPacket::Forwarded {
142                packet_tag,
143                previous_hop,
144                next_hop,
145                data,
146                ack,
147            },
148        }
149    }
150}
151
152impl From<OutgoingPacket> for TransportPacket {
153    fn from(value: OutgoingPacket) -> Self {
154        TransportPacket::Outgoing {
155            next_hop: value.next_hop,
156            ack_challenge: value.ack_challenge,
157            data: value.data,
158        }
159    }
160}