OZ++ Class: TrafficControlMsg
/******************************************************************************
 *
 * 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.
 *
 *
 *  TrafficControlMsg.h
 *
 *****************************************************************************/

#pragma once

#include <oz++/CommonObject.h>
#include <oz++/StringBufferT.h>
#include <oz++/CharString.h>
#include <oz++/Pair.h>
#include <oz++/KeyNamePairs.h>
#include <oz++/Exception.h>
#include <oz++/Attribute.h>


#include <oz++/netlink/SocketNetlink.h>
#include <oz++/netlink/SockAddrNetlink.h>
#include <oz++/netlink/NetlinkMsg.h>

#include <linux/pkt_sched.h>

/*
RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC Add, 
remove or get a queueing discipline. The message contains a struct tcmsg 
and may be followed by a series of attributes. 
*/
/*
 Traffic control messages.

struct tcmsg {
    unsigned char   tcm_family;
    unsigned char   tcm__pad1;
    unsigned short  tcm__pad2;
    int     tcm_ifindex;
    __u32       tcm_handle;
    __u32       tcm_parent;
    __u32       tcm_info;
};
*/

namespace OZ {

class TrafficControlMsg :public NetlinkMsg<tcmsg> {

public:
  TrafficControlMsg(void* msg)
  :NetlinkMsg<tcmsg>(msg, (size_t)TCA_MAX)
  {
  }

public:
  TrafficControlMsg(struct tcmsg* msg)
  :NetlinkMsg<tcmsg>(msg, (size_t)TCA_MAX)
  {
  }

  

  void family(unsigned char family)
  {
    message -> tcm_family = family; 
  }
    
  unsigned char family()
  {
    return message -> tcm_family;
  }
    
  void ifindex(int index)
  {
    message -> tcm_ifindex = index; 
  }
    
  int  ifindex()
  {
    return message -> tcm_ifindex;
  }

  void handle(__u32 h)
  {
    message -> tcm_handle = h; 
  }
    
  __u32  handle()
  {
    return message -> tcm_handle;
  }
    
  void parent(__u32 p)
  {
    message -> tcm_parent = p; 
  }


  __u32  parent()
  {
    return message -> tcm_parent;
  }
    

  void info(__u32 i)
  {
    message -> tcm_info = i; 
  }
    
  __u32  info()
  {
    return message -> tcm_info;
  }


public:
  void display()
  {
    printf("TCMSG family:  %s\n",   getFamily(message -> tcm_family));
    printf("TCMSG ifindex: %d\n",  message -> tcm_ifindex); //if_indextoname(message -> tcm_ifindex, name));
    printf("TCMSG handle:  %d\n",   message -> tcm_handle);
    printf("TCMSG parent:  %s\n",   getParent(message -> tcm_parent));
    printf("TCMSG info:    %d\n",   message -> tcm_info);

    displayAttributes();
  }


public:
  static const char* getParent(__u32 parent)
  {
    static Pair<__u32, const char*> parents[] = 
    {
      {TC_H_UNSPEC, "TC_H_UNSPEC"},
      {TC_H_ROOT,   "TC_H_ROOT"},
      {TC_H_INGRESS, "TC_H_INGRESS"},
    };
      KeyNamePairs<__u32> pairs(parents, SizeOf(parents));
      return pairs.match(parent);
  }

};

}