[pso] Tema5[Linux]Test Number of Rules!

Flucus Andrei andrei.flucus at gmail.com
Mon Jun 9 01:11:57 EEST 2008


Buna ,

Nu pot sa fac sa imi mearga comanda FW_LIST de listarea a regulilor de
filtrare . Se poate sa nu fi inteles corect cerinta respectiva .
 In enuntul temei avem:
  "FW_LIST va primi ca argument o zona de memorie alocate de user in care se
vor pune regulile actuale. Utilizatorul va pune in primul intreg din aceasta
zona numarul de reguli pentru  care a alocat zona. Daca numarul de reguli e
mai mare decat cel specificat de utilizator, driverul trebuie sa puna in
primul intreg din zona pasata de utilizator numarul de reguli si sa intoarca
-ENOSPC. Altfel, driverul va copia regulile in userspace si va intoarce
numarul de reguli copiate."

Eu am inteles din chestia asta ca la apelul comenzi, userul trimite numarul
de reguli pt care a alocat spatiu , iar in kernel se face comparatia intre
numarul de reguli(statice+dinamice) existente si valoarea primita din user
space. Daca avem mai multe reguli decat valoarea citita din user space ,
trimit numarul de reguli  existente si intorc -ENOSPC ,altfel trimit un
pointer la un  buffer unde sunt regulile de filtrare si intorc numarul de
reguli.
Pt chestia asta am modificat putin testul temei:

/*
 * test number of rules in driver; use ipnecklace (list global variable)
 */

static void test_rules (int new_rules)
{
    int x;

    if (dir == DIR_INSIDE) {
        rules += new_rules;
        x = WEXITSTATUS (system (list));      * // aici tot timpul imi
intoarce valoarea 255 pt x *
        printf("No of rules output : x=%d  rules=%d" , x , rules );
        test("no of rules", x == rules);
    }
}


Eu in fct ioctl pt optiunea FW_LIST am ceva de genu :.
 Apelez copy_from_user ca sa citesc numarul de reguli puse de catre
utilizator , valoarea asta o compar cu numarul dereguli de filtrare ,daca e
mai mica , inseamna ca
userul a alocat prea putin spatiu , si fac un copu_to_user in care trimit
numarul de reguli din kernel si intorc -ENOSPC ,altfel apelez un
copy_to_user unde trimit un buffer
in care am regulile de filtrare si intorc numarul de reguli .
Am pus sa-mi afiseze numarul dereguli citite prima data din user space si
acesta este tot timpul 0  care e< nr meu de reguli si prin urmare tot timpul
fct mea intoarce -ENOPSC.

Nu prea am inteles ce se intampla in user space cand se da comanda FW_LIST ,
eu am comentat do while ca sa treaca mai departe sa vad ca merge restul
temei,
    if (strcmp (argv[1], "list") == 0) {
        fwr_t *fwr = NULL;
        int size, i;

//        do {
            size = 0;

            if (ioctl (fd, FW_LIST, &size) < 0 && errno != ENOSPC) {// *aici
ce se intampla mai exact , se trimite numarul de reguli sau se citeste nr de
reguli  ???*
                perror("failed to list rules");
                exit (EXIT_FAILURE);
            }

            printf("Number of rules from kernel is: %i \n" , size);
//*asta am adaugat eu si e 0 tot timpul
*
            if (!fwr)
                free (fwr);

            if (!(fwr = malloc (size * sizeof (*fwr)))) {
                perror ("malloc");
                exit (EXIT_FAILURE);
            }
            * (int*) fwr = size;

            size = ioctl (fd, FW_LIST, fwr);

            if (size < 0 && errno != ENOSPC) {
                perror ("failed to list rules");
                exit (EXIT_FAILURE);
            }
//        } while (size < 0);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://cursuri.cs.pub.ro/pipermail/pso/attachments/20080609/5c915821/attachment.htm 


More information about the pso mailing list