diff options
Diffstat (limited to 'lib/flow_control')
-rw-r--r-- | lib/flow_control/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/flow_control/burst_type_filter_impl.cc | 103 | ||||
-rw-r--r-- | lib/flow_control/burst_type_filter_impl.h | 55 | ||||
-rw-r--r-- | lib/flow_control/uplink_downlink_splitter_impl.cc | 4 | ||||
-rw-r--r-- | lib/flow_control/uplink_downlink_splitter_impl.h | 4 |
5 files changed, 163 insertions, 4 deletions
diff --git a/lib/flow_control/CMakeLists.txt b/lib/flow_control/CMakeLists.txt index 30a5f50..b8f63f7 100644 --- a/lib/flow_control/CMakeLists.txt +++ b/lib/flow_control/CMakeLists.txt @@ -23,6 +23,7 @@ add_sources( burst_sdcch_subslot_splitter_impl.cc burst_timeslot_filter_impl.cc burst_timeslot_splitter_impl.cc + burst_type_filter_impl.cc dummy_burst_filter_impl.cc uplink_downlink_splitter_impl.cc ) diff --git a/lib/flow_control/burst_type_filter_impl.cc b/lib/flow_control/burst_type_filter_impl.cc new file mode 100644 index 0000000..c8bbd7e --- /dev/null +++ b/lib/flow_control/burst_type_filter_impl.cc @@ -0,0 +1,103 @@ +/* -*- c++ -*- */ +/* @file + * @author (C) 2017 by Piotr Krysik <ptrkrysik@gmail.com> + * @section LICENSE + * + * Gr-gsm is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * Gr-gsm is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gr-gsm; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "burst_type_filter_impl.h" +#include <stdio.h> +#include <grgsm/endian.h> +#include <grgsm/gsmtap.h> + + +namespace gr { + namespace gsm { + + burst_type_filter::sptr + burst_type_filter::make(const std::vector<uint8_t> & selected_burst_types) + { + return gnuradio::get_initial_sptr + (new burst_type_filter_impl(selected_burst_types)); + } + + /* + * The private constructor + */ + burst_type_filter_impl::burst_type_filter_impl(const std::vector<uint8_t> & selected_burst_types) + : gr::block("burst_type_filter", + gr::io_signature::make(0, 0, 0), + gr::io_signature::make(0, 0, 0)), + d_filter_policy(FILTER_POLICY_DEFAULT) + { + set_selected_burst_types(selected_burst_types); + + message_port_register_in(pmt::mp("bursts_in")); + message_port_register_out(pmt::mp("bursts_out")); + + set_msg_handler(pmt::mp("bursts_in"), boost::bind(&burst_type_filter_impl::process_burst, this, _1)); + } + + /* + * Our virtual destructor. + */ + burst_type_filter_impl::~burst_type_filter_impl() {} + + void burst_type_filter_impl::process_burst(pmt::pmt_t msg) + { + if (d_filter_policy == FILTER_POLICY_DROP_ALL) + return; + + if (d_filter_policy == FILTER_POLICY_PASS_ALL) { + message_port_pub(pmt::mp("bursts_out"), msg); + return; + } + + gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(pmt::cdr(msg)); + if (std::find(d_selected_burst_types.begin(), d_selected_burst_types.end(), header->sub_type) != d_selected_burst_types.end()) //check if burst type is listed in burst types to pass + { + message_port_pub(pmt::mp("bursts_out"), msg); + } + } + + /* Filtering policy */ + filter_policy + burst_type_filter_impl::get_policy(void) + { + return d_filter_policy; + } + + filter_policy + burst_type_filter_impl::set_policy(filter_policy policy) + { + d_filter_policy = policy; + return d_filter_policy; + } + + void + burst_type_filter_impl::set_selected_burst_types(const std::vector<uint8_t> & selected_burst_types) + { + d_selected_burst_types.assign(selected_burst_types.begin(), selected_burst_types.end()); + } + } /* namespace gsm */ +} /* namespace gr */ diff --git a/lib/flow_control/burst_type_filter_impl.h b/lib/flow_control/burst_type_filter_impl.h new file mode 100644 index 0000000..5c6ad14 --- /dev/null +++ b/lib/flow_control/burst_type_filter_impl.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- */ +/* @file + * @author (C) 2017 by Piotr Krysik <ptrkrysik@gmail.com> + * @section LICENSE + * + * Gr-gsm is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * Gr-gsm is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gr-gsm; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + * + */ + +#ifndef INCLUDED_GSM_BURST_TYPE_FILTER_IMPL_H +#define INCLUDED_GSM_BURST_TYPE_FILTER_IMPL_H + +#define BURST_TYPE_LEN 148 + +#include <grgsm/flow_control/burst_type_filter.h> + +namespace gr { + namespace gsm { + + class burst_type_filter_impl : public burst_type_filter + { + private: + filter_policy d_filter_policy; + std::vector<uint8_t> d_selected_burst_types; + public: + burst_type_filter_impl(const std::vector<uint8_t> & selected_burst_types); + ~burst_type_filter_impl(); + void process_burst(pmt::pmt_t msg); + + /* External API */ + /* Filtering policy */ + filter_policy get_policy(void); + filter_policy set_policy(filter_policy policy); + + void set_selected_burst_types(const std::vector<uint8_t> & selected_burst_types); + }; + + } // namespace gsm +} // namespace gr + +#endif /* INCLUDED_GSM_BURST_TYPE_FILTER_IMPL_H */ + diff --git a/lib/flow_control/uplink_downlink_splitter_impl.cc b/lib/flow_control/uplink_downlink_splitter_impl.cc index 691feb3..de5ae30 100644 --- a/lib/flow_control/uplink_downlink_splitter_impl.cc +++ b/lib/flow_control/uplink_downlink_splitter_impl.cc @@ -30,7 +30,7 @@ #include <grgsm/endian.h> #define BURST_SIZE 148 namespace gr { - namespace grgsm { + namespace gsm { uplink_downlink_splitter::sptr uplink_downlink_splitter::make() @@ -71,6 +71,6 @@ namespace gr { uplink_downlink_splitter_impl::~uplink_downlink_splitter_impl() { } - } /* namespace grgsm */ + } /* namespace gsm */ } /* namespace gr */ diff --git a/lib/flow_control/uplink_downlink_splitter_impl.h b/lib/flow_control/uplink_downlink_splitter_impl.h index fb8b2b8..5edfe5a 100644 --- a/lib/flow_control/uplink_downlink_splitter_impl.h +++ b/lib/flow_control/uplink_downlink_splitter_impl.h @@ -26,7 +26,7 @@ #include <grgsm/flow_control/uplink_downlink_splitter.h> namespace gr { - namespace grgsm { + namespace gsm { class uplink_downlink_splitter_impl : public uplink_downlink_splitter { @@ -36,7 +36,7 @@ namespace gr { void process_msg(pmt::pmt_t msg); }; - } // namespace grgsm + } // namespace gsm } // namespace gr #endif /* INCLUDED_GRGSM_UPLINK_DOWNLINK_SPLITTER_IMPL_H */ |