commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7412 - in usrp2/trunk/host: . apps lib


From: eb
Subject: [Commit-gnuradio] r7412 - in usrp2/trunk/host: . apps lib
Date: Sat, 12 Jan 2008 21:03:04 -0700 (MST)

Author: eb
Date: 2008-01-12 21:03:04 -0700 (Sat, 12 Jan 2008)
New Revision: 7412

Added:
   usrp2/trunk/host/lib/gri_if_stats.cc
   usrp2/trunk/host/lib/gri_if_stats.h
Modified:
   usrp2/trunk/host/Makefile.common
   usrp2/trunk/host/apps/Makefile.am
   usrp2/trunk/host/apps/rx_samples.cc
   usrp2/trunk/host/lib/Makefile.am
Log:
collect ethernet interface stats and compare to what we see in user space

Modified: usrp2/trunk/host/Makefile.common
===================================================================
--- usrp2/trunk/host/Makefile.common    2008-01-13 03:57:47 UTC (rev 7411)
+++ usrp2/trunk/host/Makefile.common    2008-01-13 04:03:04 UTC (rev 7412)
@@ -16,6 +16,8 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
+AM_CXXFLAGS = @autoconf_default_CXXFLAGS@
+
 STD_DEFINES_AND_INCLUDES = \
   -I$(top_srcdir)/../firmware/include \
   -I$(top_srcdir)/lib

Modified: usrp2/trunk/host/apps/Makefile.am
===================================================================
--- usrp2/trunk/host/apps/Makefile.am   2008-01-13 03:57:47 UTC (rev 7411)
+++ usrp2/trunk/host/apps/Makefile.am   2008-01-13 04:03:04 UTC (rev 7412)
@@ -36,3 +36,4 @@
 
 
 
+

Modified: usrp2/trunk/host/apps/rx_samples.cc
===================================================================
--- usrp2/trunk/host/apps/rx_samples.cc 2008-01-13 03:57:47 UTC (rev 7411)
+++ usrp2/trunk/host/apps/rx_samples.cc 2008-01-13 04:03:04 UTC (rev 7412)
@@ -25,11 +25,38 @@
 #include <getopt.h>
 #include <string.h>
 #include "strtod_si.h"
+#include <signal.h>
+#include <stdexcept>
+#include "gri_if_stats.h"
 
-
 typedef std::complex<float> fcomplex;
 
+static volatile bool signaled = false;
 
+static void 
+sig_handler(int sig)
+{
+  signaled = true;
+}
+
+static void
+install_sig_handler(int signum,
+                   void (*new_handler)(int))
+{
+  struct sigaction new_action;
+  memset (&new_action, 0, sizeof (new_action));
+
+  new_action.sa_handler = new_handler;
+  sigemptyset (&new_action.sa_mask);
+  new_action.sa_flags = 0;
+
+  if (sigaction (signum, &new_action, 0) < 0){
+    perror ("sigaction (install new)");
+    throw std::runtime_error ("sigaction");
+  }
+}
+
+
 /*
  * Vectorize me!
  */
