[wlan] Use Span for BufferReader/Writer and Packet

Test=Updated tests

Change-Id: I06f8ef47050257604f704fcc7298efb8a5a9e10b
diff --git a/drivers/wlan/wlan/device.cpp b/drivers/wlan/wlan/device.cpp
index e74ac0f..790cb08 100644
--- a/drivers/wlan/wlan/device.cpp
+++ b/drivers/wlan/wlan/device.cpp
@@ -419,7 +419,7 @@
         return ZX_ERR_INVALID_ARGS;
     }
 
-    if (ethmac_proxy_ != nullptr) { ethmac_proxy_->Recv(packet->mut_data(), packet->len(), 0u); }
+    if (ethmac_proxy_ != nullptr) { ethmac_proxy_->Recv(packet->data(), packet->len(), 0u); }
     return ZX_OK;
 }
 
diff --git a/lib/wlan/mlme/ap/beacon_sender.cpp b/lib/wlan/mlme/ap/beacon_sender.cpp
index 5f61f51..93ef7e1 100644
--- a/lib/wlan/mlme/ap/beacon_sender.cpp
+++ b/lib/wlan/mlme/ap/beacon_sender.cpp
@@ -50,7 +50,7 @@
     // Copy template content.
     auto packet = frame.Take();
     bcn_cfg.tmpl.packet_head.len = packet->len();
