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: Acknowledgement,
16 },
17 Forwarded {
19 packet_tag: PacketTag,
20 previous_hop: PeerId,
21 next_hop: PeerId,
22 data: Box<[u8]>,
23 ack: Acknowledgement,
24 },
25}
26
27impl TryFrom<TransportPacketWithChainData> for IncomingPacket {
28 type Error = ProtocolError;
29
30 fn try_from(value: TransportPacketWithChainData) -> std::result::Result<Self, ProtocolError> {
31 match value {
32 TransportPacketWithChainData::Final {
33 packet_tag,
34 previous_hop,
35 plain_text,
36 ack,
37 } => Ok(IncomingPacket::Final {
38 packet_tag,
39 previous_hop: previous_hop.into(),
40 plain_text,
41 ack,
42 }),
43 TransportPacketWithChainData::Forwarded {
44 packet_tag,
45 previous_hop,
46 next_hop,
47 data,
48 ack,
49 } => Ok(IncomingPacket::Forwarded {
50 packet_tag,
51 previous_hop: previous_hop.into(),
52 next_hop: next_hop.into(),
53 data,
54 ack,
55 }),
56 TransportPacketWithChainData::Outgoing { .. } => Err(ProtocolError::Logic(
57 "Outgoing packet received when processing incoming packets".to_string(),
58 )),
59 }
60 }
61}
62
63pub struct OutgoingPacket {
65 pub next_hop: PeerId,
66 pub ack_challenge: HalfKeyChallenge,
67 pub data: Box<[u8]>,
68}
69
70impl TryFrom<TransportPacketWithChainData> for OutgoingPacket {
71 type Error = ProtocolError;
72
73 fn try_from(value: TransportPacketWithChainData) -> std::result::Result<Self, Self::Error> {
74 match value {
75 TransportPacketWithChainData::Final { .. } | TransportPacketWithChainData::Forwarded { .. } => Err(
76 ProtocolError::Logic("Incoming packet received when processing outgoing packets".to_string()),
77 ),
78 TransportPacketWithChainData::Outgoing {
79 next_hop,
80 ack_challenge,
81 data,
82 } => Ok(OutgoingPacket {
83 next_hop: next_hop.into(),
84 ack_challenge,
85 data,
86 }),
87 }
88 }
89}
90
91pub enum TransportPacket {
92 Final {
94 packet_tag: PacketTag,
95 previous_hop: PeerId,
96 plain_text: Box<[u8]>,
97 ack: Acknowledgement,
98 },
99 Forwarded {
101 packet_tag: PacketTag,
102 previous_hop: PeerId,
103 next_hop: PeerId,
104 data: Box<[u8]>,
105 ack: Acknowledgement,
106 },
107 Outgoing {
109 next_hop: PeerId,
110 ack_challenge: HalfKeyChallenge,
111 data: Box<[u8]>,
112 },
113}
114
115impl From<IncomingPacket> for TransportPacket {
116 fn from(value: IncomingPacket) -> Self {
117 match value {
118 IncomingPacket::Final {
119 packet_tag,
120 previous_hop,
121 plain_text,
122 ack,
123 } => TransportPacket::Final {
124 packet_tag,
125 previous_hop,
126 plain_text,
127 ack,
128 },
129 IncomingPacket::Forwarded {
130 packet_tag,
131 previous_hop,
132 next_hop,
133 data,
134 ack,
135 } => TransportPacket::Forwarded {
136 packet_tag,
137 previous_hop,
138 next_hop,
139 data,
140 ack,
141 },
142 }
143 }
144}
145
146impl From<OutgoingPacket> for TransportPacket {
147 fn from(value: OutgoingPacket) -> Self {
148 TransportPacket::Outgoing {
149 next_hop: value.next_hop,
150 ack_challenge: value.ack_challenge,
151 data: value.data,
152 }
153 }
154}