1*a17240f2Sderaadt /* $NetBSD: prune.h,v 1.3 1995/12/10 10:07:11 mycroft Exp $ */ 2df930be7Sderaadt 3df930be7Sderaadt /* 4df930be7Sderaadt * The mrouted program is covered by the license in the accompanying file 5df930be7Sderaadt * named "LICENSE". Use of the mrouted program represents acceptance of 6df930be7Sderaadt * the terms and conditions listed in that file. 7df930be7Sderaadt * 8df930be7Sderaadt * The mrouted program is COPYRIGHT 1989 by The Board of Trustees of 9df930be7Sderaadt * Leland Stanford Junior University. 10df930be7Sderaadt */ 11df930be7Sderaadt 12df930be7Sderaadt /* 13df930be7Sderaadt * Group table 14df930be7Sderaadt * 15df930be7Sderaadt * Each group entry is a member of two doubly-linked lists: 16df930be7Sderaadt * 17df930be7Sderaadt * a) A list hanging off of the routing table entry for this source (rt_groups) 18df930be7Sderaadt * sorted by group address under the routing entry (gt_next, gt_prev) 19df930be7Sderaadt * b) An independent list pointed to by kernel_table, which is a list of 20df930be7Sderaadt * active source,group's (gt_gnext, gt_gprev). 21df930be7Sderaadt * 22df930be7Sderaadt */ 23df930be7Sderaadt struct gtable { 24df930be7Sderaadt struct gtable *gt_next; /* pointer to the next entry */ 25df930be7Sderaadt struct gtable *gt_prev; /* back pointer for linked list */ 26df930be7Sderaadt struct gtable *gt_gnext; /* fwd pointer for group list */ 27df930be7Sderaadt struct gtable *gt_gprev; /* rev pointer for group list */ 28df930be7Sderaadt u_int32_t gt_mcastgrp; /* multicast group associated */ 29df930be7Sderaadt vifbitmap_t gt_scope; /* scoped interfaces */ 30df930be7Sderaadt u_char gt_ttls[MAXVIFS]; /* ttl vector for forwarding */ 31df930be7Sderaadt vifbitmap_t gt_grpmems; /* forw. vifs for src, grp */ 32df930be7Sderaadt int gt_prsent_timer; /* prune timer for this group */ 33df930be7Sderaadt int gt_timer; /* timer for this group entry */ 34df930be7Sderaadt time_t gt_ctime; /* time of entry creation */ 35df930be7Sderaadt u_char gt_grftsnt; /* graft sent/retransmit timer */ 36df930be7Sderaadt struct stable *gt_srctbl; /* source table */ 37df930be7Sderaadt struct ptable *gt_pruntbl; /* prune table */ 38df930be7Sderaadt struct rtentry *gt_route; /* parent route */ 39*a17240f2Sderaadt #ifdef RSRR 40*a17240f2Sderaadt struct rsrr_cache *gt_rsrr_cache; /* RSRR cache */ 41*a17240f2Sderaadt #endif /* RSRR */ 42df930be7Sderaadt }; 43df930be7Sderaadt 44df930be7Sderaadt /* 45df930be7Sderaadt * Source table 46df930be7Sderaadt * 47df930be7Sderaadt * When source-based prunes exist, there will be a struct ptable here as well. 48df930be7Sderaadt */ 49df930be7Sderaadt struct stable 50df930be7Sderaadt { 51df930be7Sderaadt struct stable *st_next; /* pointer to the next entry */ 52df930be7Sderaadt u_int32_t st_origin; /* host origin of multicasts */ 53df930be7Sderaadt u_long st_pktcnt; /* packet count for src-grp entry */ 54df930be7Sderaadt }; 55df930be7Sderaadt 56df930be7Sderaadt /* 57df930be7Sderaadt * structure to store incoming prunes. Can hang off of either group or source. 58df930be7Sderaadt */ 59df930be7Sderaadt struct ptable 60df930be7Sderaadt { 61df930be7Sderaadt struct ptable *pt_next; /* pointer to the next entry */ 62df930be7Sderaadt u_int32_t pt_router; /* router that sent this prune */ 63df930be7Sderaadt vifi_t pt_vifi; /* vif prune received on */ 64df930be7Sderaadt int pt_timer; /* timer for prune */ 65df930be7Sderaadt }; 66df930be7Sderaadt 67df930be7Sderaadt /* 68df930be7Sderaadt * The packet format for a traceroute request. 69df930be7Sderaadt */ 70df930be7Sderaadt struct tr_query { 71df930be7Sderaadt u_int32_t tr_src; /* traceroute source */ 72df930be7Sderaadt u_int32_t tr_dst; /* traceroute destination */ 73df930be7Sderaadt u_int32_t tr_raddr; /* traceroute response address */ 74df930be7Sderaadt #if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN) 75df930be7Sderaadt struct { 76df930be7Sderaadt u_int qid : 24; /* traceroute query id */ 77df930be7Sderaadt u_int ttl : 8; /* traceroute response ttl */ 78df930be7Sderaadt } q; 79df930be7Sderaadt #else 80df930be7Sderaadt struct { 81df930be7Sderaadt u_int ttl : 8; /* traceroute response ttl */ 82df930be7Sderaadt u_int qid : 24; /* traceroute query id */ 83df930be7Sderaadt } q; 84df930be7Sderaadt #endif /* BYTE_ORDER */ 85df930be7Sderaadt }; 86df930be7Sderaadt 87df930be7Sderaadt #define tr_rttl q.ttl 88df930be7Sderaadt #define tr_qid q.qid 89df930be7Sderaadt 90df930be7Sderaadt /* 91df930be7Sderaadt * Traceroute response format. A traceroute response has a tr_query at the 92df930be7Sderaadt * beginning, followed by one tr_resp for each hop taken. 93df930be7Sderaadt */ 94df930be7Sderaadt struct tr_resp { 95df930be7Sderaadt u_int32_t tr_qarr; /* query arrival time */ 96df930be7Sderaadt u_int32_t tr_inaddr; /* incoming interface address */ 97df930be7Sderaadt u_int32_t tr_outaddr; /* outgoing interface address */ 98df930be7Sderaadt u_int32_t tr_rmtaddr; /* parent address in source tree */ 99df930be7Sderaadt u_int32_t tr_vifin; /* input packet count on interface */ 100df930be7Sderaadt u_int32_t tr_vifout; /* output packet count on interface */ 101df930be7Sderaadt u_int32_t tr_pktcnt; /* total incoming packets for src-grp */ 102df930be7Sderaadt u_char tr_rproto; /* routing protocol deployed on router */ 103df930be7Sderaadt u_char tr_fttl; /* ttl required to forward on outvif */ 104df930be7Sderaadt u_char tr_smask; /* subnet mask for src addr */ 105df930be7Sderaadt u_char tr_rflags; /* forwarding error codes */ 106df930be7Sderaadt }; 107df930be7Sderaadt 108df930be7Sderaadt /* defs within mtrace */ 109df930be7Sderaadt #define QUERY 1 110df930be7Sderaadt #define RESP 2 111df930be7Sderaadt #define QLEN sizeof(struct tr_query) 112df930be7Sderaadt #define RLEN sizeof(struct tr_resp) 113df930be7Sderaadt 114df930be7Sderaadt /* fields for tr_rflags (forwarding error codes) */ 115df930be7Sderaadt #define TR_NO_ERR 0 116df930be7Sderaadt #define TR_WRONG_IF 1 117df930be7Sderaadt #define TR_PRUNED 2 118df930be7Sderaadt #define TR_OPRUNED 3 119df930be7Sderaadt #define TR_SCOPED 4 120df930be7Sderaadt #define TR_NO_RTE 5 121df930be7Sderaadt #define TR_NO_FWD 7 122df930be7Sderaadt #define TR_NO_SPACE 0x81 123df930be7Sderaadt #define TR_OLD_ROUTER 0x82 124df930be7Sderaadt 125df930be7Sderaadt /* fields for tr_rproto (routing protocol) */ 126df930be7Sderaadt #define PROTO_DVMRP 1 127df930be7Sderaadt #define PROTO_MOSPF 2 128df930be7Sderaadt #define PROTO_PIM 3 129df930be7Sderaadt #define PROTO_CBT 4 130df930be7Sderaadt 131df930be7Sderaadt #define MASK_TO_VAL(x, i) { \ 132df930be7Sderaadt u_int32_t _x = ntohl(x); \ 133*a17240f2Sderaadt (i) = 1; \ 134*a17240f2Sderaadt while ((_x) <<= 1) \ 135df930be7Sderaadt (i)++; \ 136df930be7Sderaadt }; 137df930be7Sderaadt 138df930be7Sderaadt #define VAL_TO_MASK(x, i) { \ 139df930be7Sderaadt x = htonl(~((1 << (32 - (i))) - 1)); \ 140df930be7Sderaadt }; 141df930be7Sderaadt 142df930be7Sderaadt #define NBR_VERS(n) (((n)->al_pv << 8) + (n)->al_mv) 143