Skip to content

Commit

Permalink
move packet parser implementation from header to cpp files
Browse files Browse the repository at this point in the history
  • Loading branch information
marenz2569 committed Jul 2, 2024
1 parent 43d618a commit 3c2e385
Show file tree
Hide file tree
Showing 13 changed files with 432 additions and 333 deletions.
40 changes: 24 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@ option(NIX_BUILD "Is CMake called by a nix build?" OFF)

add_executable(tetra-decoder
src/main.cpp
src/decoder.cpp
src/bit_stream_decoder.cpp
src/iq_stream_decoder.cpp
src/prometheus.cpp
src/l2/access_assignment_channel.cpp
src/l2/broadcast_synchronization_channel.cpp
src/l2/lower_mac.cpp
src/l2/slot.cpp
src/l2/timebase_counter.cpp
src/l2/upper_mac.cpp
src/l2/upper_mac_packet.cpp
src/l2/upper_mac_packet_builder.cpp
src/l2/upper_mac_packet_formatter.cpp
src/utils/address.cpp
src/utils/bit_vector.cpp
src/utils/viter_bi_codec.cpp)
src/decoder.cpp
src/bit_stream_decoder.cpp
src/iq_stream_decoder.cpp
src/prometheus.cpp
src/l2/access_assignment_channel.cpp
src/l2/broadcast_synchronization_channel.cpp
src/l2/logical_link_control_formatter.cpp
src/l2/logical_link_control_packet.cpp
src/l2/lower_mac.cpp
src/l2/slot.cpp
src/l2/timebase_counter.cpp
src/l2/upper_mac.cpp
src/l2/upper_mac_packet.cpp
src/l2/upper_mac_packet_builder.cpp
src/l2/upper_mac_packet_formatter.cpp
src/l3/circuit_mode_control_entity_formatter.cpp
src/l3/circuit_mode_control_entity_packet.cpp
src/l3/mobile_link_entity_formatter.cpp
src/l3/mobile_link_entity_packet.cpp
src/l3/short_data_service_formatter.cpp
src/l3/short_data_service_packet.cpp
src/utils/address.cpp
src/utils/bit_vector.cpp
src/utils/viter_bi_codec.cpp)

add_executable(tetra-puncturing
src/examples/tetra_puncturing.cpp)
Expand Down
79 changes: 4 additions & 75 deletions include/l2/logical_link_control_packet.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@

#include "l2/upper_mac_packet.hpp"
#include "utils/bit_vector.hpp"
#include <bitset>
#include <optional>
#include <stdexcept>

