hopr_transport_protocol/msg/
packet.rs1use 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 Final {
12 packet_tag: PacketTag,
13 previous_hop: PeerId,
14 plain_text: Box<[u8]>,
15 ack_key: HalfKey,
16 no_ack: bool,
17 },
18 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
66pub 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 Final {
97 packet_tag: PacketTag,
98 previous_hop: PeerId,
99 plain_text: Box<[u8]>,
100 ack_key: HalfKey,
101 no_ack: bool,
102 },
103 Forwarded {
105 packet_tag: PacketTag,
106 previous_hop: PeerId,
107 next_hop: PeerId,
108 data: Box<[u8]>,
109 ack: Acknowledgement,
110 },
111 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}