Skip to content
HEROBAN-SEL4 NETWORK GATEWAY
🔄مُعاد هيكلتها — ٣٠ يوليو ٢٠٢٦
🌐

حاوية net

بوابة الشبكة الشاملة. استبدلت حاوية tor القديمة وأصبحت تملك مكدس TCP/IP الكامل (smoltcp). Tor بات خياراً برمجياً من داخلها — لا حاوية مستقلة.

🧅TorDefault Mode
📡smoltcpTCP/IP Stack
💾256 KBNET_HEAP
⚙️talcAllocator
📜

سياق الإعادة الهيكلية

كانت حاوية tor القديمة حاويةً مستقلة تتكلم مع بطاقة الشبكة مباشرة ولا تعرف إلا بروتوكول Tor. في ٣٠ يوليو ٢٠٢٦، اتُخذ قرار معماري بدمجها داخل حاوية net الأشمل، والتي تملك الآن بطاقة الشبكة (NIC) وحدها، وتقدم Tor كوضع توجيه قابل للتفعيل عبر رسالة IPC. هذا يسمح مستقبلاً بإضافة اتصال مباشر (Direct) أو بروتوكولات أخرى دون إعادة هيكلة الصلاحيات.

🔀

أوضاع الاتصال (ConnMode)

يُحدد الكود وضعَي اتصال ويُخزّن الحالة محلياً داخل حلقة الخدمة. الافتراضي Tor.

🧅
ConnMode::Tor
وضع Tor (الافتراضي)
  1. Bus_Vault ترسل IPC
  2. Net_Vault تستقبل الطلب
  3. TorState::route_request() يُستدعى
  4. smoltcp يُحدَّث عبر iface.poll()
  5. Circuit يفتح TCP → Entry Node :443
  6. StreamManager يرسل HTTP عبر الدائرة المشفرة
💡 الوضع الافتراضي. يُشغَّل مباشرة عند بدء الحاوية.
🔗
ConnMode::Direct
وضع Direct (Stub)
  1. Bus_Vault ترسل IPC مع mr[0]=0xDE, mr[1]=0
  2. conn_mode تتغير إلى Direct
  3. عند الطلب: iface.poll() فقط
  4. لا يوجد VirtIO حقيقي — TODO في الكود
💡 مُعلَّق حالياً. منصة لدمج VirtIO-NET مستقبلاً.
⚙️

تهيئة Lazy لـ smoltcp

مكدس الشبكة لا يُهيأ عند بدء الحاوية، بل عند وصول أول رسالة IPC. هذا يُقلل من التعقيد في مرحلة الإقلاع.

🦀 Rustcontainers/net/src/main.rs
// وضع الاتصال الافتراضي: Tor
let mut conn_mode = ConnMode::Tor;

receiver.serve(|msg| {
    // ── Lazy Init: تُهيأ smoltcp عند أول رسالة فقط ──
    if !net_init {
        net_init = true;
        let hw_addr = HardwareAddress::Ethernet(
            EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01])
        );
        let mut iface = Interface::new(Config::new(hw_addr), &mut device, Instant::from_millis(0));
        iface.update_ip_addrs(|addrs| {
            let _ = addrs.push(IpCidr::new(IpAddress::v4(10, 0, 2, 15), 24));
        });
        // إضافة TCP Socket بمخازن 2048 بايت
        let tcp_socket = TcpSocket::new(
            SocketBuffer::new(&mut TCP_RX_BUF[..]),
            SocketBuffer::new(&mut TCP_TX_BUF[..]),
        );
    }

    // ── تبديل الوضع عبر IPC (tag=Unknown, mr[0]=0xDE) ──
    match msg.tag {
        MessageTag::Unknown if msg.mr[0] == 0xDE => {
            conn_mode = if msg.mr[1] == 0 { ConnMode::Direct } else { ConnMode::Tor };
        }
        MessageTag::Unknown => {
            match conn_mode {
                ConnMode::Tor    => tor_state.route_request(...),
                ConnMode::Direct => iface.poll(...), // TODO: VirtIO
            }
        }
        _ => IpcMessage::error(1)
    }
})
💻

مخرجات الحاوية الحية

