|
|
1.1 root 1: //
2: // nono
1.1.1.3 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.6 root 7: //
8: // Ethernet 基本クラス
9: //
10:
1.1 root 11: #include "ethernet.h"
1.1.1.7 ! root 12: #include "config.h"
1.1.1.6 root 13: #include "hostnet.h"
14: #include "scheduler.h"
1.1 root 15:
16: // コンストラクタ
1.1.1.7 ! root 17: EthernetDevice::EthernetDevice()
! 18: : inherited(OBJ_ETHERNET)
1.1 root 19: {
20: }
21:
22: // デストラクタ
23: EthernetDevice::~EthernetDevice()
24: {
1.1.1.6 root 25: if ((bool)hostnet) {
26: hostnet->SetCallbackDevice(NULL);
27: }
1.1 root 28: }
29:
30: // 動的なコンストラクション
31: bool
32: EthernetDevice::Create()
33: {
1.1.1.6 root 34: // ホストドライバを作成してこのデバイスと紐付ける
35: hostnet.reset(new HostNetDevice());
1.1 root 36:
1.1.1.6 root 37: hostnet->SetRxCallback(ToDeviceCallback(&EthernetDevice::HostRxCallback));
38: hostnet->SetCallbackDevice(this);
1.1 root 39:
40: return true;
41: }
42:
1.1.1.6 root 43: // これは Host スレッドから呼ばれる
44: void
45: EthernetDevice::HostRxCallback()
1.1.1.5 root 46: {
1.1.1.6 root 47: // スレッドを超えるためにメッセージを投げる
1.1.1.7 ! root 48: scheduler->SendMessage(MessageID::HOSTNET_RX);
! 49: }
! 50:
! 51: // 設定ファイルから MAC アドレスを読み込む。
! 52: // MAC アドレスを保持するデバイスが呼び出すこと。MAC アドレスを保持する
! 53: // デバイスがイーサネットデバイスとは限らず、例えば LANCE を採用している
! 54: // 機種ではたいてい ROM か誰かが MAC アドレスを持っている。
! 55: //
! 56: // 引数 accept_rom が true なら、設定 ethernet-macaddr=rom を許可する。
! 57: // これは (お手持ちの実機) ROM イメージが MAC アドレスを保持しているため、
! 58: // 指定(や生成)不要なケースで指定できる (prom.cpp 参照)。
! 59: // 引数 accept_rom が false で、設定値に "rom" が指定されるとエラーにする。
! 60: //
! 61: // "rom" が指定されて許可されている場合 mac は触らず true を返す。
! 62: // MAC アドレスが指定されているか自動生成したかで取得できれば mac に格納して
! 63: // true を返す。それ以外の場合は、エラーメッセージを表示して false を返す。
! 64: /*static*/ bool
! 65: EthernetDevice::GetConfigMacAddr(macaddr_t *mac, bool accept_rom)
! 66: {
! 67: const ConfigItem& item = gConfig->Find("ethernet-macaddr");
! 68: const std::string& val = item.AsString();
! 69:
! 70: if (val == "rom") {
! 71: // ROM に書いてあるのを使う。
! 72: if (accept_rom) {
! 73: return true;
! 74: } else {
! 75: item.Err("\"rom\" cannot be specified in this vmtype");
! 76: return false;
! 77: }
! 78: } else {
! 79: if (val == "auto") {
! 80: // 自動生成。
! 81: // 出来れば生成したのを覚えといて、次からそれを使いたい。
! 82: if (0) {
! 83: } else {
! 84: mac->Generate();
! 85: }
! 86: } else {
! 87: // ユーザ指定
! 88: if (mac->FromString(val) == false) {
! 89: item.Err("Invalid MAC address");
! 90: return false;
! 91: }
! 92: }
! 93: }
! 94:
! 95: return true;
1.1.1.5 root 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.