1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef COMMUNICATION_NETSTACK_TLV_UTILS_H 16 #define COMMUNICATION_NETSTACK_TLV_UTILS_H 17 18 #include <cstdint> 19 #include <string> 20 21 #ifdef __cplusplus 22 extern "C" { 23 #endif 24 25 namespace OHOS::NetStack { 26 27 #define TLV_OK 0 28 #define TLV_ERR 1001 29 #define TLV_ERR_INVALID_PARA 1002 30 #define TLV_ERR_PARSE_PAYLOAD_ERR 1003 31 #define TLV_ERR_BUFF_NO_ENOUGH 1004 32 33 struct DfxMessage { 34 uint64_t requestBeginTime_ = 0; 35 uint64_t dnsEndTime_ = 0; 36 uint64_t tcpConnectEndTime_ = 0; 37 uint64_t tlsHandshakeEndTime_ = 0; 38 uint64_t firstSendTime_ = 0; 39 uint64_t firstRecvTime_ = 0; 40 uint64_t requestEndTime_ = 0; 41 std::string requestId_; 42 std::string requestUrl_; 43 std::string requestMethod_; 44 std::string requestHeader_; 45 uint32_t responseStatusCode_ = 0; 46 std::string responseHeader_; 47 std::string responseEffectiveUrl_; 48 std::string responseIpAddress_; 49 std::string responseHttpVersion_; 50 std::string responseReasonPhrase_; 51 std::string responseBody_; 52 }; 53 54 enum Type : int32_t { 55 INVALID = 0, 56 U64 = 1, 57 U32, 58 STRING, 59 }; 60 61 typedef struct TlvCommon { 62 uint32_t tag_; 63 uint32_t len_; 64 void *value_; 65 } TlvCommon; 66 67 class TlvUtils { 68 public: 69 static uint32_t Encode(DfxMessage &msg, void *data, uint32_t &dataSize); 70 static uint32_t Decode(DfxMessage &msg, void *data, uint32_t dataSize); 71 72 private: 73 static uint8_t *GetNextTlv(const uint8_t *buffer); 74 static uint8_t *ParseTlv(const uint8_t *buffer, TlvCommon *tlv, const uint8_t *boundary, uint32_t *retCode); 75 static uint8_t *AppendTlv(uint8_t *buffer, const TlvCommon *tlv, const uint8_t *boundary, uint32_t *retCode); 76 static uint32_t Serialize(const TlvCommon *tlv, uint32_t tlvCount, uint8_t *buff, uint32_t maxBuffSize, 77 uint32_t *buffSize); 78 static uint32_t Deserialize(const uint8_t *buff, uint32_t buffSize, TlvCommon *tlv, uint32_t maxTlvCount, 79 uint32_t *tlvCount); 80 static uint32_t GenerateTlv(DfxMessage &msg, TlvCommon *tlv, uint32_t *tlvCount); 81 static uint32_t Parse(DfxMessage &msg, TlvCommon *tlvs, uint32_t tlvCount); 82 }; 83 } 84 85 #ifdef __cplusplus 86 } 87 #endif 88 89 #endif //COMMUNICATION_NETSTACK_TLV_UTILS_H