root@heroban:~/net_vault_tty
bash
[Net] Container started — Network hub for seL4-Vault
[Net] IPC ready. Entering serve loop...
─────────────────────────────────────────────
[Net] Initializing smoltcp network interface...
[Net] Network interface ready.
[Net/Tor] Connecting to Entry Node (simulated)...
[Net/Tor] HTTP GET dispatched via Onion Circuit.
_
📦

الاعتماديات الحقيقية (Cargo.toml)

أضخم حاوية من حيث الاعتماديات — تمتلك مكدس شبكة كامل ومكتبات Tor مخصصة.

sel4-sysمحلي

Syscalls للنواة — طباعة وSeL4_Yield في حلقة الذعر.

ipc-syncمحلي

بنية Receiver لحلقة الخدمة (serve loop).

net-driverمحلي

مشغل الشبكة الداخلي — قيد التطوير.

tor-cellمحلي

تمثيل خلايا بروتوكول Tor (OR-Cell).

tor-circuitمحلي

إدارة دوائر Onion Routing المتعددة القفزات.

tor-streamمحلي

مدير تدفقات Tor المتزامنة (StreamManager).

tor-handshakeمحلي

مصافحة التشفير (TAP/ntor Handshake) عند بناء الدائرة.

smoltcp 0.11crates.io

مكدس TCP/IP كامل بـ no_std. يشمل: Ethernet، IPv4، DHCP، TCP sockets.

talc 4crates.io

مخصص ذاكرة ديناميكي بديل لـ bump-alloc. تستهلكه smoltcp لتخصيص بيانات الحزم.

spin 0.9crates.io

Mutex لضمان سلامة الوصول للـ Global Allocator من talc.

📁

توثيق الملفات البرمجية

🌐

src/main.rs

Network Hub
containers/net/src/main.rs
~152 سطر

قلب حاوية net. يُهيئ مكدس smoltcp عند أول طلب IPC (lazy init) ثم يدير حلقة خدمة تقبل وضعَي الاتصال: Direct (جاهز للتوسع لـ VirtIO) وTor (عبر دوائر مشفرة). كلاهما يمر عبر نفس الـ DummyDevice حالياً.

🔍 أهم العناصر
HeapNET_HEAP: [u8; 256 * 1024]
Allocatortalc::ClaimOnOom + AssumeUnlockable
TCP BuffersTCP_RX_BUF / TCP_TX_BUF: [u8; 2048]
IP Address10.0.2.15/24 (QEMU default)
MAC02:00:00:00:00:01 (Fake Static MAC)
Lazy Initnet_init: bool — يُهيأ عند أول رسالة فقط
Default ModeConnMode::Tor (افتراضياً)
🔌

src/network.rs

Device Stub
containers/net/src/network.rs
~63 سطر

يُعرّف DummyDevice — وهو جهاز شبكة وهمي يُلبّي متطلبات smoltcp التجريدية دون إرسال أو استقبال فعلي. receive() تُرجع None دائماً، وtransmit() تُوفّر مخزناً مؤقتاً ثم تتجاهله. هذا هو الجسر المعماري لمشغل VirtIO-NET الحقيقي مستقبلاً.

🔍 أهم العناصر
MTU1500 bytes
MediumEthernet
receive()دائماً None — لا بيانات واردة حالياً
transmit()يوفر buf[1500] ثم يتجاهل البيانات
🧅

src/tor/routing.rs

Onion Router
containers/net/src/tor/routing.rs
~68 سطر

محرك Tor الداخلي. يحتوي على TorState الذي يُغلّف Circuit (دائرة واحدة لـ Circuit::new(1)) وStreamManager. عند استدعاء route_request()، يحاول الاتصال بـ Entry Node (198.51.100.1:443) عبر smoltcp ثم يرسل طلب HTTP عبر القناة المشفرة.

🔍 أهم العناصر
Entry Node IP198.51.100.1:443 (محاكاة)
Local Port10000 (TCP connect)
Circuit IDCircuit::new(1) — دائرة واحدة
Test RequestGET / HTTP/1.1 → example.com:80
📦

src/tor/mod.rs

Module Root
containers/net/src/tor/mod.rs
~8 سطر

وحدة Tor تُعرّف routing كـ submodule. هي بسيطة وصريحة: "Tor هو خيار اتصال داخل net، وليست حاوية مستقلة بعد الآن."

🔍 أهم العناصر
Modulepub mod routing

جميع الحقوق محفوظة © 2026 Qtoom