-    bcn_cfg.tmpl.packet_head.data = packet->mut_data();
+    bcn_cfg.tmpl.packet_head.data = packet->data();
     bcn_cfg.beacon_interval = req.body()->beacon_period;
     status = device_->EnableBeaconing(&bcn_cfg);
     if (status != ZX_OK) {
diff --git a/lib/wlan/mlme/include/wlan/mlme/buffer_reader.h b/lib/wlan/mlme/include/wlan/mlme/buffer_reader.h
index a15e3b2..259b7ce 100644
--- a/lib/wlan/mlme/include/wlan/mlme/buffer_reader.h
+++ b/lib/wlan/mlme/include/wlan/mlme/buffer_reader.h
@@ -5,6 +5,7 @@
 #pragma once
 
 #include <fbl/unique_ptr.h>
+#include <wlan/common/span.h>
 #include <wlan/mlme/packet.h>
 #include <zircon/types.h>
 
@@ -12,49 +13,43 @@
 
 class BufferReader {
    public:
-    BufferReader(const uint8_t* buf, size_t len) : buf_(buf), len_(len) {
-        ZX_ASSERT(buf != nullptr);
-    }
-
-    explicit BufferReader(const Packet* pkt) : buf_(pkt->data()), len_(pkt->len()) {
-        ZX_ASSERT(pkt != nullptr);
+    explicit BufferReader(Span<const uint8_t> buf) : buf_(buf) {
+        ZX_ASSERT(buf_.data() != nullptr);
     }
 
     template <typename T> const T* Peek() {
-        if (len_ < offset_ + sizeof(T)) { return nullptr; }
-        return reinterpret_cast<const T*>(buf_ + offset_);
+        if (buf_.size() < offset_ + sizeof(T)) { return nullptr; }
+        return reinterpret_cast<const T*>(buf_.data() + offset_);
     }
 
     template <typename T> const T* Read() {
-        if (len_ < offset_ + sizeof(T)) { return nullptr; }
+        if (buf_.size() < offset_ + sizeof(T)) { return nullptr; }
 
-        auto data = reinterpret_cast<const T*>(buf_ + offset_);
+        auto data = reinterpret_cast<const T*>(buf_.data() + offset_);
         offset_ += sizeof(T);
         return data;
     }
 
-    const uint8_t* Read(size_t len) {
-        if (len_ < offset_ + len) { return nullptr; }
+    Span<const uint8_t> Read(size_t len) {
+        if (buf_.size() < offset_ + len) { return {}; }
 
-        auto data = buf_ + offset_;
+        auto data = buf_.data() + offset_;
         offset_ += len;
+        return {data, len};
+    }
+
+    Span<const uint8_t> ReadRemaining() {
+        auto data = buf_.subspan(offset_);
+        offset_ = buf_.size();
         return data;
     }
 
-    std::tuple<const uint8_t*, size_t> ReadRemaining() {
-        size_t remaining = RemainingBytes();
-        auto data = buf_ + offset_;
-        offset_ += remaining;
-        return {data, remaining};
-    }
-
     size_t ReadBytes() const { return offset_; }
-    size_t RemainingBytes() const { return len_ - offset_; }
+    size_t RemainingBytes() const { return buf_.size() - offset_; }
 
    private:
+    Span<const uint8_t> buf_;
     size_t offset_ = 0;
-    const uint8_t* buf_;
-    size_t len_ = 0;
 };
 
 }  // namespace wlan
diff --git a/lib/wlan/mlme/include/wlan/mlme/buffer_writer.h b/lib/wlan/mlme/include/wlan/mlme/buffer_writer.h
index f9beb39..3f64fe1 100644
--- a/lib/wlan/mlme/include/wlan/mlme/buffer_writer.h
+++ b/lib/wlan/mlme/include/wlan/mlme/buffer_writer.h
@@ -5,6 +5,7 @@
 #pragma once
 
 #include <fbl/unique_ptr.h>
+#include <wlan/common/span.h>
 #include <wlan/mlme/packet.h>
 #include <zircon/types.h>
 
@@ -12,37 +13,32 @@
 
 class BufferWriter {
    public:
-    BufferWriter(uint8_t* buf, size_t len) : buf_(buf), len_(len) {
-        ZX_ASSERT(buf != nullptr);
-    }
-
-    explicit BufferWriter(Packet* pkt) : buf_(pkt->mut_data()), len_(pkt->len()) {
-        ZX_ASSERT(pkt != nullptr);
+    explicit BufferWriter(Span<uint8_t> buf) : buf_(buf) {
+        ZX_ASSERT(buf.data() != nullptr);
     }
 
     template <typename T> T* Write() {
-        ZX_ASSERT(len_ >= offset_ + sizeof(T));
+        ZX_ASSERT(buf_.size() >= offset_ + sizeof(T));
 
-        memset(buf_ + offset_, 0, sizeof(T));
-        auto data = reinterpret_cast<T*>(buf_ + offset_);
+        memset(buf_.data() + offset_, 0, sizeof(T));
+        auto data = reinterpret_cast<T*>(buf_.data() + offset_);
         offset_ += sizeof(T);
         return data;
     }
 
-    void Write(const uint8_t* buf, size_t len) {
-        ZX_ASSERT(len_ >= offset_ + len);
+    void Write(Span<const uint8_t> buf) {
+        ZX_ASSERT(buf_.size() >= offset_ + buf.size());
 
-        std::memcpy(buf_ + offset_, buf, len);
-        offset_ += len;
+        std::memcpy(buf_.data() + offset_, buf.data(), buf.size());
+        offset_ += buf.size();
     }
 
     size_t WrittenBytes() const { return offset_; }
-    size_t RemainingBytes() const { return len_ - offset_; }
+    size_t RemainingBytes() const { return buf_.size() - offset_; }
 
 private:
     size_t offset_ = 0;
-    uint8_t* buf_;
-    size_t len_ = 0;
+    Span<uint8_t> buf_;
 };
 
 }  // namespace wlan
diff --git a/lib/wlan/mlme/include/wlan/mlme/packet.h b/lib/wlan/mlme/include/wlan/mlme/packet.h
index 848dc41..3c5ab90 100644
--- a/lib/wlan/mlme/include/wlan/mlme/packet.h
+++ b/lib/wlan/mlme/include/wlan/mlme/packet.h
@@ -5,6 +5,7 @@
 #ifndef GARNET_LIB_WLAN_MLME_INCLUDE_WLAN_MLME_PACKET_H_
 #define GARNET_LIB_WLAN_MLME_INCLUDE_WLAN_MLME_PACKET_H_
 
+#include <wlan/common/span.h>
 #include <wlan/mlme/wlan.h>
 
 #include <fbl/intrusive_double_list.h>
@@ -142,6 +143,8 @@
 // within the buffer.
 class Packet : public fbl::DoublyLinkedListable<fbl::unique_ptr<Packet>> {
    public:
+    typedef uint8_t value_type;
+
     enum class Peer {
         kUnknown,
         kDevice,
@@ -162,7 +165,9 @@
     Peer peer() const { return peer_; }
 
     const uint8_t* data() const { return buffer_->data(); }
-    uint8_t* mut_data() { return buffer_->data(); }
+    uint8_t* data() { return buffer_->data(); }
+
+    size_t size() const { return len_; }
 
     // Length can only be made shorter at this time.
     zx_status_t set_len(size_t len) {
diff --git a/lib/wlan/mlme/mesh/mesh_mlme.cpp b/lib/wlan/mlme/mesh/mesh_mlme.cpp
index bfc877b..3068d7e 100644
--- a/lib/wlan/mlme/mesh/mesh_mlme.cpp
+++ b/lib/wlan/mlme/mesh/mesh_mlme.cpp
@@ -102,7 +102,7 @@
 
     auto packet = buffer.Take();
     cfg.tmpl.packet_head.len = packet->len();
-    cfg.tmpl.packet_head.data = packet->mut_data();
+    cfg.tmpl.packet_head.data = packet->data();
     cfg.beacon_interval = req.body()->beacon_period;
     status = device_->EnableBeaconing(&cfg);
     if (status != ZX_OK) {
diff --git a/lib/wlan/mlme/packet.cpp b/lib/wlan/mlme/packet.cpp
index 266fe59..a2beb96 100644
--- a/lib/wlan/mlme/packet.cpp
+++ b/lib/wlan/mlme/packet.cpp
@@ -27,7 +27,7 @@
 wlan_tx_packet_t Packet::AsWlanTxPacket() {
     ZX_DEBUG_ASSERT(len() <= fbl::numeric_limits<uint16_t>::max());
     wlan_tx_packet_t tx_pkt = {};
-    tx_pkt.packet_head.data = mut_data();
+    tx_pkt.packet_head.data = data();
     tx_pkt.packet_head.len = static_cast<uint16_t>(len());
     if (has_ext_data()) {
         tx_pkt.packet_tail = ext_data();
diff --git a/lib/wlan/mlme/tests/buffer_utils_unittest.cpp b/lib/wlan/mlme/tests/buffer_utils_unittest.cpp
index af6afef..c4e7088 100644
--- a/lib/wlan/mlme/tests/buffer_utils_unittest.cpp
+++ b/lib/wlan/mlme/tests/buffer_utils_unittest.cpp
@@ -22,7 +22,7 @@
     uint8_t buf[16] = {};
     std::iota(buf, buf + sizeof(buf), 0);
 
-    BufferWriter w(buf, sizeof(buf));
+    BufferWriter w(buf);
     auto c1 = w.Write<Container<4>>();
     c1->data[0] = 1;
     c1->data[1] = 0;
@@ -34,7 +34,7 @@
     c2->data[1] = 4;
 
     uint8_t data[4] = {5, 6, 7, 8};
-    w.Write(data, sizeof(data));
+    w.Write(data);
 
     EXPECT_EQ(w.WrittenBytes(), 10u);
     EXPECT_EQ(w.RemainingBytes(), 6u);
@@ -51,7 +51,7 @@
     uint8_t buf[16] = {};
     std::iota(buf, buf + sizeof(buf), 0);
 
-    BufferReader r(buf, sizeof(buf));
+    BufferReader r(buf);
     auto c1 = r.Read<Container<4>>();
     ASSERT_NE(c1, nullptr);
     EXPECT_EQ(c1->data[0], 0u);
@@ -68,7 +68,8 @@
     EXPECT_EQ(c3->data[2], 8u);
 
     auto read_data = r.Read(3);
-    ASSERT_NE(read_data, nullptr);
+    ASSERT_FALSE(read_data.empty());
+    ASSERT_EQ(read_data.size(), 3u);
     EXPECT_EQ(read_data[0], 6u);
     EXPECT_EQ(read_data[2], 8u);
 
@@ -76,13 +77,13 @@
     EXPECT_EQ(r.RemainingBytes(), 7u);
 
     // Read over the remaining buffer size.
-    EXPECT_EQ(r.Read(8), nullptr);
+    EXPECT_TRUE(r.Read(8).empty());
     EXPECT_EQ(r.Peek<Container<8>>(), nullptr);
     EXPECT_EQ(r.Read<Container<8>>(), nullptr);
 
-    auto [remaining, remaining_len] = r.ReadRemaining();
-    ASSERT_NE(remaining, nullptr);
-    ASSERT_EQ(remaining_len, 7u);
+    auto remaining = r.ReadRemaining();
+    ASSERT_NE(remaining.data(), nullptr);
+    ASSERT_EQ(remaining.size(), 7u);
     EXPECT_EQ(r.ReadBytes(), 16u);
     EXPECT_EQ(r.RemainingBytes(), 0u);
     EXPECT_EQ(remaining[0], 9u);
diff --git a/lib/wlan/mlme/tests/scanner_unittest.cpp b/lib/wlan/mlme/tests/scanner_unittest.cpp
index f4255c8..a7506c8 100644
--- a/lib/wlan/mlme/tests/scanner_unittest.cpp
+++ b/lib/wlan/mlme/tests/scanner_unittest.cpp
@@ -43,7 +43,7 @@
     // everyone.
     const size_t kBufLen = 4096;
     auto packet = GetSvcPacket(kBufLen);
-    memset(packet->mut_data(), 0, kBufLen);
+    memset(packet->data(), 0, kBufLen);
     SerializeServiceMsg(packet.get(), ordinal, msg.get());
     return fbl::move(packet);
 }
diff --git a/lib/wlan/mlme/tests/service_unittest.cpp b/lib/wlan/mlme/tests/service_unittest.cpp
index 3d16a5f..aa51e00 100644
--- a/lib/wlan/mlme/tests/service_unittest.cpp
+++ b/lib/wlan/mlme/tests/service_unittest.cpp
@@ -31,7 +31,7 @@
     // everyone.
     constexpr size_t kBufLen = 4096;
     auto packet = GetSvcPacket(kBufLen);
-    memset(packet->mut_data(), 0, kBufLen);
+    memset(packet->data(), 0, kBufLen);
     SerializeServiceMsg(packet.get(), ordinal, msg.get());
     return fbl::move(packet);
 }