1*54821Ssklower /* 2*54821Ssklower * Copyright (c) 1989 Stephen Deering. 3*54821Ssklower * Copyright (c) 1992 Regents of the University of California. 4*54821Ssklower * All rights reserved. 5*54821Ssklower * 6*54821Ssklower * This code is derived from software contributed to Berkeley by 7*54821Ssklower * Stephen Deering of Stanford University. 8*54821Ssklower * 9*54821Ssklower * %sccs.include.redist.c% 10*54821Ssklower * 11*54821Ssklower * @(#)ip_mroute.h 7.1 (Berkeley) 07/08/92 12*54821Ssklower */ 13*54821Ssklower 14*54821Ssklower /* 15*54821Ssklower * Definitions for the kernel part of DVMRP, 16*54821Ssklower * a Distance-Vector Multicast Routing Protocol. 17*54821Ssklower * (See RFC-1075.) 18*54821Ssklower * 19*54821Ssklower * Written by David Waitzman, BBN Labs, August 1988. 20*54821Ssklower * Modified by Steve Deering, Stanford, February 1989. 21*54821Ssklower * 22*54821Ssklower * MROUTING 1.0 23*54821Ssklower */ 24*54821Ssklower 25*54821Ssklower /* 26*54821Ssklower * Copyright (c) 1992 Regents of the University of California. 27*54821Ssklower * All rights reserved. 28*54821Ssklower * 29*54821Ssklower * %sccs.include.redist.c% 30*54821Ssklower * 31*54821Ssklower * @(#)ip_mroute.h 7.1 (Berkeley) 07/08/92 32*54821Ssklower */ 33*54821Ssklower 34*54821Ssklower /* 35*54821Ssklower * DVMRP-specific setsockopt commands. 36*54821Ssklower */ 37*54821Ssklower #define DVMRP_INIT 100 38*54821Ssklower #define DVMRP_DONE 101 39*54821Ssklower #define DVMRP_ADD_VIF 102 40*54821Ssklower #define DVMRP_DEL_VIF 103 41*54821Ssklower #define DVMRP_ADD_LGRP 104 42*54821Ssklower #define DVMRP_DEL_LGRP 105 43*54821Ssklower #define DVMRP_ADD_MRT 106 44*54821Ssklower #define DVMRP_DEL_MRT 107 45*54821Ssklower 46*54821Ssklower 47*54821Ssklower /* 48*54821Ssklower * Types and macros for handling bitmaps with one bit per virtual interface. 49*54821Ssklower */ 50*54821Ssklower #define MAXVIFS 32 51*54821Ssklower typedef u_long vifbitmap_t; 52*54821Ssklower typedef u_short vifi_t; /* type of a vif index */ 53*54821Ssklower 54*54821Ssklower #define VIFM_SET(n, m) ((m) |= (1 << (n))) 55*54821Ssklower #define VIFM_CLR(n, m) ((m) &= ~(1 << (n))) 56*54821Ssklower #define VIFM_ISSET(n, m) ((m) & (1 << (n))) 57*54821Ssklower #define VIFM_CLRALL(m) ((m) = 0x00000000) 58*54821Ssklower #define VIFM_COPY(mfrom, mto) ((mto) = (mfrom)) 59*54821Ssklower #define VIFM_SAME(m1, m2) ((m1) == (m2)) 60*54821Ssklower 61*54821Ssklower 62*54821Ssklower /* 63*54821Ssklower * Agument structure for DVMRP_ADD_VIF. 64*54821Ssklower * (DVMRP_DEL_VIF takes a single vifi_t argument.) 65*54821Ssklower */ 66*54821Ssklower struct vifctl { 67*54821Ssklower vifi_t vifc_vifi; /* the index of the vif to be added */ 68*54821Ssklower u_char vifc_flags; /* VIFF_ flags defined below */ 69*54821Ssklower u_char vifc_threshold; /* min ttl required to forward on vif */ 70*54821Ssklower struct in_addr vifc_lcl_addr; /* local interface address */ 71*54821Ssklower struct in_addr vifc_rmt_addr; /* remote address (tunnels only) */ 72*54821Ssklower }; 73*54821Ssklower 74*54821Ssklower #define VIFF_TUNNEL 0x1 /* vif represents a tunnel end-point */ 75*54821Ssklower 76*54821Ssklower 77*54821Ssklower /* 78*54821Ssklower * Argument structure for DVMRP_ADD_LGRP and DVMRP_DEL_LGRP. 79*54821Ssklower */ 80*54821Ssklower struct lgrplctl { 81*54821Ssklower vifi_t lgc_vifi; 82*54821Ssklower struct in_addr lgc_gaddr; 83*54821Ssklower }; 84*54821Ssklower 85*54821Ssklower 86*54821Ssklower /* 87*54821Ssklower * Argument structure for DVMRP_ADD_MRT. 88*54821Ssklower * (DVMRP_DEL_MRT takes a single struct in_addr argument, containing origin.) 89*54821Ssklower */ 90*54821Ssklower struct mrtctl { 91*54821Ssklower struct in_addr mrtc_origin; /* subnet origin of multicasts */ 92*54821Ssklower struct in_addr mrtc_originmask; /* subnet mask for origin */ 93*54821Ssklower vifi_t mrtc_parent; /* incoming vif */ 94*54821Ssklower vifbitmap_t mrtc_children; /* outgoing children vifs */ 95*54821Ssklower vifbitmap_t mrtc_leaves; /* subset of outgoing children vifs */ 96*54821Ssklower }; 97*54821Ssklower 98*54821Ssklower 99*54821Ssklower #ifdef KERNEL 100*54821Ssklower 101*54821Ssklower /* 102*54821Ssklower * The kernel's virtual-interface structure. 103*54821Ssklower */ 104*54821Ssklower struct vif { 105*54821Ssklower u_char v_flags; /* VIFF_ flags defined above */ 106*54821Ssklower u_char v_threshold; /* min ttl required to forward on vif */ 107*54821Ssklower struct in_addr v_lcl_addr; /* local interface address */ 108*54821Ssklower struct in_addr v_rmt_addr; /* remote address (tunnels only) */ 109*54821Ssklower struct ifnet *v_ifp; /* pointer to interface */ 110*54821Ssklower struct in_addr *v_lcl_grps; /* list of local grps (phyints only) */ 111*54821Ssklower int v_lcl_grps_max; /* malloc'ed number of v_lcl_grps */ 112*54821Ssklower int v_lcl_grps_n; /* used number of v_lcl_grps */ 113*54821Ssklower u_long v_cached_group; /* last grp looked-up (phyints only) */ 114*54821Ssklower int v_cached_result; /* last look-up result (phyints only) */ 115*54821Ssklower }; 116*54821Ssklower 117*54821Ssklower /* 118*54821Ssklower * The kernel's multicast route structure. 119*54821Ssklower */ 120*54821Ssklower struct mrt { 121*54821Ssklower struct in_addr mrt_origin; /* subnet origin of multicasts */ 122*54821Ssklower struct in_addr mrt_originmask; /* subnet mask for origin */ 123*54821Ssklower vifi_t mrt_parent; /* incoming vif */ 124*54821Ssklower vifbitmap_t mrt_children; /* outgoing children vifs */ 125*54821Ssklower vifbitmap_t mrt_leaves; /* subset of outgoing children vifs */ 126*54821Ssklower struct mrt *mrt_next; /* forward link */ 127*54821Ssklower }; 128*54821Ssklower 129*54821Ssklower 130*54821Ssklower #define MRTHASHSIZ 64 131*54821Ssklower #if (MRTHASHSIZ & (MRTHASHSIZ - 1)) == 0 /* from sys:route.h */ 132*54821Ssklower #define MRTHASHMOD(h) ((h) & (MRTHASHSIZ - 1)) 133*54821Ssklower #else 134*54821Ssklower #define MRTHASHMOD(h) ((h) % MRTHASHSIZ) 135*54821Ssklower #endif 136*54821Ssklower 137*54821Ssklower /* 138*54821Ssklower * The kernel's multicast routing statistics. 139*54821Ssklower */ 140*54821Ssklower struct mrtstat { 141*54821Ssklower u_long mrts_mrt_lookups; /* # multicast route lookups */ 142*54821Ssklower u_long mrts_mrt_misses; /* # multicast route cache misses */ 143*54821Ssklower u_long mrts_grp_lookups; /* # group address lookups */ 144*54821Ssklower u_long mrts_grp_misses; /* # group address cache misses */ 145*54821Ssklower u_long mrts_no_route; /* no route for packet's origin */ 146*54821Ssklower u_long mrts_bad_tunnel; /* malformed tunnel options */ 147*54821Ssklower u_long mrts_cant_tunnel; /* no room for tunnel options */ 148*54821Ssklower }; 149*54821Ssklower 150*54821Ssklower 151*54821Ssklower int ip_mrouter_cmd __P((int, struct socket *, struct mbuf *)); 152*54821Ssklower int ip_mrouter_done __P(()); 153*54821Ssklower 154*54821Ssklower #endif /* KERNEL */ 155*54821Ssklower 156