• Apparati e reti
  • Come programmare [N.B. NON configurare] un router o altre CPE?

Ciao a tutti,

Seguo il forum da anni, ma è la prima volta che scrivo. Di questi argomenti sono assolutamente un neofita e spero che la domanda sia comprensibile e (soprattutto) sensata.

Fatta questa premessa e in base a quel che capito, su ogni apparato configurabile da parte dell'utente è presente un software/firmware. Ecco, come funziona la sua programmazione? Che linguaggi vengono usati? Quali procedure?

Grazie mille in anticipo a chi mi schiarirà un minimo le idee

    ErmesPalinsesto Fatta questa premessa e in base a quel che capito, su ogni apparato configurabile da parte dell'utente è presente un software/firmware. Ecco, come funziona la sua programmazione? Che linguaggi vengono usati? Quali procedure?

    Qui trovi tutto: https://openwrt.org (https://github.com/openwrt/openwrt)

    Il kernel è Linux (https://github.com/torvalds/linux)

    praticamente a questo livello è tutto C puro.

    eutampieri mmm...lo dici per assurdo o effettivamente ci sono CPE su cui vengono fatte girare applicazioni oltre al firmware scritto in C?

      ErmesPalinsesto su openwrt essendo Linux ci puoi fare girare quello che vuoi. Da qui a dire che sia utile/da fare ce ne passa

      ErmesPalinsesto Di base, qualsiasi sistema operativo (inteso come pacchetto software che sovraintende i vari programmi) è programmato in C (anche in assembler ma non mi dilungo su questo) essendo il linguaggio "moderno" (aggiornato/supportato sarebbe quasi più consono) più vicino al linguaggio macchina. Una volta che hai creato le tue syscalls (ed una API facendo in modo di controllare meglio come esse vengono usate) puoi svilupparci sopra utilizzando linguaggi più ad alto livello.

      Ovviamente un router è, nella maggioranza dei casi d'uso domestici, un dispositivo a bassa potenza che richiede un sistema operativo leggero in quanto la maggior parte del tempo CPU deve essere assegnata al routing dei pacchetti.

      Detto questo, quando hai finito di scrivere un firmware (che includa algoritmi altamente efficienti, specie se si parla di un router con poca potenza) puoi svilupparci sopra un web server o qualsivoglia tipo di interfaccia (telnet, ssh, ecc...) utilizzando linguaggi ad alto livello.

      E questo non tiene conto delle varie architetture diverse per le CPU usate nei ruoter (x86/x64, ARM, MIPS, ecc...) e dei vari compilatori, dei driver per i vari chip che, specialmente se parti da zero, dovrai scrivere te. E' un lavoro incredibilmente complicato, che un solo sviluppatore potrebbe impiegarci anni per finire.

      Se vuoi programmare qualcosa su un router, prendilo bello potente e con software basati su soluzioni con una fondazione solida, altrimenti meglio non cimentarsi in queste operazioni...

      Ovviamente non mi sono soffermato sui dettagli, ma come generalizzazione credo vada bene.

      • [cancellato]

      ErmesPalinsesto Oltre a C, ci sono altri linguaggi in cui si può programmare un sw/fw per router? Non so...PHP, Python, etc

      In teoria ogni linguaggio con un compilatore in grado di generare il codice macchina per l’architetturale target è usabile - però poi ci vuole tutto uno stack software a partire dal bootloader per caricare il codice, il kernel con i suoi driver, ecc. e con le librerie necessarie per scrivere questo tipo di codice. I linguaggi scripted di alto livello come PHP o Python, o anche linguaggi P-Code come Java e .NET (anche se con JIT) sono stati pensati per altri usi e non hanno tipicamente a disposizione quanto necessario, specialmente per applicazione commerciali (a volte si trovano implementazioni più o meno sperimentali per uso a più basso livello).

      Per motivi storici i linguaggio più utilizzato per tutta la parte kernel, driver e sistema operativo è il C, a volte con parti scritte in C++, qualcosa a volte se necessario direttamente anche in assembler (che però non è portabile), raramente in altri linguaggi, anche se oggi c'è un certo interesse a usare Rust per la sua inerente maggior sicurezza rispetto al C, ma comunque in grado di generare il codice necessario.

      Sopra di questo è possibile vedere anche parti realizzate in PHP, Python o altro, specialmente per le interfacce web e altro codice "glue" fra i vari applicativi, che richiedono però la messa a disposizione dei propri ambienti di esecuzione. Più facile trovarli su sistemi router più complessi destinati a funzionare su macchine con più risorse a disposizione (es. pfSense) che su sistemi router con meno risorse hardware (CPU, memorie RAM e di massa) che tendono a minimizzare il codice necessario e compilare tutto in unico firmware.

        [cancellato] Grazie mille, spiegazione davvero chiarissima. E hai centrato il punto (ma sono io che sono stato lacunoso in principio): non chiedevo info per iniziare io a programmare un router, ma per capire meglio come funzioni in contesti commerciali (provider, insomma). Proprio di questo uso "a basso livello" mi hanno parlato, ma non sono ancora riuscito a capire la differenza concreta, ad es., fra programmare in PHP ad alto livello (web, API) e a basso livello. Alla fine si usano sempre Laravel e Symfony o dico una cavolata?

          • [cancellato]

          ErmesPalinsesto non chiedevo info per iniziare io a programmare un router, ma per capire meglio come funzioni in contesti commerciali (provider, insomma)

          Mi sa che devi dare qualche informazione in più sul contesto che ti interesse specificatamente.

          ErmesPalinsesto ma non sono ancora riuscito a capire la differenza concreta, ad es., fra programmare in PHP ad alto livello (web, API) e a basso livello. Alla fine si usano sempre Laravel e Symfony o dico una cavolata?

          Sia Lavarel che Symphony AFAIK sono dei framework che incapsulano una serie di task di programmazione standard per semplificare la vita al programmatore web. Il "routing" di Lavarel non ha nulla a che fare con il "routing" TCP/IP, stesso termine per indicare cose diverse.

          Con PHP; Python & C (ma anche con altri linguaggi, C incluso) puoi partire da zero utilizzando il minimo necessario per interagire con l'ambiente sottostante - che è quello che si intende di solito per programmazione "a basso livello" - o usare framework che implementano già gran parte delle routine necessarie per i compiti più comuni così da potersi concentrare solo sull'applicazione, evitando le minuzie di interazione con gli strati più bassi.

          Evidentemente in C (e altri linguaggi compilati in codice macchina) "basso livello" può significare persino al livello della CPU stessa, in altri casi può essere il livello del sistema operativo o dell'interprete - di solito ad esempio anche nei linguaggi scripted ci sono dei metodi per poter chiamare direttamente delle API con ABI (Application Binary Interface) C standard.

            [cancellato] ci sarebbe da fare un discorso sull'astrazione, che è il concetto fondamentale che separa un linguaggio di alto livello da uno a un livello più basso. Quando si inizia a capirlo si incomincia a realizzare come funzionano una stragrande maggioranza di sistemi informatici.

            ErmesPalinsesto Alla fine si usano sempre Laravel e Symfony o dico una cavolata?

            Il Routing lato web Application è completamente diverso da quello lato router 🙄

              simonebortolin Sono noob, ma non fino a questo punto. 😂
              Rispondendo anche a [cancellato], mi hanno parlato di sviluppo "a basso livello" in ambito reti o CPE (non ho capito con precisione, sinceramente) con PHP (e nel discorso è uscito fuori anche Python). Quindi mi stavo chiedendo com'è che un provider possa concretamente adoperare PHP sulle sue reti o i suoi CPE.

              Perché io di base sapevo che su una CPE girasse un firmware (e quindi sì, avete ragione, SW Embedded...C o C++, non se ne scappa). Quello della programmazione applicata alle telecomunicazioni è un campo in cui ho solo alcune nozioni parziali, quindi vado un po' a tentoni.

              Comunque vi ringrazio per avermi chiarito diversi punti teorici fondamentali per orientarsi in ambito sviluppo SW e, almeno, non usare le parole a caso. 😁

                ErmesPalinsesto Python e PHP sono entrambi interpretati, quindi non li definirei assolutamente a basso livello.

                Poi una generica CPE può pure avere OpenWRT, e a quel punto visto che ci gira Linux puoi anche metterci server in PHP per esempio.

                ErmesPalinsesto premetto che in entrambi i casi hai citato tu sia PHP che laravel

                ErmesPalinsesto fra programmare in PHP ad alto livello (web, API) e a basso livello. Alla fine si usano sempre Laravel e Symfony o dico una cavolata?

                ErmesPalinsesto Oltre a C, ci sono altri linguaggi in cui si può programmare un sw/fw per router? Non so...PHP, Python, etc

                La risposta di @[cancellato] è da interpretare come tutto è possibile ma nessuno lo fa, php viene usato per sviluppare principalmente web Application in modo un po' al quanto acrocchioso... Niente divisione formale tra get e post se non tramite framework di dubbia utilità, niente routing se non tramite i parametri get dell'url, gestione discutibile su molte cose....

                Oltre che dubito la presenza di codice php per fare routing a livello tcp/ip...anche per esempio la gestione delle immagini su php viene sempre delegata a framework come imagemagik o simili...

                Mentre per python o script bash questo è già più plausibile si usa c/c++ per fare i core (per esempio nat44, nat64, nat66, ipip, ipip6, ip6ip...)
                E poi si lasciano script bash o python per la creazione nel kernel delle interfaccie e la creazione di regole nel firewall ecc...

                In generale nelle telecomunicazioni si usa solo C, raramente Rust (di cui ammiro la sua gestione più safety della memoria, ma non su un linguaggio di così basso livello...) o C++

                Sarò forse della vecchia scuola ma ritengo che ogni linguaggio ha uno scopo, e non bisogna fare tutto con uno o tutto con un altro o ancora peggio forzare un linguaggio a non fare quello che deve fare (per esempio ritengo che la gestione safe della memoria si può fare con linguaggi che supportano una gestione delle eccezioni ad alto livello come java e c#, non con quella di c/c++/rust) come non vedo di buon occhio una gestione delle web Application senza la minima gestione separata dei metodi get e post e lasciar fare tutto a $_request....

                  • [cancellato]

                  ErmesPalinsesto mi hanno parlato di sviluppo "a basso livello" in ambito reti o CPE (non ho capito con precisione, sinceramente) con PHP (e nel discorso è uscito fuori anche Python).

                  Dipende cosa si intende per "basso livello". Se prendiamo ad esempio OpenStack c'è molto Python - e a seconda da che parte lo guardi OpenStack può essere "basso livello" oppure no. Se lo guardi dal punto di vista delle applicazioni cloud OpenStack è il livello "basso", certo che se lo guardi dal punto di vista dell'hardware è il livello in alto.

                  Riguardo alle CPE bisogna vedere di che CPE si parta ed il contesto - se è il software per le interfacce web a bordo, o magari il software di gestione lato ISP (o anche controller on-premises stile Ubiquiti e altri). Con le CPU adeguate nulla vieta di avere un interprete PHP per l'interffaccia web, sicuramente permette interfacce più sofisticate, c'è poi l'interrogativo sicurezza dato che si amplia la superficie di attacco, e senza aggiornamenti firmware frequenti può essere un rischio maggiore.

                  • [cancellato]

                  simonebortolin non con quella di c/c++/rust

                  In realtà Rust è nato esattamente per fare quello. Si può tranquillamente fare, e ci sono altri linguaggi compilati più safe persino prima di Rust ma che non sono diventati di moda. java e .NET sono un altro paio di maniche e tipicamente inefficienti nella gestione delle memoria causa GC.

                  Il problema di C (e in parte anche C++) è la "sacralità" che ha attorniato il linguaggio e ha impedito qualsiasi evoluzione sensata, nonostante i bug clamorosi che permette di introdurre e che continuiamo a pagare. L'affermazione che non si può perché è "il più vicino alla CPU" non vale da tempo visto che le ottimizzazioni che fanno i compilatori, e quello che fanno le pipeline delle CPU quando traducono le istruzioni da eseguire nel loro formato interno. Valeva forse 50 anni fa quando le CPU e i compilatori erano molto più semplici, e gli altri linguaggi erano Fortran, COBOL e Lisp.

                    [cancellato] In realtà Rust è nato esattamente per fare quello. Si può tranquillamente fare, e ci sono altri linguaggi compilati più safe persino prima di Rust ma che non sono diventati di moda. java e .NET sono un altro paio di maniche e tipicamente inefficienti nella gestione delle memoria causa GC.

                    Vedi come hai ben detto, ma hai tralasciato che la gestione "safe" della memoria in Rust è semplicemente l'aggiunta di controlli in fase di compilazione alla fine dello scope delle variabili eliminandole... Questo aumenta un casino i tempi di compilazione e si può fare pure più o meno ovunque.

                    La gestione safe della memoria però non è solo questo, ci sono comunque da controllare la gestione degli accesso in memoria, l'accesso ad array fuori da indici, array dinamici ecc... cosa che rust non implementa così bene

                    Concordo che nei linguaggi ad alto livello come java e .NET sono controllati da un GC, che non lo reputo mai da implementare in un livello a basso livello come C/C++. Però almeno c'è una gestione realmente safe.

                    [cancellato] io personalmente non sono d'accordo con questo. C'è questa sacralità di cui parli sul C, ma un linguaggio del genere non ha bisogno di evoluzioni proprio grazie all'enorme lavoro di ottimizzazione che il compilatore svolge; aggiungere nuove feature complica il processo e tra l'altro potrebbe risultare pure controproducente (vedi C++, che ha così tante feature in più da non essere mai stato considerato un superset e da risultare fastidiosamente convoluto). Avere questo tipo di stabilità nel linguaggio ed implementazione credo sia ormai la feature più importante del C più che le altre.

                      Mattoz Il problema è uno ed uno solo è un linguaggio che non ha la gestione moderna della memoria. Puntatori, accessi in array, .... tutto di tipo troppo vecchio.

                        Informativa privacy - Informativa cookie - Termini e condizioni - Regolamento - Disclaimer - 🏳️‍🌈
                        P.I. IT16712091004 - info@fibraclick.it

                        ♻️ Il server di questo sito è alimentato al 100% con energia rinnovabile