Do spisu tresci tematu 9
Inicjalizacja protokolow
Spis tresci
Poziom socket.c
Przed lektura tego dokumentu warto zapoznac sie z kilkoma
definicjami.
W pliku socket.c mamy funkcje
void sock_init(void)
{
int i;
printk(KERN_INFO "Swansea University Computer Society \
NET3.035 for Linux 2.0\n");
/* Interesujaca nas linia nr 1 */
/* dopiero bedziemy rejestrowac protokoly */
for (i = 0;i < NPROTO; ++i) pops[i] = NULL;
*************************************************************
Tutaj nastepuja ujete w klamry #ifdef...#endif wywolania procedur
inicjalizujacych m.in. netlink, system firewall .
**************************************************************
/* Interesujaca nas linia nr 2
* Procedura opisana dalej
*/
proto_init();
/* dalej jest jeszcze pare rzeczy,pominalem */
}
Funkcja proto_init
void proto_init(void)
{
extern struct net_proto protocols[]; /* rodziny protokolow */
struct net_proto *pro;
/* Kick all configured protocols. */
pro = protocols;
while (pro->name != NULL)
{
(*pro->init_func)(pro); /* interesuja nas
/* inet_proto_init z af_inet.c
/* lub unix_proto_init z af_unix.c
pro++;
}
/* Koniec inicjalizowania. */
}
Funkcja sock_register
int sock_register(int family, struct proto_ops *ops)
{
int i;
cli();
for(i = 0; i < NPROTO; i++)
{
/* Szukamy wolnego miejsca */
if (pops[i] != NULL)
continue;
/* Wstawiamy w wolne miejsce strukture proto_ops */
pops[i] = ops;
pops[i]->family = family;
sti();
return(i);
}
/* Nie ma miejsca w tabeli */
sti();
return(-ENOMEM);
}
Poziom rodzin protokolow
Funkcja inet_proto_init
void inet_proto_init(struct net_proto *pro)
{
struct inet_protocol *p;
int i;
printk("Swansea University Computer Society TCP/IP for NET3.034\n");
/*
* Rejestrujemy protokol internetu w tabeli pops
*/
(void) sock_register(inet_proto_ops.family, &inet_proto_ops);
seq_offset = CURRENT_TIME*250;
/*
* Dodajemy protokoly internetu.
* Sa trzymane w tablicy inet_protos
. (protocol.c) Do operacji na niej
* uzywane jest hashowanie, kluczem jest pole protocol struktury
* inet_protocol
*/
for(i = 0; i < SOCK_ARRAY_SIZE; i++)
{
tcp_prot.sock_array[i] = NULL;
udp_prot.sock_array[i] = NULL;
raw_prot.sock_array[i] = NULL;
}
tcp_prot.inuse = 0;
tcp_prot.highestinuse = 0;
udp_prot.inuse = 0;
udp_prot.highestinuse = 0;
raw_prot.inuse = 0;
raw_prot.highestinuse = 0;
printk("IP Protocols: ");
/* inet_protocol_base to wskaznik na liste zawierajaca
struktury icmp_protocol,udp_protocol,tcp_protocol i opcjonalnie
ipip_protocol ( zdefiniowane w protocol.c )
*/
for(p = inet_protocol_base; p != NULL;)
{
struct inet_protocol *tmp = (struct inet_protocol *) p->next;
/* wstawiamy do tablicy inet_protos */
inet_add_protocol(p);
printk("%s%s",p->name,tmp?", ":"\n");
p = tmp;
}
/*
* Wywolujemy procedure inicjalizacji ARP
*/
arp_init();
/*
* ... IP
*/
ip_init();
/*
* ... warstwe ICMP
*/
icmp_init(&inet_proto_ops);
/* Nastepnie tworzymy w proc-filesystemie odpowiednie pliki dotyczace
statystyk uzycia sieci ,tutaj pominiete*/
}
Funkcja unix_proto_init
void unix_proto_init(struct net_proto *pro)
{
/* W dziedzinie unixa nie ma protokolow;inicjalizujemy tylko /proc
printk(KERN_INFO "NET3: Unix domain sockets 0.12 for Linux NET3.035.\n");
sock_register(unix_proto_ops.family, &unix_proto_ops);
/* Opcjonalnie tworzymy plik w /proc */
#ifdef CONFIG_PROC_FS
proc_net_register(&(struct proc_dir_entry) {
PROC_NET_UNIX, 4, "unix",
S_IFREG | S_IRUGO, 1, 0, 0,
0, &proc_net_inode_operations,
unix_get_info
});
#endif
}
Bibliografia
- Zrodla kernela Linuxa 2.0.0 +
Linux Navigator
- W. Stevens "Programowanie zastosowan sieciowych"
Autor: Rafal Wojtczuk