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