|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2019 [email protected]
4: //
5:
6: #pragma once
7:
8: #include <array>
9: #include <condition_variable>
10: #include <mutex>
11: #include <vector>
12: #include "device.h"
13: #include "mystring.h"
14: #include "qvector.h"
15:
16: // IODevice
17: // |
18: // v
19: // EthernetDevice (イーサネットとしての共通部分)
20: // |
21: // +--------+-------+
22: // v v
23: // LanceDevice RTL8019Device
24: // (LUNA, AM7990) (X68000, RTL8019)
25: //
26: // これ自体は IODevice である必要はないが、LanceDevice などの親になるため
27: // IODevice にしてある。(多重継承はしない)
28:
29: class NetDriver;
30:
31: // MAC アドレス格納用のクラス
32: class macaddr_t : public std::array<uint8, 6>
33: {
34: typedef std::array<uint8, 6> inherited;
35: public:
36: // この MAC アドレスが 00:00:00:00:00:00 なら true
37: bool empty() const {
38: for (const auto& v : *this) {
39: if (v != 0) {
40: return false;
41: }
42: }
43: return true;
44: }
45:
46: // 文字列形式を返す
47: std::string to_string() const {
48: std::string buf;
49: for (const auto& v : *this) {
50: buf += string_format("%02x:", v);
51: }
52: buf.pop_back();
53: return buf;
54: }
55: };
56:
57: class EthernetDevice : public IODevice
58: {
59: typedef IODevice inherited;
60: protected:
61: EthernetDevice();
62: public:
63: virtual ~EthernetDevice();
64:
65: virtual bool Create();
66: virtual bool Init();
67:
68: // パケットを受信した。
69: // ホストネットワークドライバから呼ばれる。
70: // ホストネットワークスレッドで mtx 取得状態で呼ばれるので、
71: // バッファをコピーしてこちらのスレッドに処理を引き渡すところまでを行う。
72: // buf はプリアンブルを含まず、イーサネットフレームヘッダ(14バイト)、
73: // データ(46-1500バイト)、FCS(CRC) (4バイト) からなる。
74: virtual bool RecvPacket(qvector<uint8>& buf) = 0;
75:
76: // パケット受信許可。
77: // true の場合のみホストドライバは RecvPacket() をコールしてよい。
78: bool RecvEnabled = false;
79:
80: // このデバイスと継承デバイスのメンバ変数を読み書きする場合は
81: // 必ずこのロックを取得する。?
82: // cv もこのロックを使う。
83: std::mutex mtx {};
84: // ワーカスレッドへ指示を出すための条件変数
85: std::condition_variable cv {};
86: // ワーカスレッドへのリクエストフラグ
87: uint32 request = 0;
88:
89: protected:
90: // MAC アドレスを生成する
91: static void GenerateMacAddr(macaddr_t *addr);
92:
93: // MAC アドレス文字列をバイナリに変換する
94: static bool ParseMacAddr(macaddr_t& dst, const std::string& src);
95:
96: // パケットを送信する
97: bool SendPacket(const std::vector<uint8>& buf);
98: };
99:
1.1.1.2 ! root 100: extern std::unique_ptr<EthernetDevice> gEthernet;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.