/* -*- c++ -*- */
/*
 * @file
 * @author (C) 2016 by Roman Khassraf <rkhassraf@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 <grgsm/gsmtap.h>
#include <unistd.h>
#include <grgsm/endian.h>

#include "extract_cmc_impl.h"

namespace gr {
  namespace gsm {
    void extract_cmc_impl::process_messages(pmt::pmt_t msg)
    {
        pmt::pmt_t message_plus_header_blob = pmt::cdr(msg);
        uint8_t * message_plus_header = (uint8_t *)pmt::blob_data(message_plus_header_blob);
        gsmtap_hdr * header = (gsmtap_hdr *)message_plus_header;
        uint8_t * msg_elements = (uint8_t *)(message_plus_header+sizeof(gsmtap_hdr));

        if((msg_elements[3] & 0xF) == 0x6 && msg_elements[4] == 0x35)
        {

            int frame_nr = be32toh(header->frame_number);
            int a5_version = ((msg_elements[5] & 0xE) >> 1) + 1; //10.5.2.9 Cipher Mode Setting
            int start_ciphering = ((msg_elements[5] & 0x1));
            d_start_ciphering.push_back(start_ciphering);
            d_framenumbers.push_back(frame_nr);
            d_a5_versions.push_back(a5_version);
        }
    }
    
    std::vector<int> extract_cmc_impl::get_framenumbers()
    {
        return d_framenumbers;
    }
    
    std::vector<int> extract_cmc_impl::get_a5_versions()
    {
        return d_a5_versions;
    }

    std::vector<int> extract_cmc_impl::get_start_ciphering()
    {
        return d_start_ciphering;
    }
    
    extract_cmc::sptr
    extract_cmc::make()
    {
      return gnuradio::get_initial_sptr
        (new extract_cmc_impl());
    }

    /*
     * The private constructor
     */
    extract_cmc_impl::extract_cmc_impl()
      : gr::block("extract_cmc",
              gr::io_signature::make(0, 0, 0),
              gr::io_signature::make(0, 0, 0))
    {
        message_port_register_in(pmt::mp("msgs"));
        set_msg_handler(pmt::mp("msgs"), boost::bind(&extract_cmc_impl::process_messages, this, _1));
    }
    
    /*
     * Our virtual destructor.
     */
    extract_cmc_impl::~extract_cmc_impl()
    {
    }
  } /* namespace gsm */
} /* namespace gr */