/// The type of the basic link packet.
enum class BasicLinkType {
Expand Down Expand Up @@ -56,63 +54,10 @@ struct BasicLinkInformation {
BasicLinkInformation() = delete;

/// construct a BasicLinkInformation from a BitVector
explicit BasicLinkInformation(BitVector& data) {
auto pdu_type = data.take<4>();

switch (pdu_type) {
case 0b0000:
n_r_ = data.take<1>();
n_s_ = data.take<1>();
break;
case 0b0001:
n_s_ = data.take<1>();
break;
case 0b0010:
break;
case 0b0011:
n_r_ = data.take<1>();
break;
case 0b0100:
n_r_ = data.take<1>();
n_s_ = data.take<1>();
break;
case 0b0101:
n_s_ = data.take<1>();
break;
case 0b0110:
break;
case 0b0111:
n_r_ = data.take<1>();
break;
default:
throw std::runtime_error(
"Did not expect something other than basic link in LogicalLinkControlPacket parser!");
}

basic_link_type_ = BasicLinkType(pdu_type);

if (pdu_type >= 0b0100) {
auto fcs = data.take_last<32>();
auto computed_fcs = data.compute_fcs();
fcs_good_ = fcs == computed_fcs;
}
}
explicit BasicLinkInformation(BitVector& data);
};

inline auto operator<<(std::ostream& stream, const BasicLinkInformation& bli) -> std::ostream& {
stream << " Basic Link Information: " << to_string(bli.basic_link_type_);
if (bli.n_r_) {
stream << " N(R): " << std::bitset<1>(*bli.n_r_);
}
if (bli.n_s_) {
stream << " N(S): " << std::bitset<1>(*bli.n_s_);
}
if (bli.fcs_good_) {
stream << " FCS good: " << (*bli.fcs_good_ ? "true" : "false");
}
stream << std::endl;
return stream;
}
auto operator<<(std::ostream& stream, const BasicLinkInformation& bli) -> std::ostream&;

/// The packet that is parsed in the logical link control layer. Currently we only implement basic link.
struct LogicalLinkControlPacket : public UpperMacCPlaneSignallingPacket {
Expand All @@ -121,23 +66,7 @@ struct LogicalLinkControlPacket : public UpperMacCPlaneSignallingPacket {

LogicalLinkControlPacket() = delete;

explicit LogicalLinkControlPacket(const UpperMacCPlaneSignallingPacket& packet)
: UpperMacCPlaneSignallingPacket(packet) {
auto data = BitVector(*tm_sdu_);
auto pdu_type = data.look<4>(0);

/// We only implemented packet parsing for Basic Link PDUs at this point in time
if (pdu_type <= 0b1000) {
basic_link_information_ = BasicLinkInformation(data);
tl_sdu_ = data;
}
}
explicit LogicalLinkControlPacket(const UpperMacCPlaneSignallingPacket& packet);
};

inline auto operator<<(std::ostream& stream, const LogicalLinkControlPacket& llc) -> std::ostream& {
if (llc.basic_link_information_) {
stream << *llc.basic_link_information_;
}
stream << " TL-SDU: " << llc.tl_sdu_ << std::endl;
return stream;
}
auto operator<<(std::ostream& stream, const LogicalLinkControlPacket& llc) -> std::ostream&;
114 changes: 8 additions & 106 deletions include/l3/circuit_mode_control_entity_packet.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,90 +239,16 @@ struct SdsData {
/// TODO: The "External subscriber number" and "DM-MS address" is not parsed!
BitVector unparsed_;

public:
static auto from_d_sds_data(BitVector& data) -> SdsData {
SdsData sds;
auto calling_party_type_identifier = data.take<2>();

if (calling_party_type_identifier == 1 || calling_party_type_identifier == 2) {
sds.address_.set_ssi(data.take<24>());
}
if (calling_party_type_identifier == 2) {
sds.address_.set_country_code(data.take<10>());
sds.address_.set_network_code(data.take<14>());
}

auto short_data_type_identifier = data.take<2>();

unsigned length_identifier = 0;
switch (short_data_type_identifier) {
case 0b00:
length_identifier = 16;
break;
case 0b01:
length_identifier = 32;
break;
case 0b10:
length_identifier = 64;
break;
case 0b11:
length_identifier = data.take<11>();
break;
}
sds.data_ = data.take_vector(length_identifier);
sds.unparsed_ = data.take_vector(data.bits_left());
private:
SdsData() = default;

return sds;
};

static auto from_u_sds_data(BitVector& data) -> SdsData {
SdsData sds;
sds.area_selection_ = data.take<4>();
auto calling_party_type_identifier = data.take<2>();

if (calling_party_type_identifier == 0) {
sds.address_.set_sna(data.take<8>());
}
if (calling_party_type_identifier == 1 || calling_party_type_identifier == 2) {
sds.address_.set_ssi(data.take<24>());
}
if (calling_party_type_identifier == 2) {
sds.address_.set_country_code(data.take<10>());
sds.address_.set_network_code(data.take<14>());
}

auto short_data_type_identifier = data.take<2>();
unsigned length_identifier = 0;
switch (short_data_type_identifier) {
case 0b00:
length_identifier = 16;
break;
case 0b01:
length_identifier = 32;
break;
case 0b10:
length_identifier = 64;
break;
case 0b11:
length_identifier = data.take<11>();
break;
}
sds.data_ = data.take_vector(length_identifier);
sds.unparsed_ = data.take_vector(data.bits_left());
public:
static auto from_d_sds_data(BitVector& data) -> SdsData;

return sds;
};
static auto from_u_sds_data(BitVector& data) -> SdsData;
};

inline auto operator<<(std::ostream& stream, const SdsData& sds) -> std::ostream& {
if (sds.area_selection_) {
stream << " Area Selction: " << std::bitset<4>(*sds.area_selection_) << std::endl;
}
stream << " SDS Address: " << sds.address_ << std::endl;
stream << " Data: " << sds.data_ << std::endl;
stream << " Unparsed: " << sds.unparsed_ << std::endl;
return stream;
};
auto operator<<(std::ostream& stream, const SdsData& sds) -> std::ostream&;

struct CircuitModeControlEntityPacket : public MobileLinkEntityPacket {
CircuitModeControlEntityPacketType packet_type_;
Expand All @@ -331,31 +257,7 @@ struct CircuitModeControlEntityPacket : public MobileLinkEntityPacket {

CircuitModeControlEntityPacket() = delete;

explicit CircuitModeControlEntityPacket(const MobileLinkEntityPacket& packet)
: MobileLinkEntityPacket(packet) {
auto data = BitVector(sdu_);

auto pdu_type = data.take<5>();
if (is_downlink()) {
packet_type_ = CircuitModeControlEntityDownlinkPacketType(pdu_type);
} else {
packet_type_ = CircuitModeControlEntityUplinkPacketType(pdu_type);
}

if (packet_type_ == CircuitModeControlEntityPacketType(CircuitModeControlEntityDownlinkPacketType::kDSdsData)) {
sds_data_ = SdsData::from_d_sds_data(data);
}

if (packet_type_ == CircuitModeControlEntityPacketType(CircuitModeControlEntityUplinkPacketType::kUSdsData)) {
sds_data_ = SdsData::from_u_sds_data(data);
}
}
explicit CircuitModeControlEntityPacket(const MobileLinkEntityPacket& packet);
};

inline auto operator<<(std::ostream& stream, const CircuitModeControlEntityPacket& cmce) -> std::ostream& {
stream << " CMCE: " << to_string(cmce.packet_type_) << std::endl;
if (cmce.sds_data_) {
stream << *cmce.sds_data_;
}
return stream;
};
auto operator<<(std::ostream& stream, const CircuitModeControlEntityPacket& cmce) -> std::ostream&;
16 changes: 2 additions & 14 deletions include/l3/mobile_link_entity_packet.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,7 @@ struct MobileLinkEntityPacket : public LogicalLinkControlPacket {

MobileLinkEntityPacket() = delete;

explicit MobileLinkEntityPacket(const LogicalLinkControlPacket& packet)
: LogicalLinkControlPacket(packet) {
sdu_ = BitVector(tl_sdu_);

auto discriminator = sdu_.take<3>();
mle_protocol_ = MobileLinkEntityProtocolDiscriminator(discriminator);

// TODO: add the special handling for the MLE protocol
};
explicit MobileLinkEntityPacket(const LogicalLinkControlPacket& packet);
};

inline auto operator<<(std::ostream& stream, const MobileLinkEntityPacket& mle) -> std::ostream& {
stream << " MLE: " << to_string(mle.mle_protocol_) << std::endl;
stream << " SDU: " << mle.sdu_ << std::endl;
return stream;
}
auto operator<<(std::ostream& stream, const MobileLinkEntityPacket& mle) -> std::ostream&;
Loading

0 comments on commit 3c2e385

Please sign in to comment.