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


  1. Zrodla kernela Linuxa 2.0.0 + Linux Navigator
  2. W. Stevens "Programowanie zastosowan sieciowych"

Autor: Rafal Wojtczuk