nexmon – Rev 1

Subversion Repositories:
Rev:
/*
 * netlink-types.h      Netlink Types (Private)
 *
 *      This library is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU Lesser General Public
 *      License as published by the Free Software Foundation version 2.1
 *      of the License.
 *
 * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
 */

#ifndef NETLINK_LOCAL_TYPES_H_
#define NETLINK_LOCAL_TYPES_H_

#include <netlink/list.h>
#include <netlink/route/link.h>
#include <netlink/route/qdisc.h>
#include <netlink/route/rtnl.h>
#include <netlink/route/route.h>

#define NL_SOCK_BUFSIZE_SET     (1<<0)
#define NL_SOCK_PASSCRED        (1<<1)
#define NL_OWN_PORT             (1<<2)
#define NL_MSG_PEEK             (1<<3)
#define NL_NO_AUTO_ACK          (1<<4)

#define NL_MSG_CRED_PRESENT 1

struct nl_cache_ops;
struct nl_sock;
struct nl_object;

struct nl_cb
{
        nl_recvmsg_msg_cb_t     cb_set[NL_CB_TYPE_MAX+1];
        void *                  cb_args[NL_CB_TYPE_MAX+1];
        
        nl_recvmsg_err_cb_t     cb_err;
        void *                  cb_err_arg;

        /** May be used to replace nl_recvmsgs with your own implementation
         * in all internal calls to nl_recvmsgs. */
        int                     (*cb_recvmsgs_ow)(struct nl_sock *,
                                                  struct nl_cb *);

        /** Overwrite internal calls to nl_recv, must return the number of
         * octets read and allocate a buffer for the received data. */
        int                     (*cb_recv_ow)(struct nl_sock *,
                                              struct sockaddr_nl *,
                                              unsigned char **,
                                              struct ucred **);

        /** Overwrites internal calls to nl_send, must send the netlink
         * message. */
        int                     (*cb_send_ow)(struct nl_sock *,
                                              struct nl_msg *);

        int                     cb_refcnt;
};

struct nl_sock
{
        struct sockaddr_nl      s_local;
        struct sockaddr_nl      s_peer;
        int                     s_fd;
        int                     s_proto;
        unsigned int            s_seq_next;
        unsigned int            s_seq_expect;
        int                     s_flags;
        struct nl_cb *          s_cb;
};

struct nl_cache
{
        struct nl_list_head     c_items;
        int                     c_nitems;
        int                     c_iarg1;
        int                     c_iarg2;
        struct nl_cache_ops *   c_ops;
};

struct nl_cache_assoc
{
        struct nl_cache *       ca_cache;
        change_func_t           ca_change;
        void *                  ca_change_data;
};

struct nl_cache_mngr
{
        int                     cm_protocol;
        int                     cm_flags;
        int                     cm_nassocs;
        struct nl_sock *        cm_handle;
        struct nl_cache_assoc * cm_assocs;
};

struct nl_parser_param;

#define LOOSE_COMPARISON        1

#define NL_OBJ_MARK             1

struct nl_object
{
        NLHDR_COMMON
};

struct nl_data
{
        size_t                  d_size;
        void *                  d_data;
};

struct nl_addr
{
        int                     a_family;
        unsigned int            a_maxsize;
        unsigned int            a_len;
        int                     a_prefixlen;
        int                     a_refcnt;
        char                    a_addr[0];
};

struct nl_msg
{
        int                     nm_protocol;
        int                     nm_flags;
        struct sockaddr_nl      nm_src;
        struct sockaddr_nl      nm_dst;
        struct ucred            nm_creds;
        struct nlmsghdr *       nm_nlh;
        size_t                  nm_size;
        int                     nm_refcnt;
};

struct rtnl_link_map
{
        uint64_t lm_mem_start;
        uint64_t lm_mem_end;
        uint64_t lm_base_addr;
        uint16_t lm_irq;
        uint8_t  lm_dma;
        uint8_t  lm_port;
};

#define IFQDISCSIZ      32

struct rtnl_link
{
        NLHDR_COMMON

        char            l_name[IFNAMSIZ];

        uint32_t        l_family;
        uint32_t        l_arptype;
        uint32_t        l_index;
        uint32_t        l_flags;
        uint32_t        l_change;
        uint32_t        l_mtu;
        uint32_t        l_link;
        uint32_t        l_txqlen;
        uint32_t        l_weight;
        uint32_t        l_master;
        struct nl_addr *l_addr; 
        struct nl_addr *l_bcast;
        char            l_qdisc[IFQDISCSIZ];
        struct rtnl_link_map l_map;
        uint64_t        l_stats[RTNL_LINK_STATS_MAX+1];
        uint32_t        l_flag_mask;
        uint8_t         l_operstate;
        uint8_t         l_linkmode;
        /* 2 byte hole */
        struct rtnl_link_info_ops *l_info_ops;
        void *          l_info;
};

