diff options
Diffstat (limited to 'package/libipfix')
| -rw-r--r-- | package/libipfix/Makefile | 48 | ||||
| -rw-r--r-- | package/libipfix/extra/append-wprobe-ie.pl | 33 | ||||
| -rw-r--r-- | package/libipfix/extra/wprobe-ie.txt | 12 | ||||
| -rw-r--r-- | package/libipfix/patches/100-openimp_sync.patch | 405 | ||||
| -rw-r--r-- | package/libipfix/patches/110-wprobe_ie.patch | 43 | 
5 files changed, 541 insertions, 0 deletions
diff --git a/package/libipfix/Makefile b/package/libipfix/Makefile new file mode 100644 index 000000000..44d5050c1 --- /dev/null +++ b/package/libipfix/Makefile @@ -0,0 +1,48 @@ +#  +# Copyright (C) 2006 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# +# $Id$ + +include $(TOPDIR)/rules.mk + +PKG_NAME:=libipfix +PKG_VERSION:=r51 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources +PKG_MD5SUM:=0e5b2871ea20ac48eda3f6006c5dba28 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME).$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk + +define Package/libipfix +  SECTION:=libs +  CATEGORY:=Libraries +  TITLE:=IP Flow Information Export Library +  URL:=http://www.fokus.fraunhofer.de/de/net/more_about/download/ipfixlib.html +  BUILDONLY:=1 +endef + +TARGET_CFLAGS += \ +	-ffunction-sections -fdata-sections + +define Build/Compile +	$(MAKE) -C $(PKG_BUILD_DIR) \ +		CCOPT="$(TARGET_CFLAGS) -I$(BUILD_DIR)/linux/include" \ +		prefix="$(PKG_INSTALL_DIR)/usr" \ +		exec_prefix="$(PKG_INSTALL_DIR)/usr" \ +		all install +	$(TARGET_CROSS)ranlib $(PKG_INSTALL_DIR)/usr/lib/libipfix.a +	$(TARGET_CROSS)ranlib $(PKG_INSTALL_DIR)/usr/lib/libmisc.a +endef + +define Build/InstallDev +	$(INSTALL_DIR) $(1) +	$(CP) $(PKG_INSTALL_DIR)/* $(1)/ +endef + +$(eval $(call BuildPackage,libipfix)) diff --git a/package/libipfix/extra/append-wprobe-ie.pl b/package/libipfix/extra/append-wprobe-ie.pl new file mode 100644 index 000000000..e3a44f0d7 --- /dev/null +++ b/package/libipfix/extra/append-wprobe-ie.pl @@ -0,0 +1,33 @@ +use strict; + +my @fields = ( +	[ "avg", "FLOAT", "Average" ], +	[ "stdev", "FLOAT", "Standard deviation" ], +	[ "n", "UINT", "Number of samples" ] +); + +my $file = $ARGV[0] or die "Syntax: $0 <file>\n"; +-f $file or die "File not found\n"; +my $last_ie = 0; +my $line; +open IES, "<$file" or die "Can't open file"; +while ($line = <IES>) { +	$line =~ /^(\d+)\s*,/ and $last_ie = $1; +} +close IES; +while (<STDIN>) { +	/^(\w+),\s*(\w+),\s*(.+)$/ and do { +		my $rfield = $1; +		my $nfield = $2; +		my $descr = $3; +		foreach my $f (@fields) { +			my $nr = ++$last_ie; +			my $n = $f->[0]; +			my $N = uc $n; +			my $ftype = $f->[1]; +			my $fdesc = $f->[2]; +			print "$nr, IPFIX_FT_WPROBE_$rfield\_$N, 4, IPFIX_CODING_$ftype, \"$nfield\_$n\", \"$descr - $fdesc\"\n"; +		} +	}; +} + diff --git a/package/libipfix/extra/wprobe-ie.txt b/package/libipfix/extra/wprobe-ie.txt new file mode 100644 index 000000000..3e5aeef30 --- /dev/null +++ b/package/libipfix/extra/wprobe-ie.txt @@ -0,0 +1,12 @@ +NOISE, global_noise, wprobe global noice floor +PHY_BUSY, global_phy_busy, wprobe global airtime total +PHY_RX, global_phy_rx, wprobe global airtime total from rx-frame +PHY_TX, global_phy_tx, wprobe global airtime total from tx-frame +RSSI, link_rssi, wprobe link received signal strength indication +SIGNAL, link_signal, wprobe link signal strength in dB +IEEE_RX_RATE, link_ieee_rx_rate, wprobe link IEEE 802.11 RX data rate +IEEE_TX_RATE, link_ieee_tx_rate, wprobe link IEEE 802.11 TX data rate +RETRANSMIT_200, link_retransmit_200, wprobe link total retransmissions per packet - <200 bytes +RETRANSMIT_400, link_retransmit_400, wprobe link total retransmissions per packet - <400 bytes +RETRANSMIT_800, link_retransmit_800, wprobe link total retransmissions per packet - <800 bytes +RETRANSMIT_1600, link_retransmit_1600, wprobe link total retransmissions per packet - >800 bytes diff --git a/package/libipfix/patches/100-openimp_sync.patch b/package/libipfix/patches/100-openimp_sync.patch new file mode 100644 index 000000000..135379529 --- /dev/null +++ b/package/libipfix/patches/100-openimp_sync.patch @@ -0,0 +1,405 @@ +--- a/lib/ipfix.c ++++ b/lib/ipfix.c +@@ -37,6 +37,9 @@ $$LIC$$ + #ifdef SCTPSUPPORT + #include <netinet/sctp.h> + #endif ++#ifndef NOTHREADS ++#include <pthread.h> ++#endif + #include <fcntl.h> + #include <netdb.h> +  +@@ -123,6 +126,18 @@ static uint16_t           g_lasttid;     + static ipfix_datarecord_t g_data = { NULL, NULL, 0 }; /* ipfix_export */ +  + static ipfix_field_t      *g_ipfix_fields; ++#ifndef NOTHREADS ++static pthread_mutex_t    g_mutex; ++#define mod_lock()        { \ ++                            if ( pthread_mutex_lock( &g_mutex ) !=0 ) \ ++                                mlogf( 0, "[ipfix] mutex_lock() failed: %s\n", \ ++                                       strerror( errno ) ); \ ++                          } ++#define mod_unlock()      {  pthread_mutex_unlock( &g_mutex ); } ++#else ++#define mod_lock() ++#define mod_unlock() ++#endif +  + /*----- prototypes -------------------------------------------------------*/ +  +@@ -133,6 +148,7 @@ int  _ipfix_send_message( ipfix_t *ifh,  +                           ipfix_message_t *message ); + int  _ipfix_write_msghdr( ipfix_t *ifh, ipfix_message_t *msg, iobuf_t *buf ); + void _ipfix_disconnect( ipfix_collector_t *col ); ++int  _ipfix_export_flush( ipfix_t *ifh ); +  +  + /* name      : do_writeselect +@@ -576,16 +592,18 @@ int ipfix_decode_float( void *in, void * +  + int ipfix_snprint_float( char *str, size_t size, void *data, size_t len ) + { +-    float tmp32; +-    double tmp64; ++    uint32_t tmp32; ++    uint64_t tmp64; +  +     switch ( len ) { +       case 4: +-          ipfix_decode_float( data, &tmp32, 4); +-          return snprintf( str, size, "%f", tmp32 ); ++          memcpy( &tmp32, data, len ); ++          tmp32 = htonl( tmp32 ); ++          return snprintf( str, size, "%f", (float)tmp32 ); +       case 8: +-          ipfix_decode_float( data, &tmp64, 8); +-          return snprintf( str, size, "%lf", tmp64); ++          memcpy( &tmp64, data, len ); ++          tmp64 = HTONLL( tmp64 ); ++          return snprintf( str, size, "%lf", (double)tmp64 ); +       default: +           break; +     } +@@ -682,12 +700,19 @@ int ipfix_get_eno_ieid( char *field, int +  * parameters: +  * remarks:     init module, read field type info. +  */ +-int ipfix_init ( void ) ++int ipfix_init( void ) + { +     if ( g_tstart ) { +         ipfix_cleanup(); +     } +  ++#ifndef NOTHREADS ++    if ( pthread_mutex_init( &g_mutex, NULL ) !=0 ) { ++        mlogf( 0, "[ipfix] pthread_mutex_init() failed: %s\n", ++               strerror(errno) ); ++        return -1; ++    } ++#endif +     g_tstart = time(NULL); +     signal( SIGPIPE, SIG_IGN ); +     g_lasttid = 255; +@@ -806,6 +831,9 @@ void ipfix_cleanup ( void ) +     g_data.maxfields = 0; +     g_data.lens  = NULL; +     g_data.addrs = NULL; ++#ifndef NOTHREADS ++    (void)pthread_mutex_destroy( &g_mutex ); ++#endif + } +  + int _ipfix_connect ( ipfix_collector_t *col ) +@@ -1465,7 +1493,7 @@ int _ipfix_write_template( ipfix_t       +       default: +           /* check space */ +           if ( tsize+ifh->offset > IPFIX_DEFAULT_BUFLEN ) { +-              if ( ipfix_export_flush( ifh ) < 0 ) ++              if ( _ipfix_export_flush( ifh ) < 0 ) +                   return -1; +               if ( tsize+ifh->offset > IPFIX_DEFAULT_BUFLEN ) +                   return -1; +@@ -1474,6 +1502,8 @@ int _ipfix_write_template( ipfix_t       +           /* write template prior to data */ +           if ( ifh->offset > 0 ) { +               memmove( ifh->buffer + tsize, ifh->buffer, ifh->offset ); ++              if ( ifh->cs_tid ) ++                  ifh->cs_header += tsize; +           } +  +           buf = ifh->buffer; +@@ -1615,8 +1645,11 @@ int ipfix_open( ipfix_t **ipfixh, int so +         return -1; +     } +     node->ifh   = i; ++ ++    mod_lock(); +     node->next  = g_ipfixlist; +     g_ipfixlist = node; ++    mod_unlock(); +  +     *ipfixh = i; +     return 0; +@@ -1633,7 +1666,8 @@ void ipfix_close( ipfix_t *h ) +     { +         ipfix_node_t *l, *n; +  +-        ipfix_export_flush( h ); ++        mod_lock(); ++        _ipfix_export_flush( h ); +  +         while( h->collectors ) +             _ipfix_drop_collector( (ipfix_collector_t**)&h->collectors ); +@@ -1659,6 +1693,7 @@ void ipfix_close( ipfix_t *h ) + #endif +         free(h->buffer); +         free(h); ++        mod_unlock(); +     } + } +  +@@ -2156,6 +2191,22 @@ void ipfix_release_template( ipfix_t *if +     ipfix_delete_template( ifh, templ ); + } +  ++static void _finish_cs( ipfix_t *ifh ) ++{ ++    size_t   buflen; ++    uint8_t  *buf; ++ ++    /* finish current dataset */ ++    if ( (buf=ifh->cs_header) ==NULL ) ++        return; ++    buflen = 0; ++    INSERTU16( buf+buflen, buflen, ifh->cs_tid ); ++    INSERTU16( buf+buflen, buflen, ifh->cs_bytes ); ++    ifh->cs_bytes = 0; ++    ifh->cs_header = NULL; ++    ifh->cs_tid = 0; ++} ++ + int ipfix_export( ipfix_t *ifh, ipfix_template_t *templ, ... ) + { +     int       i; +@@ -2199,13 +2250,14 @@ int ipfix_export( ipfix_t *ifh, ipfix_te +                                g_data.addrs, g_data.lens ); + } +  +-int ipfix_export_array( ipfix_t          *ifh, +-                        ipfix_template_t *templ, +-                        int              nfields, +-                        void             **fields, +-                        uint16_t         *lengths ) ++static int ++_ipfix_export_array( ipfix_t          *ifh, ++                     ipfix_template_t *templ, ++                     int              nfields, ++                     void             **fields, ++                     uint16_t         *lengths ) + { +-    int               i; ++    int               i, newset_f=0; +     size_t            buflen, datasetlen; +     uint8_t           *p, *buf; +  +@@ -2249,7 +2301,19 @@ int ipfix_export_array( ipfix_t          +  +     /** get size of data set, check space +      */ +-    for ( i=0, datasetlen=4; i<nfields; i++ ) { ++    if ( templ->tid == ifh->cs_tid ) { ++        newset_f = 0; ++        datasetlen = 0; ++    } ++    else { ++        if ( ifh->cs_tid > 0 ) { ++            _finish_cs( ifh ); ++        } ++        newset_f = 1; ++        datasetlen = 4; ++    } ++ ++    for ( i=0; i<nfields; i++ ) { +         if ( templ->fields[i].flength == IPFIX_FT_VARLEN ) { +             if ( lengths[i]>254 ) +                 datasetlen += 3; +@@ -2263,21 +2327,29 @@ int ipfix_export_array( ipfix_t          +         } +         datasetlen += lengths[i]; +     } +-    if ( ((ifh->offset + datasetlen) > IPFIX_DEFAULT_BUFLEN ) +-         && (ipfix_export_flush( ifh ) <0) ) { +-        return -1; ++ ++    if ( (ifh->offset + datasetlen) > IPFIX_DEFAULT_BUFLEN ) { ++        if ( ifh->cs_tid ) ++            _finish_cs( ifh ); ++        newset_f = 1; ++ ++        if ( _ipfix_export_flush( ifh ) <0 ) ++            return -1; +     } +  +-    /* fill buffer +-     */ ++    /* fill buffer */ +     buf    = (uint8_t*)(ifh->buffer) + ifh->offset; +     buflen = 0; +  +-    /* insert data set +-     */ +-    ifh->nrecords ++; +-    INSERTU16( buf+buflen, buflen, templ->tid ); +-    INSERTU16( buf+buflen, buflen, datasetlen ); ++    if ( newset_f ) { ++        /* insert data set ++         */ ++        ifh->cs_bytes = 0; ++        ifh->cs_header = buf; ++        ifh->cs_tid = templ->tid; ++        INSERTU16( buf+buflen, buflen, templ->tid ); ++        INSERTU16( buf+buflen, buflen, 4 ); ++    } +  +     /* insert data record +      */ +@@ -2303,7 +2375,9 @@ int ipfix_export_array( ipfix_t          +         buflen += lengths[i]; +     } +  ++    ifh->nrecords ++; +     ifh->offset += buflen; ++    ifh->cs_bytes += buflen; +     if ( ifh->version == IPFIX_VERSION ) +         ifh->seqno ++; +     return 0; +@@ -2313,7 +2387,7 @@ int ipfix_export_array( ipfix_t          +  * parameters: +  * remarks:     rewrite this func! +  */ +-int ipfix_export_flush( ipfix_t *ifh ) ++int _ipfix_export_flush( ipfix_t *ifh ) + { +     iobuf_t           *buf; +     ipfix_collector_t *col; +@@ -2322,8 +2396,14 @@ int ipfix_export_flush( ipfix_t *ifh ) +     if ( (ifh==NULL) || (ifh->offset==0) ) +         return 0; +  +-    if ( (buf=_ipfix_getbuf()) ==NULL ) ++    if ( ifh->cs_tid > 0 ) { ++        /* finish current dataset */ ++        _finish_cs( ifh ); ++    } ++ ++    if ( (buf=_ipfix_getbuf()) ==NULL ) { +         return -1; ++    } +  + #ifdef DEBUG +     mlogf( 0, "[ipfix_export_flush] msg has %d records, %d bytes\n", +@@ -2350,3 +2430,30 @@ int ipfix_export_flush( ipfix_t *ifh ) +     _ipfix_freebuf( buf ); +     return ret; + } ++ ++int ipfix_export_array( ipfix_t          *ifh, ++                        ipfix_template_t *templ, ++                        int              nfields, ++                        void             **fields, ++                        uint16_t         *lengths ) ++{ ++    int ret; ++ ++    mod_lock(); ++    ret = _ipfix_export_array( ifh, templ, nfields, fields, lengths ); ++    mod_unlock(); ++ ++    return ret; ++} ++ ++int ipfix_export_flush( ipfix_t *ifh ) ++{ ++    int ret; ++ ++    mod_lock(); ++    ret = _ipfix_export_flush( ifh ); ++    mod_unlock(); ++ ++    return ret; ++} ++ +--- a/lib/ipfix.h ++++ b/lib/ipfix.h +@@ -142,6 +142,12 @@ typedef struct +     int         nrecords;         /* no. of records in buffer */ +     size_t      offset;           /* output buffer fill level */ +     uint32_t    seqno;            /* sequence no. of next message */ ++ ++    /* experimental */ ++    int        cs_tid;            /* template id of current dataset */ ++    int        cs_bytes;          /* size of current set */ ++    uint8_t    *cs_header;        /* start of current set */ ++ + } ipfix_t; +  + /** exporter funcs +--- a/lib/ipfix_col.c ++++ b/lib/ipfix_col.c +@@ -907,7 +907,7 @@ int ipfix_decode_datarecord( ipfixt_node +     return 0; + } +  +-static void do_free_datarecord( ipfix_datarecord_t   *data ) ++void ipfix_free_datarecord( ipfix_datarecord_t   *data ) + {  +     if ( data ) { +         if ( data->addrs ) +@@ -925,6 +925,7 @@ int ipfix_parse_msg( ipfix_input_t *inpu +     ipfix_hdr_t          hdr;                  /* ipfix packet header */ +     ipfixs_node_t        *s; +     ipfix_datarecord_t   data = { NULL, NULL, 0 }; ++    ipfixe_node_t        *e; +     uint8_t              *buf;                 /* ipfix payload */ +     uint16_t             setid, setlen;        /* set id, set lenght */ +     int                  i, nread, offset;     /* counter */ +@@ -1042,6 +1043,12 @@ int ipfix_parse_msg( ipfix_input_t *inpu +                 err_flag = 1; +             }  +             else { ++                for ( e=g_exporter; e!=NULL; e=e->next ) { ++                    if ( e->elem->export_dset ) ++                        (void) e->elem->export_dset( t, buf+nread, setlen, ++                                                     e->elem->data ); ++                } ++ +                 /** read data records +                  */ +                 for ( offset=nread, bytesleft=setlen; bytesleft>4; ) { +@@ -1076,11 +1083,11 @@ int ipfix_parse_msg( ipfix_input_t *inpu +         goto errend; +  +  end: +-    do_free_datarecord( &data ); ++    ipfix_free_datarecord( &data ); +     return nread; +  +  errend: +-    do_free_datarecord( &data ); ++    ipfix_free_datarecord( &data ); +     return -1; + } +  +@@ -1093,7 +1100,7 @@ void process_client_tcp( int fd, int mas +     tcp_conn_t   *tcon = (tcp_conn_t*)data; +     char         *func = "process_client_tcp"; +  +-    mlogf( 3,  "[%s] fd %d mask %d called.\n", func, fd, mask ); ++    mlogf( 4,  "[%s] fd %d mask %d called.\n", func, fd, mask ); +  +     /** read ipfix header  +      */ +--- a/lib/ipfix_col.h ++++ b/lib/ipfix_col.h +@@ -88,6 +88,7 @@ typedef struct ipfix_col_info +     int (*export_newsource)(ipfixs_node_t*,void*); +     int (*export_newmsg)(ipfixs_node_t*,ipfix_hdr_t*,void*); +     int (*export_trecord)(ipfixs_node_t*,ipfixt_node_t*,void*); ++    int (*export_dset)(ipfixt_node_t*,uint8_t*,size_t,void*); +     int (*export_drecord)(ipfixs_node_t*,ipfixt_node_t*, +                           ipfix_datarecord_t*,void*); +     void (*export_cleanup)(void*); +--- a/lib/ipfix_col_files.c ++++ b/lib/ipfix_col_files.c +@@ -68,7 +68,7 @@ static int export_newsource_file( ipfixs +             return -1; +         } +         snprintf( s->fname+strlen(s->fname), PATH_MAX-strlen(s->fname), +-                  "/%u", s->odid ); ++                  "/%u", (unsigned int)s->odid ); +         if ( (access( s->fname, R_OK ) <0 ) +              && (mkdir( s->fname, S_IRWXU ) <0) ) { +             mlogf( 0, "[%s] cannot access dir '%s': %s\n", diff --git a/package/libipfix/patches/110-wprobe_ie.patch b/package/libipfix/patches/110-wprobe_ie.patch new file mode 100644 index 000000000..866b67a2f --- /dev/null +++ b/package/libipfix/patches/110-wprobe_ie.patch @@ -0,0 +1,43 @@ +--- a/lib/ipfix_FOKUS_IEs.txt ++++ b/lib/ipfix_FOKUS_IEs.txt +@@ -38,4 +38,39 @@ + 312, IPFIX_FT_OWDVARMEAN_NSEC,      4, IPFIX_CODING_INT, "owdvarmean_nsec", "FOKUS mean owd variace in ns" + 313, IPFIX_FT_OWDVARMIN_NSEC,       4, IPFIX_CODING_INT, "owdvarmin_nsec", "FOKUS minimum owd variance in ns" + 314, IPFIX_FT_OWDVARMAX_NSEC,       4, IPFIX_CODING_INT, "owdvarmax_nsec", "FOKUS maximum ow variance in ns" +- ++315, IPFIX_FT_WPROBE_NOISE_AVG, 4, IPFIX_CODING_FLOAT, "global_noise_avg", "wprobe global noice floor - Average" ++316, IPFIX_FT_WPROBE_NOISE_STDEV, 4, IPFIX_CODING_FLOAT, "global_noise_stdev", "wprobe global noice floor - Standard deviation" ++317, IPFIX_FT_WPROBE_NOISE_N, 4, IPFIX_CODING_UINT, "global_noise_n", "wprobe global noice floor - Number of samples" ++318, IPFIX_FT_WPROBE_PHY_BUSY_AVG, 4, IPFIX_CODING_FLOAT, "global_phy_busy_avg", "wprobe global airtime total - Average" ++319, IPFIX_FT_WPROBE_PHY_BUSY_STDEV, 4, IPFIX_CODING_FLOAT, "global_phy_busy_stdev", "wprobe global airtime total - Standard deviation" ++320, IPFIX_FT_WPROBE_PHY_BUSY_N, 4, IPFIX_CODING_UINT, "global_phy_busy_n", "wprobe global airtime total - Number of samples" ++321, IPFIX_FT_WPROBE_PHY_RX_AVG, 4, IPFIX_CODING_FLOAT, "global_phy_rx_avg", "wprobe global airtime total from rx-frame - Average" ++322, IPFIX_FT_WPROBE_PHY_RX_STDEV, 4, IPFIX_CODING_FLOAT, "global_phy_rx_stdev", "wprobe global airtime total from rx-frame - Standard deviation" ++323, IPFIX_FT_WPROBE_PHY_RX_N, 4, IPFIX_CODING_UINT, "global_phy_rx_n", "wprobe global airtime total from rx-frame - Number of samples" ++324, IPFIX_FT_WPROBE_PHY_TX_AVG, 4, IPFIX_CODING_FLOAT, "global_phy_tx_avg", "wprobe global airtime total from tx-frame - Average" ++325, IPFIX_FT_WPROBE_PHY_TX_STDEV, 4, IPFIX_CODING_FLOAT, "global_phy_tx_stdev", "wprobe global airtime total from tx-frame - Standard deviation" ++326, IPFIX_FT_WPROBE_PHY_TX_N, 4, IPFIX_CODING_UINT, "global_phy_tx_n", "wprobe global airtime total from tx-frame - Number of samples" ++327, IPFIX_FT_WPROBE_RSSI_AVG, 4, IPFIX_CODING_FLOAT, "link_rssi_avg", "wprobe link received signal strength indication - Average" ++328, IPFIX_FT_WPROBE_RSSI_STDEV, 4, IPFIX_CODING_FLOAT, "link_rssi_stdev", "wprobe link received signal strength indication - Standard deviation" ++329, IPFIX_FT_WPROBE_RSSI_N, 4, IPFIX_CODING_UINT, "link_rssi_n", "wprobe link received signal strength indication - Number of samples" ++330, IPFIX_FT_WPROBE_SIGNAL_AVG, 4, IPFIX_CODING_FLOAT, "link_signal_avg", "wprobe link signal strength in dB - Average" ++331, IPFIX_FT_WPROBE_SIGNAL_STDEV, 4, IPFIX_CODING_FLOAT, "link_signal_stdev", "wprobe link signal strength in dB - Standard deviation" ++332, IPFIX_FT_WPROBE_SIGNAL_N, 4, IPFIX_CODING_UINT, "link_signal_n", "wprobe link signal strength in dB - Number of samples" ++333, IPFIX_FT_WPROBE_IEEE_RX_RATE_AVG, 4, IPFIX_CODING_FLOAT, "link_ieee_rx_rate_avg", "wprobe link IEEE 802.11 RX data rate - Average" ++334, IPFIX_FT_WPROBE_IEEE_RX_RATE_STDEV, 4, IPFIX_CODING_FLOAT, "link_ieee_rx_rate_stdev", "wprobe link IEEE 802.11 RX data rate - Standard deviation" ++335, IPFIX_FT_WPROBE_IEEE_RX_RATE_N, 4, IPFIX_CODING_UINT, "link_ieee_rx_rate_n", "wprobe link IEEE 802.11 RX data rate - Number of samples" ++336, IPFIX_FT_WPROBE_IEEE_TX_RATE_AVG, 4, IPFIX_CODING_FLOAT, "link_ieee_tx_rate_avg", "wprobe link IEEE 802.11 TX data rate - Average" ++337, IPFIX_FT_WPROBE_IEEE_TX_RATE_STDEV, 4, IPFIX_CODING_FLOAT, "link_ieee_tx_rate_stdev", "wprobe link IEEE 802.11 TX data rate - Standard deviation" ++338, IPFIX_FT_WPROBE_IEEE_TX_RATE_N, 4, IPFIX_CODING_UINT, "link_ieee_tx_rate_n", "wprobe link IEEE 802.11 TX data rate - Number of samples" ++339, IPFIX_FT_WPROBE_RETRANSMIT_200_AVG, 4, IPFIX_CODING_FLOAT, "link_retransmit_200_avg", "wprobe link total retransmissions per packet - <200 bytes - Average" ++340, IPFIX_FT_WPROBE_RETRANSMIT_200_STDEV, 4, IPFIX_CODING_FLOAT, "link_retransmit_200_stdev", "wprobe link total retransmissions per packet - <200 bytes - Standard deviation" ++341, IPFIX_FT_WPROBE_RETRANSMIT_200_N, 4, IPFIX_CODING_UINT, "link_retransmit_200_n", "wprobe link total retransmissions per packet - <200 bytes - Number of samples" ++342, IPFIX_FT_WPROBE_RETRANSMIT_400_AVG, 4, IPFIX_CODING_FLOAT, "link_retransmit_400_avg", "wprobe link total retransmissions per packet - <400 bytes - Average" ++343, IPFIX_FT_WPROBE_RETRANSMIT_400_STDEV, 4, IPFIX_CODING_FLOAT, "link_retransmit_400_stdev", "wprobe link total retransmissions per packet - <400 bytes - Standard deviation" ++344, IPFIX_FT_WPROBE_RETRANSMIT_400_N, 4, IPFIX_CODING_UINT, "link_retransmit_400_n", "wprobe link total retransmissions per packet - <400 bytes - Number of samples" ++345, IPFIX_FT_WPROBE_RETRANSMIT_800_AVG, 4, IPFIX_CODING_FLOAT, "link_retransmit_800_avg", "wprobe link total retransmissions per packet - <800 bytes - Average" ++346, IPFIX_FT_WPROBE_RETRANSMIT_800_STDEV, 4, IPFIX_CODING_FLOAT, "link_retransmit_800_stdev", "wprobe link total retransmissions per packet - <800 bytes - Standard deviation" ++347, IPFIX_FT_WPROBE_RETRANSMIT_800_N, 4, IPFIX_CODING_UINT, "link_retransmit_800_n", "wprobe link total retransmissions per packet - <800 bytes - Number of samples" ++348, IPFIX_FT_WPROBE_RETRANSMIT_1600_AVG, 4, IPFIX_CODING_FLOAT, "link_retransmit_1600_avg", "wprobe link total retransmissions per packet - >800 bytes - Average" ++349, IPFIX_FT_WPROBE_RETRANSMIT_1600_STDEV, 4, IPFIX_CODING_FLOAT, "link_retransmit_1600_stdev", "wprobe link total retransmissions per packet - >800 bytes - Standard deviation" ++350, IPFIX_FT_WPROBE_RETRANSMIT_1600_N, 4, IPFIX_CODING_UINT, "link_retransmit_1600_n", "wprobe link total retransmissions per packet - >800 bytes - Number of samples"  | 
