summaryrefslogtreecommitdiffstats
path: root/pimd/pim_mroute.h
blob: 3c15c800daf1915c6c53e4a4756bbf4805d22bd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
  PIM for Quagga
  Copyright (C) 2008  Everton da Silva Marques

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program; see the file COPYING; if not, write to the
  Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
  MA 02110-1301 USA
*/

#ifndef PIM_MROUTE_H
#define PIM_MROUTE_H

/*
  For msghdr.msg_control in Solaris 10
*/
#ifndef _XPG4_2
#define _XPG4_2
#endif
#ifndef __EXTENSIONS__
#define __EXTENSIONS__
#endif

#include <netinet/in.h>
#ifdef HAVE_NETINET_IP_MROUTE_H
#include <netinet/ip_mroute.h>
#endif

#define PIM_MROUTE_MIN_TTL (1)

#if defined(HAVE_LINUX_MROUTE_H)
#include <linux/mroute.h>
#else
/*
  Below: from <linux/mroute.h>
*/

#ifndef MAXVIFS
#define MAXVIFS (256)
#endif

#ifndef SIOCGETVIFCNT
#define SIOCGETVIFCNT   SIOCPROTOPRIVATE        /* IP protocol privates */
#define SIOCGETSGCNT    (SIOCPROTOPRIVATE+1)
#define SIOCGETRPF      (SIOCPROTOPRIVATE+2)
#endif

#ifndef MRT_INIT
#define MRT_BASE     200
#define MRT_INIT     (MRT_BASE)      /* Activate the kernel mroute code      */
#define MRT_DONE     (MRT_BASE+1)    /* Shutdown the kernel mroute           */
#define MRT_ADD_VIF  (MRT_BASE+2)    /* Add a virtual interface              */
#define MRT_DEL_VIF  (MRT_BASE+3)    /* Delete a virtual interface           */
#define MRT_ADD_MFC  (MRT_BASE+4)    /* Add a multicast forwarding entry     */
#define MRT_DEL_MFC  (MRT_BASE+5)    /* Delete a multicast forwarding entry  */
#define MRT_VERSION  (MRT_BASE+6)    /* Get the kernel multicast version     */
#define MRT_ASSERT   (MRT_BASE+7)    /* Activate PIM assert mode             */
#define MRT_PIM      (MRT_BASE+8)    /* enable PIM code      */
#endif

#ifndef HAVE_VIFI_T
typedef unsigned short vifi_t;
#endif

#ifndef HAVE_STRUCT_VIFCTL
struct vifctl {
	vifi_t	vifc_vifi;		/* Index of VIF */
	unsigned char vifc_flags;	/* VIFF_ flags */
	unsigned char vifc_threshold;	/* ttl limit */
	unsigned int vifc_rate_limit;	/* Rate limiter values (NI) */
	struct in_addr vifc_lcl_addr;	/* Our address */
	struct in_addr vifc_rmt_addr;	/* IPIP tunnel addr */
};
#endif

#ifndef HAVE_STRUCT_MFCCTL
struct mfcctl {
  struct in_addr mfcc_origin;             /* Origin of mcast      */
  struct in_addr mfcc_mcastgrp;           /* Group in question    */
  vifi_t         mfcc_parent;             /* Where it arrived     */
  unsigned char  mfcc_ttls[MAXVIFS];      /* Where it is going    */
  unsigned int   mfcc_pkt_cnt;            /* pkt count for src-grp */
  unsigned int   mfcc_byte_cnt;
  unsigned int   mfcc_wrong_if;
  int            mfcc_expire;
};
#endif

/*
 *      Group count retrieval for mrouted
 */
/*
  struct sioc_sg_req sgreq;
  memset(&sgreq, 0, sizeof(sgreq));
  memcpy(&sgreq.src, &source_addr, sizeof(sgreq.src));
  memcpy(&sgreq.grp, &group_addr, sizeof(sgreq.grp));
  ioctl(mrouter_s4, SIOCGETSGCNT, &sgreq);
 */
#ifndef HAVE_STRUCT_SIOC_SG_REQ
struct sioc_sg_req {
  struct in_addr src;
  struct in_addr grp;
  unsigned long pktcnt;
  unsigned long bytecnt;
  unsigned long wrong_if;
};
#endif

/*
 *      To get vif packet counts
 */
/*
  struct sioc_vif_req vreq;
  memset(&vreq, 0, sizeof(vreq));
  vreq.vifi = vif_index;
  ioctl(mrouter_s4, SIOCGETVIFCNT, &vreq);
 */
#ifndef HAVE_STRUCT_SIOC_VIF_REQ
struct sioc_vif_req {
  vifi_t  vifi;           /* Which iface */
  unsigned long icount;   /* In packets */
  unsigned long ocount;   /* Out packets */
  unsigned long ibytes;   /* In bytes */
  unsigned long obytes;   /* Out bytes */
};
#endif

/*
 *      Pseudo messages used by mrouted
 */
#ifndef IGMPMSG_NOCACHE
#define IGMPMSG_NOCACHE         1               /* Kern cache fill request to mrouted */
#define IGMPMSG_WRONGVIF        2               /* For PIM assert processing (unused) */
#define IGMPMSG_WHOLEPKT        3               /* For PIM Register processing */
#endif

#ifndef HAVE_STRUCT_IGMPMSG
struct igmpmsg
{
  uint32_t unused1,unused2;
  unsigned char im_msgtype;               /* What is this */
  unsigned char im_mbz;                   /* Must be zero */
  unsigned char im_vif;                   /* Interface (this ought to be a vifi_t!) */
  unsigned char unused3;
  struct in_addr im_src,im_dst;
};
#endif
#endif

#ifndef IGMPMSG_WRVIFWHOLE
#define IGMPMSG_WRVIFWHOLE      4               /* For PIM processing */
#endif

/*
  Above: from <linux/mroute.h>
*/

int pim_mroute_socket_enable(void);
int pim_mroute_socket_disable(void);

int pim_mroute_add_vif(struct interface *ifp, struct in_addr ifaddr, unsigned char flags);
int pim_mroute_del_vif(int vif_index);

int pim_mroute_add(struct channel_oil *c_oil, const char *name);
int pim_mroute_del(struct channel_oil *c_oil, const char *name);

int pim_mroute_msg(int fd, const char *buf, int buf_size);

void pim_mroute_update_counters (struct channel_oil *c_oil);
#endif /* PIM_MROUTE_H */