Annotation of nono/host/netdriver_slirp.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2025 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // ホストネットワークの usermode (SLIRP) ドライバ
                      9: //
                     10: 
                     11: #pragma once
                     12: 
                     13: #include "netdriver.h"
                     14: #include "autofd.h"
                     15: #include "config.h"
                     16: #include "hostnet.h"
                     17: #include <poll.h>
                     18: #include <netinet/in.h>
                     19: #include <list>
                     20: #include <mutex>
                     21: 
                     22: typedef struct Slirp Slirp;
                     23: class SlirpThread;
                     24: class SlirpTimer;
                     25: 
                     26: struct FwdInfo
                     27: {
                     28:        int is_udp;
                     29:        struct sockaddr_in host;
                     30:        struct sockaddr_in guest;
                     31: };
                     32: 
                     33: class NetDriverSlirp : public NetDriver
                     34: {
                     35:        using inherited = NetDriver;
                     36:  public:
                     37:        explicit NetDriverSlirp(HostDevice *hostdev_);
                     38:        ~NetDriverSlirp() override;
                     39: 
                     40:        void SetLogLevel(int) override;
                     41:        bool InitDriver() override;
                     42:        int Read(NetPacket *p) override;
                     43:        void Write(const void *buf, int buflen) override;
                     44: 
                     45:        void MonitorUpdateMD(TextScreen&, int y) override;
                     46: 
                     47:  private:
                     48:        void Close();
                     49: 
                     50:        int txd {};                     // 裏スレッドへの送信ディスクリプタ
                     51:        int rxd {};                     // 裏スレッドからの受信ディスクリプタ
                     52: 
                     53:        std::unique_ptr<SlirpThread> backend /*{}*/;
                     54: 
                     55:        // usermode を使えるのは同時に1人だけに限定する。
                     56:        static bool slirp_occupied;
                     57: };
                     58: 
                     59: // 裏スレッド
                     60: class SlirpThread : public ThreadDevice
                     61: {
                     62:        using inherited = ThreadDevice;
                     63: 
                     64:        // major.minor.patch のバージョン番号を適当に整数にマッピングする。
                     65:        static uint32 VER(uint major_, uint minor_, uint patch_) {
                     66:                return (major_ << 16) + (minor_ << 8) + patch_;
                     67:        }
                     68: 
                     69:  public:
                     70:        explicit SlirpThread(NetDriverSlirp *parent_);
                     71:        ~SlirpThread() override;
                     72: 
                     73:        // 初期化
                     74:        bool InitBackend(const std::string& key, int *rfd, int *tfd);
                     75: 
                     76:        void Close();
                     77:        void Terminate() override;
                     78: 
                     79:        void MonitorUpdate(Monitor *, TextScreen&);
                     80: 
                     81:        // コールバック (C のコールバックから呼ばれるので public)
                     82:        int AddPollCB(int fd, int slevents);
                     83:        int GetReventsCB(int idx);
                     84:        ssize_t SendPacketCB(const void *src, size_t srclen);
                     85:        int64 ClockGetNsCB() const;
                     86:        void *TimerNewCB(void (*)(void *), void *);
                     87:        void TimerFreeCB(SlirpTimer *);
                     88:        void TimerModCB(SlirpTimer *, int64);
                     89:        void GuestErrorCB(const char *);
                     90: 
                     91:  private:
                     92:        void ThreadRun() override;
                     93: 
                     94:        bool ParseAddr(std::string, const char *, struct sockaddr_in *,
                     95:                std::string&) const;
                     96: 
                     97:        void Write();
                     98:        // 一部のパケットをこちらで処理する。
                     99:        bool WriteHook(const std::vector<uint8>&) const;
                    100: 
                    101:        void UpdateInfo();
                    102: 
                    103:        // スレッド終了フラグ
                    104:        bool exit_requested {};
                    105: 
                    106:        // デバッグ用。
                    107:        void DumpHex(const void *, size_t) const;
                    108:        void DumpFrame(const void *, size_t) const;
                    109: 
                    110:        // Slirp ハンドル
                    111:        Slirp *sl {};
                    112: 
                    113:        std::vector<struct pollfd> pollfds {};
                    114: 
                    115:        std::list<SlirpTimer *> timerlist {};
                    116: 
                    117:        std::vector<FwdInfo> fwdinfo {};
                    118: 
                    119:        struct in6_addr gw6 {};
                    120:        struct in6_addr dns6 {};
                    121:        struct in6_addr perfaddr6 {};
                    122: 
                    123:        // 表スレッドとの送信側/受信側パイプ。
                    124:        autofd txd_r {};
                    125:        autofd txd_w {};
                    126:        autofd rxd_r {};
                    127:        autofd rxd_w {};
                    128: 
                    129:        // モニタ表示用の内部テーブル文字列。
                    130:        char *conninfo {};
                    131:        char *nbrinfo {};
                    132:        std::mutex info_mtx {};
                    133: 
                    134:        // タイマーを区別するためのデバッグ用の番号用。
                    135:        int latest_timer_num {};
                    136: 
                    137:        // libslirp のバージョン
                    138:        uint32 ver {};
                    139: 
                    140:        Monitor *monitor {};
                    141: 
                    142:        HostNetDevice *hostnet {};
                    143:        NetDriverSlirp *parent {};
                    144: };

unix.superglobalmegacorp.com

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