struct rtnl_ncacheinfo
{
        uint32_t nci_confirmed; /**< Time since neighbour validty was last confirmed */
        uint32_t nci_used;      /**< Time since neighbour entry was last ued */
        uint32_t nci_updated;   /**< Time since last update */
        uint32_t nci_refcnt;    /**< Reference counter */
};


struct rtnl_neigh
{
        NLHDR_COMMON
        uint32_t        n_family;
        uint32_t        n_ifindex;
        uint16_t        n_state;
        uint8_t         n_flags;
        uint8_t         n_type; 
        struct nl_addr *n_lladdr;
        struct nl_addr *n_dst;  
        uint32_t        n_probes;
        struct rtnl_ncacheinfo n_cacheinfo;
        uint32_t                n_state_mask;
        uint32_t                n_flag_mask;
};


struct rtnl_addr_cacheinfo
{
        /* Preferred lifetime in seconds */
        uint32_t aci_prefered;

        /* Valid lifetime in seconds */
        uint32_t aci_valid;

        /* Timestamp of creation in 1/100s seince boottime */
        uint32_t aci_cstamp;

        /* Timestamp of last update in 1/100s since boottime */
        uint32_t aci_tstamp;
};

struct rtnl_addr
{
        NLHDR_COMMON

        uint8_t         a_family;
        uint8_t         a_prefixlen;
        uint8_t         a_flags;
        uint8_t         a_scope;
        uint32_t        a_ifindex;

        struct nl_addr *a_peer; 
        struct nl_addr *a_local;
        struct nl_addr *a_bcast;
        struct nl_addr *a_anycast;
        struct nl_addr *a_multicast;

        struct rtnl_addr_cacheinfo a_cacheinfo;
        
        char a_label[IFNAMSIZ];
        uint32_t a_flag_mask;
};

struct rtnl_nexthop
{
        uint8_t                 rtnh_flags;
        uint8_t                 rtnh_flag_mask;
        uint8_t                 rtnh_weight;
        /* 1 byte spare */
        uint32_t                rtnh_ifindex;
        struct nl_addr *        rtnh_gateway;
        uint32_t                ce_mask; /* HACK to support attr macros */
        struct nl_list_head     rtnh_list;
        uint32_t                rtnh_realms;
};

struct rtnl_route
{
        NLHDR_COMMON

        uint8_t                 rt_family;
        uint8_t                 rt_dst_len;
        uint8_t                 rt_src_len;
        uint8_t                 rt_tos;
        uint8_t                 rt_protocol;
        uint8_t                 rt_scope;
        uint8_t                 rt_type;
        uint8_t                 rt_nmetrics;
        uint32_t                rt_flags;
        struct nl_addr *        rt_dst;
        struct nl_addr *        rt_src;
        uint32_t                rt_table;
        uint32_t                rt_iif;
        uint32_t                rt_prio;
        uint32_t                rt_metrics[RTAX_MAX];
        uint32_t                rt_metrics_mask;
        uint32_t                rt_nr_nh;
        struct nl_addr *        rt_pref_src;
        struct nl_list_head     rt_nexthops;
        struct rtnl_rtcacheinfo rt_cacheinfo;
        uint32_t                rt_flag_mask;
};

struct rtnl_rule
{
        NLHDR_COMMON

        uint64_t        r_mark;
        uint32_t        r_prio;
        uint32_t        r_realms;
        uint32_t        r_table;
        uint8_t         r_dsfield;
        uint8_t         r_type;
        uint8_t         r_family;
        uint8_t         r_src_len;
        uint8_t         r_dst_len;
        char            r_iif[IFNAMSIZ];
        struct nl_addr *r_src;
        struct nl_addr *r_dst;
        struct nl_addr *r_srcmap;
};

struct rtnl_neightbl_parms
{
        /**
         * Interface index of the device this parameter set is assigned
         * to or 0 for the default set.
         */
        uint32_t                ntp_ifindex;

        /**
         * Number of references to this parameter set.
         */
        uint32_t                ntp_refcnt;

        /**
         * Queue length for pending arp requests, i.e. the number of
         * packets which are accepted from other layers while the
         * neighbour address is still being resolved
         */
        uint32_t                ntp_queue_len;