@@ -62,7 +89,7 @@
   fprintf(stderr, "  -h                   show this message and exit\n");
   fprintf(stderr, "  -e ETH_INTERFACE     specify ethernet interface 
[default=eth0]\n");
   fprintf(stderr, "  -m MAC_ADDR          mac address of USRP2 HH:HH 
[default=first one found]\n");
-  fprintf(stderr, "  -o OUTPUT_FILE       set output filename 
[default=samples.dat]\n");
+  fprintf(stderr, "  -o OUTPUT_FILE       set output filename 
[default=NONE]\n");
   fprintf(stderr, "  -f FREQ              set frequency to FREQ 
[default=0]\n");
   fprintf(stderr, "  -d DECIM             set decimation rate to DECIM 
[default=32]\n");
   fprintf(stderr, "  -N NSAMPLES          total number of samples to receive 
[default=2.5e6]\n");
@@ -77,7 +104,7 @@
   // options and their defaults
   const char *interface = "eth0";
   const char *mac_addr_str = 0;
-  const char *output_filename = "samples.dat";
+  const char *output_filename = 0;
   double freq = 0;
   int32_t decim = 32;
   int32_t nsamples = static_cast<int32_t>(2.5e6);
@@ -154,7 +181,9 @@
     exit(1);
   }
 
-  FILE *of = fopen(output_filename, "wb");
+  FILE *of = 0;
+  if (output_filename)
+    of = fopen(output_filename, "wb");
 
   usrp2_basic *u2 = new usrp2_basic();
 
@@ -163,6 +192,14 @@
     return 0;
   }
 
+
+  install_sig_handler(SIGINT, sig_handler);
+  if (1){
+    install_sig_handler(SIGALRM, sig_handler);
+    alarm(5);
+  }
+
+  
   std::vector<op_id_reply_t> r = u2->find_usrps();
 
   for (size_t i = 0; i < r.size(); i++){
@@ -176,12 +213,20 @@
 
   u2_mac_addr_t which = r[0].addr;     // pick the first one
 
+
+  gri_if_stats start, stop;
+  gri_get_if_stats(interface, &start);
+
   if (!u2->start_rx(which, freq, decim, nsamples, samples_per_frame, scale, 
scale)){
     std::cerr << "start_rx failed\n";
     return 1;
   }
 
-  while (1){
+
+  long total_samples_recvd = 0;
+  long total_pkts_recvd = 0;
+  
+  while (!signaled && total_samples_recvd < nsamples){
     u2_eth_samples_t   pkt;
     // fcomplex                c_samples[U2_MAX_SAMPLES];
     
@@ -190,19 +235,37 @@
     if (n <= 0)
       break;
     
-    printf("%3d  %8d\n", n, u2p_timestamp(&pkt.fixed));
+    total_pkts_recvd++;
+    total_samples_recvd += n;
+    printf("%3d  %8d  %8ld  %8ld\n", n, u2p_timestamp(&pkt.fixed),
+          total_pkts_recvd, total_samples_recvd);
 
     // convert_samples_to_complex(n, pkt.samples, c_samples);
     // size_t r = fwrite(c_samples, sizeof(fcomplex), n, of);
 
-    size_t r = fwrite(pkt.samples, sizeof(uint32_t), n, of);
-    fflush(of);
+    if (of){
+      fwrite(pkt.samples, sizeof(uint32_t), n, of);
+      fflush(of);
+    }
   }
 
+  gri_get_if_stats(interface, &stop);
+
   if (!u2->stop_rx(which)){
     std::cerr << "stop_rx failed\n";
     return 1;
   }
 
+  printf("\nInterface statistics:\n");
+  printf("  rx_bytes:    %8Ld\n",   stop.rx_bytes - start.rx_bytes);
+  printf("  rx_packets:  %8Ld\n",   stop.rx_packets - start.rx_packets);
+  printf("  rx_errs:     %8Ld\n",   stop.rx_errs - start.rx_errs);
+  printf("  rx_drop:     %8Ld\n",   stop.rx_drop - start.rx_drop);
+  printf("  tx_bytes:    %8Ld\n",   stop.tx_bytes - start.tx_bytes);
+  printf("  tx_packets:  %8Ld\n",   stop.tx_packets - start.tx_packets);
+  printf("  tx_errs:     %8Ld\n",   stop.tx_errs - start.tx_errs);
+  printf("  tx_drop:     %8Ld\n",   stop.tx_drop - start.tx_drop);
+
+
   return 0;
 }

Modified: usrp2/trunk/host/lib/Makefile.am
===================================================================
--- usrp2/trunk/host/lib/Makefile.am    2008-01-13 03:57:47 UTC (rev 7411)
+++ usrp2/trunk/host/lib/Makefile.am    2008-01-13 04:03:04 UTC (rev 7412)
@@ -23,6 +23,7 @@
 
 libusrp2_la_SOURCES = \
        gri_ethernet.cc \
+       gri_if_stats.cc \
        gri_pktfilter.cc \
        strtod_si.c \
        usrp2_basic.cc
@@ -30,6 +31,7 @@
 
 include_HEADERS = \
        gri_ethernet.h \
+       gri_if_stats.h \
        gri_pktfilter.h \
        strtod_si.h \
        usrp2_basic.h

Added: usrp2/trunk/host/lib/gri_if_stats.cc
===================================================================
--- usrp2/trunk/host/lib/gri_if_stats.cc                                (rev 0)
+++ usrp2/trunk/host/lib/gri_if_stats.cc        2008-01-13 04:03:04 UTC (rev 
7412)
@@ -0,0 +1,76 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gri_if_stats.h"
+#include <stdio.h>
+
+
+/* Very fragile.  Works on my machine. C++ is way too low-level for this kind 
of thing */
+   
+static const char *stats_filename = "/proc/net/dev";
+
+std::vector<gri_if_stats> 
+gri_get_all_if_stats()
+{
+  std::vector<gri_if_stats>  r;
+  char line[1024];
+  
+  FILE *fp = fopen(stats_filename, "r");
+  if (fp == 0){
+    perror(stats_filename);
+    return r;
+  }
+
+  fgets(line, sizeof(line), fp);       // read and ignore 1st line
+  fgets(line, sizeof(line), fp);       // read and ignore 2nd line
+
+  while (fgets(line, sizeof(line), fp) != 0){
+    gri_if_stats  s;
+    char name[16];
+    const char *fmt = " %15[^:]: %Ld %Ld %Ld %Ld %*Ld %*Ld %*Ld %*Ld %Ld %Ld 
%Ld %Ld";
+    int n = sscanf(line, fmt,
+                  name,
+                  &s.rx_bytes, &s.rx_packets, &s.rx_errs, &s.rx_drop,
+                  &s.tx_bytes, &s.tx_packets, &s.tx_errs, &s.tx_drop);
+    name[15] = 0;
+    if (n != 9){
+      fprintf(stderr, "gri_get_if_stats: unexpected input: n = %d\n%s\n", n, 
line);
+      continue;
+    }
+    s.if_name = name;
+    r.push_back(s);
+  }
+
+  return r;
+}
+
+bool
+gri_get_if_stats(const std::string &if_name, gri_if_stats *s)
+{
+  std::vector<gri_if_stats>  all = gri_get_all_if_stats();
+  for (size_t i = 0; i < all.size(); i++){
+    if (all[i].if_name == if_name){
+      *s = all[i];
+      return true;
+    }
+  }
+  return  false;
+}


Property changes on: usrp2/trunk/host/lib/gri_if_stats.cc
___________________________________________________________________
Name: svn:eol-style
   + native

Added: usrp2/trunk/host/lib/gri_if_stats.h
===================================================================
--- usrp2/trunk/host/lib/gri_if_stats.h                         (rev 0)
+++ usrp2/trunk/host/lib/gri_if_stats.h 2008-01-13 04:03:04 UTC (rev 7412)
@@ -0,0 +1,46 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef INCLUDED_GRI_IF_STATS_H
+#define INCLUDED_GRI_IF_STATS_H
+
+#include <string>
+#include <vector>
+
+struct gri_if_stats {
+  std::string  if_name;
+
+  long long    rx_bytes;
+  long long    rx_packets;
+  long long    rx_errs;
+  long long    rx_drop;
+
+  long long    tx_bytes;
+  long long    tx_packets;
+  long long    tx_errs;
+  long long    tx_drop;
+};
+
+
+/*!
+ * Retrieve network interface stats (by reading /proc/net/dev)
+ */
+std::vector<gri_if_stats> gri_get_all_if_stats();
+
+bool gri_get_if_stats(const std::string &if_name, gri_if_stats *s);
+
+#endif /* INCLUDED_GRI_IF_STATS_H */


Property changes on: usrp2/trunk/host/lib/gri_if_stats.h
___________________________________________________________________
Name: svn:eol-style
   + native





reply via email to

[Prev in Thread] Current Thread [Next in Thread]