From dab44836f55480708966b37cc69b031d9f868e49 Mon Sep 17 00:00:00 2001 From: Bastian Bloessl Date: Tue, 31 Dec 2013 12:51:19 +0100 Subject: [PATCH] add packet_header_generator --- grc/ieee802_11_packet_headergenerator.xml | 20 ++++++ include/ieee802-11/packet_headergenerator.h | 61 +++++++++++++++++ lib/packet_headergenerator_impl.cc | 75 +++++++++++++++++++++ lib/packet_headergenerator_impl.h | 50 ++++++++++++++ 4 files changed, 206 insertions(+) create mode 100644 grc/ieee802_11_packet_headergenerator.xml create mode 100644 include/ieee802-11/packet_headergenerator.h create mode 100644 lib/packet_headergenerator_impl.cc create mode 100644 lib/packet_headergenerator_impl.h diff --git a/grc/ieee802_11_packet_headergenerator.xml b/grc/ieee802_11_packet_headergenerator.xml new file mode 100644 index 0000000..87e34ab --- /dev/null +++ b/grc/ieee802_11_packet_headergenerator.xml @@ -0,0 +1,20 @@ + + Packet Header Generator + ieee802_11_packet_headergenerator + IEEE802.11 + import ieee802_11 + ieee802_11.packet_headergenerator($header_formatter) + + Formatter Object + header_formatter + raw + + + in + byte + + + out + byte + + diff --git a/include/ieee802-11/packet_headergenerator.h b/include/ieee802-11/packet_headergenerator.h new file mode 100644 index 0000000..f7397c9 --- /dev/null +++ b/include/ieee802-11/packet_headergenerator.h @@ -0,0 +1,61 @@ +/* -*- c++ -*- */ +/* Copyright 2012 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio 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. + * + * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_H +#define INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_H + +#include +#include +#include + +namespace gr { +namespace ieee802_11 { + +class IEEE802_11_API packet_headergenerator : virtual public tagged_stream_block +{ +public: + typedef boost::shared_ptr sptr; + + /* \param header_formatter A header formatter object. + * \param len_tag_key Length tag key. Note that for header generation, + * it is irrelevant which tag names are set in the + * formatter object, only this value is relevant! + */ + static sptr make( + const digital::packet_header_default::sptr &header_formatter, + const std::string &len_tag_key="packet_len" + ); + + /* \param header_len If this value is given, a packet_header_default + * object is used to generate the header. This is + * the number of bits per header. + * \param len_tag_key Length tag key. + */ + static sptr make( + long header_len, + const std::string &len_tag_key = "packet_len"); + }; + +} // namespace ieee802_11 +} // namespace gr + +#endif /* INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_H */ + diff --git a/lib/packet_headergenerator_impl.cc b/lib/packet_headergenerator_impl.cc new file mode 100644 index 0000000..fe8ce28 --- /dev/null +++ b/lib/packet_headergenerator_impl.cc @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2013 Bastian Bloessl + * + * This program 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 of the License, or + * (at your option) any later version. + * + * This program 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 this program. If not, see . + */ +#include +#include +#include "packet_headergenerator_impl.h" + +using namespace gr::ieee802_11; + +packet_headergenerator::sptr packet_headergenerator::make( + const digital::packet_header_default::sptr &header_formatter, + const std::string &len_tag_key) { + return gnuradio::get_initial_sptr (new packet_headergenerator_impl(header_formatter, len_tag_key)); +} + + +packet_headergenerator::sptr packet_headergenerator::make( + long header_len, + const std::string &len_tag_key) { + const digital::packet_header_default::sptr header_formatter( + new digital::packet_header_default(header_len, len_tag_key)); + return gnuradio::get_initial_sptr (new packet_headergenerator_impl(header_formatter, len_tag_key)); +} + + + packet_headergenerator_impl::packet_headergenerator_impl( + const gr::digital::packet_header_default::sptr &header_formatter, + const std::string &len_tag_key + ) + : tagged_stream_block("packet_headergenerator_impl", + io_signature::make(1, 1, sizeof (char)), + io_signature::make(1, 1, sizeof (char)), + len_tag_key), + d_formatter(header_formatter) + { + set_output_multiple(d_formatter->header_len()); + // This is the worst case rate, because we don't know the true value, of course + set_relative_rate(d_formatter->header_len()); + set_tag_propagation_policy(TPP_DONT); + } + + packet_headergenerator_impl::~packet_headergenerator_impl() + { + } + + int + packet_headergenerator_impl::work (int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + unsigned char *out = (unsigned char *) output_items[0]; + std::vector all_tags; + get_tags_in_range(all_tags, 0, nitems_read(0), nitems_read(0) + ninput_items[0]); + if (!d_formatter->header_formatter(ninput_items[0], out, all_tags)) { + GR_LOG_FATAL(d_logger, boost::format("header_formatter() returned false (this shouldn't happen). Offending header started at %1%") % nitems_read(0)); + throw std::runtime_error("header formatter returned false."); + } + + return d_formatter->header_len(); + } + diff --git a/lib/packet_headergenerator_impl.h b/lib/packet_headergenerator_impl.h new file mode 100644 index 0000000..f50a2f2 --- /dev/null +++ b/lib/packet_headergenerator_impl.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2013 Bastian Bloessl + * + * This program 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 of the License, or + * (at your option) any later version. + * + * This program 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 this program. If not, see . + */ +#ifndef INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_IMPL_H +#define INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_IMPL_H + +#include + +namespace gr { +namespace ieee802_11 { + +class packet_headergenerator_impl : public packet_headergenerator +{ +private: + gr::digital::packet_header_default::sptr d_formatter; + +public: + packet_headergenerator_impl( + const digital::packet_header_default::sptr &header_formatter, + const std::string &len_tag_key + ); + ~packet_headergenerator_impl(); + + void remove_length_tags(const std::vector > &tags) {}; + int calculate_output_stream_length(const gr_vector_int &ninput_items) { return d_formatter->header_len(); }; + + int work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + +} // namespace ieee802_11 +} // namespace gr + +#endif /* INCLUDED_IEEE802_11_PACKET_HEADERGENERATOR_IMPL_H */ +