154821Ssklower /* 254821Ssklower * Copyright (c) 1989 Stephen Deering. 363218Sbostic * Copyright (c) 1992, 1993 463218Sbostic * The Regents of the University of California. All rights reserved. 554821Ssklower * 654821Ssklower * This code is derived from software contributed to Berkeley by 754821Ssklower * Stephen Deering of Stanford University. 854821Ssklower * 954821Ssklower * %sccs.include.redist.c% 1054821Ssklower * 11*69081Ssklower * @(#)ip_mroute.h 8.2 (Berkeley) 04/28/95 1254821Ssklower */ 1354821Ssklower 1454821Ssklower /* 1554821Ssklower * Definitions for the kernel part of DVMRP, 1654821Ssklower * a Distance-Vector Multicast Routing Protocol. 1754821Ssklower * (See RFC-1075.) 1854821Ssklower * 1954821Ssklower * Written by David Waitzman, BBN Labs, August 1988. 2054821Ssklower * Modified by Steve Deering, Stanford, February 1989. 2154821Ssklower * 2254821Ssklower * MROUTING 1.0 2354821Ssklower */ 2454821Ssklower 2554821Ssklower 2654821Ssklower /* 2754821Ssklower * DVMRP-specific setsockopt commands. 2854821Ssklower */ 2954821Ssklower #define DVMRP_INIT 100 3054821Ssklower #define DVMRP_DONE 101 3154821Ssklower #define DVMRP_ADD_VIF 102 3254821Ssklower #define DVMRP_DEL_VIF 103 3354821Ssklower #define DVMRP_ADD_LGRP 104 3454821Ssklower #define DVMRP_DEL_LGRP 105 3554821Ssklower #define DVMRP_ADD_MRT 106 3654821Ssklower #define DVMRP_DEL_MRT 107 3754821Ssklower 3854821Ssklower 3954821Ssklower /* 4054821Ssklower * Types and macros for handling bitmaps with one bit per virtual interface. 4154821Ssklower */ 4254821Ssklower #define MAXVIFS 32 4354821Ssklower typedef u_long vifbitmap_t; 4454821Ssklower typedef u_short vifi_t; /* type of a vif index */ 4554821Ssklower 4654821Ssklower #define VIFM_SET(n, m) ((m) |= (1 << (n))) 4754821Ssklower #define VIFM_CLR(n, m) ((m) &= ~(1 << (n))) 4854821Ssklower #define VIFM_ISSET(n, m) ((m) & (1 << (n))) 4954821Ssklower #define VIFM_CLRALL(m) ((m) = 0x00000000) 5054821Ssklower #define VIFM_COPY(mfrom, mto) ((mto) = (mfrom)) 5154821Ssklower #define VIFM_SAME(m1, m2) ((m1) == (m2)) 5254821Ssklower 5354821Ssklower 5454821Ssklower /* 5554821Ssklower * Agument structure for DVMRP_ADD_VIF. 5654821Ssklower * (DVMRP_DEL_VIF takes a single vifi_t argument.) 5754821Ssklower */ 5854821Ssklower struct vifctl { 5954821Ssklower vifi_t vifc_vifi; /* the index of the vif to be added */ 6054821Ssklower u_char vifc_flags; /* VIFF_ flags defined below */ 6154821Ssklower u_char vifc_threshold; /* min ttl required to forward on vif */ 6254821Ssklower struct in_addr vifc_lcl_addr; /* local interface address */ 6354821Ssklower struct in_addr vifc_rmt_addr; /* remote address (tunnels only) */ 6454821Ssklower }; 6554821Ssklower 6654821Ssklower #define VIFF_TUNNEL 0x1 /* vif represents a tunnel end-point */ 6754821Ssklower 6854821Ssklower 6954821Ssklower /* 7054821Ssklower * Argument structure for DVMRP_ADD_LGRP and DVMRP_DEL_LGRP. 7154821Ssklower */ 7254821Ssklower struct lgrplctl { 7354821Ssklower vifi_t lgc_vifi; 7454821Ssklower struct in_addr lgc_gaddr; 7554821Ssklower }; 7654821Ssklower 7754821Ssklower 7854821Ssklower /* 7954821Ssklower * Argument structure for DVMRP_ADD_MRT. 8054821Ssklower * (DVMRP_DEL_MRT takes a single struct in_addr argument, containing origin.) 8154821Ssklower */ 8254821Ssklower struct mrtctl { 8354821Ssklower struct in_addr mrtc_origin; /* subnet origin of multicasts */ 8454821Ssklower struct in_addr mrtc_originmask; /* subnet mask for origin */ 8554821Ssklower vifi_t mrtc_parent; /* incoming vif */ 8654821Ssklower vifbitmap_t mrtc_children; /* outgoing children vifs */ 8754821Ssklower vifbitmap_t mrtc_leaves; /* subset of outgoing children vifs */ 8854821Ssklower }; 8954821Ssklower 9054821Ssklower 9154821Ssklower #ifdef KERNEL 9254821Ssklower 9354821Ssklower /* 9454821Ssklower * The kernel's virtual-interface structure. 9554821Ssklower */ 9654821Ssklower struct vif { 9754821Ssklower u_char v_flags; /* VIFF_ flags defined above */ 9854821Ssklower u_char v_threshold; /* min ttl required to forward on vif */ 9954821Ssklower struct in_addr v_lcl_addr; /* local interface address */ 10054821Ssklower struct in_addr v_rmt_addr; /* remote address (tunnels only) */ 10154821Ssklower struct ifnet *v_ifp; /* pointer to interface */ 10254821Ssklower struct in_addr *v_lcl_grps; /* list of local grps (phyints only) */ 10354821Ssklower int v_lcl_grps_max; /* malloc'ed number of v_lcl_grps */ 10454821Ssklower int v_lcl_grps_n; /* used number of v_lcl_grps */ 10554821Ssklower u_long v_cached_group; /* last grp looked-up (phyints only) */ 10654821Ssklower int v_cached_result; /* last look-up result (phyints only) */ 10754821Ssklower }; 10854821Ssklower 10954821Ssklower /* 11054821Ssklower * The kernel's multicast route structure. 11154821Ssklower */ 11254821Ssklower struct mrt { 11354821Ssklower struct in_addr mrt_origin; /* subnet origin of multicasts */ 11454821Ssklower struct in_addr mrt_originmask; /* subnet mask for origin */ 11554821Ssklower vifi_t mrt_parent; /* incoming vif */ 11654821Ssklower vifbitmap_t mrt_children; /* outgoing children vifs */ 11754821Ssklower vifbitmap_t mrt_leaves; /* subset of outgoing children vifs */ 11854821Ssklower struct mrt *mrt_next; /* forward link */ 11954821Ssklower }; 12054821Ssklower 12154821Ssklower 12254821Ssklower #define MRTHASHSIZ 64 12354821Ssklower #if (MRTHASHSIZ & (MRTHASHSIZ - 1)) == 0 /* from sys:route.h */ 12454821Ssklower #define MRTHASHMOD(h) ((h) & (MRTHASHSIZ - 1)) 12554821Ssklower #else 12654821Ssklower #define MRTHASHMOD(h) ((h) % MRTHASHSIZ) 12754821Ssklower #endif 12854821Ssklower 12954821Ssklower /* 13054821Ssklower * The kernel's multicast routing statistics. 13154821Ssklower */ 13254821Ssklower struct mrtstat { 13354821Ssklower u_long mrts_mrt_lookups; /* # multicast route lookups */ 13454821Ssklower u_long mrts_mrt_misses; /* # multicast route cache misses */ 13554821Ssklower u_long mrts_grp_lookups; /* # group address lookups */ 13654821Ssklower u_long mrts_grp_misses; /* # group address cache misses */ 13754821Ssklower u_long mrts_no_route; /* no route for packet's origin */ 13854821Ssklower u_long mrts_bad_tunnel; /* malformed tunnel options */ 13954821Ssklower u_long mrts_cant_tunnel; /* no room for tunnel options */ 140*69081Ssklower u_long mrts_wrong_if; /* arrived on the wrong interface */ 14154821Ssklower }; 14254821Ssklower 14354821Ssklower 14454821Ssklower int ip_mrouter_cmd __P((int, struct socket *, struct mbuf *)); 14561335Sbostic int ip_mrouter_done __P((void)); 14654821Ssklower 14754821Ssklower #endif /* KERNEL */ 148