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