Bonjour,
je voudrais améliorer les performances d' un projet (en C).

le projet permet d'analyser des règles de politique de sécurité réseau;

la version actuelle du projet utilise (Flex et Bison) pour parser un fichier qui contient les règles et initialise une structure de donnée "tab_donnée" qui est une transcription d'une règle

voila le format d'une règle:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
type_de_règle : (addr_src = @ipsrc ) & (addr_dest = @ipdst ) & ( (type_service portinf ... portsup) -> action ;


tel que:
- type_de_regle: (LAN,IN,OUT)
- typeservice: (tcp,http,udp...)
- action: (permit,deny,alert)

exempe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
lan : (addr_src = 192.168.1.1/24) & (addr_dest = 192.168.1.0/20) & ( http 80 ) -> permit ;
et voila la structure de données utilisée:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// structure pour representer adresse ipv4 avec cidr ou sans
typedef struct _addr{
 short egal; // 0 pour representer != ou n'appartient pas, 1 autrement
 struct in_addr addr4;
 struct in6_addr addr6;
 int cidr;
 
 int ipversion;
 
 unsigned long haddr;
 unsigned long hnetmask;
 
} addresse;
 
// structure pour representer port ou plage de ports
typedef struct _port{
 short egal ; // 0 pour representer != ou n'appartient pas, 1 autrement
 long inf;
 long sup;
} port;
 
// structure pour representer reste selon type de protocole (TCP-UDP ou ICMP)
typedef struct s_proto{
        struct s_tcp_udp {
  port port_s;
  port port_d;
  short flags ;
  short egal_flags;
 } tcp_udp;
        struct s_icmp{
  short egal_type;
  short type;
  short egal_code;
  short code;
 } icmp;
} proto_packet;
 
// ligne du tableau pour representer la politique de securite
typedef struct s_tableau {
 unsigned short action;  // permit,deny,alert
 unsigned short proto;   // tcp,udp,http...
     addresse addr_s;    // ip_src
 addresse addr_d;       // ip_dest
 proto_packet proto_protocole;  // reste de protocole (port)
} tab_donnees;
 
typedef struct
{
 tab_donnees **policy_in;    // regle IN
 tab_donnees **policy_out;  // regle OUT
 tab_donnees **policy_lan;  // regle LAN
 
 int policy_in_size; 
 int policy_out_size;
 int policy_lan_size;
} access_policy;
PS: le principe de fonctionnement: les éléments d'une règle (ip_src,ip_dest,protocole,port) sont matchés avec les caractéristiques d'une paquet réseau pour appliquer l'action indiquée dans la règle.


je voudrais convertir cette structure en un "Radix Trie" pour une recherche efficace , car actuellement c'est on a beaucoup de règles, les performances diminues gravement .

si vous avez des idées, aidez moi svp.
merci