File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / pimd / pim_mroute.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:11 2016 UTC (8 years, 7 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    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: #if defined(HAVE_LINUX_MROUTE_H)
   44: #include <linux/mroute.h>
   45: #else
   46: /*
   47:   Below: from <linux/mroute.h>
   48: */
   49: 
   50: #ifndef MAXVIFS
   51: #define MAXVIFS (32)
   52: #endif
   53: 
   54: #ifndef SIOCGETVIFCNT
   55: #define SIOCGETVIFCNT   SIOCPROTOPRIVATE        /* IP protocol privates */
   56: #define SIOCGETSGCNT    (SIOCPROTOPRIVATE+1)
   57: #define SIOCGETRPF      (SIOCPROTOPRIVATE+2)
   58: #endif
   59: 
   60: #ifndef MRT_INIT
   61: #define MRT_BASE     200
   62: #define MRT_INIT     (MRT_BASE)      /* Activate the kernel mroute code      */
   63: #define MRT_DONE     (MRT_BASE+1)    /* Shutdown the kernel mroute           */
   64: #define MRT_ADD_VIF  (MRT_BASE+2)    /* Add a virtual interface              */
   65: #define MRT_DEL_VIF  (MRT_BASE+3)    /* Delete a virtual interface           */
   66: #define MRT_ADD_MFC  (MRT_BASE+4)    /* Add a multicast forwarding entry     */
   67: #define MRT_DEL_MFC  (MRT_BASE+5)    /* Delete a multicast forwarding entry  */
   68: #define MRT_VERSION  (MRT_BASE+6)    /* Get the kernel multicast version     */
   69: #define MRT_ASSERT   (MRT_BASE+7)    /* Activate PIM assert mode             */
   70: #define MRT_PIM      (MRT_BASE+8)    /* enable PIM code      */
   71: #endif
   72: 
   73: #ifndef HAVE_VIFI_T
   74: typedef unsigned short vifi_t;
   75: #endif
   76: 
   77: #ifndef HAVE_STRUCT_VIFCTL
   78: struct vifctl {
   79: 	vifi_t	vifc_vifi;		/* Index of VIF */
   80: 	unsigned char vifc_flags;	/* VIFF_ flags */
   81: 	unsigned char vifc_threshold;	/* ttl limit */
   82: 	unsigned int vifc_rate_limit;	/* Rate limiter values (NI) */
   83: 	struct in_addr vifc_lcl_addr;	/* Our address */
   84: 	struct in_addr vifc_rmt_addr;	/* IPIP tunnel addr */
   85: };
   86: #endif
   87: 
   88: #ifndef HAVE_STRUCT_MFCCTL
   89: struct mfcctl {
   90:   struct in_addr mfcc_origin;             /* Origin of mcast      */
   91:   struct in_addr mfcc_mcastgrp;           /* Group in question    */
   92:   vifi_t         mfcc_parent;             /* Where it arrived     */
   93:   unsigned char  mfcc_ttls[MAXVIFS];      /* Where it is going    */
   94:   unsigned int   mfcc_pkt_cnt;            /* pkt count for src-grp */
   95:   unsigned int   mfcc_byte_cnt;
   96:   unsigned int   mfcc_wrong_if;
   97:   int            mfcc_expire;
   98: };
   99: #endif
  100: 
  101: /*
  102:  *      Group count retrieval for mrouted
  103:  */
  104: /*
  105:   struct sioc_sg_req sgreq;
  106:   memset(&sgreq, 0, sizeof(sgreq));
  107:   memcpy(&sgreq.src, &source_addr, sizeof(sgreq.src));
  108:   memcpy(&sgreq.grp, &group_addr, sizeof(sgreq.grp));
  109:   ioctl(mrouter_s4, SIOCGETSGCNT, &sgreq);
  110:  */
  111: #ifndef HAVE_STRUCT_SIOC_SG_REQ
  112: struct sioc_sg_req {
  113:   struct in_addr src;
  114:   struct in_addr grp;
  115:   unsigned long pktcnt;
  116:   unsigned long bytecnt;
  117:   unsigned long wrong_if;
  118: };
  119: #endif
  120: 
  121: /*
  122:  *      To get vif packet counts
  123:  */
  124: /*
  125:   struct sioc_vif_req vreq;
  126:   memset(&vreq, 0, sizeof(vreq));
  127:   vreq.vifi = vif_index;
  128:   ioctl(mrouter_s4, SIOCGETVIFCNT, &vreq);
  129:  */
  130: #ifndef HAVE_STRUCT_SIOC_VIF_REQ
  131: struct sioc_vif_req {
  132:   vifi_t  vifi;           /* Which iface */
  133:   unsigned long icount;   /* In packets */
  134:   unsigned long ocount;   /* Out packets */
  135:   unsigned long ibytes;   /* In bytes */
  136:   unsigned long obytes;   /* Out bytes */
  137: };
  138: #endif
  139: 
  140: /*
  141:  *      Pseudo messages used by mrouted
  142:  */
  143: #ifndef IGMPMSG_NOCACHE
  144: #define IGMPMSG_NOCACHE         1               /* Kern cache fill request to mrouted */
  145: #define IGMPMSG_WRONGVIF        2               /* For PIM assert processing (unused) */
  146: #define IGMPMSG_WHOLEPKT        3               /* For PIM Register processing */
  147: #endif
  148: 
  149: #ifndef HAVE_STRUCT_IGMPMSG
  150: struct igmpmsg
  151: {
  152:   uint32_t unused1,unused2;
  153:   unsigned char im_msgtype;               /* What is this */
  154:   unsigned char im_mbz;                   /* Must be zero */
  155:   unsigned char im_vif;                   /* Interface (this ought to be a vifi_t!) */
  156:   unsigned char unused3;
  157:   struct in_addr im_src,im_dst;
  158: };
  159: #endif
  160: #endif
  161: 
  162: /*
  163:   Above: from <linux/mroute.h>
  164: */
  165: 
  166: int pim_mroute_socket_enable(void);
  167: int pim_mroute_socket_disable(void);
  168: 
  169: int pim_mroute_add_vif(int vif_index, struct in_addr ifaddr);
  170: int pim_mroute_del_vif(int vif_index);
  171: 
  172: int pim_mroute_add(struct mfcctl *mc);
  173: int pim_mroute_del(struct mfcctl *mc);
  174: 
  175: int pim_mroute_msg(int fd, const char *buf, int buf_size);
  176: 
  177: #endif /* PIM_MROUTE_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>