OZ++ Class: RoutingLinkStats64
/******************************************************************************
 *
 * Copyright (c) 2014 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *  
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  RoutingLinkStats64.h
 *
 *****************************************************************************/

//2018/08/20 Modified to use %llu

#pragma once

#include <oz++/CommonObject.h>
#include <linux/rtnetlink.h>
#include <linux/if_link.h>

/*
struct rtnl_link_stats64 {
    __u64   rx_packets;     // total packets received   
    __u64   tx_packets;     // total packets transmitted    
    __u64   rx_bytes;       // total bytes received     
    __u64   tx_bytes;       // total bytes transmitted  
    __u64   rx_errors;      // bad packets received     
    __u64   tx_errors;      // packet transmit problems 
    __u64   rx_dropped;     // no space in linux buffers    
    __u64   tx_dropped;     // no space available in linux  
    __u64   multicast;      // multicast packets received   
    __u64   collisions;

    // detailed rx_errors: 
    __u64   rx_length_errors;
    __u64   rx_over_errors;     // receiver ring buff overflow  
    __u64   rx_crc_errors;      // recved pkt with crc error    
    __u64   rx_frame_errors;    // recv'd frame alignment error 
    __u64   rx_fifo_errors;     // recv'r fifo overrun      
    __u64   rx_missed_errors;   // receiver missed packet   

    // detailed tx_errors 
    __u64   tx_aborted_errors;
    __u64   tx_carrier_errors;
    __u64   tx_fifo_errors;
    __u64   tx_heartbeat_errors;
    __u64   tx_window_errors;

    // for cslip etc 
    __u64   rx_compressed;
    __u64   tx_compressed;
};
*/


namespace OZ {

class RoutingLinkStats64 :public CommonObject {
private:
  struct rtnl_link_stats64 stats;

public:
  RoutingLinkStats64(struct rtnl_link_stats64 st)
  :stats(st)
  {

  }
    
  void display()
  {
    printf("STATS64: ");    
    printf("rx_packets: %llu,",   stats.rx_packets);
    printf("tx_packets: %llu,",   stats.tx_packets);
    printf("rx_bytes: %llu,",     stats.rx_bytes);
    printf("tx_bytes: %llu,",     stats.tx_bytes);
    printf("rx_errors: %llu,",    stats.rx_errors);
    printf("tx_errors: %llu,",    stats.tx_errors);
    printf("rx_dropped: %llu,",   stats.rx_dropped);
    printf("tx_dropped: %llu,",   stats.tx_dropped);
    printf("multicast: %llu,",    stats.multicast);
    printf("collisions: %llu\n",   stats.collisions);
  }

   // detailed rx_errors: 
  void rxerrors()
  {
    printf("rx_length_errors: %llu, ",   stats.rx_length_errors);
    printf("rx_over_errors: %llu, ",   stats.rx_over_errors);     // receiver ring buff overflow  
    printf("rx_crc_errors: %llu, ",   stats.rx_crc_errors);      // recved pkt with crc error    
    printf("rx_frame_errors: %llu, ",   stats.rx_frame_errors);    // recv'd frame alignment error 
    printf("rx_fifo_errors: %llu, ",   stats.rx_fifo_errors);     // recv'r fifo overrun      
    printf("rx_missed_errors: %llu\n",   stats.rx_missed_errors);   // receiver missed packet   
  }
  // detailed tx_errors 
  void txerrors()
  {
    printf("tx_aborted_errors: %llu, ",   stats.tx_aborted_errors);
    printf("tx_carrier_errors: %llu, ",   stats.tx_carrier_errors);
    printf("tx_fifo_errors: %llu, ",   stats.tx_fifo_errors);
    printf("tx_heartbeat_errors: %llu, ",   stats.tx_heartbeat_errors);
    printf("tx_window_errors: %llu\n",   stats.tx_window_errors);
  }
  // for cslip etc 
  void cslip()
  {
    printf("rx_compressed: %llu, ",   stats.rx_compressed);
    printf("tx_compressed: %llu\n",   stats.tx_compressed);
  }


};

}