diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2017-07-21 10:59:51 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2017-07-22 12:43:16 +0700 |
commit | 04536ab41ca48051dfcc895279769424a1131c5e (patch) | |
tree | 947d20fe5b9b87c003b30d63604e8d6bc7cbe9ef /lib | |
parent | 6ee2c165d94bbe0f34f827dbecb3190d47ba649a (diff) |
flow_control: implement pass / drop filtering policies
This change introduces a set of three modes for flow control
filters, one of which is default behavor and two extra modes
else described below:
- FILTER_POLICY_PASS_ALL
- FILTER_POLICY_DROP_ALL
Both modes are opposite, and make a filter either unconditionally
pass or drop all the data one gets to the input. They would be
usable for some external usage.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/flow_control/burst_fnr_filter_impl.cc | 25 | ||||
-rw-r--r-- | lib/flow_control/burst_fnr_filter_impl.h | 5 | ||||
-rw-r--r-- | lib/flow_control/burst_sdcch_subslot_filter_impl.cc | 25 | ||||
-rw-r--r-- | lib/flow_control/burst_sdcch_subslot_filter_impl.h | 5 | ||||
-rw-r--r-- | lib/flow_control/burst_timeslot_filter_impl.cc | 25 | ||||
-rw-r--r-- | lib/flow_control/burst_timeslot_filter_impl.h | 5 | ||||
-rw-r--r-- | lib/flow_control/dummy_burst_filter_impl.cc | 25 | ||||
-rw-r--r-- | lib/flow_control/dummy_burst_filter_impl.h | 6 |
8 files changed, 117 insertions, 4 deletions
diff --git a/lib/flow_control/burst_fnr_filter_impl.cc b/lib/flow_control/burst_fnr_filter_impl.cc index 940dcdf..5d1ffbc 100644 --- a/lib/flow_control/burst_fnr_filter_impl.cc +++ b/lib/flow_control/burst_fnr_filter_impl.cc @@ -49,7 +49,8 @@ namespace gr { gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), d_mode(mode), - d_framenr(fnr) + d_framenr(fnr), + d_filter_policy(FILTER_POLICY_DEFAULT) { message_port_register_in(pmt::mp("in")); message_port_register_out(pmt::mp("out")); @@ -64,6 +65,14 @@ namespace gr { void burst_fnr_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("out"), msg); + return; + } + pmt::pmt_t header_plus_burst = pmt::cdr(msg); gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst); @@ -106,5 +115,19 @@ namespace gr { return d_mode; } + /* Filtering policy */ + filter_policy + burst_fnr_filter_impl::get_policy(void) + { + return d_filter_policy; + } + + filter_policy + burst_fnr_filter_impl::set_policy(filter_policy policy) + { + d_filter_policy = policy; + return d_filter_policy; + } + } /* namespace gsm */ } /* namespace gr */ diff --git a/lib/flow_control/burst_fnr_filter_impl.h b/lib/flow_control/burst_fnr_filter_impl.h index b113679..9d13825 100644 --- a/lib/flow_control/burst_fnr_filter_impl.h +++ b/lib/flow_control/burst_fnr_filter_impl.h @@ -34,6 +34,7 @@ namespace gr { class burst_fnr_filter_impl : public burst_fnr_filter { private: + filter_policy d_filter_policy; unsigned int d_framenr; filter_mode d_mode; public: @@ -47,6 +48,10 @@ namespace gr { filter_mode get_mode(void); filter_mode set_mode(filter_mode mode); + + /* Filtering policy */ + filter_policy get_policy(void); + filter_policy set_policy(filter_policy policy); }; } // namespace gsm diff --git a/lib/flow_control/burst_sdcch_subslot_filter_impl.cc b/lib/flow_control/burst_sdcch_subslot_filter_impl.cc index 76bf9cd..80e7c89 100644 --- a/lib/flow_control/burst_sdcch_subslot_filter_impl.cc +++ b/lib/flow_control/burst_sdcch_subslot_filter_impl.cc @@ -48,7 +48,8 @@ namespace gr { gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), d_mode(mode), - d_subslot(subslot) + d_subslot(subslot), + d_filter_policy(FILTER_POLICY_DEFAULT) { message_port_register_in(pmt::mp("in")); message_port_register_out(pmt::mp("out")); @@ -73,6 +74,14 @@ namespace gr { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,-1,-1,-1 }; + + if (d_filter_policy == FILTER_POLICY_DROP_ALL) + return; + + if (d_filter_policy == FILTER_POLICY_PASS_ALL) { + message_port_pub(pmt::mp("out"), msg); + return; + } pmt::pmt_t header_plus_burst = pmt::cdr(msg); gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst); @@ -133,5 +142,19 @@ namespace gr { return d_mode; } + /* Filtering policy */ + filter_policy + burst_sdcch_subslot_filter_impl::get_policy(void) + { + return d_filter_policy; + } + + filter_policy + burst_sdcch_subslot_filter_impl::set_policy(filter_policy policy) + { + d_filter_policy = policy; + return d_filter_policy; + } + } /* namespace gsm */ } /* namespace gr */ diff --git a/lib/flow_control/burst_sdcch_subslot_filter_impl.h b/lib/flow_control/burst_sdcch_subslot_filter_impl.h index 9068140..85a392f 100644 --- a/lib/flow_control/burst_sdcch_subslot_filter_impl.h +++ b/lib/flow_control/burst_sdcch_subslot_filter_impl.h @@ -31,6 +31,7 @@ namespace gr { class burst_sdcch_subslot_filter_impl : public burst_sdcch_subslot_filter { private: + filter_policy d_filter_policy; subslot_filter_mode d_mode; unsigned int d_subslot; public: @@ -44,6 +45,10 @@ namespace gr { subslot_filter_mode get_mode(void); subslot_filter_mode set_mode(subslot_filter_mode mode); + + /* Filtering policy */ + filter_policy get_policy(void); + filter_policy set_policy(filter_policy policy); }; } // namespace gsm diff --git a/lib/flow_control/burst_timeslot_filter_impl.cc b/lib/flow_control/burst_timeslot_filter_impl.cc index 20306d1..c93bc60 100644 --- a/lib/flow_control/burst_timeslot_filter_impl.cc +++ b/lib/flow_control/burst_timeslot_filter_impl.cc @@ -48,7 +48,8 @@ namespace gr { : gr::block("burst_timeslot_filter", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), - d_timeslot(timeslot) + d_timeslot(timeslot), + d_filter_policy(FILTER_POLICY_DEFAULT) { message_port_register_in(pmt::mp("in")); message_port_register_out(pmt::mp("out")); @@ -63,6 +64,14 @@ namespace gr { void burst_timeslot_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("out"), msg); + return; + } + pmt::pmt_t header_plus_burst = pmt::cdr(msg); gsmtap_hdr * header = (gsmtap_hdr *)pmt::blob_data(header_plus_burst); @@ -92,5 +101,19 @@ namespace gr { return d_timeslot; } + /* Filtering policy */ + filter_policy + burst_timeslot_filter_impl::get_policy(void) + { + return d_filter_policy; + } + + filter_policy + burst_timeslot_filter_impl::set_policy(filter_policy policy) + { + d_filter_policy = policy; + return d_filter_policy; + } + } /* namespace gsm */ } /* namespace gr */ diff --git a/lib/flow_control/burst_timeslot_filter_impl.h b/lib/flow_control/burst_timeslot_filter_impl.h index 130047e..fa54ef4 100644 --- a/lib/flow_control/burst_timeslot_filter_impl.h +++ b/lib/flow_control/burst_timeslot_filter_impl.h @@ -31,6 +31,7 @@ namespace gr { class burst_timeslot_filter_impl : public burst_timeslot_filter { private: + filter_policy d_filter_policy; unsigned int d_timeslot; public: burst_timeslot_filter_impl(unsigned int timeslot); @@ -40,6 +41,10 @@ namespace gr { /* External API */ unsigned int get_tn(void); unsigned int set_tn(unsigned int tn); + + /* Filtering policy */ + filter_policy get_policy(void); + filter_policy set_policy(filter_policy policy); }; } // namespace gsm diff --git a/lib/flow_control/dummy_burst_filter_impl.cc b/lib/flow_control/dummy_burst_filter_impl.cc index 33c24cb..4241111 100644 --- a/lib/flow_control/dummy_burst_filter_impl.cc +++ b/lib/flow_control/dummy_burst_filter_impl.cc @@ -60,7 +60,8 @@ namespace gr { dummy_burst_filter_impl::dummy_burst_filter_impl() : gr::block("dummy_burst_filter", gr::io_signature::make(0, 0, 0), - gr::io_signature::make(0, 0, 0)) + gr::io_signature::make(0, 0, 0)), + d_filter_policy(FILTER_POLICY_DEFAULT) { message_port_register_in(pmt::mp("in")); message_port_register_out(pmt::mp("out")); @@ -75,6 +76,14 @@ namespace gr { void dummy_burst_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("out"), msg); + return; + } + pmt::pmt_t header_plus_burst = pmt::cdr(msg); int8_t * burst = (int8_t *)(pmt::blob_data(header_plus_burst)) + sizeof(gsmtap_hdr); size_t burst_len = pmt::blob_length(header_plus_burst) - sizeof(gsmtap_hdr); @@ -100,6 +109,20 @@ namespace gr { } return true; } + + /* Filtering policy */ + filter_policy + dummy_burst_filter_impl::get_policy(void) + { + return d_filter_policy; + } + + filter_policy + dummy_burst_filter_impl::set_policy(filter_policy policy) + { + d_filter_policy = policy; + return d_filter_policy; + } } /* namespace gsm */ } /* namespace gr */ diff --git a/lib/flow_control/dummy_burst_filter_impl.h b/lib/flow_control/dummy_burst_filter_impl.h index ce9c741..953ae94 100644 --- a/lib/flow_control/dummy_burst_filter_impl.h +++ b/lib/flow_control/dummy_burst_filter_impl.h @@ -35,10 +35,16 @@ namespace gr { private: bool is_dummy_burst(int8_t *burst, size_t burst_len); static const int8_t d_dummy_burst[]; + filter_policy d_filter_policy; public: dummy_burst_filter_impl(); ~dummy_burst_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); }; } // namespace gsm |