Root/package/libipfix/patches/100-openimp_sync.patch

1--- a/lib/ipfix.c
2+++ b/lib/ipfix.c
3@@ -37,6 +37,9 @@ $$LIC$$
4 #ifdef SCTPSUPPORT
5 #include <netinet/sctp.h>
6 #endif
7+#ifndef NOTHREADS
8+#include <pthread.h>
9+#endif
10 #include <fcntl.h>
11 #include <netdb.h>
12 
13@@ -123,6 +126,18 @@ static uint16_t g_lasttid;
14 static ipfix_datarecord_t g_data = { NULL, NULL, 0 }; /* ipfix_export */
15 
16 static ipfix_field_t *g_ipfix_fields;
17+#ifndef NOTHREADS
18+static pthread_mutex_t g_mutex;
19+#define mod_lock() { \
20+ if ( pthread_mutex_lock( &g_mutex ) !=0 ) \
21+ mlogf( 0, "[ipfix] mutex_lock() failed: %s\n", \
22+ strerror( errno ) ); \
23+ }
24+#define mod_unlock() { pthread_mutex_unlock( &g_mutex ); }
25+#else
26+#define mod_lock()
27+#define mod_unlock()
28+#endif
29 
30 /*----- prototypes -------------------------------------------------------*/
31 
32@@ -133,6 +148,7 @@ int _ipfix_send_message( ipfix_t *ifh,
33                           ipfix_message_t *message );
34 int _ipfix_write_msghdr( ipfix_t *ifh, ipfix_message_t *msg, iobuf_t *buf );
35 void _ipfix_disconnect( ipfix_collector_t *col );
36+int _ipfix_export_flush( ipfix_t *ifh );
37 
38 
39 /* name : do_writeselect
40@@ -576,16 +592,18 @@ int ipfix_decode_float( void *in, void *
41 
42 int ipfix_snprint_float( char *str, size_t size, void *data, size_t len )
43 {
44- float tmp32;
45- double tmp64;
46+ uint32_t tmp32;
47+ uint64_t tmp64;
48 
49     switch ( len ) {
50       case 4:
51- ipfix_decode_float( data, &tmp32, 4);
52- return snprintf( str, size, "%f", tmp32 );
53+ memcpy( &tmp32, data, len );
54+ tmp32 = htonl( tmp32 );
55+ return snprintf( str, size, "%f", (float)tmp32 );
56       case 8:
57- ipfix_decode_float( data, &tmp64, 8);
58- return snprintf( str, size, "%lf", tmp64);
59+ memcpy( &tmp64, data, len );
60+ tmp64 = HTONLL( tmp64 );
61+ return snprintf( str, size, "%lf", (double)tmp64 );
62       default:
63           break;
64     }
65@@ -682,12 +700,19 @@ int ipfix_get_eno_ieid( char *field, int
66  * parameters:
67  * remarks: init module, read field type info.
68  */
69-int ipfix_init ( void )
70+int ipfix_init( void )
71 {
72     if ( g_tstart ) {
73         ipfix_cleanup();
74     }
75 
76+#ifndef NOTHREADS
77+ if ( pthread_mutex_init( &g_mutex, NULL ) !=0 ) {
78+ mlogf( 0, "[ipfix] pthread_mutex_init() failed: %s\n",
79+ strerror(errno) );
80+ return -1;
81+ }
82+#endif
83     g_tstart = time(NULL);
84     signal( SIGPIPE, SIG_IGN );
85     g_lasttid = 255;
86@@ -806,6 +831,9 @@ void ipfix_cleanup ( void )
87     g_data.maxfields = 0;
88     g_data.lens = NULL;
89     g_data.addrs = NULL;
90+#ifndef NOTHREADS
91+ (void)pthread_mutex_destroy( &g_mutex );
92+#endif
93 }
94 
95 int _ipfix_connect ( ipfix_collector_t *col )
96@@ -1465,7 +1493,7 @@ int _ipfix_write_template( ipfix_t
97       default:
98           /* check space */
99           if ( tsize+ifh->offset > IPFIX_DEFAULT_BUFLEN ) {
100- if ( ipfix_export_flush( ifh ) < 0 )
101+ if ( _ipfix_export_flush( ifh ) < 0 )
102                   return -1;
103               if ( tsize+ifh->offset > IPFIX_DEFAULT_BUFLEN )
104                   return -1;
105@@ -1474,6 +1502,8 @@ int _ipfix_write_template( ipfix_t
106           /* write template prior to data */
107           if ( ifh->offset > 0 ) {
108               memmove( ifh->buffer + tsize, ifh->buffer, ifh->offset );
109+ if ( ifh->cs_tid )
110+ ifh->cs_header += tsize;
111           }
112 
113           buf = ifh->buffer;
114@@ -1615,8 +1645,11 @@ int ipfix_open( ipfix_t **ipfixh, int so
115         return -1;
116     }
117     node->ifh = i;
118+
119+ mod_lock();
120     node->next = g_ipfixlist;
121     g_ipfixlist = node;
122+ mod_unlock();
123 
124     *ipfixh = i;
125     return 0;
126@@ -1633,7 +1666,8 @@ void ipfix_close( ipfix_t *h )
127     {
128         ipfix_node_t *l, *n;
129 
130- ipfix_export_flush( h );
131+ mod_lock();
132+ _ipfix_export_flush( h );
133 
134         while( h->collectors )
135             _ipfix_drop_collector( (ipfix_collector_t**)&h->collectors );
136@@ -1659,6 +1693,7 @@ void ipfix_close( ipfix_t *h )
137 #endif
138         free(h->buffer);
139         free(h);
140+ mod_unlock();
141     }
142 }
143 
144@@ -2156,6 +2191,22 @@ void ipfix_release_template( ipfix_t *if
145     ipfix_delete_template( ifh, templ );
146 }
147 
148+static void _finish_cs( ipfix_t *ifh )
149+{
150+ size_t buflen;
151+ uint8_t *buf;
152+
153+ /* finish current dataset */
154+ if ( (buf=ifh->cs_header) ==NULL )
155+ return;
156+ buflen = 0;
157+ INSERTU16( buf+buflen, buflen, ifh->cs_tid );
158+ INSERTU16( buf+buflen, buflen, ifh->cs_bytes );
159+ ifh->cs_bytes = 0;
160+ ifh->cs_header = NULL;
161+ ifh->cs_tid = 0;
162+}
163+
164 int ipfix_export( ipfix_t *ifh, ipfix_template_t *templ, ... )
165 {
166     int i;
167@@ -2199,13 +2250,14 @@ int ipfix_export( ipfix_t *ifh, ipfix_te
168                                g_data.addrs, g_data.lens );
169 }
170 
171-int ipfix_export_array( ipfix_t *ifh,
172- ipfix_template_t *templ,
173- int nfields,
174- void **fields,
175- uint16_t *lengths )
176+static int
177+_ipfix_export_array( ipfix_t *ifh,
178+ ipfix_template_t *templ,
179+ int nfields,
180+ void **fields,
181+ uint16_t *lengths )
182 {
183- int i;
184+ int i, newset_f=0;
185     size_t buflen, datasetlen;
186     uint8_t *p, *buf;
187 
188@@ -2249,7 +2301,19 @@ int ipfix_export_array( ipfix_t
189 
190     /** get size of data set, check space
191      */
192- for ( i=0, datasetlen=4; i<nfields; i++ ) {
193+ if ( templ->tid == ifh->cs_tid ) {
194+ newset_f = 0;
195+ datasetlen = 0;
196+ }
197+ else {
198+ if ( ifh->cs_tid > 0 ) {
199+ _finish_cs( ifh );
200+ }
201+ newset_f = 1;
202+ datasetlen = 4;
203+ }
204+
205+ for ( i=0; i<nfields; i++ ) {
206         if ( templ->fields[i].flength == IPFIX_FT_VARLEN ) {
207             if ( lengths[i]>254 )
208                 datasetlen += 3;
209@@ -2263,21 +2327,29 @@ int ipfix_export_array( ipfix_t
210         }
211         datasetlen += lengths[i];
212     }
213- if ( ((ifh->offset + datasetlen) > IPFIX_DEFAULT_BUFLEN )
214- && (ipfix_export_flush( ifh ) <0) ) {
215- return -1;
216+
217+ if ( (ifh->offset + datasetlen) > IPFIX_DEFAULT_BUFLEN ) {
218+ if ( ifh->cs_tid )
219+ _finish_cs( ifh );
220+ newset_f = 1;
221+
222+ if ( _ipfix_export_flush( ifh ) <0 )
223+ return -1;
224     }
225 
226- /* fill buffer
227- */
228+ /* fill buffer */
229     buf = (uint8_t*)(ifh->buffer) + ifh->offset;
230     buflen = 0;
231 
232- /* insert data set
233- */
234- ifh->nrecords ++;
235- INSERTU16( buf+buflen, buflen, templ->tid );
236- INSERTU16( buf+buflen, buflen, datasetlen );
237+ if ( newset_f ) {
238+ /* insert data set
239+ */
240+ ifh->cs_bytes = 0;
241+ ifh->cs_header = buf;
242+ ifh->cs_tid = templ->tid;
243+ INSERTU16( buf+buflen, buflen, templ->tid );
244+ INSERTU16( buf+buflen, buflen, 4 );
245+ }
246 
247     /* insert data record
248      */
249@@ -2303,7 +2375,9 @@ int ipfix_export_array( ipfix_t
250         buflen += lengths[i];
251     }
252 
253+ ifh->nrecords ++;
254     ifh->offset += buflen;
255+ ifh->cs_bytes += buflen;
256     if ( ifh->version == IPFIX_VERSION )
257         ifh->seqno ++;
258     return 0;
259@@ -2313,7 +2387,7 @@ int ipfix_export_array( ipfix_t
260  * parameters:
261  * remarks: rewrite this func!
262  */
263-int ipfix_export_flush( ipfix_t *ifh )
264+int _ipfix_export_flush( ipfix_t *ifh )
265 {
266     iobuf_t *buf;
267     ipfix_collector_t *col;
268@@ -2322,8 +2396,14 @@ int ipfix_export_flush( ipfix_t *ifh )
269     if ( (ifh==NULL) || (ifh->offset==0) )
270         return 0;
271 
272- if ( (buf=_ipfix_getbuf()) ==NULL )
273+ if ( ifh->cs_tid > 0 ) {
274+ /* finish current dataset */
275+ _finish_cs( ifh );
276+ }
277+
278+ if ( (buf=_ipfix_getbuf()) ==NULL ) {
279         return -1;
280+ }
281 
282 #ifdef DEBUG
283     mlogf( 0, "[ipfix_export_flush] msg has %d records, %d bytes\n",
284@@ -2350,3 +2430,30 @@ int ipfix_export_flush( ipfix_t *ifh )
285     _ipfix_freebuf( buf );
286     return ret;
287 }
288+
289+int ipfix_export_array( ipfix_t *ifh,
290+ ipfix_template_t *templ,
291+ int nfields,
292+ void **fields,
293+ uint16_t *lengths )
294+{
295+ int ret;
296+
297+ mod_lock();
298+ ret = _ipfix_export_array( ifh, templ, nfields, fields, lengths );
299+ mod_unlock();
300+
301+ return ret;
302+}
303+
304+int ipfix_export_flush( ipfix_t *ifh )
305+{
306+ int ret;
307+
308+ mod_lock();
309+ ret = _ipfix_export_flush( ifh );
310+ mod_unlock();
311+
312+ return ret;
313+}
314+
315--- a/lib/ipfix.h
316+++ b/lib/ipfix.h
317@@ -142,6 +142,12 @@ typedef struct
318     int nrecords; /* no. of records in buffer */
319     size_t offset; /* output buffer fill level */
320     uint32_t seqno; /* sequence no. of next message */
321+
322+ /* experimental */
323+ int cs_tid; /* template id of current dataset */
324+ int cs_bytes; /* size of current set */
325+ uint8_t *cs_header; /* start of current set */
326+
327 } ipfix_t;
328 
329 /** exporter funcs
330--- a/lib/ipfix_col.c
331+++ b/lib/ipfix_col.c
332@@ -897,6 +897,8 @@ int ipfix_decode_datarecord( ipfixt_node
333             return -1;
334         }
335 
336+ n->ipfixt->fields[i].elem->decode(p,p,len);
337+
338         data->lens[i] = len;
339         data->addrs[i] = p;
340 
341@@ -907,7 +909,7 @@ int ipfix_decode_datarecord( ipfixt_node
342     return 0;
343 }
344 
345-static void do_free_datarecord( ipfix_datarecord_t *data )
346+void ipfix_free_datarecord( ipfix_datarecord_t *data )
347 {
348     if ( data ) {
349         if ( data->addrs )
350@@ -925,6 +927,7 @@ int ipfix_parse_msg( ipfix_input_t *inpu
351     ipfix_hdr_t hdr; /* ipfix packet header */
352     ipfixs_node_t *s;
353     ipfix_datarecord_t data = { NULL, NULL, 0 };
354+ ipfixe_node_t *e;
355     uint8_t *buf; /* ipfix payload */
356     uint16_t setid, setlen; /* set id, set lenght */
357     int i, nread, offset; /* counter */
358@@ -1042,6 +1045,12 @@ int ipfix_parse_msg( ipfix_input_t *inpu
359                 err_flag = 1;
360             }
361             else {
362+ for ( e=g_exporter; e!=NULL; e=e->next ) {
363+ if ( e->elem->export_dset )
364+ (void) e->elem->export_dset( t, buf+nread, setlen,
365+ e->elem->data );
366+ }
367+
368                 /** read data records
369                  */
370                 for ( offset=nread, bytesleft=setlen; bytesleft>4; ) {
371@@ -1076,11 +1085,11 @@ int ipfix_parse_msg( ipfix_input_t *inpu
372         goto errend;
373 
374  end:
375- do_free_datarecord( &data );
376+ ipfix_free_datarecord( &data );
377     return nread;
378 
379  errend:
380- do_free_datarecord( &data );
381+ ipfix_free_datarecord( &data );
382     return -1;
383 }
384 
385@@ -1093,7 +1102,7 @@ void process_client_tcp( int fd, int mas
386     tcp_conn_t *tcon = (tcp_conn_t*)data;
387     char *func = "process_client_tcp";
388 
389- mlogf( 3, "[%s] fd %d mask %d called.\n", func, fd, mask );
390+ mlogf( 4, "[%s] fd %d mask %d called.\n", func, fd, mask );
391 
392     /** read ipfix header
393      */
394--- a/lib/ipfix_col.h
395+++ b/lib/ipfix_col.h
396@@ -88,6 +88,7 @@ typedef struct ipfix_col_info
397     int (*export_newsource)(ipfixs_node_t*,void*);
398     int (*export_newmsg)(ipfixs_node_t*,ipfix_hdr_t*,void*);
399     int (*export_trecord)(ipfixs_node_t*,ipfixt_node_t*,void*);
400+ int (*export_dset)(ipfixt_node_t*,uint8_t*,size_t,void*);
401     int (*export_drecord)(ipfixs_node_t*,ipfixt_node_t*,
402                           ipfix_datarecord_t*,void*);
403     void (*export_cleanup)(void*);
404--- a/lib/ipfix_col_files.c
405+++ b/lib/ipfix_col_files.c
406@@ -68,7 +68,7 @@ static int export_newsource_file( ipfixs
407             return -1;
408         }
409         snprintf( s->fname+strlen(s->fname), PATH_MAX-strlen(s->fname),
410- "/%u", s->odid );
411+ "/%u", (unsigned int)s->odid );
412         if ( (access( s->fname, R_OK ) <0 )
413              && (mkdir( s->fname, S_IRWXU ) <0) ) {
414             mlogf( 0, "[%s] cannot access dir '%s': %s\n",
415--- a/lib/ipfix_FOKUS_IEs.txt
416+++ b/lib/ipfix_FOKUS_IEs.txt
417@@ -24,6 +24,8 @@
418 196, IPFIX_FT_PKTID, 4, IPFIX_CODING_UINT, "pktId", "FOKUS packet id"
419 197, IPFIX_FT_STARTTIME, 4, IPFIX_CODING_INT, "startTime", "FOKUS interval start"
420 198, IPFIX_FT_ENDTIME, 4, IPFIX_CODING_INT, "endTime", "FOKUS interval end"
421+199, IPFIX_FT_RTT_USEC, 8, IPFIX_CODING_UINT, "rtt_usec", "FOKUS rtt in us"
422+
423 300, IPFIX_FT_FLOWCREATIONTIMEUSEC, 4, IPFIX_CODING_INT, "flowCreationTimeUsec", "FOKUS flow start usec fraction"
424 301, IPFIX_FT_FLOWENDTIMEUSEC, 4, IPFIX_CODING_INT, "flowEndTimeUsec", "FOKUS flow end usec fraction"
425 303, IPFIX_FT_TC_PACKETS, 4, IPFIX_CODING_UINT, "tcPackets", "DAIDALOS Packets seen"
426@@ -39,3 +41,48 @@
427 313, IPFIX_FT_OWDVARMIN_NSEC, 4, IPFIX_CODING_INT, "owdvarmin_nsec", "FOKUS minimum owd variance in ns"
428 314, IPFIX_FT_OWDVARMAX_NSEC, 4, IPFIX_CODING_INT, "owdvarmax_nsec", "FOKUS maximum ow variance in ns"
429 
430+# Project INTERSECTION
431+315, IPFIX_FT_SOURCEIPV4FANOUT, 4, IPFIX_CODING_UINT,"sourceIPv4FanOut", "FOKUS IPv4 fanout"
432+316, IPFIX_FT_DESTINATIONIPV4FANIN, 4, IPFIX_CODING_UINT,"destinationIPv4FanIn", "FOKUS IPv4 fanin"
433+
434+# Project PRISM
435+
436+330, IPFIX_FT_PR_SESSIONID, 4, IPFIX_CODING_UINT, "sessionId", "PRISM Session ID"
437+331, IPFIX_FT_PR_TRANSACTIONID, 4, IPFIX_CODING_UINT, "transactionId", "PRISM Transaction ID"
438+332, IPFIX_FT_PR_ENCRYPTEDDATA, 65535, IPFIX_CODING_STRING, "encryptedData", "PRISM encrypted data"
439+333, IPFIX_FT_PR_DECRYPTIONKEY, 65535, IPFIX_CODING_STRING, "decryptionKey", "PRISM decryption key"
440+334, IPFIX_FT_PR_KEYSHARE, 65535, IPFIX_CODING_STRING, "keyShare", "PRISM key share"
441+335, IPFIX_FT_PR_KEYSHAREADP, 65535, IPFIX_CODING_STRING, "keyShareAdp", "PRISM key share ADP"
442+336, IPFIX_FT_PR_INITVECTOR, 65535, IPFIX_CODING_STRING, "cryptoInitVector", "PRISM crypto init vector"
443+
444+
445+# these information elements have been defined by FOKUS for the Oracle project
446+
447+402, IPFIX_FT_ORsignalBandwidth, 4, IPFIX_CODING_UINT, "ORsignalBandwidth", "signal bandwidth"
448+403, IPFIX_FT_ORsignalPower, 2, IPFIX_CODING_UINT, "ORsignalPower", "ERIP"
449+404, IPFIX_FT_ORmodulationType, 2, IPFIX_CODING_UINT, "ORmodulationType", "AM/FM,.."
450+405, IPFIX_FT_ORsymbolRate, 2, IPFIX_CODING_UINT, "ORsymbolRate", "symbol rate"
451+406, IPFIX_FT_ORmodulationOrder, 1, IPFIX_CODING_UINT, "ORmodulationOrder", "number of levels"
452+407, IPFIX_FT_ORrolloffFactor, 2, IPFIX_CODING_UINT, "ORrolloffFactor", "roll of factor"
453+408, IPFIX_FT_ORgeopositionLon, 4, IPFIX_CODING_UINT, "ORgeopositionLon", "GPS coordinate, resolution 1 cm"
454+409, IPFIX_FT_ORgeopositionLat, 4, IPFIX_CODING_UINT, "ORgeopositionLat", "GPS coordinate, resolution 1 cm"
455+410, IPFIX_FT_ORgeopositionElev, 4, IPFIX_CODING_UINT, "ORgeopositionElev", "GPS coordinate, resolution 1 cm"
456+411, IPFIX_FT_ORpolicyRecord, 65535, IPFIX_CODING_STRING, "ORpolicyRecord", "policy record has variable length, First 8 bits in data describe the length (in bytes) of the field"
457+420, IPFIX_FT_channel_status, 1, IPFIX_CODING_UINT, "channel_status", vacancy of the scanned channel (1: channel busy, 0: channel idle)"
458+421, IPFIX_FT_sensing_value, 2, IPFIX_CODING_UINT, "sensing_value", "Cost function output"
459+422, IPFIX_FT_sensing_threshold, 2, IPFIX_CODING_UINT, "sensing_threshold", "Decision threshold"
460+423, IPFIX_FT_OR_terminal_id, 1, IPFIX_CODING_UINT, "OR_terminal_id", "terminal identifier"
461+424, IPFIX_FT_OR_terminal_id_list, 65535, IPFIX_CODING_STRING, "OR_terminal_id_list", "terminal identifier list"
462+425, IPFIX_FT_Infrastructure_network_id, 1, IPFIX_CODING_UINT, "Infrastructure_network_id", "network identifier"
463+426, IPFIX_FT_Infrastructure_network_type, 1, IPFIX_CODING_UINT, "Infrastructure_network_type", "network type (GSM - 1, UMTS - 2, WiMAX - 3, WiFi - 4)"
464+427, IPFIX_FT_Battery_lifetime_min, 1, IPFIX_CODING_UINT, "Battery_lifetime_min", "expected battery lifetime to provide requested services or functionalities, in minutes"
465+428, IPFIX_FT_Battery_lifetime_h, 1, IPFIX_CODING_UINT, "Battery_lifetime_h", "expected battery lifetime to provide requested services or functionalities, in hours"
466+429, IPFIX_FT_Battery_status, 1, IPFIX_CODING_UINT, "Battery_status", "expected battery lifetime to provide requested services or functionalities, 1 bit status flag, values 1 or 0"
467+430, IPFIX_FT_Cell_id_number, 4, IPFIX_CODING_UINT, "Cell_id_number", "16-32 bit cell id number, identifier"
468+431, IPFIX_FT_Spectral_allocation_vector, 1, IPFIX_CODING_UINT, "Spectral_allocation_vector", "binary vector to indicate whether a band is free 1 bit 0 or not 1 bit 1"
469+432, IPFIX_FT_Spectral_allocation_profile, 2, IPFIX_CODING_UINT, "Spectral_allocation_profile", "received power spectral density vs. frequency to indicate spectral activity in the band of interest (8-16 bits per discrete frequency value)"
470+433, IPFIX_FT_Center_frequency, 2, IPFIX_CODING_UINT, "Center_frequency", "Center frequency of the sensed band"
471+434, IPFIX_FT_Bandwidth_of_CAP, 2, IPFIX_CODING_UINT, "Bandwidth_of_CAP", "Bandwidth of the spectral allocation profile"
472+435, IPFIX_FT_ORmodulation, 1, IPFIX_CODING_UINT, "ORmodulation", "CREST factor"
473+436, IPFIX_FT_ORprofileRecord, 65535, IPFIX_CODING_STRING, "ORprofileRecord", "profile record has variable length, First 8 bits in data describe the length (in bytes) of the field"
474+
475

Archive Download this file



interactive