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));
}