1*d1eb37ffSangelos /* $OpenBSD: ip_mroute.h,v 1.7 2001/06/09 07:03:42 angelos Exp $ */ 2b400e158Sniklas /* $NetBSD: ip_mroute.h,v 1.10 1996/02/13 23:42:55 christos Exp $ */ 3df930be7Sderaadt 4*d1eb37ffSangelos #ifndef _NETINET_IP_MROUTE_H_ 5*d1eb37ffSangelos #define _NETINET_IP_MROUTE_H_ 6*d1eb37ffSangelos 7df930be7Sderaadt /* 8df930be7Sderaadt * Definitions for IP multicast forwarding. 9df930be7Sderaadt * 10df930be7Sderaadt * Written by David Waitzman, BBN Labs, August 1988. 11df930be7Sderaadt * Modified by Steve Deering, Stanford, February 1989. 12df930be7Sderaadt * Modified by Ajit Thyagarajan, PARC, August 1993. 13df930be7Sderaadt * Modified by Ajit Thyagarajan, PARC, August 1994. 14df930be7Sderaadt * 15df930be7Sderaadt * MROUTING Revision: 1.2 16df930be7Sderaadt */ 17df930be7Sderaadt 18df930be7Sderaadt #include <sys/queue.h> 19df930be7Sderaadt 20df930be7Sderaadt /* 21df930be7Sderaadt * Multicast Routing set/getsockopt commands. 22df930be7Sderaadt */ 23df930be7Sderaadt #define MRT_INIT 100 /* initialize forwarder */ 24df930be7Sderaadt #define MRT_DONE 101 /* shut down forwarder */ 25df930be7Sderaadt #define MRT_ADD_VIF 102 /* create virtual interface */ 26df930be7Sderaadt #define MRT_DEL_VIF 103 /* delete virtual interface */ 27df930be7Sderaadt #define MRT_ADD_MFC 104 /* insert forwarding cache entry */ 28df930be7Sderaadt #define MRT_DEL_MFC 105 /* delete forwarding cache entry */ 29df930be7Sderaadt #define MRT_VERSION 106 /* get kernel version number */ 30df930be7Sderaadt #define MRT_ASSERT 107 /* enable PIM assert processing */ 31df930be7Sderaadt 32df930be7Sderaadt 33df930be7Sderaadt /* 34df930be7Sderaadt * Types and macros for handling bitmaps with one bit per virtual interface. 35df930be7Sderaadt */ 36df930be7Sderaadt #define MAXVIFS 32 37df930be7Sderaadt typedef u_int32_t vifbitmap_t; 38df930be7Sderaadt typedef u_int16_t vifi_t; /* type of a vif index */ 39df930be7Sderaadt 40df930be7Sderaadt #define VIFM_SET(n, m) ((m) |= (1 << (n))) 41df930be7Sderaadt #define VIFM_CLR(n, m) ((m) &= ~(1 << (n))) 42df930be7Sderaadt #define VIFM_ISSET(n, m) ((m) & (1 << (n))) 43df930be7Sderaadt #define VIFM_SETALL(m) ((m) = 0xffffffff) 44df930be7Sderaadt #define VIFM_CLRALL(m) ((m) = 0x00000000) 45df930be7Sderaadt #define VIFM_COPY(mfrom, mto) ((mto) = (mfrom)) 46df930be7Sderaadt #define VIFM_SAME(m1, m2) ((m1) == (m2)) 47df930be7Sderaadt 48df930be7Sderaadt #define VIFF_TUNNEL 0x1 /* vif represents a tunnel end-point */ 49df930be7Sderaadt #define VIFF_SRCRT 0x2 /* tunnel uses IP src routing */ 50df930be7Sderaadt 51df930be7Sderaadt /* 52df930be7Sderaadt * Argument structure for MRT_ADD_VIF. 53df930be7Sderaadt * (MRT_DEL_VIF takes a single vifi_t argument.) 54df930be7Sderaadt */ 55df930be7Sderaadt struct vifctl { 56df930be7Sderaadt vifi_t vifc_vifi; /* the index of the vif to be added */ 57df930be7Sderaadt u_int8_t vifc_flags; /* VIFF_ flags defined below */ 58df930be7Sderaadt u_int8_t vifc_threshold; /* min ttl required to forward on vif */ 59df930be7Sderaadt u_int32_t vifc_rate_limit; /* max rate */ 60df930be7Sderaadt struct in_addr vifc_lcl_addr;/* local interface address */ 61df930be7Sderaadt struct in_addr vifc_rmt_addr;/* remote address (tunnels only) */ 62df930be7Sderaadt }; 63df930be7Sderaadt 64df930be7Sderaadt /* 65df930be7Sderaadt * Argument structure for MRT_ADD_MFC and MRT_DEL_MFC. 66df930be7Sderaadt * (mfcc_tos to be added at a future point) 67df930be7Sderaadt */ 68df930be7Sderaadt struct mfcctl { 69df930be7Sderaadt struct in_addr mfcc_origin; /* ip origin of mcasts */ 70df930be7Sderaadt struct in_addr mfcc_mcastgrp; /* multicast group associated */ 71df930be7Sderaadt vifi_t mfcc_parent; /* incoming vif */ 72df930be7Sderaadt u_int8_t mfcc_ttls[MAXVIFS]; /* forwarding ttls on vifs */ 73df930be7Sderaadt }; 74df930be7Sderaadt 75df930be7Sderaadt /* 76df930be7Sderaadt * Argument structure used by mrouted to get src-grp pkt counts. 77df930be7Sderaadt */ 78df930be7Sderaadt struct sioc_sg_req { 79df930be7Sderaadt struct in_addr src; 80df930be7Sderaadt struct in_addr grp; 81df930be7Sderaadt u_long pktcnt; 82df930be7Sderaadt u_long bytecnt; 83df930be7Sderaadt u_long wrong_if; 84df930be7Sderaadt }; 85df930be7Sderaadt 86df930be7Sderaadt /* 87df930be7Sderaadt * Argument structure used by mrouted to get vif pkt counts. 88df930be7Sderaadt */ 89df930be7Sderaadt struct sioc_vif_req { 90df930be7Sderaadt vifi_t vifi; /* vif number */ 91df930be7Sderaadt u_long icount; /* input packet count on vif */ 92df930be7Sderaadt u_long ocount; /* output packet count on vif */ 93df930be7Sderaadt u_long ibytes; /* input byte count on vif */ 94df930be7Sderaadt u_long obytes; /* output byte count on vif */ 95df930be7Sderaadt }; 96df930be7Sderaadt 97df930be7Sderaadt 98df930be7Sderaadt /* 99df930be7Sderaadt * The kernel's multicast routing statistics. 100df930be7Sderaadt */ 101df930be7Sderaadt struct mrtstat { 102df930be7Sderaadt u_long mrts_mfc_lookups; /* # forw. cache hash table hits */ 103df930be7Sderaadt u_long mrts_mfc_misses; /* # forw. cache hash table misses */ 104df930be7Sderaadt u_long mrts_upcalls; /* # calls to mrouted */ 105df930be7Sderaadt u_long mrts_no_route; /* no route for packet's origin */ 106df930be7Sderaadt u_long mrts_bad_tunnel; /* malformed tunnel options */ 107df930be7Sderaadt u_long mrts_cant_tunnel; /* no room for tunnel options */ 108df930be7Sderaadt u_long mrts_wrong_if; /* arrived on wrong interface */ 109df930be7Sderaadt u_long mrts_upq_ovflw; /* upcall Q overflow */ 110df930be7Sderaadt u_long mrts_cache_cleanups; /* # entries with no upcalls */ 111df930be7Sderaadt u_long mrts_drop_sel; /* pkts dropped selectively */ 112df930be7Sderaadt u_long mrts_q_overflow; /* pkts dropped - Q overflow */ 113df930be7Sderaadt u_long mrts_pkt2large; /* pkts dropped - size > BKT SIZE */ 114df930be7Sderaadt u_long mrts_upq_sockfull; /* upcalls dropped - socket full */ 115df930be7Sderaadt }; 116df930be7Sderaadt 117df930be7Sderaadt 118df930be7Sderaadt #ifdef _KERNEL 119df930be7Sderaadt 120df930be7Sderaadt /* 121df930be7Sderaadt * Token bucket filter at each vif 122df930be7Sderaadt */ 123df930be7Sderaadt struct tbf { 124df930be7Sderaadt u_int32_t last_pkt_t; /* arr. time of last pkt */ 125df930be7Sderaadt u_int32_t n_tok; /* no of tokens in bucket */ 126df930be7Sderaadt u_int32_t q_len; /* length of queue at this vif */ 127df930be7Sderaadt }; 128df930be7Sderaadt 129df930be7Sderaadt /* 130df930be7Sderaadt * The kernel's virtual-interface structure. 131df930be7Sderaadt */ 132df930be7Sderaadt struct vif { 133df930be7Sderaadt u_int8_t v_flags; /* VIFF_ flags defined above */ 134df930be7Sderaadt u_int8_t v_threshold; /* min ttl required to forward on vif */ 135df930be7Sderaadt u_int32_t v_rate_limit; /* max rate */ 136df930be7Sderaadt struct tbf v_tbf; /* token bucket structure at intf. */ 137df930be7Sderaadt struct in_addr v_lcl_addr; /* local interface address */ 138df930be7Sderaadt struct in_addr v_rmt_addr; /* remote address (tunnels only) */ 139df930be7Sderaadt struct ifnet *v_ifp; /* pointer to interface */ 140df930be7Sderaadt u_long v_pkt_in; /* # pkts in on interface */ 141df930be7Sderaadt u_long v_pkt_out; /* # pkts out on interface */ 142df930be7Sderaadt u_long v_bytes_in; /* # bytes in on interface */ 143df930be7Sderaadt u_long v_bytes_out; /* # bytes out on interface */ 144df930be7Sderaadt struct route v_route; /* cached route if this is a tunnel */ 145df930be7Sderaadt #ifdef RSVP_ISI 146df930be7Sderaadt int v_rsvp_on; /* # RSVP listening on this vif */ 147df930be7Sderaadt struct socket *v_rsvpd; /* # RSVPD daemon */ 148df930be7Sderaadt #endif /* RSVP_ISI */ 149df930be7Sderaadt }; 150df930be7Sderaadt 151df930be7Sderaadt /* 152df930be7Sderaadt * The kernel's multicast forwarding cache entry structure. 153df930be7Sderaadt * (A field for the type of service (mfc_tos) is to be added 154df930be7Sderaadt * at a future point.) 155df930be7Sderaadt */ 156df930be7Sderaadt struct mfc { 157df930be7Sderaadt LIST_ENTRY(mfc) mfc_hash; 158df930be7Sderaadt struct in_addr mfc_origin; /* ip origin of mcasts */ 159df930be7Sderaadt struct in_addr mfc_mcastgrp; /* multicast group associated */ 160df930be7Sderaadt vifi_t mfc_parent; /* incoming vif */ 161df930be7Sderaadt u_int8_t mfc_ttls[MAXVIFS]; /* forwarding ttls on vifs */ 162df930be7Sderaadt u_long mfc_pkt_cnt; /* pkt count for src-grp */ 163df930be7Sderaadt u_long mfc_byte_cnt; /* byte count for src-grp */ 164df930be7Sderaadt u_long mfc_wrong_if; /* wrong if for src-grp */ 165df930be7Sderaadt int mfc_expire; /* time to clean entry up */ 166df930be7Sderaadt struct timeval mfc_last_assert; /* last time I sent an assert */ 167df930be7Sderaadt struct rtdetq *mfc_stall; /* pkts waiting for route */ 168df930be7Sderaadt }; 169df930be7Sderaadt 170df930be7Sderaadt /* 171df930be7Sderaadt * Structure used to communicate from kernel to multicast router. 172df930be7Sderaadt * (Note the convenient similarity to an IP packet.) 173df930be7Sderaadt */ 174df930be7Sderaadt struct igmpmsg { 175df930be7Sderaadt u_int32_t unused1; 176df930be7Sderaadt u_int32_t unused2; 177df930be7Sderaadt u_int8_t im_msgtype; /* what type of message */ 178df930be7Sderaadt #define IGMPMSG_NOCACHE 1 179df930be7Sderaadt #define IGMPMSG_WRONGVIF 2 180df930be7Sderaadt u_int8_t im_mbz; /* must be zero */ 181df930be7Sderaadt u_int8_t im_vif; /* vif rec'd on */ 182df930be7Sderaadt u_int8_t unused3; 183df930be7Sderaadt struct in_addr im_src, im_dst; 184df930be7Sderaadt }; 185df930be7Sderaadt 186df930be7Sderaadt /* 187df930be7Sderaadt * Argument structure used for pkt info. while upcall is made. 188df930be7Sderaadt */ 189df930be7Sderaadt struct rtdetq { 190df930be7Sderaadt struct mbuf *m; /* a copy of the packet */ 191df930be7Sderaadt struct ifnet *ifp; /* interface pkt came in on */ 192df930be7Sderaadt #ifdef UPCALL_TIMING 193df930be7Sderaadt struct timeval t; /* timestamp */ 194df930be7Sderaadt #endif /* UPCALL_TIMING */ 195df930be7Sderaadt struct rtdetq *next; 196df930be7Sderaadt }; 197df930be7Sderaadt 198df930be7Sderaadt #define MFCTBLSIZ 256 199df930be7Sderaadt #define MAX_UPQ 4 /* max. no of pkts in upcall Q */ 200df930be7Sderaadt 201df930be7Sderaadt /* 202df930be7Sderaadt * Token bucket filter code 203df930be7Sderaadt */ 204df930be7Sderaadt #define MAX_BKT_SIZE 10000 /* 10K bytes size */ 205df930be7Sderaadt #define MAXQSIZE 10 /* max. no of pkts in token queue */ 206df930be7Sderaadt 207df930be7Sderaadt /* 208df930be7Sderaadt * Queue structure at each vif 209df930be7Sderaadt */ 210df930be7Sderaadt struct pkt_queue { 211df930be7Sderaadt u_int32_t pkt_len; /* length of packet in queue */ 212df930be7Sderaadt struct mbuf *pkt_m; /* pointer to packet mbuf */ 213df930be7Sderaadt struct ip *pkt_ip; /* pointer to ip header */ 214df930be7Sderaadt }; 215df930be7Sderaadt 216df930be7Sderaadt int ip_mrouter_set __P((int, struct socket *, struct mbuf **)); 217b400e158Sniklas int ip_mrouter_get __P((int, struct socket *, struct mbuf **)); 218b400e158Sniklas int mrt_ioctl __P((u_long, caddr_t)); 219df930be7Sderaadt int ip_mrouter_done __P((void)); 220b400e158Sniklas void reset_vif __P((struct vif *)); 22180ca96b8Sniklas void vif_delete __P((struct ifnet *)); 222b400e158Sniklas #ifdef RSVP_ISI 223b400e158Sniklas int ip_mforward __P((struct mbuf *, struct ifnet *, struct ip_moptions *)); 224b400e158Sniklas int legal_vif_num __P((int)); 225b400e158Sniklas int ip_rsvp_vif_init __P((struct socket *, struct mbuf *)); 226b400e158Sniklas int ip_rsvp_vif_done __P((struct socket *, struct mbuf *)); 227b400e158Sniklas void ip_rsvp_force_done __P((struct socket *)); 228287546eaSitojun void rsvp_input __P((struct mbuf *, int, int)); 229287546eaSitojun #else 230b400e158Sniklas int ip_mforward __P((struct mbuf *, struct ifnet *)); 231*d1eb37ffSangelos #endif /* RSVP_ISI */ 232*d1eb37ffSangelos 2339a570b6dSangelos void ipip_mroute_input __P((struct mbuf *, ...)); 234df930be7Sderaadt 235df930be7Sderaadt #endif /* _KERNEL */ 236*d1eb37ffSangelos #endif /* _NETINET_IP_MROUTE_H_ */ 237