[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