1use crate::enums::{ContentType, HandshakeType};
2use crate::error::Error;
3use crate::log::warn;
4use crate::msgs::message::MessagePayload;
5
6macro_rules! require_handshake_msg(
11 ( $m:expr, $handshake_type:path, $payload_type:path ) => (
12 match &$m.payload {
13 MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload(
14 $payload_type(hm),
15 ), .. } => Ok(hm),
16 payload => Err($crate::check::inappropriate_handshake_message(
17 payload,
18 &[$crate::ContentType::Handshake],
19 &[$handshake_type]))
20 }
21 )
22);
23
24macro_rules! require_handshake_msg_move(
26 ( $m:expr, $handshake_type:path, $payload_type:path ) => (
27 match $m.payload {
28 MessagePayload::Handshake { parsed: $crate::msgs::handshake::HandshakeMessagePayload(
29 $payload_type(hm),
30 ), .. } => Ok(hm),
31 payload =>
32 Err($crate::check::inappropriate_handshake_message(
33 &payload,
34 &[$crate::ContentType::Handshake],
35 &[$handshake_type]))
36 }
37 )
38);
39
40pub(crate) fn inappropriate_message(
41 payload: &MessagePayload<'_>,
42 content_types: &[ContentType],
43) -> Error {
44 warn!(
45 "Received a {:?} message while expecting {:?}",
46 payload.content_type(),
47 content_types
48 );
49 Error::InappropriateMessage {
50 expect_types: content_types.to_vec(),
51 got_type: payload.content_type(),
52 }
53}
54
55pub(crate) fn inappropriate_handshake_message(
56 payload: &MessagePayload<'_>,
57 content_types: &[ContentType],
58 handshake_types: &[HandshakeType],
59) -> Error {
60 match payload {
61 MessagePayload::Handshake { parsed, .. } => {
62 let got_type = parsed.0.handshake_type();
63 warn!(
64 "Received a {:?} handshake message while expecting {:?}",
65 got_type, handshake_types
66 );
67 Error::InappropriateHandshakeMessage {
68 expect_types: handshake_types.to_vec(),
69 got_type,
70 }
71 }
72 payload => inappropriate_message(payload, content_types),
73 }
74}