Annotation of embedaddon/quagga/pimd/pim_mroute.h, revision 1.1.1.1

1.1       misho       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>