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