1 /*
2 * Copyright (c) 2021 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
16 #include "stream_packetizer.h"
17
18 #include "common_inner.h"
19 #include "securec.h"
20 #include "stream_common.h"
21 #include "stream_packet_header.h"
22
23 namespace Communication {
24 namespace SoftBus {
CalculateHeaderSize() const25 ssize_t StreamPacketizer::CalculateHeaderSize() const
26 {
27 auto total = StreamPacketHeader::STREAM_HEADER_SIZE;
28
29 return total;
30 }
31
CalculateExtSize(ssize_t extSize) const32 ssize_t StreamPacketizer::CalculateExtSize(ssize_t extSize) const
33 {
34 auto total = 0;
35
36 if (extSize > 0) {
37 total += TwoLevelsTlv::HEADER_LEN + TwoLevelsTlv::NUMS_LEN;
38 total += TwoLevelsTlv::HEADER_LEN + TwoLevelsTlv::NUMS_LEN;
39 total += Align(extSize, SHIFT);
40 total += TwoLevelsTlv::CHECK_SUM_LEN;
41 }
42
43 return total;
44 }
45
PacketizeStream()46 std::unique_ptr<char[]> StreamPacketizer::PacketizeStream()
47 {
48 dataSize_ = originData_->GetBufferLen();
49 hdrSize_ = CalculateHeaderSize();
50 extSize_ = CalculateExtSize(originData_->GetExtBufferLen());
51 auto data = std::make_unique<char[]>(hdrSize_ + extSize_ + dataSize_);
52
53 auto streamPktHeader = StreamPacketHeader(streamType_, extSize_ > 0, originData_->GetSeqNum(),
54 originData_->GetStreamId(), extSize_ + dataSize_);
55 streamPktHeader.Packetize(data.get(), hdrSize_, 0);
56
57 TwoLevelsTlv tlv(originData_->GetExtBuffer(), originData_->GetExtBufferLen());
58 if (tlv.Packetize(data.get(), extSize_, hdrSize_) != 0) {
59 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "packetize tlv failed");
60 return nullptr;
61 }
62
63 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
64 "streamPktHeader version = %d, subVersion = %d, extFlag = %d, streamType = %d, marker = %d, flag = %d, "
65 "streamId = %d (%x), timestamp = %u (%x), dataLen = %u (%x), seqNum = %d (%x), subSeqNum = %d (%x), "
66 "dataSize_ = %zd, extSize_ = %zd",
67 streamPktHeader.GetVersion(), streamPktHeader.GetSubVersion(), streamPktHeader.GetExtFlag(),
68 streamPktHeader.GetStreamType(), streamPktHeader.GetMarker(), streamPktHeader.GetFlag(),
69 streamPktHeader.GetStreamId(), streamPktHeader.GetStreamId(), streamPktHeader.GetTimestamp(),
70 streamPktHeader.GetTimestamp(), streamPktHeader.GetDataLen(), streamPktHeader.GetDataLen(),
71 streamPktHeader.GetSeqNum(), streamPktHeader.GetSeqNum(), streamPktHeader.GetSubSeqNum(),
72 streamPktHeader.GetSubSeqNum(), dataSize_, extSize_);
73
74 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_INFO,
75 "TLV version: %d, num = %d, extSize = %zd, extLen = %zd, checksum = %u",
76 tlv.GetVersion(), tlv.GetTlvNums(), extSize_, tlv.GetExtLen(), tlv.GetCheckSum());
77
78 auto ret = memcpy_s(data.get() + hdrSize_ + extSize_, dataSize_, originData_->GetBuffer().get(),
79 originData_->GetBufferLen());
80 if (ret != 0) {
81 SoftBusLog(SOFTBUS_LOG_TRAN, SOFTBUS_LOG_ERROR, "Failed to memcpy data!, ret:%d", ret);
82 }
83
84 return data;
85 }
86 } // namespace SoftBus
87 } // namespace Communication
88