100-openimp_sync.patch 17 KB

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