1/* 2 PIM for Quagga 3 Copyright (C) 2008 Everton da Silva Marques 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; see the file COPYING; if not, write to the 17 Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 18 MA 02110-1301 USA 19 20 $QuaggaId: $Format:%an, %ai, %h$ $ 21*/ 22 23#ifndef PIM_MROUTE_H 24#define PIM_MROUTE_H 25 26/* 27 For msghdr.msg_control in Solaris 10 28*/ 29#ifndef _XPG4_2 30#define _XPG4_2 31#endif 32#ifndef __EXTENSIONS__ 33#define __EXTENSIONS__ 34#endif 35 36#include <netinet/in.h> 37#ifdef HAVE_NETINET_IP_MROUTE_H 38#include <netinet/ip_mroute.h> 39#endif 40 41#define PIM_MROUTE_MIN_TTL (1) 42 43/* 44 Below: from <linux/mroute.h> 45*/ 46 47#ifndef MAXVIFS 48#define MAXVIFS (32) 49#endif 50 51#ifndef SIOCGETVIFCNT 52#define SIOCGETVIFCNT SIOCPROTOPRIVATE /* IP protocol privates */ 53#define SIOCGETSGCNT (SIOCPROTOPRIVATE+1) 54#define SIOCGETRPF (SIOCPROTOPRIVATE+2) 55#endif 56 57#ifndef MRT_INIT 58#define MRT_BASE 200 59#define MRT_INIT (MRT_BASE) /* Activate the kernel mroute code */ 60#define MRT_DONE (MRT_BASE+1) /* Shutdown the kernel mroute */ 61#define MRT_ADD_VIF (MRT_BASE+2) /* Add a virtual interface */ 62#define MRT_DEL_VIF (MRT_BASE+3) /* Delete a virtual interface */ 63#define MRT_ADD_MFC (MRT_BASE+4) /* Add a multicast forwarding entry */ 64#define MRT_DEL_MFC (MRT_BASE+5) /* Delete a multicast forwarding entry */ 65#define MRT_VERSION (MRT_BASE+6) /* Get the kernel multicast version */ 66#define MRT_ASSERT (MRT_BASE+7) /* Activate PIM assert mode */ 67#define MRT_PIM (MRT_BASE+8) /* enable PIM code */ 68#endif 69 70#ifndef HAVE_VIFI_T 71typedef unsigned short vifi_t; 72#endif 73 74#ifndef HAVE_STRUCT_VIFCTL 75struct vifctl { 76 vifi_t vifc_vifi; /* Index of VIF */ 77 unsigned char vifc_flags; /* VIFF_ flags */ 78 unsigned char vifc_threshold; /* ttl limit */ 79 unsigned int vifc_rate_limit; /* Rate limiter values (NI) */ 80 struct in_addr vifc_lcl_addr; /* Our address */ 81 struct in_addr vifc_rmt_addr; /* IPIP tunnel addr */ 82}; 83#endif 84 85#ifndef HAVE_STRUCT_MFCCTL 86struct mfcctl { 87 struct in_addr mfcc_origin; /* Origin of mcast */ 88 struct in_addr mfcc_mcastgrp; /* Group in question */ 89 vifi_t mfcc_parent; /* Where it arrived */ 90 unsigned char mfcc_ttls[MAXVIFS]; /* Where it is going */ 91 unsigned int mfcc_pkt_cnt; /* pkt count for src-grp */ 92 unsigned int mfcc_byte_cnt; 93 unsigned int mfcc_wrong_if; 94 int mfcc_expire; 95}; 96#endif 97 98/* 99 * Group count retrieval for mrouted 100 */ 101/* 102 struct sioc_sg_req sgreq; 103 memset(&sgreq, 0, sizeof(sgreq)); 104 memcpy(&sgreq.src, &source_addr, sizeof(sgreq.src)); 105 memcpy(&sgreq.grp, &group_addr, sizeof(sgreq.grp)); 106 ioctl(mrouter_s4, SIOCGETSGCNT, &sgreq); 107 */ 108#ifndef HAVE_STRUCT_SIOC_SG_REQ 109struct sioc_sg_req { 110 struct in_addr src; 111 struct in_addr grp; 112 unsigned long pktcnt; 113 unsigned long bytecnt; 114 unsigned long wrong_if; 115}; 116#endif 117 118/* 119 * To get vif packet counts 120 */ 121/* 122 struct sioc_vif_req vreq; 123 memset(&vreq, 0, sizeof(vreq)); 124 vreq.vifi = vif_index; 125 ioctl(mrouter_s4, SIOCGETVIFCNT, &vreq); 126 */ 127#ifndef HAVE_STRUCT_SIOC_VIF_REQ 128struct sioc_vif_req { 129 vifi_t vifi; /* Which iface */ 130 unsigned long icount; /* In packets */ 131 unsigned long ocount; /* Out packets */ 132 unsigned long ibytes; /* In bytes */ 133 unsigned long obytes; /* Out bytes */ 134}; 135#endif 136 137/* 138 * Pseudo messages used by mrouted 139 */ 140#ifndef IGMPMSG_NOCACHE 141#define IGMPMSG_NOCACHE 1 /* Kern cache fill request to mrouted */ 142#define IGMPMSG_WRONGVIF 2 /* For PIM assert processing (unused) */ 143#define IGMPMSG_WHOLEPKT 3 /* For PIM Register processing */ 144#endif 145 146#ifndef HAVE_STRUCT_IGMPMSG 147struct igmpmsg 148{ 149 uint32_t unused1,unused2; 150 unsigned char im_msgtype; /* What is this */ 151 unsigned char im_mbz; /* Must be zero */ 152 unsigned char im_vif; /* Interface (this ought to be a vifi_t!) */ 153 unsigned char unused3; 154 struct in_addr im_src,im_dst; 155}; 156#endif 157 158/* 159 Above: from <linux/mroute.h> 160*/ 161 162int pim_mroute_socket_enable(void); 163int pim_mroute_socket_disable(void); 164 165int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr); 166int pim_mroute_del_vif(int vif_index); 167 168int pim_mroute_add(struct mfcctl *mc); 169int pim_mroute_del(struct mfcctl *mc); 170 171int pim_mroute_msg(int fd, const char *buf, int buf_size); 172 173#endif /* PIM_MROUTE_H */ 174