16dbb5987Sopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd.
26dbb5987Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
36dbb5987Sopenharmony_ci// you may not use this file except in compliance with the License.
46dbb5987Sopenharmony_ci// You may obtain a copy of the License at
56dbb5987Sopenharmony_ci//
66dbb5987Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
76dbb5987Sopenharmony_ci//
86dbb5987Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
96dbb5987Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
106dbb5987Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
116dbb5987Sopenharmony_ci// See the License for the specific language governing permissions and
126dbb5987Sopenharmony_ci// limitations under the License.
136dbb5987Sopenharmony_ci
146dbb5987Sopenharmony_ciuse crate::h3::parts::Parts;
156dbb5987Sopenharmony_ci
166dbb5987Sopenharmony_ci/// Data Frame type code.
176dbb5987Sopenharmony_cipub const DATA_FRAME_TYPE: u64 = 0x0;
186dbb5987Sopenharmony_ci/// HEADERS Frame type code.
196dbb5987Sopenharmony_cipub const HEADERS_FRAME_TYPE: u64 = 0x1;
206dbb5987Sopenharmony_ci/// CANCEL_PUSH Frame type code.
216dbb5987Sopenharmony_cipub const CANCEL_PUSH_FRAME_TYPE: u64 = 0x3;
226dbb5987Sopenharmony_ci/// SETTINGS Frame type code.
236dbb5987Sopenharmony_cipub const SETTINGS_FRAME_TYPE: u64 = 0x4;
246dbb5987Sopenharmony_ci/// PUSH_PROMISE Frame type code.
256dbb5987Sopenharmony_cipub const PUSH_PROMISE_FRAME_TYPE: u64 = 0x5;
266dbb5987Sopenharmony_ci/// GOAWAY Frame type code.
276dbb5987Sopenharmony_cipub const GOAWAY_FRAME_TYPE: u64 = 0x7;
286dbb5987Sopenharmony_ci/// MAX_PUSH_ID Frame type code.
296dbb5987Sopenharmony_cipub const MAX_PUSH_ID_FRAME_TYPE: u64 = 0xD;
306dbb5987Sopenharmony_ci/// SETTING_QPACK_MAX_TABLE_CAPACITY setting code.
316dbb5987Sopenharmony_cipub const SETTING_QPACK_MAX_TABLE_CAPACITY: u64 = 0x1;
326dbb5987Sopenharmony_ci/// SETTING_MAX_FIELD_SECTION_SIZE setting code.
336dbb5987Sopenharmony_cipub const SETTING_MAX_FIELD_SECTION_SIZE: u64 = 0x6;
346dbb5987Sopenharmony_ci/// SETTING_QPACK_BLOCKED_STREAMS setting code.
356dbb5987Sopenharmony_cipub const SETTING_QPACK_BLOCKED_STREAMS: u64 = 0x7;
366dbb5987Sopenharmony_ci/// SETTING_ENABLE_CONNECT_PROTOCOL setting code.
376dbb5987Sopenharmony_cipub const SETTING_ENABLE_CONNECT_PROTOCOL: u64 = 0x8;
386dbb5987Sopenharmony_ci/// SETTING_H3_DATAGRAM setting code.
396dbb5987Sopenharmony_cipub const SETTING_H3_DATAGRAM: u64 = 0x33;
406dbb5987Sopenharmony_ci/// MAX_SETTING_PAYLOAD_SIZE setting code.
416dbb5987Sopenharmony_ci// Permit between 16 maximally-encoded and 128 minimally-encoded SETTINGS.
426dbb5987Sopenharmony_ciconst MAX_SETTING_PAYLOAD_SIZE: usize = 256;
436dbb5987Sopenharmony_ci
446dbb5987Sopenharmony_ci/// Http3 frame definition.
456dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
466dbb5987Sopenharmony_cipub struct Frame {
476dbb5987Sopenharmony_ci    ty: u64,
486dbb5987Sopenharmony_ci    payload: Payload,
496dbb5987Sopenharmony_ci}
506dbb5987Sopenharmony_ci
516dbb5987Sopenharmony_ci/// Http3 frame payload.
526dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
536dbb5987Sopenharmony_cipub enum Payload {
546dbb5987Sopenharmony_ci    /// HEADERS frame payload.
556dbb5987Sopenharmony_ci    Headers(Headers),
566dbb5987Sopenharmony_ci    /// DATA frame payload.
576dbb5987Sopenharmony_ci    Data(Data),
586dbb5987Sopenharmony_ci    /// SETTINGS frame payload.
596dbb5987Sopenharmony_ci    Settings(Settings),
606dbb5987Sopenharmony_ci    /// CancelPush frame payload.
616dbb5987Sopenharmony_ci    CancelPush(CancelPush),
626dbb5987Sopenharmony_ci    /// PushPromise frame payload.
636dbb5987Sopenharmony_ci    PushPromise(PushPromise),
646dbb5987Sopenharmony_ci    /// GOAWAY frame payload.
656dbb5987Sopenharmony_ci    Goaway(GoAway),
666dbb5987Sopenharmony_ci    /// MaxPushId frame payload.
676dbb5987Sopenharmony_ci    MaxPushId(MaxPushId),
686dbb5987Sopenharmony_ci    /// Unknown frame payload.
696dbb5987Sopenharmony_ci    Unknown(Unknown),
706dbb5987Sopenharmony_ci}
716dbb5987Sopenharmony_ci
726dbb5987Sopenharmony_ci/// Http3 Headers frame payload, which also contains instructions to send when
736dbb5987Sopenharmony_ci/// decoding.
746dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
756dbb5987Sopenharmony_cipub struct Headers {
766dbb5987Sopenharmony_ci    parts: Parts,
776dbb5987Sopenharmony_ci    ins: Option<Vec<u8>>,
786dbb5987Sopenharmony_ci}
796dbb5987Sopenharmony_ci
806dbb5987Sopenharmony_ci/// Http3 Data frame payload, containing the body data.
816dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
826dbb5987Sopenharmony_cipub struct Data {
836dbb5987Sopenharmony_ci    data: Vec<u8>,
846dbb5987Sopenharmony_ci}
856dbb5987Sopenharmony_ci
866dbb5987Sopenharmony_ci/// Http3 Settings frame payload.
876dbb5987Sopenharmony_ci#[derive(Clone, Default, Debug)]
886dbb5987Sopenharmony_cipub struct Settings {
896dbb5987Sopenharmony_ci    max_field_section_size: Option<u64>,
906dbb5987Sopenharmony_ci    qpack_max_table_capacity: Option<u64>,
916dbb5987Sopenharmony_ci    qpack_blocked_streams: Option<u64>,
926dbb5987Sopenharmony_ci    connect_protocol_enabled: Option<u64>,
936dbb5987Sopenharmony_ci    h3_datagram: Option<u64>,
946dbb5987Sopenharmony_ci    additional: Option<Vec<(u64, u64)>>,
956dbb5987Sopenharmony_ci}
966dbb5987Sopenharmony_ci
976dbb5987Sopenharmony_ci/// Http3 CancelPush frame payload.
986dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
996dbb5987Sopenharmony_cipub struct CancelPush {
1006dbb5987Sopenharmony_ci    push_id: u64,
1016dbb5987Sopenharmony_ci}
1026dbb5987Sopenharmony_ci
1036dbb5987Sopenharmony_ci/// Http3 PushPromise frame payload.
1046dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
1056dbb5987Sopenharmony_cipub struct PushPromise {
1066dbb5987Sopenharmony_ci    push_id: u64,
1076dbb5987Sopenharmony_ci    parts: Parts,
1086dbb5987Sopenharmony_ci    ins: Option<Vec<u8>>,
1096dbb5987Sopenharmony_ci}
1106dbb5987Sopenharmony_ci
1116dbb5987Sopenharmony_ci/// Http3 GoAway frame payload.
1126dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
1136dbb5987Sopenharmony_cipub struct GoAway {
1146dbb5987Sopenharmony_ci    id: u64,
1156dbb5987Sopenharmony_ci}
1166dbb5987Sopenharmony_ci
1176dbb5987Sopenharmony_ci/// Http3 MaxPushId frame payload.
1186dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
1196dbb5987Sopenharmony_cipub struct MaxPushId {
1206dbb5987Sopenharmony_ci    push_id: u64,
1216dbb5987Sopenharmony_ci}
1226dbb5987Sopenharmony_ci
1236dbb5987Sopenharmony_ci/// Http3 Unknown frame payload.
1246dbb5987Sopenharmony_ci#[derive(Clone, Debug)]
1256dbb5987Sopenharmony_cipub struct Unknown {
1266dbb5987Sopenharmony_ci    raw_type: u64,
1276dbb5987Sopenharmony_ci    len: u64,
1286dbb5987Sopenharmony_ci}
1296dbb5987Sopenharmony_ci
1306dbb5987Sopenharmony_ciimpl Frame {
1316dbb5987Sopenharmony_ci    /// Constructs a Frame with type and payload.
1326dbb5987Sopenharmony_ci    pub fn new(ty: u64, payload: Payload) -> Self {
1336dbb5987Sopenharmony_ci        Frame { ty, payload }
1346dbb5987Sopenharmony_ci    }
1356dbb5987Sopenharmony_ci
1366dbb5987Sopenharmony_ci    /// Gets frame type.
1376dbb5987Sopenharmony_ci    pub fn frame_type(&self) -> &u64 {
1386dbb5987Sopenharmony_ci        &self.ty
1396dbb5987Sopenharmony_ci    }
1406dbb5987Sopenharmony_ci
1416dbb5987Sopenharmony_ci    /// Gets frame payload.
1426dbb5987Sopenharmony_ci    pub fn payload(&self) -> &Payload {
1436dbb5987Sopenharmony_ci        &self.payload
1446dbb5987Sopenharmony_ci    }
1456dbb5987Sopenharmony_ci
1466dbb5987Sopenharmony_ci    /// Gets a mutable frame payload of current frame.
1476dbb5987Sopenharmony_ci    pub(crate) fn payload_mut(&mut self) -> &mut Payload {
1486dbb5987Sopenharmony_ci        &mut self.payload
1496dbb5987Sopenharmony_ci    }
1506dbb5987Sopenharmony_ci}
1516dbb5987Sopenharmony_ci
1526dbb5987Sopenharmony_ciimpl Settings {
1536dbb5987Sopenharmony_ci    /// Sets SETTINGS_HEADER_TABLE_SIZE (0x01) setting.
1546dbb5987Sopenharmony_ci    pub fn set_max_field_section_size(&mut self, size: u64) {
1556dbb5987Sopenharmony_ci        self.max_field_section_size = Some(size)
1566dbb5987Sopenharmony_ci    }
1576dbb5987Sopenharmony_ci
1586dbb5987Sopenharmony_ci    /// Sets SETTINGS_ENABLE_PUSH (0x02) setting.
1596dbb5987Sopenharmony_ci    pub fn set_qpack_max_table_capacity(&mut self, size: u64) {
1606dbb5987Sopenharmony_ci        self.qpack_max_table_capacity = Some(size)
1616dbb5987Sopenharmony_ci    }
1626dbb5987Sopenharmony_ci
1636dbb5987Sopenharmony_ci    /// Sets SETTINGS_MAX_FRAME_SIZE (0x05) setting.
1646dbb5987Sopenharmony_ci    pub fn set_qpack_block_stream(&mut self, size: u64) {
1656dbb5987Sopenharmony_ci        self.qpack_blocked_streams = Some(size)
1666dbb5987Sopenharmony_ci    }
1676dbb5987Sopenharmony_ci
1686dbb5987Sopenharmony_ci    /// Sets SETTINGS_MAX_HEADER_LIST_SIZE (0x06) setting.
1696dbb5987Sopenharmony_ci    pub fn set_connect_protocol_enabled(&mut self, size: u64) {
1706dbb5987Sopenharmony_ci        self.connect_protocol_enabled = Some(size)
1716dbb5987Sopenharmony_ci    }
1726dbb5987Sopenharmony_ci
1736dbb5987Sopenharmony_ci    /// Sets SETTINGS_H3_DATAGRAM setting.
1746dbb5987Sopenharmony_ci    pub fn set_h3_datagram(&mut self, size: u64) {
1756dbb5987Sopenharmony_ci        self.h3_datagram = Some(size);
1766dbb5987Sopenharmony_ci    }
1776dbb5987Sopenharmony_ci
1786dbb5987Sopenharmony_ci    /// Sets additional settings.
1796dbb5987Sopenharmony_ci    pub fn set_additional(&mut self, addition: Vec<(u64, u64)>) {
1806dbb5987Sopenharmony_ci        self.additional = Some(addition)
1816dbb5987Sopenharmony_ci    }
1826dbb5987Sopenharmony_ci
1836dbb5987Sopenharmony_ci    /// Gets SETTINGS_MAX_FIELD_SECTION_SIZE setting.
1846dbb5987Sopenharmony_ci    pub fn max_fied_section_size(&self) -> Option<u64> {
1856dbb5987Sopenharmony_ci        self.max_field_section_size
1866dbb5987Sopenharmony_ci    }
1876dbb5987Sopenharmony_ci
1886dbb5987Sopenharmony_ci    /// Gets SETTINGS_QPACK_MAX_TABLE_CAPACITY setting.
1896dbb5987Sopenharmony_ci    pub fn qpack_max_table_capacity(&self) -> Option<u64> {
1906dbb5987Sopenharmony_ci        self.qpack_max_table_capacity
1916dbb5987Sopenharmony_ci    }
1926dbb5987Sopenharmony_ci
1936dbb5987Sopenharmony_ci    /// Gets SETTINGS_QPACK_BLOCKED_STREAMS setting.
1946dbb5987Sopenharmony_ci    pub fn qpack_block_stream(&self) -> Option<u64> {
1956dbb5987Sopenharmony_ci        self.qpack_blocked_streams
1966dbb5987Sopenharmony_ci    }
1976dbb5987Sopenharmony_ci
1986dbb5987Sopenharmony_ci    /// Gets SETTINGS_ENABLE_CONNECT_PROTOCOL setting.
1996dbb5987Sopenharmony_ci    pub fn connect_protocol_enabled(&self) -> Option<u64> {
2006dbb5987Sopenharmony_ci        self.connect_protocol_enabled
2016dbb5987Sopenharmony_ci    }
2026dbb5987Sopenharmony_ci
2036dbb5987Sopenharmony_ci    /// Gets SETTINGS_H3_DATAGRAM setting.
2046dbb5987Sopenharmony_ci    pub fn h3_datagram(&self) -> Option<u64> {
2056dbb5987Sopenharmony_ci        self.h3_datagram
2066dbb5987Sopenharmony_ci    }
2076dbb5987Sopenharmony_ci
2086dbb5987Sopenharmony_ci    /// Gets additional settings.
2096dbb5987Sopenharmony_ci    pub fn additional(&self) -> &Option<Vec<(u64, u64)>> {
2106dbb5987Sopenharmony_ci        &self.additional
2116dbb5987Sopenharmony_ci    }
2126dbb5987Sopenharmony_ci}
2136dbb5987Sopenharmony_ci
2146dbb5987Sopenharmony_ciimpl Data {
2156dbb5987Sopenharmony_ci    /// Creates a new Data instance containing the provided data.
2166dbb5987Sopenharmony_ci    pub fn new(data: Vec<u8>) -> Self {
2176dbb5987Sopenharmony_ci        Data { data }
2186dbb5987Sopenharmony_ci    }
2196dbb5987Sopenharmony_ci
2206dbb5987Sopenharmony_ci    /// Return the `Vec` that contains the data payload.
2216dbb5987Sopenharmony_ci    pub fn data(&self) -> &Vec<u8> {
2226dbb5987Sopenharmony_ci        &self.data
2236dbb5987Sopenharmony_ci    }
2246dbb5987Sopenharmony_ci}
2256dbb5987Sopenharmony_ci
2266dbb5987Sopenharmony_ciimpl CancelPush {
2276dbb5987Sopenharmony_ci    /// Creates a new CancelPush instance from the provided Parts.
2286dbb5987Sopenharmony_ci    pub fn new(id: u64) -> Self {
2296dbb5987Sopenharmony_ci        CancelPush { push_id: id }
2306dbb5987Sopenharmony_ci    }
2316dbb5987Sopenharmony_ci
2326dbb5987Sopenharmony_ci    /// Gets push id of CancelPush payload.
2336dbb5987Sopenharmony_ci    pub fn get_push_id(&self) -> &u64 {
2346dbb5987Sopenharmony_ci        &self.push_id
2356dbb5987Sopenharmony_ci    }
2366dbb5987Sopenharmony_ci}
2376dbb5987Sopenharmony_ci
2386dbb5987Sopenharmony_ciimpl Headers {
2396dbb5987Sopenharmony_ci    /// Creates a new Headers instance from the provided Parts.
2406dbb5987Sopenharmony_ci    pub fn new(parts: Parts) -> Self {
2416dbb5987Sopenharmony_ci        Headers { parts, ins: None }
2426dbb5987Sopenharmony_ci    }
2436dbb5987Sopenharmony_ci
2446dbb5987Sopenharmony_ci    /// Gets the instructions generated by qpack decoder after decoding headers
2456dbb5987Sopenharmony_ci    /// frame.
2466dbb5987Sopenharmony_ci    pub fn get_instruction(&self) -> &Option<Vec<u8>> {
2476dbb5987Sopenharmony_ci        &self.ins
2486dbb5987Sopenharmony_ci    }
2496dbb5987Sopenharmony_ci
2506dbb5987Sopenharmony_ci    /// Gets headers part of Headers frame payload.
2516dbb5987Sopenharmony_ci    pub fn get_part(&self) -> Parts {
2526dbb5987Sopenharmony_ci        self.parts.clone()
2536dbb5987Sopenharmony_ci    }
2546dbb5987Sopenharmony_ci
2556dbb5987Sopenharmony_ci    pub(crate) fn set_instruction(&mut self, buf: Vec<u8>) {
2566dbb5987Sopenharmony_ci        self.ins = Some(buf)
2576dbb5987Sopenharmony_ci    }
2586dbb5987Sopenharmony_ci}
2596dbb5987Sopenharmony_ci
2606dbb5987Sopenharmony_ciimpl PushPromise {
2616dbb5987Sopenharmony_ci    /// Creates a new PushPromise instance from the provided Parts.
2626dbb5987Sopenharmony_ci    pub fn new(push_id: u64, parts: Parts) -> Self {
2636dbb5987Sopenharmony_ci        PushPromise {
2646dbb5987Sopenharmony_ci            push_id,
2656dbb5987Sopenharmony_ci            parts,
2666dbb5987Sopenharmony_ci            ins: None,
2676dbb5987Sopenharmony_ci        }
2686dbb5987Sopenharmony_ci    }
2696dbb5987Sopenharmony_ci
2706dbb5987Sopenharmony_ci    /// Gets push id of PushPromise payload.
2716dbb5987Sopenharmony_ci    pub fn get_push_id(&self) -> u64 {
2726dbb5987Sopenharmony_ci        self.push_id
2736dbb5987Sopenharmony_ci    }
2746dbb5987Sopenharmony_ci
2756dbb5987Sopenharmony_ci    /// Returns a copy of the internal parts of the Headers.
2766dbb5987Sopenharmony_ci    pub(crate) fn get_parts(&self) -> &Parts {
2776dbb5987Sopenharmony_ci        &self.parts
2786dbb5987Sopenharmony_ci    }
2796dbb5987Sopenharmony_ci
2806dbb5987Sopenharmony_ci    pub(crate) fn set_instruction(&mut self, buf: Vec<u8>) {
2816dbb5987Sopenharmony_ci        self.ins = Some(buf)
2826dbb5987Sopenharmony_ci    }
2836dbb5987Sopenharmony_ci}
2846dbb5987Sopenharmony_ci
2856dbb5987Sopenharmony_ciimpl GoAway {
2866dbb5987Sopenharmony_ci    /// Creates a new GoAway instance from the provided Parts.
2876dbb5987Sopenharmony_ci    pub fn new(id: u64) -> Self {
2886dbb5987Sopenharmony_ci        GoAway { id }
2896dbb5987Sopenharmony_ci    }
2906dbb5987Sopenharmony_ci
2916dbb5987Sopenharmony_ci    /// Gets go away stream id.
2926dbb5987Sopenharmony_ci    pub fn get_id(&self) -> &u64 {
2936dbb5987Sopenharmony_ci        &self.id
2946dbb5987Sopenharmony_ci    }
2956dbb5987Sopenharmony_ci}
2966dbb5987Sopenharmony_ci
2976dbb5987Sopenharmony_ciimpl MaxPushId {
2986dbb5987Sopenharmony_ci    /// Creates a new MaxPushId instance from the provided Parts.
2996dbb5987Sopenharmony_ci    pub fn new(push_id: u64) -> Self {
3006dbb5987Sopenharmony_ci        MaxPushId { push_id }
3016dbb5987Sopenharmony_ci    }
3026dbb5987Sopenharmony_ci
3036dbb5987Sopenharmony_ci    /// Gets allowed max push stream id.
3046dbb5987Sopenharmony_ci    pub fn get_id(&self) -> &u64 {
3056dbb5987Sopenharmony_ci        &self.push_id
3066dbb5987Sopenharmony_ci    }
3076dbb5987Sopenharmony_ci}
308