| // Copyright (C) 2021, Cloudflare, Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright notice, |
| // this list of conditions and the following disclaimer. |
| // |
| // * Redistributions in binary form must reproduce the above copyright |
| // notice, this list of conditions and the following disclaimer in the |
| // documentation and/or other materials provided with the distribution. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| use serde::Deserialize; |
| use serde::Serialize; |
| |
| use crate::events::ApplicationErrorCode; |
| use crate::events::Bytes; |
| use crate::events::ConnectionErrorCode; |
| use crate::events::PathEndpointInfo; |
| |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| #[serde(rename_all = "snake_case")] |
| pub enum TransportOwner { |
| Local, |
| Remote, |
| } |
| |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| #[serde(rename_all = "snake_case")] |
| pub enum ConnectionState { |
| Attempted, |
| PeerValidated, |
| HandshakeStarted, |
| EarlyWrite, |
| HandshakeCompleted, |
| HandshakeConfirmed, |
| Closing, |
| Draining, |
| Closed, |
| } |
| |
| #[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] |
| #[serde(rename_all = "snake_case")] |
| pub enum ConnectivityEventType { |
| ServerListening, |
| ConnectionStarted, |
| ConnectionClosed, |
| ConnectionIdUpdated, |
| SpinBitUpdated, |
| ConnectionStateUpdated, |
| PathAssigned, |
| MtuUpdated, |
| } |
| |
| #[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] |
| #[serde(rename_all = "snake_case")] |
| pub enum ConnectionClosedTrigger { |
| Clean, |
| HandshakeTimeout, |
| IdleTimeout, |
| Error, |
| StatelessReset, |
| VersionMismatch, |
| Application, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct ServerListening { |
| pub ip_v4: Option<String>, // human-readable or bytes |
| pub ip_v6: Option<String>, // human-readable or bytes |
| pub port_v4: Option<u16>, |
| pub port_v6: Option<u16>, |
| |
| retry_required: Option<bool>, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct ConnectionStarted { |
| pub ip_version: Option<String>, // "v4" or "v6" |
| pub src_ip: String, // human-readable or bytes |
| pub dst_ip: String, // human-readable or bytes |
| |
| pub protocol: Option<String>, |
| pub src_port: Option<u16>, |
| pub dst_port: Option<u16>, |
| |
| pub src_cid: Option<Bytes>, |
| pub dst_cid: Option<Bytes>, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct ConnectionClosed { |
| pub owner: Option<TransportOwner>, |
| |
| pub connection_code: Option<ConnectionErrorCode>, |
| pub application_code: Option<ApplicationErrorCode>, |
| pub internal_code: Option<u32>, |
| |
| pub reason: Option<String>, |
| |
| pub trigger: Option<ConnectionClosedTrigger>, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct ConnectionIdUpdated { |
| pub owner: Option<TransportOwner>, |
| |
| pub old: Option<Bytes>, |
| pub new: Option<Bytes>, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct SpinBitUpdated { |
| pub state: bool, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct ConnectionStateUpdated { |
| pub old: Option<ConnectionState>, |
| pub new: ConnectionState, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct PathAssigned { |
| pub path_id: String, |
| pub path_remote: Option<PathEndpointInfo>, |
| pub path_local: Option<PathEndpointInfo>, |
| } |
| |
| #[serde_with::skip_serializing_none] |
| #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] |
| pub struct MtuUpdated { |
| pub old: Option<u32>, |
| pub new: u32, |
| pub done: Option<bool>, |
| } |