        /**
         * Number of requests to send to the user level ARP daemon.
         * Specify 0 to disable.
         */
        uint32_t                ntp_app_probes;

        /**
         * Maximum number of retries for unicast solicitation.
         */
        uint32_t                ntp_ucast_probes;

        /**
         * Maximum number of retries for multicast solicitation.
         */
        uint32_t                ntp_mcast_probes;

        /**
         * Base value in milliseconds to ompute reachable time, see RFC2461.
         */
        uint64_t                ntp_base_reachable_time;

        /**
         * Actual reachable time (read-only)
         */
        uint64_t                ntp_reachable_time;     /* secs */

        /**
         * The time in milliseconds between retransmitted Neighbor
         * Solicitation messages.
         */
        uint64_t                ntp_retrans_time;

        /**
         * Interval in milliseconds to check for stale neighbour
         * entries.
         */
        uint64_t                ntp_gc_stale_time;      /* secs */

        /**
         * Delay in milliseconds for the first time probe if
         * the neighbour is reachable.
         */
        uint64_t                ntp_probe_delay;        /* secs */

        /**
         * Maximum delay in milliseconds of an answer to a neighbour
         * solicitation message.
         */
        uint64_t                ntp_anycast_delay;

        /**
         * Minimum age in milliseconds before a neighbour entry
         * may be replaced.
         */
        uint64_t                ntp_locktime;

        /**
         * Delay in milliseconds before answering to an ARP request
         * for which a proxy ARP entry exists.
         */
        uint64_t                ntp_proxy_delay;

        /**
         * Queue length for the delayed proxy arp requests.
         */
        uint32_t                ntp_proxy_qlen;
        
        /**
         * Mask of available parameter attributes
         */
        uint32_t                ntp_mask;
};

#define NTBLNAMSIZ      32

/**
 * Neighbour table
 * @ingroup neightbl
 */
struct rtnl_neightbl
{
        NLHDR_COMMON

        char                    nt_name[NTBLNAMSIZ];
        uint32_t                nt_family;
        uint32_t                nt_gc_thresh1;
        uint32_t                nt_gc_thresh2;
        uint32_t                nt_gc_thresh3;
        uint64_t                nt_gc_interval;
        struct ndt_config       nt_config;
        struct rtnl_neightbl_parms nt_parms;
        struct ndt_stats        nt_stats;
};

struct rtnl_ratespec
{
        uint8_t                 rs_cell_log;
        uint16_t                rs_feature;
        uint16_t                rs_addend;
        uint16_t                rs_mpu;
        uint32_t                rs_rate;
};

struct rtnl_tstats
{
        struct {
                uint64_t            bytes;
                uint64_t            packets;
        } tcs_basic;

        struct {
                uint32_t            bps;
                uint32_t            pps;
        } tcs_rate_est;

        struct {
                uint32_t            qlen;
                uint32_t            backlog;
                uint32_t            drops;
                uint32_t            requeues;
                uint32_t            overlimits;
        } tcs_queue;
};

#define TCKINDSIZ       32

#define NL_TCA_GENERIC(pre)                             \
        NLHDR_COMMON                                    \
        uint32_t                pre ##_family;          \
        uint32_t                pre ##_ifindex;         \
        uint32_t                pre ##_handle;          \
        uint32_t                pre ##_parent;          \
        uint32_t                pre ##_info;            \
        char                    pre ##_kind[TCKINDSIZ]; \
        struct nl_data *        pre ##_opts;            \
        uint64_t                pre ##_stats[RTNL_TC_STATS_MAX+1]; \
        struct nl_data *        pre ##_xstats;          \
        struct nl_data *        pre ##_subdata;         \


struct rtnl_tca
{
        NL_TCA_GENERIC(tc);
};

struct rtnl_qdisc
{
        NL_TCA_GENERIC(q);
        struct rtnl_qdisc_ops   *q_ops;
};

struct rtnl_class
{
        NL_TCA_GENERIC(c);
        struct rtnl_class_ops   *c_ops;
};

struct rtnl_cls
{
        NL_TCA_GENERIC(c);
        uint16_t                c_prio;
        uint16_t                c_protocol;
        struct rtnl_cls_ops     *c_ops;
};

struct rtnl_u32
{
        uint32_t                cu_divisor;
        uint32_t                cu_hash;
        uint32_t                cu_classid;
        uint32_t                cu_link;
        struct nl_data *        cu_pcnt;
        struct nl_data *        cu_selector;
        struct nl_data *        cu_act;
        struct nl_data *        cu_police;
        char                    cu_indev[IFNAMSIZ];
        int                     cu_mask;
};

