|
|
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.