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