|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2019 [email protected]
4: //
5:
6: #include "configfile.h"
7: #include "ethernet.h"
8: #include "netdriver_bpf.h"
9: #include "netdriver_tap.h"
10: #include "netdriver_none.h"
11: #include <random>
12:
13: EthernetDevice *gEthernet;
14:
15: // コンストラクタ
16: EthernetDevice::EthernetDevice()
17: {
18: }
19:
20: // デストラクタ
21: EthernetDevice::~EthernetDevice()
22: {
23: if (gNetDriver) {
24: delete gNetDriver;
25: gNetDriver = NULL;
26: }
27: }
28:
29: // 動的なコンストラクション
30: bool
31: EthernetDevice::Create()
32: {
33: const std::string key = "ethernet.hostdriver";
34: const std::string type = gConfig->ReadStr(key, "none");
35: if (type == "none") {
36: gNetDriver = new NetDriverNone();
37: } else if (type == "tap") {
38: #if defined(NETDRIVER_TAP)
39: try {
40: gNetDriver = new NetDriverTap(this, &mtx, &cv);
41: } catch (...) {
42: warnx("Creating NetDriverTap failed");
43: return false;
44: }
45: #else
46: gConfig->Err(key, "\"%s\" not supported", type.c_str());
47: return false;
48: #endif
49: } else if (type == "bpf") {
50: #if defined(NETDRIVER_BPF)
51: try {
52: gNetDriver = new NetDriverBPF(this, &mtx, &cv);
53: } catch (...) {
54: warnx("Creating NetDriverBPF failed");
55: return false;
56: }
57: #else
58: gConfig->Err(key, "\"%s\" not supported", type.c_str());
59: return false;
60: #endif
61: } else {
62: gConfig->Err(key, "unknown \"%s\"", type.c_str());
63: return false;
64: }
65: assert(gNetDriver);
66:
67: return true;
68: }
69:
70: // 初期化
71: bool
72: EthernetDevice::Init()
73: {
74: if (gNetDriver->Init() == false) {
75: delete gNetDriver;
76: gNetDriver = NULL;
77: return false;
78: }
79:
80: return true;
81: }
82:
83: // MAC アドレスをてきとーに生成する。
84: // 02:00:01 はローカルだし割り当てもされてなさそうなので使っちゃえ。
85: // 下3バイトは乱数。
86: /*static*/ void
87: EthernetDevice::GenerateMacAddr(macaddr_t *addrp)
88: {
89: std::random_device rnd;
90: uint32 x = rnd();
91:
92: macaddr_t& addr = *addrp;
93: addr[0] = 0x02;
94: addr[1] = 0x00;
95: addr[2] = 0x01;
96: addr[3] = (x >> 16) & 0xff;
97: addr[4] = (x >> 8) & 0xff;
98: addr[5] = x & 0xff;
99: }
100:
101: // MAC アドレス文字列をバイナリに変換して返す。
102: // "HH:HH:HH:HH:HH:HH" 形式のみ。
103: // 成功すれば true を返す。
104: /*static*/ bool
105: EthernetDevice::ParseMacAddr(macaddr_t& dst, const std::string& src)
106: {
107: const char *p;
108: char *e;
109:
110: p = src.data();
111: for (int i = 0; ; ) {
112: unsigned long val = strtoul(p, &e, 16);
113:
114: if (p == e) {
115: return false;
116: }
117: if (val > 0xff) {
118: return false;
119: }
120: dst[i++] = val;
121: p = e;
122:
123: // 最後だけ ':' をチェックしないので
124: if (i == 6) {
125: break;
126: }
127:
128: if (*p++ != ':') {
129: return false;
130: }
131: }
132: if (*p != '\0') {
133: return false;
134: }
135: return true;
136: }
137:
138: // パケットを送信する (VM から呼ばれる)
139: bool
140: EthernetDevice::SendPacket(const std::vector<uint8>& buf)
141: {
142: return gNetDriver->SendPacket(buf);
143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.