struct rtnl_cgroup
{
        struct rtnl_ematch_tree *cg_ematch;
        int                     cg_mask;
};

struct rtnl_fw
{
        uint32_t                cf_classid;
        struct nl_data *        cf_act;
        struct nl_data *        cf_police;
        char                    cf_indev[IFNAMSIZ];
        int                     cf_mask;
};

struct rtnl_ematch
{
        uint16_t                e_id;
        uint16_t                e_kind;
        uint16_t                e_flags;

        struct nl_list_head     e_childs;
        struct nl_list_head     e_list;
        struct rtnl_ematch_ops *e_ops;

        char                    e_data[0];
};

struct rtnl_ematch_tree
{
        uint16_t                et_progid;
        struct nl_list_head     et_list;

};

struct rtnl_dsmark_qdisc
{
        uint16_t        qdm_indices;
        uint16_t        qdm_default_index;
        uint32_t        qdm_set_tc_index;
        uint32_t        qdm_mask;
};

struct rtnl_dsmark_class
{
        uint8_t         cdm_bmask;
        uint8_t         cdm_value;
        uint32_t        cdm_mask;
};

struct rtnl_fifo
{
        uint32_t        qf_limit;
        uint32_t        qf_mask;
};

struct rtnl_prio
{
        uint32_t        qp_bands;
        uint8_t         qp_priomap[TC_PRIO_MAX+1];
        uint32_t        qp_mask;
};

struct rtnl_tbf
{
        uint32_t                qt_limit;
        uint32_t                qt_mpu;
        struct rtnl_ratespec    qt_rate;
        uint32_t                qt_rate_bucket;
        uint32_t                qt_rate_txtime;
        struct rtnl_ratespec    qt_peakrate;
        uint32_t                qt_peakrate_bucket;
        uint32_t                qt_peakrate_txtime;
        uint32_t                qt_mask;
};

struct rtnl_sfq
{
        uint32_t        qs_quantum;
        uint32_t        qs_perturb;
        uint32_t        qs_limit;
        uint32_t        qs_divisor;
        uint32_t        qs_flows;
        uint32_t        qs_mask;
};

struct rtnl_netem_corr
{
        uint32_t        nmc_delay;
        uint32_t        nmc_loss;
        uint32_t        nmc_duplicate;
};

struct rtnl_netem_reo
{
        uint32_t        nmro_probability;
        uint32_t        nmro_correlation;
};

struct rtnl_netem_crpt
{
        uint32_t        nmcr_probability;
        uint32_t        nmcr_correlation;
};

struct rtnl_netem_dist
{
        int16_t *       dist_data;
        size_t          dist_size;
};

struct rtnl_netem
{
        uint32_t                qnm_latency;
        uint32_t                qnm_limit;
        uint32_t                qnm_loss;
        uint32_t                qnm_gap;
        uint32_t                qnm_duplicate;
        uint32_t                qnm_jitter;
        uint32_t                qnm_mask;
        struct rtnl_netem_corr  qnm_corr;
        struct rtnl_netem_reo   qnm_ro;
        struct rtnl_netem_crpt  qnm_crpt;
        struct rtnl_netem_dist  qnm_dist;
};

struct rtnl_htb_qdisc
{
        uint32_t                qh_rate2quantum;
        uint32_t                qh_defcls;
        uint32_t                qh_mask;
};

struct rtnl_htb_class
{
        uint32_t                ch_prio;
        uint32_t                ch_mtu;
        struct rtnl_ratespec    ch_rate;
        struct rtnl_ratespec    ch_ceil;
        uint32_t                ch_rbuffer;
        uint32_t                ch_cbuffer;
        uint32_t                ch_quantum;
        uint8_t                 ch_overhead;
        uint8_t                 ch_mpu;
        uint32_t                ch_mask;
};

struct rtnl_cbq
{
        struct tc_cbq_lssopt    cbq_lss;
        struct tc_ratespec      cbq_rate;
        struct tc_cbq_wrropt    cbq_wrr;
        struct tc_cbq_ovl       cbq_ovl;
        struct tc_cbq_fopt      cbq_fopt;
        struct tc_cbq_police    cbq_police;
};

struct rtnl_red
{
        uint32_t        qr_limit;
        uint32_t        qr_qth_min;
        uint32_t        qr_qth_max;
        uint8_t         qr_flags;
        uint8_t         qr_wlog;
        uint8_t         qr_plog;
        uint8_t         qr_scell_log;
        uint32_t        qr_mask;
};

