blob: 514908ac1560176ca22237ab616dd2c336f99d5d [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <ddk/device.h>
#include <ddk/protocol/test.h>
#include <ddktl/device.h>
#include <ddktl/protocol/ethernet.h>
#include <ddktl/protocol/test.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <zircon/device/ethertap.h>
#include <lib/zx/socket.h>
#include <fbl/mutex.h>
#include <fbl/unique_ptr.h>
#include <threads.h>
namespace eth {
class TapCtl : public ddk::Device<TapCtl, ddk::Ioctlable> {
public:
TapCtl(zx_device_t* device);
void DdkRelease();
zx_status_t DdkIoctl(uint32_t op, const void* in_buf, size_t in_len, void* out_buf,
size_t out_len, size_t* out_actual);
};
class TapDevice : public ddk::Device<TapDevice, ddk::Unbindable>,
public ddk::EthmacProtocol<TapDevice, ddk::base_protocol> {
public:
TapDevice(zx_device_t* device, const ethertap_ioctl_config* config, zx::socket data);
void DdkRelease();
void DdkUnbind();
zx_status_t EthmacQuery(uint32_t options, ethmac_info_t* info);
void EthmacStop();
zx_status_t EthmacStart(const ethmac_ifc_t* ifc);
zx_status_t EthmacQueueTx(uint32_t options, ethmac_netbuf_t* netbuf);
zx_status_t EthmacSetParam(uint32_t param, int32_t value, const void* data,
size_t data_size);
// No DMA capability, so return invalid handle for get_bti
void EthmacGetBti(zx::bti* bti);
int Thread();
private:
zx_status_t UpdateLinkStatus(zx_signals_t observed);
zx_status_t Recv(uint8_t* buffer, uint32_t capacity);
// ethertap options
uint32_t options_ = 0;
// ethermac fields
uint32_t features_ = 0;
uint32_t mtu_ = 0;
uint8_t mac_[6] = {};
fbl::Mutex lock_;
bool dead_ = false;
ddk::EthmacIfcClient ethmac_client_ __TA_GUARDED(lock_);
// Only accessed from Thread, so not locked.
bool online_ = false;
zx::socket data_;
thrd_t thread_;
};
} // namespace eth