root/trunk/src/renetcolAgg.c @ 154

Revision 154, 39.3 KB (checked in by andreu, 11 years ago)

Typo correction and copyright update

  • Property svn:eol-style set to native
Line 
1/*
2 * File: renetcolAgg.c
3 *
4 * Authors: ANDREU Francois-Xavier
5 *
6 * Copyright (C) 2007-2011 GIP RENATER
7 */
8
9/*  This file is part of renetcol.
10 *
11 *  renetcol is free software; you can redistribute it and/or modify
12 *  it under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation; either version 2 of the License, or
14 *  (at your option) any later version.
15 *
16 *  renetcol is distributed in the hope that it will be useful,
17 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 *  GNU General Public License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with renetcol; if not, write to the Free Software
23 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24 */
25
26/*
27 * In this file, I use directly the C rrd librairy to create and update
28 * the rrd files which contain the statistique for each subnet.
29 * When your system is too fast and the number of your subnet too big
30 * (> 1024), the create and update process can be too fast and before the
31 * end of creation. So the maximum number of files which can be opened for one
32 * process in the same time is reached and we must temporize.
33 */
34
35#include "renetcolAgg.h"
36
37struct SHMForAgg *shmForAgg;
38
39int
40main(int argc, char *argv[])
41{
42  int shmid;
43  int i, j, k = 0;
44  int index = 1;
45  int rrd_update_er_ct = 0;
46  int rrd_update_ok_ct = 0;
47  int rrd_already_created_ct = 0;
48  int rrd_create_er_ct = 0;
49  int rrd_create_ok_ct = 0;
50  int isFirstUpdate = 1;
51  key_t key;
52  static char buf[2048];
53  static char name[2048];
54  static char ipStr[24];
55#ifdef IPV6LINKAGG
56  static char ipv6LinkStr[40]; /* 10_0_0_1_20_136 <router address> + <sampling> + <SNMP index> */
57#endif
58#if defined(MATRIX) && defined(IPV4AGGIDR)
59  static char indexStr[24];
60#endif
61  static char asStr[7];
62  static char createstr[2048];
63  char *opt[27];
64  char *optUpdate[3];
65  FILE *fp;
66  static time_t now, now2;
67 
68  key = 8765;
69  if ((shmid = shmget(key, SHMSIZE, 0666)) < 0) {
70    perror("shmget");
71    exit(1);
72  }
73  if ((shmForAgg = (struct SHMForAgg *)shmat(shmid, (void *)0, 0)) == (void *) -1) {
74    perror("shmat");
75    exit(1);
76  }
77 
78  fprintf(stderr, "renetcolAgg: I become a deamon, next messages via syslogd. Bye.\n");
79  if (fork () != 0)
80    exit (0);
81  if (setsid() == -1){
82    exit(4);
83  }
84 
85  do {
86    if (shmForAgg->readed == 1) {
87      shmForAgg->readed = 0;
88      if (shmForAgg->currentTable == 0) {
89        index = 1;
90      }else{
91        index = 0;
92      }
93      now = time((time_t *)NULL);
94      if (isFirstUpdate == 0) {
95        /* RRD ACCOUNTING for prefixV4Tab */
96        for (i=0; i<shmForAgg->v4PrefixNb; i++){
97          /* HERE create or update RRD FILE */
98          if (shmForAgg->prefixV4Tab[index][i].sampling != 0) {
99            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
100            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
101            for (j=0; j<strlen(ipStr); j++) {ipStr[j] = '\0';}
102            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
103            strcat(name, PREFIX_RRD_LOCATION);
104            sprintf(ipStr, "%lu_%lu_%lu_%lu_%hu_%lu",
105                    shmForAgg->prefixV4Tab[index][i].beginning>>24,
106                    shmForAgg->prefixV4Tab[index][i].beginning<<8>>24,
107                    shmForAgg->prefixV4Tab[index][i].beginning<<16>>24,
108                    shmForAgg->prefixV4Tab[index][i].beginning<<24>>24,
109                    shmForAgg->prefixV4Tab[index][i].mask,
110                    shmForAgg->prefixV4Tab[index][i].sampling
111                    );
112            strcat(name, ipStr);
113            strcat(name, RRD_EXTENSION);
114            if ( (fp=fopen(name,"r")) == NULL ){
115              opt[0]= (char *) malloc((strlen(RRD_PARAM_PREFIX_0) + 1) * sizeof(char));
116              strcpy(opt[0], RRD_PARAM_PREFIX_0);
117              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
118              strcpy(opt[1], name);
119              opt[2]= (char *) malloc((strlen(RRD_PARAM_PREFIX_1) + 1) * sizeof(char));
120              strcpy(opt[2], RRD_PARAM_PREFIX_1);
121              opt[3]= (char *) malloc((strlen(RRD_PARAM_PREFIX_2) + 1) * sizeof(char));
122              strcpy(opt[3], RRD_PARAM_PREFIX_2);
123              opt[4]= (char *) malloc((strlen(RRD_PARAM_PREFIX_3) + 1) * sizeof(char));
124              strcpy(opt[4], RRD_PARAM_PREFIX_3);
125              opt[5]= (char *) malloc((strlen(RRD_PARAM_PREFIX_4) + 1) * sizeof(char));
126              strcpy(opt[5], RRD_PARAM_PREFIX_4);
127              opt[6]= (char *) malloc((strlen(RRD_PARAM_PREFIX_5) + 1) * sizeof(char));
128              strcpy(opt[6], RRD_PARAM_PREFIX_5);
129              opt[7]= (char *) malloc((strlen(RRD_PARAM_PREFIX_6) + 1) * sizeof(char));
130              strcpy(opt[7], RRD_PARAM_PREFIX_6);
131              opt[8]= (char *) malloc((strlen(RRD_PARAM_PREFIX_7) + 1) * sizeof(char));
132              strcpy(opt[8], RRD_PARAM_PREFIX_7);
133              opt[9]= (char *) malloc((strlen(RRD_PARAM_PREFIX_8) + 1) * sizeof(char));
134              strcpy(opt[9], RRD_PARAM_PREFIX_8);
135              opt[10]= (char *) malloc((strlen(RRD_PARAM_PREFIX_9) + 1) * sizeof(char));
136              strcpy(opt[10], RRD_PARAM_PREFIX_9);
137              opt[11]= (char *) malloc((strlen(RRD_PARAM_PREFIX_10) + 1) * sizeof(char));
138              strcpy(opt[11], RRD_PARAM_PREFIX_10);
139              opt[12]= (char *) malloc((strlen(RRD_PARAM_PREFIX_11) + 1) * sizeof(char));
140              strcpy(opt[12], RRD_PARAM_PREFIX_11);
141              opt[13]= (char *) malloc((strlen(RRD_PARAM_PREFIX_12) + 1) * sizeof(char));
142              strcpy(opt[13], RRD_PARAM_PREFIX_12);
143              opt[14]= (char *) malloc((strlen(RRD_PARAM_PREFIX_13) + 1) * sizeof(char));
144              strcpy(opt[14], RRD_PARAM_PREFIX_13);
145              opt[15]= (char *) malloc((strlen(RRD_PARAM_PREFIX_14) + 1) * sizeof(char));
146              strcpy(opt[15], RRD_PARAM_PREFIX_14);
147              opt[16]= (char *) malloc((strlen(RRD_PARAM_PREFIX_15) + 1) * sizeof(char));
148              strcpy(opt[16], RRD_PARAM_PREFIX_15);
149              opt[17]= (char *) malloc((strlen(RRD_PARAM_PREFIX_16) + 1) * sizeof(char));
150              strcpy(opt[17], RRD_PARAM_PREFIX_16);
151              opt[18]= (char *) malloc((strlen(RRD_PARAM_PREFIX_17) + 1) * sizeof(char));
152              strcpy(opt[18], RRD_PARAM_PREFIX_17);
153              opt[19]= (char *) malloc((strlen(RRD_PARAM_PREFIX_18) + 1) * sizeof(char));
154              strcpy(opt[19], RRD_PARAM_PREFIX_18);
155              opt[20]= (char *) malloc((strlen(RRD_PARAM_PREFIX_19) + 1) * sizeof(char));
156              strcpy(opt[20], RRD_PARAM_PREFIX_19);
157              opt[21]= (char *) malloc((strlen(RRD_PARAM_PREFIX_20) + 1) * sizeof(char));
158              strcpy(opt[21], RRD_PARAM_PREFIX_20);
159              opt[22]= (char *) malloc((strlen(RRD_PARAM_PREFIX_21) + 1) * sizeof(char));
160              strcpy(opt[22], RRD_PARAM_PREFIX_21);
161              opt[23]= (char *) malloc((strlen(RRD_PARAM_PREFIX_22) + 1) * sizeof(char));
162              strcpy(opt[23], RRD_PARAM_PREFIX_22);
163              opt[24]= (char *) malloc((strlen(RRD_PARAM_PREFIX_23) + 1) * sizeof(char));
164              strcpy(opt[24], RRD_PARAM_PREFIX_23);
165              opt[25]= (char *) malloc((strlen(RRD_PARAM_PREFIX_24) + 1) * sizeof(char));
166              strcpy(opt[25], RRD_PARAM_PREFIX_24);
167              opt[26]= (char *) malloc((strlen(RRD_PARAM_PREFIX_25) + 1) * sizeof(char));
168              strcpy(opt[26], RRD_PARAM_PREFIX_25);
169              optind = opterr = 0;
170              rrd_clear_error();
171              if ( rrd_create(27,opt) < 0) {
172                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
173                rrd_create_er_ct++;
174              } else {
175                rrd_create_ok_ct++;
176              }
177              for ( j=0; j<27; j++) {
178                free(opt[j]);
179                opt[j] = NULL;
180              }
181            }else{
182              fclose(fp);
183              rrd_already_created_ct++;
184              snprintf(buf,
185                       2048,
186                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu"
187                       now-300,  /* or ctime(&now) with %s */
188                       shmForAgg->prefixV4Tab[index][i].flowNbIN,  /* 1 */
189                       shmForAgg->prefixV4Tab[index][i].flowNbOUT,
190                       shmForAgg->prefixV4Tab[index][i].bytesNbIN,
191                       shmForAgg->prefixV4Tab[index][i].bytesNbOUT,
192                       shmForAgg->prefixV4Tab[index][i].pktsNbIN,  /* 5 */
193                       shmForAgg->prefixV4Tab[index][i].pktsNbOUT,
194                       shmForAgg->prefixV4Tab[index][i].firstCoSIN,
195                       shmForAgg->prefixV4Tab[index][i].firstCoSOUT,
196                       shmForAgg->prefixV4Tab[index][i].secondCoSIN,
197                       shmForAgg->prefixV4Tab[index][i].secondCoSOUT,
198                       shmForAgg->prefixV4Tab[index][i].thirdCoSIN,
199                       shmForAgg->prefixV4Tab[index][i].thirdCoSOUT,
200                       shmForAgg->prefixV4Tab[index][i].fourthCoSIN,
201                       shmForAgg->prefixV4Tab[index][i].fourthCoSOUT
202                       );
203              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
204              strcpy(optUpdate[0], RRD_UPDATE_0);
205              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
206              strcpy(optUpdate[1], name);
207              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
208              strcpy(optUpdate[2], buf);
209              optind = opterr = 0;
210              rrd_clear_error();
211              if ( rrd_update(3, optUpdate) < 0 ) {
212                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
213                rrd_update_er_ct++;
214              } else {
215                rrd_update_ok_ct++;
216              }
217              for ( j=0; j<3; j++) {
218                free(optUpdate[j]);
219                optUpdate[j] = NULL;
220              }
221            }
222            /* Reinit the shared tables */
223            shmForAgg->prefixV4Tab[index][i].flowNbIN = 0;
224            shmForAgg->prefixV4Tab[index][i].bytesNbIN = 0;
225            shmForAgg->prefixV4Tab[index][i].pktsNbIN = 0;
226            shmForAgg->prefixV4Tab[index][i].flowNbOUT = 0;
227            shmForAgg->prefixV4Tab[index][i].bytesNbOUT = 0;
228            shmForAgg->prefixV4Tab[index][i].pktsNbOUT = 0;
229            shmForAgg->prefixV4Tab[index][i].firstCoSIN = 0;
230            shmForAgg->prefixV4Tab[index][i].secondCoSIN = 0;
231            shmForAgg->prefixV4Tab[index][i].thirdCoSIN = 0;
232            shmForAgg->prefixV4Tab[index][i].fourthCoSIN = 0;
233            shmForAgg->prefixV4Tab[index][i].firstCoSOUT = 0;
234            shmForAgg->prefixV4Tab[index][i].secondCoSOUT = 0;
235            shmForAgg->prefixV4Tab[index][i].thirdCoSOUT = 0;
236            shmForAgg->prefixV4Tab[index][i].fourthCoSOUT = 0;
237          }
238        }
239        /* ACCOUNTING for prefixV4SubnetTab */
240        for (i=0; i<shmForAgg->v4SubnetNb; i++){
241          /* HERE create or update RRD FILE */
242          if (shmForAgg->prefixV4SubnetTab[index][i].sampling != 0) {
243            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
244            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
245            for (j=0; j<strlen(ipStr); j++) {ipStr[j] = '\0';}
246            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
247            strcat(name, PREFIX_RRD_LOCATION);
248            sprintf(ipStr, "%lu_%lu_%lu_%lu_%hu_%lu",
249                    shmForAgg->prefixV4SubnetTab[index][i].beginning>>24,
250                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<8>>24,
251                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<16>>24,
252                    shmForAgg->prefixV4SubnetTab[index][i].beginning<<24>>24,
253                    shmForAgg->prefixV4SubnetTab[index][i].mask,
254                    shmForAgg->prefixV4SubnetTab[index][i].sampling
255                    );
256            strcat(name, ipStr);
257            strcat(name, RRD_EXTENSION);
258            if ( (fp=fopen(name,"r")) == NULL ){
259              opt[0]= (char *) malloc((strlen(RRD_PARAM_PREFIX_0) + 1) * sizeof(char));
260              strcpy(opt[0], RRD_PARAM_PREFIX_0);
261              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
262              strcpy(opt[1], name);
263              opt[2]= (char *) malloc((strlen(RRD_PARAM_PREFIX_1) + 1) * sizeof(char));
264              strcpy(opt[2], RRD_PARAM_PREFIX_1);
265              opt[3]= (char *) malloc((strlen(RRD_PARAM_PREFIX_2) + 1) * sizeof(char));
266              strcpy(opt[3], RRD_PARAM_PREFIX_2);
267              opt[4]= (char *) malloc((strlen(RRD_PARAM_PREFIX_3) + 1) * sizeof(char));
268              strcpy(opt[4], RRD_PARAM_PREFIX_3);
269              opt[5]= (char *) malloc((strlen(RRD_PARAM_PREFIX_4) + 1) * sizeof(char));
270              strcpy(opt[5], RRD_PARAM_PREFIX_4);
271              opt[6]= (char *) malloc((strlen(RRD_PARAM_PREFIX_5) + 1) * sizeof(char));
272              strcpy(opt[6], RRD_PARAM_PREFIX_5);
273              opt[7]= (char *) malloc((strlen(RRD_PARAM_PREFIX_6) + 1) * sizeof(char));
274              strcpy(opt[7], RRD_PARAM_PREFIX_6);
275              opt[8]= (char *) malloc((strlen(RRD_PARAM_PREFIX_7) + 1) * sizeof(char));
276              strcpy(opt[8], RRD_PARAM_PREFIX_7);
277              opt[9]= (char *) malloc((strlen(RRD_PARAM_PREFIX_8) + 1) * sizeof(char));
278              strcpy(opt[9], RRD_PARAM_PREFIX_8);
279              opt[10]= (char *) malloc((strlen(RRD_PARAM_PREFIX_9) + 1) * sizeof(char));
280              strcpy(opt[10], RRD_PARAM_PREFIX_9);
281              opt[11]= (char *) malloc((strlen(RRD_PARAM_PREFIX_10) + 1) * sizeof(char));
282              strcpy(opt[11], RRD_PARAM_PREFIX_10);
283              opt[12]= (char *) malloc((strlen(RRD_PARAM_PREFIX_11) + 1) * sizeof(char));
284              strcpy(opt[12], RRD_PARAM_PREFIX_11);
285              opt[13]= (char *) malloc((strlen(RRD_PARAM_PREFIX_12) + 1) * sizeof(char));
286              strcpy(opt[13], RRD_PARAM_PREFIX_12);
287              opt[14]= (char *) malloc((strlen(RRD_PARAM_PREFIX_13) + 1) * sizeof(char));
288              strcpy(opt[14], RRD_PARAM_PREFIX_13);
289              opt[15]= (char *) malloc((strlen(RRD_PARAM_PREFIX_14) + 1) * sizeof(char));
290              strcpy(opt[15], RRD_PARAM_PREFIX_14);
291              opt[16]= (char *) malloc((strlen(RRD_PARAM_PREFIX_15) + 1) * sizeof(char));
292              strcpy(opt[16], RRD_PARAM_PREFIX_15);
293              opt[17]= (char *) malloc((strlen(RRD_PARAM_PREFIX_16) + 1) * sizeof(char));
294              strcpy(opt[17], RRD_PARAM_PREFIX_16);
295              opt[18]= (char *) malloc((strlen(RRD_PARAM_PREFIX_17) + 1) * sizeof(char));
296              strcpy(opt[18], RRD_PARAM_PREFIX_17);
297              opt[19]= (char *) malloc((strlen(RRD_PARAM_PREFIX_18) + 1) * sizeof(char));
298              strcpy(opt[19], RRD_PARAM_PREFIX_18);
299              opt[20]= (char *) malloc((strlen(RRD_PARAM_PREFIX_19) + 1) * sizeof(char));
300              strcpy(opt[20], RRD_PARAM_PREFIX_19);
301              opt[21]= (char *) malloc((strlen(RRD_PARAM_PREFIX_20) + 1) * sizeof(char));
302              strcpy(opt[21], RRD_PARAM_PREFIX_20);
303              opt[22]= (char *) malloc((strlen(RRD_PARAM_PREFIX_21) + 1) * sizeof(char));
304              strcpy(opt[22], RRD_PARAM_PREFIX_21);
305              opt[23]= (char *) malloc((strlen(RRD_PARAM_PREFIX_22) + 1) * sizeof(char));
306              strcpy(opt[23], RRD_PARAM_PREFIX_22);
307              opt[24]= (char *) malloc((strlen(RRD_PARAM_PREFIX_23) + 1) * sizeof(char));
308              strcpy(opt[24], RRD_PARAM_PREFIX_23);
309              opt[25]= (char *) malloc((strlen(RRD_PARAM_PREFIX_24) + 1) * sizeof(char));
310              strcpy(opt[25], RRD_PARAM_PREFIX_24);
311              opt[26]= (char *) malloc((strlen(RRD_PARAM_PREFIX_25) + 1) * sizeof(char));
312              strcpy(opt[26], RRD_PARAM_PREFIX_25);
313              optind = opterr = 0;
314              rrd_clear_error();
315              if ( rrd_create(27,opt) < 0) {
316                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
317                rrd_create_er_ct++;
318              } else {
319                rrd_create_ok_ct++;
320              }
321              for ( j=0; j<27; j++) {
322                free(opt[j]);
323                opt[j] = NULL;
324              }
325            }else{
326              fclose(fp);
327              rrd_already_created_ct++;
328              snprintf(buf,
329                       2048,
330                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu"
331                       now-300,  /* or ctime(&now) with %s */
332                       shmForAgg->prefixV4SubnetTab[index][i].flowNbIN,  /* 1 */
333                       shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT,
334                       shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN,
335                       shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT,
336                       shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN,  /* 5 */
337                       shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT,
338                       shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN,
339                       shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT,
340                       shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN,
341                       shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT,
342                       shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN,
343                       shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT,
344                       shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN,
345                       shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT
346                       );
347              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
348              strcpy(optUpdate[0], RRD_UPDATE_0);
349              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
350              strcpy(optUpdate[1], name);
351              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
352              strcpy(optUpdate[2], buf);
353              optind = opterr = 0;
354              rrd_clear_error();
355              if ( rrd_update(3, optUpdate) < 0 ) {
356                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
357                rrd_update_er_ct++;
358              } else {
359                rrd_update_ok_ct++;
360              }
361              for ( j=0; j<3; j++) {
362                free(optUpdate[j]);
363                optUpdate[j] = NULL;
364              }
365            }
366            /* Reinit the shared tables */
367            shmForAgg->prefixV4SubnetTab[index][i].flowNbIN = 0;
368            shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN = 0;
369            shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN = 0;
370            shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT = 0;
371            shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT = 0;
372            shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT = 0;
373            shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN = 0;
374            shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN = 0;
375            shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN = 0;
376            shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN = 0;
377            shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT = 0;
378            shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT = 0;
379            shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT = 0;
380            shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT = 0;
381          }
382        }
383#if defined(MATRIX) && defined(IPV4AGGIDR)
384        /* MATRIX INTER POP ACCOUNTING */
385        /* rrd */
386        for (i=0; i<ROUTER_INDEX_MAX; i++){
387          for (j=0; j<ROUTER_INDEX_MAX; j++){
388            /* HERE create or update RRD FILE */
389            for (k=0; k<strlen(name); k++) {name[k] = '\0';}
390            for (k=0; k<strlen(createstr); k++) {createstr[k] = '\0';}
391            for (k=0; k<strlen(indexStr); k++) {indexStr[k] = '\0';}
392            for (k=0; k<strlen(buf); k++) {buf[k] = '\0';}
393            strcat(name, MATRIX_RRD_LOCATION);
394            sprintf(indexStr, "%d_%d",
395                    i,
396                    j
397                    );
398            strcat(name, indexStr);
399            strcat(name, RRD_EXTENSION);
400            if ( (fp=fopen(name,"r")) == NULL ){
401              opt[0]= (char *) malloc((strlen(RRD_PARAM_MATRIX_0) + 1) * sizeof(char));
402              strcpy(opt[0], RRD_PARAM_MATRIX_0);
403              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
404              strcpy(opt[1], name);
405              opt[2]= (char *) malloc((strlen(RRD_PARAM_MATRIX_1) + 1) * sizeof(char));
406              strcpy(opt[2], RRD_PARAM_MATRIX_1);
407              opt[3]= (char *) malloc((strlen(RRD_PARAM_MATRIX_2) + 1) * sizeof(char));
408              strcpy(opt[3], RRD_PARAM_MATRIX_2);
409              opt[4]= (char *) malloc((strlen(RRD_PARAM_MATRIX_3) + 1) * sizeof(char));
410              strcpy(opt[4], RRD_PARAM_MATRIX_3);
411              opt[5]= (char *) malloc((strlen(RRD_PARAM_MATRIX_4) + 1) * sizeof(char));
412              strcpy(opt[5], RRD_PARAM_MATRIX_4);
413              opt[6]= (char *) malloc((strlen(RRD_PARAM_MATRIX_5) + 1) * sizeof(char));
414              strcpy(opt[6], RRD_PARAM_MATRIX_5);
415              opt[7]= (char *) malloc((strlen(RRD_PARAM_MATRIX_6) + 1) * sizeof(char));
416              strcpy(opt[7], RRD_PARAM_MATRIX_6);
417              opt[8]= (char *) malloc((strlen(RRD_PARAM_MATRIX_7) + 1) * sizeof(char));
418              strcpy(opt[8], RRD_PARAM_MATRIX_7);
419              opt[9]= (char *) malloc((strlen(RRD_PARAM_MATRIX_8) + 1) * sizeof(char));
420              strcpy(opt[9], RRD_PARAM_MATRIX_8);
421              opt[10]= (char *) malloc((strlen(RRD_PARAM_MATRIX_9) + 1) * sizeof(char));
422              strcpy(opt[10], RRD_PARAM_MATRIX_9);
423              opt[11]= (char *) malloc((strlen(RRD_PARAM_MATRIX_10) + 1) * sizeof(char));
424              strcpy(opt[11], RRD_PARAM_MATRIX_10);
425              opt[12]= (char *) malloc((strlen(RRD_PARAM_MATRIX_11) + 1) * sizeof(char));
426              strcpy(opt[12], RRD_PARAM_MATRIX_11);
427              opt[13]= (char *) malloc((strlen(RRD_PARAM_MATRIX_12) + 1) * sizeof(char));
428              strcpy(opt[13], RRD_PARAM_MATRIX_12);
429              opt[14]= (char *) malloc((strlen(RRD_PARAM_MATRIX_13) + 1) * sizeof(char));
430              strcpy(opt[14], RRD_PARAM_MATRIX_13);
431              opt[15]= (char *) malloc((strlen(RRD_PARAM_MATRIX_14) + 1) * sizeof(char));
432              strcpy(opt[15], RRD_PARAM_MATRIX_14);
433              optind = opterr = 0;
434              rrd_clear_error();
435              if ( rrd_create(16,opt) < 0) {
436                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
437                rrd_create_er_ct++;
438              } else {
439                rrd_create_ok_ct++;
440              }
441              for ( k=0; k<16; k++) {
442                free(opt[k]);
443                opt[k] = NULL;
444              }
445            }else{
446              fclose(fp);
447              rrd_already_created_ct++;
448              snprintf(buf,
449                       2048,
450                       "%lu:%llu:%llu:%llu"
451                       now-300,  /* or ctime(&now) with %s */
452                       shmForAgg->matrixPOP[index][i][j].flowNb,
453                       shmForAgg->matrixPOP[index][i][j].bytesNb,
454                       shmForAgg->matrixPOP[index][i][j].pktsNb
455                       );
456              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
457              strcpy(optUpdate[0], RRD_UPDATE_0);
458              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
459              strcpy(optUpdate[1], name);
460              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
461              strcpy(optUpdate[2], buf);
462              optind = opterr = 0;
463              rrd_clear_error();
464              if ( rrd_update(3, optUpdate) < 0 ) {
465                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
466                rrd_update_er_ct++;
467              } else {
468                rrd_update_ok_ct++;
469              }
470              for ( k=0; k<3; k++) {
471                free(optUpdate[k]);
472                optUpdate[k] = NULL;
473              }
474            }
475
476          }
477        }
478        /* reinit */
479        for (i=0; i<ROUTER_INDEX_MAX; i++){
480          for (j=0; j<ROUTER_INDEX_MAX; j++) {
481            shmForAgg->matrixPOP[index][i][j].bytesNb = 0;
482            shmForAgg->matrixPOP[index][i][j].pktsNb = 0;
483            shmForAgg->matrixPOP[index][i][j].flowNb = 0;
484          }
485        }
486        /* END MATRIX INTER POP ACC */
487#endif /* MATRIX */
488#ifdef ASACC
489        /*
490         *
491         * AS ACCOUNTING
492         *
493         */
494        for (i=0; i<shmForAgg->ASNb; i++){
495          /* HERE create or update RRD FILE */
496          if (shmForAgg->ASTab[index][i].sampling != 0) {
497            for (j=0; j<strlen(name); j++) {name[j] = '\0';}
498            for (j=0; j<strlen(createstr); j++) {createstr[j] = '\0';}
499            for (j=0; j<strlen(asStr); j++) {asStr[j] = '\0';}
500            for (j=0; j<strlen(buf); j++) {buf[j] = '\0';}
501            strcat(name, AS_RRD_LOCATION);
502            sprintf(asStr, "%hu_%lu",
503                    shmForAgg->ASTab[index][i].as,
504                    shmForAgg->ASTab[index][i].sampling
505                    );
506            strcat(name, asStr);
507            strcat(name, RRD_EXTENSION);
508            if ( (fp=fopen(name,"r")) == NULL ){
509              opt[0]= (char *) malloc((strlen(RRD_PARAM_AS_0) + 1) * sizeof(char));
510              strcpy(opt[0], RRD_PARAM_AS_0);
511              opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
512              strcpy(opt[1], name);
513              opt[2]= (char *) malloc((strlen(RRD_PARAM_AS_1) + 1) * sizeof(char));
514              strcpy(opt[2], RRD_PARAM_AS_1);
515              opt[3]= (char *) malloc((strlen(RRD_PARAM_AS_2) + 1) * sizeof(char));
516              strcpy(opt[3], RRD_PARAM_AS_2);
517              opt[4]= (char *) malloc((strlen(RRD_PARAM_AS_3) + 1) * sizeof(char));
518              strcpy(opt[4], RRD_PARAM_AS_3);
519              opt[5]= (char *) malloc((strlen(RRD_PARAM_AS_4) + 1) * sizeof(char));
520              strcpy(opt[5], RRD_PARAM_AS_4);
521              opt[6]= (char *) malloc((strlen(RRD_PARAM_AS_5) + 1) * sizeof(char));
522              strcpy(opt[6], RRD_PARAM_AS_5);
523              opt[7]= (char *) malloc((strlen(RRD_PARAM_AS_6) + 1) * sizeof(char));
524              strcpy(opt[7], RRD_PARAM_AS_6);
525              opt[8]= (char *) malloc((strlen(RRD_PARAM_AS_7) + 1) * sizeof(char));
526              strcpy(opt[8], RRD_PARAM_AS_7);
527              opt[9]= (char *) malloc((strlen(RRD_PARAM_AS_8) + 1) * sizeof(char));
528              strcpy(opt[9], RRD_PARAM_AS_8);
529              opt[10]= (char *) malloc((strlen(RRD_PARAM_AS_9) + 1) * sizeof(char));
530              strcpy(opt[10], RRD_PARAM_AS_9);
531              opt[11]= (char *) malloc((strlen(RRD_PARAM_AS_10) + 1) * sizeof(char));
532              strcpy(opt[11], RRD_PARAM_AS_10);
533              opt[12]= (char *) malloc((strlen(RRD_PARAM_AS_11) + 1) * sizeof(char));
534              strcpy(opt[12], RRD_PARAM_AS_11);
535              opt[13]= (char *) malloc((strlen(RRD_PARAM_AS_12) + 1) * sizeof(char));
536              strcpy(opt[13], RRD_PARAM_AS_12);
537              opt[14]= (char *) malloc((strlen(RRD_PARAM_AS_13) + 1) * sizeof(char));
538              strcpy(opt[14], RRD_PARAM_AS_13);
539              opt[15]= (char *) malloc((strlen(RRD_PARAM_AS_14) + 1) * sizeof(char));
540              strcpy(opt[15], RRD_PARAM_AS_14);
541              opt[16]= (char *) malloc((strlen(RRD_PARAM_AS_15) + 1) * sizeof(char));
542              strcpy(opt[16], RRD_PARAM_AS_15);
543              opt[17]= (char *) malloc((strlen(RRD_PARAM_AS_16) + 1) * sizeof(char));
544              strcpy(opt[17], RRD_PARAM_AS_16);
545              opt[18]= (char *) malloc((strlen(RRD_PARAM_AS_17) + 1) * sizeof(char));
546              strcpy(opt[18], RRD_PARAM_AS_17);
547              optind = opterr = 0;
548              rrd_clear_error();
549              if ( rrd_create(19,opt) < 0) {
550                syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
551                rrd_create_er_ct++;
552              } else {
553                rrd_create_ok_ct++;
554              }
555              for ( j=0; j<19; j++) {
556                free(opt[j]);
557                opt[j] = NULL;
558              }
559            }else{
560              fclose(fp);
561              rrd_already_created_ct++;
562              snprintf(buf,
563                       2048,
564                       "%lu:%llu:%llu:%llu:%llu:%llu:%llu"
565                       now-300,  /* or ctime(&now) with %s */
566                       shmForAgg->ASTab[index][i].flowNbIN,  /* 1 */
567                       shmForAgg->ASTab[index][i].flowNbOUT,
568                       shmForAgg->ASTab[index][i].bytesNbIN,
569                       shmForAgg->ASTab[index][i].bytesNbOUT,
570                       shmForAgg->ASTab[index][i].pktsNbIN,  /* 5 */
571                       shmForAgg->ASTab[index][i].pktsNbOUT
572                       );
573              optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
574              strcpy(optUpdate[0], RRD_UPDATE_0);
575              optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
576              strcpy(optUpdate[1], name);
577              optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
578              strcpy(optUpdate[2], buf);
579              optind = opterr = 0;
580              rrd_clear_error();
581              if ( rrd_update(3, optUpdate) < 0 ) {
582                syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
583                rrd_update_er_ct++;
584              } else {
585                rrd_update_ok_ct++;
586              }
587              for ( j=0; j<3; j++) {
588                free(optUpdate[j]);
589                optUpdate[j] = NULL;
590              }
591            }
592            /* Reinit the shared tables */
593            shmForAgg->ASTab[index][i].flowNbIN = 0;
594            shmForAgg->ASTab[index][i].bytesNbIN = 0;
595            shmForAgg->ASTab[index][i].pktsNbIN = 0;
596            shmForAgg->ASTab[index][i].flowNbOUT = 0;
597            shmForAgg->ASTab[index][i].bytesNbOUT = 0;
598            shmForAgg->ASTab[index][i].pktsNbOUT = 0;
599          }
600        }
601#ifdef IPV6LINKAGG
602        /*
603         *
604         * IPv6 Links ACCOUNTING
605         *
606         */
607        for (i=0; i<ROUTER_INDEX_MAX; i++){
608          for (j=0; j<MAX_INDEX_BY_ROUTER; j++) {
609          /* HERE create or update RRD FILE for IPV6 LINKs AGGregation */
610            if (shmForAgg->indexV6Tab[index][i][j].hasStats == 1) {
611              for (k=0; k<strlen(name); k++) {name[k] = '\0';}
612              for (k=0; k<strlen(createstr); k++) {createstr[k] = '\0';}
613              for (k=0; k<strlen(ipv6LinkStr); k++) {ipv6LinkStr[k] = '\0';}
614              for (k=0; k<strlen(buf); k++) {buf[k] = '\0';}
615              strcat(name, SNMP_INDEX_RRD_LOCATION);
616              sprintf(ipv6LinkStr, "%lu_%lu_%lu_%lu_%hu_%hu",
617                      shmForAgg->indexV6Tab[index][i][j].routerIPAddress>>24,
618                      shmForAgg->indexV6Tab[index][i][j].routerIPAddress<<8>>24,
619                      shmForAgg->indexV6Tab[index][i][j].routerIPAddress<<16>>24,
620                      shmForAgg->indexV6Tab[index][i][j].routerIPAddress<<24>>24,
621                      (unsigned short) 1,
622                      shmForAgg->indexV6Tab[index][i][j].indexSNMP
623                      );
624              strcat(name, ipv6LinkStr);
625              strcat(name, RRD_EXTENSION);
626              if ( (fp=fopen(name,"r")) == NULL ){
627                opt[0]= (char *) malloc((strlen(RRD_PARAM_INDEX_0) + 1) * sizeof(char));
628                strcpy(opt[0], RRD_PARAM_INDEX_0);
629                opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
630                strcpy(opt[1], name);
631                opt[2]= (char *) malloc((strlen(RRD_PARAM_INDEX_1) + 1) * sizeof(char));
632                strcpy(opt[2], RRD_PARAM_INDEX_1);
633                opt[3]= (char *) malloc((strlen(RRD_PARAM_INDEX_2) + 1) * sizeof(char));
634                strcpy(opt[3], RRD_PARAM_INDEX_2);
635                opt[4]= (char *) malloc((strlen(RRD_PARAM_INDEX_3) + 1) * sizeof(char));
636                strcpy(opt[4], RRD_PARAM_INDEX_3);
637                opt[5]= (char *) malloc((strlen(RRD_PARAM_INDEX_4) + 1) * sizeof(char));
638                strcpy(opt[5], RRD_PARAM_INDEX_4);
639                opt[6]= (char *) malloc((strlen(RRD_PARAM_INDEX_5) + 1) * sizeof(char));
640                strcpy(opt[6], RRD_PARAM_INDEX_5);
641                opt[7]= (char *) malloc((strlen(RRD_PARAM_INDEX_6) + 1) * sizeof(char));
642                strcpy(opt[7], RRD_PARAM_INDEX_6);
643                opt[8]= (char *) malloc((strlen(RRD_PARAM_INDEX_7) + 1) * sizeof(char));
644                strcpy(opt[8], RRD_PARAM_INDEX_7);
645                opt[9]= (char *) malloc((strlen(RRD_PARAM_INDEX_8) + 1) * sizeof(char));
646                strcpy(opt[9], RRD_PARAM_INDEX_8);
647                opt[10]= (char *) malloc((strlen(RRD_PARAM_INDEX_9) + 1) * sizeof(char));
648                strcpy(opt[10], RRD_PARAM_INDEX_9);
649                opt[11]= (char *) malloc((strlen(RRD_PARAM_INDEX_10) + 1) * sizeof(char));
650                strcpy(opt[11], RRD_PARAM_INDEX_10);
651                opt[12]= (char *) malloc((strlen(RRD_PARAM_INDEX_11) + 1) * sizeof(char));
652                strcpy(opt[12], RRD_PARAM_INDEX_11);
653                opt[13]= (char *) malloc((strlen(RRD_PARAM_INDEX_12) + 1) * sizeof(char));
654                strcpy(opt[13], RRD_PARAM_INDEX_12);
655                opt[14]= (char *) malloc((strlen(RRD_PARAM_INDEX_13) + 1) * sizeof(char));
656                strcpy(opt[14], RRD_PARAM_INDEX_13);
657                opt[15]= (char *) malloc((strlen(RRD_PARAM_INDEX_14) + 1) * sizeof(char));
658                strcpy(opt[15], RRD_PARAM_INDEX_14);
659                opt[16]= (char *) malloc((strlen(RRD_PARAM_INDEX_15) + 1) * sizeof(char));
660                strcpy(opt[16], RRD_PARAM_INDEX_15);
661                opt[17]= (char *) malloc((strlen(RRD_PARAM_INDEX_16) + 1) * sizeof(char));
662                strcpy(opt[17], RRD_PARAM_INDEX_16);
663                opt[18]= (char *) malloc((strlen(RRD_PARAM_INDEX_17) + 1) * sizeof(char));
664                strcpy(opt[18], RRD_PARAM_INDEX_17);
665                optind = opterr = 0;
666                rrd_clear_error();
667                if ( rrd_create(19,opt) < 0) {
668                  syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
669                  rrd_create_er_ct++;
670                } else {
671                  rrd_create_ok_ct++;
672                }
673                for ( k=0; k<19; k++) {
674                  free(opt[k]);
675                  opt[k] = NULL;
676                }
677              }else{
678                fclose(fp);
679                rrd_already_created_ct++;
680                snprintf(buf,
681                         2048,
682                         "%lu:%llu:%llu:%llu:%llu:%llu:%llu"
683                         now-300,  /* or ctime(&now) with %s */
684                         shmForAgg->indexV6Tab[index][i][j].flowNbIN,  /* 1 */
685                         shmForAgg->indexV6Tab[index][i][j].flowNbOUT,
686                         shmForAgg->indexV6Tab[index][i][j].bytesNbIN,
687                         shmForAgg->indexV6Tab[index][i][j].bytesNbOUT,
688                         shmForAgg->indexV6Tab[index][i][j].pktsNbIN,  /* 5 */
689                         shmForAgg->indexV6Tab[index][i][j].pktsNbOUT
690                         );
691                optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
692                strcpy(optUpdate[0], RRD_UPDATE_0);
693                optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
694                strcpy(optUpdate[1], name);
695                optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
696                strcpy(optUpdate[2], buf);
697                optind = opterr = 0;
698                rrd_clear_error();
699                if ( rrd_update(3, optUpdate) < 0 ) {
700                  syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
701                  rrd_update_er_ct++;
702                } else {
703                  rrd_update_ok_ct++;
704                }
705                for ( k=0; k<3; k++) {
706                  free(optUpdate[k]);
707                  optUpdate[k] = NULL;
708                }
709              }
710              shmForAgg->indexV6Tab[index][i][j].bytesNbIN = 0;
711              shmForAgg->indexV6Tab[index][i][j].pktsNbIN = 0;
712              shmForAgg->indexV6Tab[index][i][j].flowNbIN = 0;
713              shmForAgg->indexV6Tab[index][i][j].bytesNbOUT = 0;
714              shmForAgg->indexV6Tab[index][i][j].pktsNbOUT = 0;
715              shmForAgg->indexV6Tab[index][i][j].flowNbOUT = 0;
716            }
717          }
718        }
719#endif
720#endif /* AS */
721        if (rrdMibsUpdate(index) != 1) {syslog(LOG_ERR, "ERROR in RRD MIBs update file\n");}
722        now2 = time((time_t *)NULL);
723#ifdef DEBUGAGG
724        fprintf(stderr, "IPv4 subnet managment (rrd update) : \n %d sec, %d files updated, %d errors, total %d\n %d rrd file already created, %d errors in creation, %d new rrd file creations",
725                (int)now2-now,
726                rrd_update_ok_ct,
727                rrd_update_er_ct,
728                rrd_update_ok_ct+rrd_update_er_ct,
729                rrd_already_created_ct,
730                rrd_create_er_ct,
731                rrd_create_ok_ct);
732#endif
733        rrd_update_ok_ct = 0;
734        rrd_update_er_ct = 0;
735        rrd_already_created_ct = 0;
736        rrd_create_er_ct = 0;
737        rrd_create_ok_ct = 0;
738        rrd_clear_error();
739      } else {
740        isFirstUpdate = 0;
741        /* RRD Update only for the MIB counters, else we clear all counters in shared memory (after) */
742        if (rrdMibsUpdate(index) != 1) {syslog(LOG_ERR, "ERROR in RRD MIBs update file\n");}
743        /* CLEAR */
744        for (i=0; i<shmForAgg->v4PrefixNb; i++){
745          shmForAgg->prefixV4Tab[index][i].flowNbIN = 0;
746          shmForAgg->prefixV4Tab[index][i].bytesNbIN = 0;
747          shmForAgg->prefixV4Tab[index][i].pktsNbIN = 0;
748          shmForAgg->prefixV4Tab[index][i].flowNbOUT = 0;
749          shmForAgg->prefixV4Tab[index][i].bytesNbOUT = 0;
750          shmForAgg->prefixV4Tab[index][i].pktsNbOUT = 0;
751          shmForAgg->prefixV4Tab[index][i].firstCoSIN = 0;
752          shmForAgg->prefixV4Tab[index][i].secondCoSIN = 0;
753          shmForAgg->prefixV4Tab[index][i].thirdCoSIN = 0;
754          shmForAgg->prefixV4Tab[index][i].fourthCoSIN = 0;
755          shmForAgg->prefixV4Tab[index][i].firstCoSOUT = 0;
756          shmForAgg->prefixV4Tab[index][i].secondCoSOUT = 0;
757          shmForAgg->prefixV4Tab[index][i].thirdCoSOUT = 0;
758          shmForAgg->prefixV4Tab[index][i].fourthCoSOUT = 0;
759        }
760        for (i=0; i<shmForAgg->v4SubnetNb; i++){       
761          shmForAgg->prefixV4SubnetTab[index][i].flowNbIN = 0;
762          shmForAgg->prefixV4SubnetTab[index][i].bytesNbIN = 0;
763          shmForAgg->prefixV4SubnetTab[index][i].pktsNbIN = 0;
764          shmForAgg->prefixV4SubnetTab[index][i].flowNbOUT = 0;
765          shmForAgg->prefixV4SubnetTab[index][i].bytesNbOUT = 0;
766          shmForAgg->prefixV4SubnetTab[index][i].pktsNbOUT = 0;
767          shmForAgg->prefixV4SubnetTab[index][i].firstCoSIN = 0;
768          shmForAgg->prefixV4SubnetTab[index][i].secondCoSIN = 0;
769          shmForAgg->prefixV4SubnetTab[index][i].thirdCoSIN = 0;
770          shmForAgg->prefixV4SubnetTab[index][i].fourthCoSIN = 0;
771          shmForAgg->prefixV4SubnetTab[index][i].firstCoSOUT = 0;
772          shmForAgg->prefixV4SubnetTab[index][i].secondCoSOUT = 0;
773          shmForAgg->prefixV4SubnetTab[index][i].thirdCoSOUT = 0;
774          shmForAgg->prefixV4SubnetTab[index][i].fourthCoSOUT = 0;
775        }
776#ifdef MATRIX
777        for (i=0; i<ROUTER_INDEX_MAX; i++){
778          for (j=0; j<ROUTER_INDEX_MAX; j++) {
779            shmForAgg->matrixPOP[index][i][j].bytesNb = 0;
780            shmForAgg->matrixPOP[index][i][j].pktsNb = 0;
781            shmForAgg->matrixPOP[index][i][j].flowNb = 0;
782          }
783        }
784#endif
785#ifdef ASACC
786        for (i=0; i<shmForAgg->ASNb; i++){
787          shmForAgg->ASTab[index][i].flowNbIN = 0;
788          shmForAgg->ASTab[index][i].bytesNbIN = 0;
789          shmForAgg->ASTab[index][i].pktsNbIN = 0;
790          shmForAgg->ASTab[index][i].flowNbOUT = 0;
791          shmForAgg->ASTab[index][i].bytesNbOUT = 0;
792          shmForAgg->ASTab[index][i].pktsNbOUT = 0;
793        }
794#endif
795#ifdef IPV6LINKAGG
796        for (i=0; i<ROUTER_INDEX_MAX; i++){
797          for (j=0; j<MAX_INDEX_BY_ROUTER; j++) {
798            shmForAgg->indexV6Tab[index][i][j].bytesNbIN = 0;
799            shmForAgg->indexV6Tab[index][i][j].pktsNbIN = 0;
800            shmForAgg->indexV6Tab[index][i][j].flowNbIN = 0;
801            shmForAgg->indexV6Tab[index][i][j].bytesNbOUT = 0;
802            shmForAgg->indexV6Tab[index][i][j].pktsNbOUT = 0;
803            shmForAgg->indexV6Tab[index][i][j].flowNbOUT = 0;
804          }
805        }
806#endif
807        /* reinit */
808      } /* end is first update */ 
809    } /* end read ok */
810    sleep(10);
811  } while (1);
812  exit(0);
813}
814
815
816/*
817 * rrdMibsUpdate
818 */
819short rrdMibsUpdate(int index)
820{
821  int i, j, k = 0;
822  int rrd_update_er_ct = 0;
823  int rrd_update_ok_ct = 0;
824  int rrd_already_created_ct = 0;
825  int rrd_create_er_ct = 0;
826  int rrd_create_ok_ct = 0;
827  static char buf[2048];
828  static char name[2048];
829  static char createstr[2048];
830  char *opt[27];
831  char *optUpdate[3];
832  FILE *fp;
833  static time_t now, now2;
834
835  now = time((time_t *)NULL);
836  for (k=0; k<strlen(name); k++) {name[k] = '\0';}
837  for (k=0; k<strlen(buf); k++) {buf[k] = '\0';}
838  strcat(name, MIB_RRD_LOCATION);
839  strcat(name, GLOBAL_MIB_RRD_FILE);
840  if ( (fp=fopen(name,"r")) == NULL ){
841    opt[0]= (char *) malloc((strlen(RRD_PARAM_MIB_0) + 1) * sizeof(char));
842    strcpy(opt[0], RRD_PARAM_MIB_0);
843    opt[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
844    strcpy(opt[1], name);
845    opt[2]= (char *) malloc((strlen(RRD_PARAM_MIB_1) + 1) * sizeof(char));
846    strcpy(opt[2], RRD_PARAM_MIB_1);
847    opt[3]= (char *) malloc((strlen(RRD_PARAM_MIB_2) + 1) * sizeof(char));
848    strcpy(opt[3], RRD_PARAM_MIB_2);
849    opt[4]= (char *) malloc((strlen(RRD_PARAM_MIB_3) + 1) * sizeof(char));
850    strcpy(opt[4], RRD_PARAM_MIB_3);
851    opt[5]= (char *) malloc((strlen(RRD_PARAM_MIB_4) + 1) * sizeof(char));
852    strcpy(opt[5], RRD_PARAM_MIB_4);
853    opt[6]= (char *) malloc((strlen(RRD_PARAM_MIB_5) + 1) * sizeof(char));
854    strcpy(opt[6], RRD_PARAM_MIB_5);
855    opt[7]= (char *) malloc((strlen(RRD_PARAM_MIB_6) + 1) * sizeof(char));
856    strcpy(opt[7], RRD_PARAM_MIB_6);
857    opt[8]= (char *) malloc((strlen(RRD_PARAM_MIB_7) + 1) * sizeof(char));
858    strcpy(opt[8], RRD_PARAM_MIB_7);
859    opt[9]= (char *) malloc((strlen(RRD_PARAM_MIB_8) + 1) * sizeof(char));
860    strcpy(opt[9], RRD_PARAM_MIB_8);
861    opt[10]= (char *) malloc((strlen(RRD_PARAM_MIB_9) + 1) * sizeof(char));
862    strcpy(opt[10], RRD_PARAM_MIB_9);
863    opt[11]= (char *) malloc((strlen(RRD_PARAM_MIB_10) + 1) * sizeof(char));
864    strcpy(opt[11], RRD_PARAM_MIB_10);
865    opt[12]= (char *) malloc((strlen(RRD_PARAM_MIB_11) + 1) * sizeof(char));
866    strcpy(opt[12], RRD_PARAM_MIB_11);
867    opt[13]= (char *) malloc((strlen(RRD_PARAM_MIB_12) + 1) * sizeof(char));
868    strcpy(opt[13], RRD_PARAM_MIB_12);
869    opt[14]= (char *) malloc((strlen(RRD_PARAM_MIB_13) + 1) * sizeof(char));
870    strcpy(opt[14], RRD_PARAM_MIB_13);
871    opt[15]= (char *) malloc((strlen(RRD_PARAM_MIB_14) + 1) * sizeof(char));
872    strcpy(opt[15], RRD_PARAM_MIB_14);
873    opt[16]= (char *) malloc((strlen(RRD_PARAM_MIB_15) + 1) * sizeof(char));
874    strcpy(opt[16], RRD_PARAM_MIB_15);
875    opt[17]= (char *) malloc((strlen(RRD_PARAM_MIB_16) + 1) * sizeof(char));
876    strcpy(opt[17], RRD_PARAM_MIB_16);
877    opt[18]= (char *) malloc((strlen(RRD_PARAM_MIB_17) + 1) * sizeof(char));
878    strcpy(opt[18], RRD_PARAM_MIB_17);
879    opt[19]= (char *) malloc((strlen(RRD_PARAM_MIB_18) + 1) * sizeof(char));
880    strcpy(opt[19], RRD_PARAM_MIB_18);
881    opt[20]= (char *) malloc((strlen(RRD_PARAM_MIB_19) + 1) * sizeof(char));
882    strcpy(opt[20], RRD_PARAM_MIB_19);
883    opt[21]= (char *) malloc((strlen(RRD_PARAM_MIB_20) + 1) * sizeof(char));
884    strcpy(opt[21], RRD_PARAM_MIB_20);
885    opt[22]= (char *) malloc((strlen(RRD_PARAM_MIB_21) + 1) * sizeof(char));
886    strcpy(opt[22], RRD_PARAM_MIB_21);
887    opt[23]= (char *) malloc((strlen(RRD_PARAM_MIB_22) + 1) * sizeof(char));
888    strcpy(opt[23], RRD_PARAM_MIB_22);
889    optind = opterr = 0;
890    rrd_clear_error();
891    if ( rrd_create(24,opt) < 0) {
892      syslog(LOG_ERR, "RRD create file %s, error: %s\n", name, rrd_get_error());
893      rrd_create_er_ct++;
894    } else {
895      rrd_create_ok_ct++;
896    }
897    for ( k=0; k<24; k++) {
898      free(opt[k]);
899      opt[k] = NULL;
900    }
901  }else{
902    fclose(fp);
903    rrd_already_created_ct++;
904    snprintf(buf,
905             2048,
906             "%lu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu:%llu"
907             now-300,  /* or ctime(&now) with %s */
908             shmForAgg->myMIB[index].ipPacketNb,
909             shmForAgg->myMIB[index].udpPacketNb,
910             shmForAgg->myMIB[index].v9PacketNb,
911             shmForAgg->myMIB[index].v9UnSeqNb,
912             shmForAgg->myMIB[index].flowSetNb,
913             shmForAgg->myMIB[index].dataFlowSetNb,
914             shmForAgg->myMIB[index].defFlowSetNb,
915             shmForAgg->myMIB[index].optDataFlowSetNb,
916             shmForAgg->myMIB[index].optDefFlowSetNb,
917             shmForAgg->myMIB[index].flowNb,
918             shmForAgg->myMIB[index].realFlowNb
919             );
920    fprintf(stderr,"\n%s\n",buf);
921    optUpdate[0]= (char *) malloc((strlen(RRD_UPDATE_0) + 1) * sizeof(char));
922    strcpy(optUpdate[0], RRD_UPDATE_0);
923    optUpdate[1]= (char *) malloc((strlen(name) + 1) * sizeof(char));
924    strcpy(optUpdate[1], name);
925    optUpdate[2]= (char *) malloc((strlen(buf) + 1) * sizeof(char));
926    strcpy(optUpdate[2], buf);
927    optind = opterr = 0;
928    rrd_clear_error();
929    if ( rrd_update(3, optUpdate) < 0 ) {
930      syslog(LOG_ERR, "RRD update file %s, error: %s\n", name, rrd_get_error());
931      rrd_update_er_ct++;
932    } else {
933      rrd_update_ok_ct++;
934    }
935    for ( k=0; k<3; k++) {
936      free(optUpdate[k]);
937      optUpdate[k] = NULL;
938    }
939  }
940  shmForAgg->myMIB[index].ipPacketNb = 0;
941  shmForAgg->myMIB[index].udpPacketNb = 0;
942  shmForAgg->myMIB[index].v9PacketNb = 0;
943  shmForAgg->myMIB[index].v9UnSeqNb = 0;
944  shmForAgg->myMIB[index].flowSetNb = 0;
945  shmForAgg->myMIB[index].dataFlowSetNb = 0;
946  shmForAgg->myMIB[index].defFlowSetNb = 0;
947  shmForAgg->myMIB[index].optDataFlowSetNb = 0;
948  shmForAgg->myMIB[index].optDefFlowSetNb = 0;
949  shmForAgg->myMIB[index].flowNb = 0;
950  shmForAgg->myMIB[index].realFlowNb = 0;
951  return 1;
952}
Note: See TracBrowser for help on using the browser.