From af4549dfea39e11aa3a1d9a9f7a2e461542ef8e4 Mon Sep 17 00:00:00 2001 From: Bastian Bloessl Date: Fri, 18 Jul 2014 09:47:17 +0200 Subject: [PATCH] allow changing of mac address --- grc/ieee802_11_ofdm_mac.xml | 30 ++++++++++++++++- include/ieee802-11/ofdm_mac.h | 4 ++- lib/ofdm_mac.cc | 63 ++++++++++++++++++++++------------- 3 files changed, 71 insertions(+), 26 deletions(-) diff --git a/grc/ieee802_11_ofdm_mac.xml b/grc/ieee802_11_ofdm_mac.xml index 69eab8c..4d6e48a 100644 --- a/grc/ieee802_11_ofdm_mac.xml +++ b/grc/ieee802_11_ofdm_mac.xml @@ -5,7 +5,35 @@ ieee802_11_ofdm_mac IEEE802.11 import ieee802_11 - ieee802_11.ofdm_mac() + ieee802_11.ofdm_mac($src_mac, $dst_mac, $bss_mac) + + + SRC MAC + src_mac + [0x23, 0x23, 0x23, 0x23, 0x23, 0x23] + int_vector + + + + DST MAC + dst_mac + [0x42, 0x42, 0x42, 0x42, 0x42, 0x42] + int_vector + + + + BSS MAC + bss_mac + [0xff, 0xff, 0xff, 0xff, 0xff, 0xff] + int_vector + + + len($src_mac) == 6 + len($dst_mac) == 6 + len($bss_mac) == 6 + all([x >= 0 and 255 >= x for x in $src_mac]) + all([x >= 0 and 255 >= x for x in $dst_mac]) + all([x >= 0 and 255 >= x for x in $bss_mac]) app in diff --git a/include/ieee802-11/ofdm_mac.h b/include/ieee802-11/ofdm_mac.h index 7e8eb6b..599b91d 100644 --- a/include/ieee802-11/ofdm_mac.h +++ b/include/ieee802-11/ofdm_mac.h @@ -28,7 +28,9 @@ class IEEE802_11_API ofdm_mac : virtual public block public: typedef boost::shared_ptr sptr; - static sptr make(); + static sptr make(std::vector src_mac, + std::vector dst_mac, + std::vector bss_mac); }; } // namespace ieee802_11 diff --git a/lib/ofdm_mac.cc b/lib/ofdm_mac.cc index aa62a93..ae67849 100644 --- a/lib/ofdm_mac.cc +++ b/lib/ofdm_mac.cc @@ -38,7 +38,7 @@ class ofdm_mac_impl : public ofdm_mac { public: -ofdm_mac_impl() : +ofdm_mac_impl(std::vector src_mac, std::vector dst_mac, std::vector bss_mac) : block("ofdm_mac", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)), @@ -52,6 +52,16 @@ ofdm_mac_impl() : message_port_register_in(pmt::mp("phy in")); set_msg_handler(pmt::mp("phy in"), boost::bind(&ofdm_mac_impl::phy_in, this, _1)); + + if(!check_mac(src_mac)) throw std::invalid_argument("wrong mac address size"); + if(!check_mac(dst_mac)) throw std::invalid_argument("wrong mac address size"); + if(!check_mac(bss_mac)) throw std::invalid_argument("wrong mac address size"); + + for(int i = 0; i < 6; i++) { + d_src_mac[i] = src_mac[i]; + d_dst_mac[i] = dst_mac[i]; + d_bss_mac[i] = bss_mac[i]; + } } void phy_in (pmt::pmt_t msg) { @@ -110,26 +120,26 @@ void generate_mac_data_frame(const char *msdu, int msdu_size, char **psdu, int * header.frame_control = 0x0008; header.duration = 0x002e; - header.addr1[0] = 0x30; - header.addr1[1] = 0x14; - header.addr1[2] = 0x4a; - header.addr1[3] = 0xe6; - header.addr1[4] = 0x46; - header.addr1[5] = 0xe4; + header.addr1[0] = d_dst_mac[0]; + header.addr1[1] = d_dst_mac[1]; + header.addr1[2] = d_dst_mac[2]; + header.addr1[3] = d_dst_mac[3]; + header.addr1[4] = d_dst_mac[4]; + header.addr1[5] = d_dst_mac[5]; - header.addr2[0] = 0x12; - header.addr2[1] = 0x34; - header.addr2[2] = 0x56; - header.addr2[3] = 0x78; - header.addr2[4] = 0x90; - header.addr2[5] = 0xab; + header.addr2[0] = d_src_mac[0]; + header.addr2[1] = d_src_mac[1]; + header.addr2[2] = d_src_mac[2]; + header.addr2[3] = d_src_mac[3]; + header.addr2[4] = d_src_mac[4]; + header.addr2[5] = d_src_mac[5]; - header.addr3[0] = 0x42; - header.addr3[1] = 0x42; - header.addr3[2] = 0x42; - header.addr3[3] = 0x42; - header.addr3[4] = 0x42; - header.addr3[5] = 0x42; + header.addr3[0] = d_bss_mac[0]; + header.addr3[1] = d_bss_mac[1]; + header.addr3[2] = d_bss_mac[2]; + header.addr3[3] = d_bss_mac[3]; + header.addr3[4] = d_bss_mac[4]; + header.addr3[5] = d_bss_mac[5]; header.seq_nr = 0; for (int i = 0; i < 12; i++) { @@ -156,15 +166,20 @@ void generate_mac_data_frame(const char *msdu, int msdu_size, char **psdu, int * memcpy(*psdu + msdu_size + 24, &fcs, sizeof(unsigned int)); } +bool check_mac(std::vector mac) { + if(mac.size() != 6) return false; + return true; +} + private: uint16_t d_seq_nr; - char d_mac1[6]; - char d_mac2[6]; - char d_mac3[6]; + uint8_t d_src_mac[6]; + uint8_t d_dst_mac[6]; + uint8_t d_bss_mac[6]; }; ofdm_mac::sptr -ofdm_mac::make() { - return gnuradio::get_initial_sptr(new ofdm_mac_impl()); +ofdm_mac::make(std::vector src_mac, std::vector dst_mac, std::vector bss_mac) { + return gnuradio::get_initial_sptr(new ofdm_mac_impl(src_mac, dst_mac, bss_mac)); }