/*      $NetBSD: prune.h,v 1.6 2003/03/05 21:05:40 wiz Exp $    */

/*
* The mrouted program is covered by the license in the accompanying file
* named "LICENSE".  Use of the mrouted program represents acceptance of
* the terms and conditions listed in that file.
*
* The mrouted program is COPYRIGHT 1989 by The Board of Trustees of
* Leland Stanford Junior University.
*/

/*
* Group table
*
* Each group entry is a member of two doubly-linked lists:
*
* a) A list hanging off of the routing table entry for this source (rt_groups)
*      sorted by group address under the routing entry (gt_next, gt_prev)
* b) An independent list pointed to by kernel_table, which is a list of
*      active source,group's (gt_gnext, gt_gprev).
*
*/
struct gtable {
   struct gtable  *gt_next;            /* pointer to the next entry        */
   struct gtable  *gt_prev;            /* back pointer for linked list     */
   struct gtable  *gt_gnext;           /* fwd pointer for group list       */
   struct gtable  *gt_gprev;           /* rev pointer for group list       */
   u_int32_t       gt_mcastgrp;        /* multicast group associated       */
   vifbitmap_t     gt_scope;           /* scoped interfaces                */
   u_char          gt_ttls[MAXVIFS];   /* ttl vector for forwarding        */
   vifbitmap_t     gt_grpmems;         /* forw. vifs for src, grp          */
   int             gt_prsent_timer;    /* prune timer for this group       */
   int             gt_timer;           /* timer for this group entry       */
   time_t          gt_ctime;           /* time of entry creation         */
   u_char          gt_grftsnt;         /* graft sent/retransmit timer      */
   struct stable  *gt_srctbl;          /* source table                     */
   struct ptable  *gt_pruntbl;         /* prune table                      */
   struct rtentry *gt_route;           /* parent route                     */
#ifdef RSRR
   struct rsrr_cache *gt_rsrr_cache;   /* RSRR cache                       */
#endif /* RSRR */
};

/*
* Source table
*
* When source-based prunes exist, there will be a struct ptable here as well.
*/
struct stable
{
   struct stable  *st_next;            /* pointer to the next entry        */
   u_int32_t       st_origin;          /* host origin of multicasts        */
   u_long          st_pktcnt;          /* packet count for src-grp entry   */
};

/*
* structure to store incoming prunes.  Can hang off of either group or source.
*/
struct ptable
{
   struct ptable  *pt_next;            /* pointer to the next entry        */
   u_int32_t       pt_router;          /* router that sent this prune      */
   vifi_t          pt_vifi;            /* vif prune received on            */
   int             pt_timer;           /* timer for prune                  */
};

/*
* The packet format for a traceroute request.
*/
struct tr_query {
   u_int32_t  tr_src;          /* traceroute source */
   u_int32_t  tr_dst;          /* traceroute destination */
   u_int32_t  tr_raddr;                /* traceroute response address */
#if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
   struct {
       u_int   qid : 24;       /* traceroute query id */
       u_int   ttl : 8;        /* traceroute response ttl */
   } q;
#else
   struct {
       u_int   ttl : 8;        /* traceroute response ttl */
       u_int   qid : 24;       /* traceroute query id */
   } q;
#endif /* BYTE_ORDER */
};

#define tr_rttl q.ttl
#define tr_qid  q.qid

/*
* Traceroute response format.  A traceroute response has a tr_query at the
* beginning, followed by one tr_resp for each hop taken.
*/
struct tr_resp {
   u_int32_t tr_qarr;          /* query arrival time */
   u_int32_t tr_inaddr;                /* incoming interface address */
   u_int32_t tr_outaddr;               /* outgoing interface address */
   u_int32_t tr_rmtaddr;               /* parent address in source tree */
   u_int32_t tr_vifin;         /* input packet count on interface */
   u_int32_t tr_vifout;                /* output packet count on interface */
   u_int32_t tr_pktcnt;                /* total incoming packets for src-grp */
   u_char  tr_rproto;          /* routing protocol deployed on router */
   u_char  tr_fttl;            /* ttl required to forward on outvif */
   u_char  tr_smask;           /* subnet mask for src addr */
   u_char  tr_rflags;          /* forwarding error codes */
};

/* defs within mtrace */
#define QUERY   1
#define RESP    2
#define QLEN    sizeof(struct tr_query)
#define RLEN    sizeof(struct tr_resp)

/* fields for tr_rflags (forwarding error codes) */
#define TR_NO_ERR       0
#define TR_WRONG_IF     1
#define TR_PRUNED       2
#define TR_OPRUNED      3
#define TR_SCOPED       4
#define TR_NO_RTE       5
#define TR_NO_FWD       7
#define TR_RP_OR_CORE   8
#define TR_RPF_INT      9
#define TR_NO_MULTICAST 10
#define TR_NO_SPACE     0x81
#define TR_OLD_ROUTER   0x82
#define TR_ADMIN_DENY   0x83

/* fields for tr_rproto (routing protocol) */
#define PROTO_DVMRP     1
#define PROTO_MOSPF     2
#define PROTO_PIM       3
#define PROTO_CBT       4
#define PROTO_PIM_SPEC  5
#define PROTO_PIM_STAT  6
#define PROTO_DVMRP_STAT 7
#define PROTO_PIM_MBGP  8

#define MASK_TO_VAL(x, i) { \
                       u_int32_t _x = ntohl(x); \
                       (i) = 1; \
                       while ((_x) <<= 1) \
                               (i)++; \
                       };

#define VAL_TO_MASK(x, i) { \
                       x = htonl(~((1 << (32 - (i))) - 1)); \
                       };

#define NBR_VERS(n)     (((n)->al_pv << 8) + (n)->al_mv)