struct flnl_request
{
        NLHDR_COMMON

        struct nl_addr *        lr_addr;
        uint32_t                lr_fwmark;
        uint8_t                 lr_tos;
        uint8_t                 lr_scope;
        uint8_t                 lr_table;
};


struct flnl_result
{
        NLHDR_COMMON

        struct flnl_request *   fr_req;
        uint8_t                 fr_table_id;
        uint8_t                 fr_prefixlen;
        uint8_t                 fr_nh_sel;
        uint8_t                 fr_type;
        uint8_t                 fr_scope;
        uint32_t                fr_error;
};

#define GENL_OP_HAS_POLICY      1
#define GENL_OP_HAS_DOIT        2
#define GENL_OP_HAS_DUMPIT      4

struct genl_family_op
{
        uint32_t                o_id;
        uint32_t                o_flags;

        struct nl_list_head     o_list;
};

struct genl_family
{
        NLHDR_COMMON

        uint16_t                gf_id;
        char                    gf_name[GENL_NAMSIZ];
        uint32_t                gf_version;
        uint32_t                gf_hdrsize;
        uint32_t                gf_maxattr;

        struct nl_list_head     gf_ops;
};

union nfnl_ct_proto
{
        struct {
                uint16_t        src;
                uint16_t        dst;
        } port;
        struct {
                uint16_t        id;
                uint8_t         type;
                uint8_t         code;
        } icmp;
};

struct nfnl_ct_dir {
        struct nl_addr *        src;
        struct nl_addr *        dst;
        union nfnl_ct_proto     proto;
        uint64_t                packets;
        uint64_t                bytes;
};

union nfnl_ct_protoinfo {
        struct {
                uint8_t         state;
        } tcp;
};

struct nfnl_ct {
        NLHDR_COMMON

        uint8_t                 ct_family;
        uint8_t                 ct_proto;
        union nfnl_ct_protoinfo ct_protoinfo;

        uint32_t                ct_status;
        uint32_t                ct_status_mask;
        uint32_t                ct_timeout;
        uint32_t                ct_mark;
        uint32_t                ct_use;
        uint32_t                ct_id;

        struct nfnl_ct_dir      ct_orig;
        struct nfnl_ct_dir      ct_repl;
};

struct nfnl_log {
        NLHDR_COMMON

        uint16_t                log_group;
        uint8_t                 log_copy_mode;
        uint32_t                log_copy_range;
        uint32_t                log_flush_timeout;
        uint32_t                log_alloc_size;
        uint32_t                log_queue_threshold;
        uint32_t                log_flags;
        uint32_t                log_flag_mask;
};

struct nfnl_log_msg {
        NLHDR_COMMON

        uint8_t                 log_msg_family;
        uint8_t                 log_msg_hook;
        uint16_t                log_msg_hwproto;
        uint32_t                log_msg_mark;
        struct timeval          log_msg_timestamp;
        uint32_t                log_msg_indev;
        uint32_t                log_msg_outdev;
        uint32_t                log_msg_physindev;
        uint32_t                log_msg_physoutdev;
        uint8_t                 log_msg_hwaddr[8];
        int                     log_msg_hwaddr_len;
        void *                  log_msg_payload;
        int                     log_msg_payload_len;
        char *                  log_msg_prefix;
        uint32_t                log_msg_uid;
        uint32_t                log_msg_gid;
        uint32_t                log_msg_seq;
        uint32_t                log_msg_seq_global;
};

struct nfnl_queue {
        NLHDR_COMMON

        uint16_t                queue_group;
        uint32_t                queue_maxlen;
        uint32_t                queue_copy_range;
        uint8_t                 queue_copy_mode;
};

struct nfnl_queue_msg {
        NLHDR_COMMON

        uint16_t                queue_msg_group;
        uint8_t                 queue_msg_family;
        uint8_t                 queue_msg_hook;
        uint16_t                queue_msg_hwproto;
        uint32_t                queue_msg_packetid;
        uint32_t                queue_msg_mark;
        struct timeval          queue_msg_timestamp;
        uint32_t                queue_msg_indev;
        uint32_t                queue_msg_outdev;
        uint32_t                queue_msg_physindev;
        uint32_t                queue_msg_physoutdev;
        uint8_t                 queue_msg_hwaddr[8];
        int                     queue_msg_hwaddr_len;
        void *                  queue_msg_payload;
        int                     queue_msg_payload_len;
        uint32_t                queue_msg_verdict;
};

#endif