Annotation of nono/vm/ethernet.cpp, revision 1.1.1.9

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.9 ! root       17: EthernetDevice::EthernetDevice(uint objid_)
1.1.1.8   root       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.9 ! root       66: EthernetDevice::GetConfigMacAddr(uint n, macaddr_t *mac, bool accept_rom)
1.1.1.7   root       67: {
1.1.1.9 ! root       68:        std::string keyname = string_format("ethernet%u-macaddr", n);
1.1.1.8   root       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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.