FreeBSD networking question

ithilgore advent.cloud.strife at gmail.com
Fri Feb 1 11:53:45 EET 2008


Giorgos Keramidas wrote:
> Καλησπέρα,
>
> Πήρα και το προσωπικό email, αλλά λόγω μικρής προτεραιότητας δεν πρόλαβα
> να σου απαντήσω πιο πριν :/
>
> On 2008-01-31 21:36, ithilgore <advent.cloud.strife at gmail.com> wrote:
>   
>> Kalhspera,
>> thelw na asxolh8w me ta networking internals tou FreeBSD (kai giati
>> oxi genika twn *BSD) gia peraiterw emba8unsh ston tomea tou low level
>> networking kai 8a h8ela merikes sumboules :
>>
>> 1) Exw ksekinhsei na diabazw to tcp-ip illustrated volume 2 (stevens) 
>> alla anaferetai se sxetika palio implementation (4.4 BSD-Lite) pou
>> shmainei oti afenos o kwdikas stis teleutaies dianomes einai safws pio
>> periplokos kai pio megalos,
>>     
>
> Από καλό βιβλίο ξεκίνησες, πάντως.  Μετά το ``TCP/IP Illustrated, Vol. I
> και II'', ίσως έχει νόημα να δεις και το ``The Design & Implementation
> of the FreeBSD Operating System''[1].  Είναι βασισμένο στο αρχικό
> ``Design & Implementation of the 4.4BSD Operating System'', και ο Kirk
> McKusick είναι πάλι στους συγγραφείς.
>
> [1] http://www.amazon.com/Design-Implementation-FreeBSD-Operating-System/dp/0201702452
>
> Τώρα, σχετικά με τις διαφορές που έχει ένα πρόσφατο FreeBSD source tree
> από το αρχικό kernel που σχολιάζει ο Stevens στα TCP/IP volumes, ίσως
> έχει νόημα να διαβάζεις τον κώδικα από το FreeBSD 4.X *πριν* τις αλλαγές
> που έγιναν για SMP support στον πυρήνα.
>
> Το FreeBSD 4.X kernel χρησιμοποιεί τα ίδια splnet() και splxxx() calls
> που περιγράφει ο Stevens για συγχρονισμό μεταξύ διαφόρων «ISR levels»
> (ISR: interrupt service request).  Ο κώδικας έχει όντως διαφορές από το
> 4.4BSD -- είναι λογικό να υπάρχουν αλλαγές σχεδόν μιας δεκαετίας σε ένα
> πυρήνα που συνεχώς εξελισσόταν από τότε που έγινε το αρχικό CVS import
> του CSRG κώδικα στο CVS tree του FreeBSD.
>
> Στο 4.X όμως βοηθάει ιδιαίτερα το ότι δεν υπάρχουν καθόλου τα διάφορα
> commits που έγιναν για SMP support.  Δεν έχω μπροστά μου το TCP/IP Ill.
> Vol 2 (κάπου το έχω δανείσει πάλι), αλλά ακόμα και από μια και μόνο
> function φαίνεται ότι είναι πιο «απλός» ο κώδικας στο 4.X.  Στο τρέχον
> RELENG_4 branch το αρχείο src/sys/netinet/tcp_usrreq.c έχει το εξής:
>
>     146 /*
>     147  * pru_detach() detaches the TCP protocol from the socket.
>     148  * If the protocol state is non-embryonic, then can't
>     149  * do this directly: have to initiate a pru_disconnect(),
>     150  * which may finish later; embryonic TCB's can just
>     151  * be discarded here.
>     152  */
>     153 static int
>     154 tcp_usr_detach(struct socket *so)
>     155 {
>     156         int s = splnet();
>     157         int error = 0;
>     158         struct inpcb *inp = sotoinpcb(so);
>     159         struct tcpcb *tp;
>     160         TCPDEBUG0;
>     161
>     162         if (inp == 0) {
>     163                 splx(s);
>     164                 return EINVAL;  /* XXX */
>     165         }
>     166         tp = intotcpcb(inp);
>     167         TCPDEBUG1();
>     168         tp = tcp_disconnect(tp);
>     169
>     170         TCPDEBUG2(PRU_DETACH);
>     171         splx(s);
>     172         return error;
>     173 }
>
> Πρόσεξε ότι όντως χρησιμοποιεί τις ίδιες κλήσεις που περιγράφει ο
> Stevens για αμοιβαίο αποκλεισμό μεταξύ των networking calls που
> χειρίζονται τα TCP sockets: splnet() και splx().
>
> Ο αντίστοιχος κώδικας στο 8.0-CURRENT, σήμερα, είναι:
>
>     241 /*
>     242  * pru_detach() detaches the TCP protocol from the socket.
>     243  * If the protocol state is non-embryonic, then can't
>     244  * do this directly: have to initiate a pru_disconnect(),
>     245  * which may finish later; embryonic TCB's can just
>     246  * be discarded here.
>     247  */
>     248 static void
>     249 tcp_usr_detach(struct socket *so)
>     250 {
>     251         struct inpcb *inp;
>     252
>     253         inp = sotoinpcb(so);
>     254         KASSERT(inp != NULL, ("tcp_usr_detach: inp == NULL"));
>     255         INP_INFO_WLOCK(&tcbinfo);
>     256         INP_LOCK(inp);
>     257         KASSERT(inp->inp_socket != NULL,
>     258             ("tcp_usr_detach: inp_socket == NULL"));
>     259         tcp_detach(so, inp);
>     260         INP_INFO_WUNLOCK(&tcbinfo);
>     261 }
>
> Οι κλήσεις splnet() και splx() έχουν αντικατασταθεί από πιο fine-grained
> locks (βλ. INP_INFO_WLOCK(), INP_LOCK() και INP_INFO_WUNLOCK() κλήσεις
> παραπάνω), αλλά αυτό κάνει τον κώδικα να είναι σημαντικά διαφορετικός
> από αυτό που περιγράφει ο Stevens πλέον.
>
> Κι αυτό για μια _πολύ_ απλή συνάρτηση, όπως η pr_usrreqs.pru_detach().
>
> Μπορείς να φανταστείς εύκολα ότι οι διαφορές σε συναρτήσεις με πολύ
> μεγαλύτερο μέγεθος ίσως να κάνουν το FreeBSD 8.0-CURRENT λίγο πιο
> δύσκολο στην κατανόηση, αν προσπαθείς να διαβάσεις το Stevens και να
> βρεις που υλοποιείται κάτι.
>
> Γι αυτό, η δική μου συμβουλή είναι:
>
>   (α) Διάβασε όντως το Stevens, αλλά
>
>   (β) Αν κοιτάς και τον κώδικα ταυτόχρονα, χρησιμοποίησε το FreeBSD
>       RELENG_4 branch (το τελευταίο 4.X release).
>
>   
>> einai sxetika duskolo na brw kapoia palia version pou na uposthrizei
>> to networking code tou 4.4 bsd-lite me liges allages.  (To pio kontino
>> pou brhka htan to FreeBSD 2.0.5).
>>     
>
> Το FreeBSD 2.0.5 ίσως να είναι λίγο δύσκολο έως αδύνατον να τρέξει σε
> μοντέρνο hardware (π.χ. λόγω ACPI, plug & play devices, disk controller
> & motherboard chipset support, κλπ.).
>
>   
>> 2) Pio 8a htan to endedeigmeno approach gia na ksekinhsei kaneis to 
>> megalo auto journey tou na asxolh8ei me ta internals (estw kai enos 
>> merous tous) enos axanous se ektash susthmatos ?
>>
>> 3) Epipleon references/phges pou 8a boh8ousan sto sugekrimeno zhthma ?
>>     
>
> Συνήθως βοηθάει το να έχεις κάποιο συγκεκριμένο στόχο, π.χ.:
>
>     θέλω να βρω πώς υλοποιούνται τα flags ενός network interface, και να
>     προσθέσω στην ifconfig(8) τη δυνατότητα να τυπώνει ένα flag του στυλ:
>
>     ath0: flags=8802<UP,KERAMIDA,BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
>
> Αν βρεις πως γίνεται να υλοποιηθεί το flag «KERAMIDA» στον πυρήνα, ως
> network interface property, πως αποθηκεύεται στη λίστα με τα interface
> flags, πώς μπορεί η ifconfig να το ελέγξει από userlevel, και τέλος πώς
> να το τυπώσει όταν δίνεται:
>
> 	ifconfig ath0
>
> Θα έχεις μάθει ένα από τα βασικά κομμάτια του kernel & userland
> interface: τον τρόπο με τον οποίο υλοποιείται ένα driver-independent
> flag για τα interfaces.
>
> Με τέτοια «mini-projects» θα μπορείς να εμβαθύνεις σε *λίγα* κομμάτια
> του networking κάθε φορά, χωρίς να χρειάζεται να «γίνεις guru για τα
> πάντα σε 21 μέρες» ή κάτι τέτοιο απίστευτο.
>
> Μερικά άλλα πράγματα που βοηθάνε αρκετά είναι:
>
>   * Ρώτα στη freebsd-net λίστα.  Οι άνθρωποι που γράφουν εκεί έχουν
>     πολλή περισσότερη εμπειρία από εμένα,και θα σε βοηθήσουν σίγουρα με
>     καλύτερο τρόπο
>
>   * Βρες από το bug database κάποια εύκολα bugs, και προσπάθησε να δεις
>     αν μπορείς να καταλάβεις:
>
>       - γιατί είναι bugs
>
>       - γιατί μπορεί να συμβαίνει αυτό το bug
>
>       - πώς θα μπορούσε να φτιαχτεί
>
>     Ότι κάνεις, μπορείς να το στέλνεις και στο bug database.  Αν είναι
>     όντως καλή δουλειά, έτσι θα έχει πιθανότητες να ενσωματωθεί και στο
>     ίδιο το FreeBSD.
>
> Αυτά από εμένα, γι αρχή.
>
> Καλό διάβασμα, και κυρίως...  Happy hacking :)
>
>
>   
Euxaristw gia thn katatopistikh auth apanthsh!

ithilgore




More information about the Linux-greek-users mailing list