Annotation of embedaddon/igmpproxy/src/igmpproxy.h, revision 1.1.1.1
1.1 misho 1: /*
2: ** igmpproxy - IGMP proxy based multicast router
3: ** Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>
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,
11: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: ** GNU 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; if not, write to the Free Software
17: ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18: **
19: **----------------------------------------------------------------------------
20: **
21: ** This software is derived work from the following software. The original
22: ** source code has been modified from it's original state by the author
23: ** of igmpproxy.
24: **
25: ** smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>
26: ** - Licensed under the GNU General Public License, version 2
27: **
28: ** mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of
29: ** Leland Stanford Junior University.
30: ** - Original license can be found in the Stanford.txt file.
31: **
32: */
33: /**
34: * igmpproxy.h - Header file for common includes.
35: */
36:
37: #include <errno.h>
38: #include <stdarg.h>
39: #include <stdio.h>
40: #include <stdlib.h>
41: #include <syslog.h>
42: #include <signal.h>
43: #include <unistd.h>
44: #include <string.h>
45: #include <fcntl.h>
46: #include <stdbool.h>
47:
48: #include <sys/socket.h>
49: #include <sys/un.h>
50: #include <sys/time.h>
51: #include <sys/ioctl.h>
52: #include <sys/param.h>
53:
54: #include <net/if.h>
55: #include <netinet/in.h>
56: #include <arpa/inet.h>
57:
58: #include "os.h"
59: #include "config.h"
60:
61: /*
62: * Limit on length of route data
63: */
64: #define MAX_IP_PACKET_LEN 576
65: #define MIN_IP_HEADER_LEN 20
66: #define MAX_IP_HEADER_LEN 60
67:
68: #define MAX_MC_VIFS 32 // !!! check this const in the specific includes
69:
70: // Useful macros..
71: #define VCMC( Vc ) (sizeof( Vc ) / sizeof( (Vc)[ 0 ] ))
72: #define VCEP( Vc ) (&(Vc)[ VCMC( Vc ) ])
73:
74: // Bit manipulation macros...
75: #define BIT_ZERO(X) ((X) = 0)
76: #define BIT_SET(X,n) ((X) |= 1 << (n))
77: #define BIT_CLR(X,n) ((X) &= ~(1 << (n)))
78: #define BIT_TST(X,n) ((X) & 1 << (n))
79:
80:
81: //#################################################################################
82: // Globals
83: //#################################################################################
84:
85: /*
86: * External declarations for global variables and functions.
87: */
88: #define RECV_BUF_SIZE 8192
89: extern char *recv_buf;
90: extern char *send_buf;
91:
92: extern char s1[];
93: extern char s2[];
94: extern char s3[];
95: extern char s4[];
96:
97:
98:
99: //#################################################################################
100: // Lib function prototypes.
101: //#################################################################################
102:
103: /* syslog.c
104: */
105: extern bool Log2Stderr; // Log to stderr instead of to syslog
106: extern int LogLevel; // Log threshold, LOG_WARNING .... LOG_DEBUG
107:
108: void my_log( int Serverity, int Errno, const char *FmtSt, ... );
109:
110: /* ifvc.c
111: */
112: #define MAX_IF 40 // max. number of interfaces recognized
113:
114: // Interface states
115: #define IF_STATE_DISABLED 0 // Interface should be ignored.
116: #define IF_STATE_UPSTREAM 1 // Interface is the upstream interface
117: #define IF_STATE_DOWNSTREAM 2 // Interface is a downstream interface
118:
119: // Multicast default values...
120: #define DEFAULT_ROBUSTNESS 2
121: #define DEFAULT_THRESHOLD 1
122: #define DEFAULT_RATELIMIT 0
123:
124: // Define timer constants (in seconds...)
125: #define INTERVAL_QUERY 125
126: #define INTERVAL_QUERY_RESPONSE 10
127: //#define INTERVAL_QUERY_RESPONSE 10
128:
129: #define ROUTESTATE_NOTJOINED 0 // The group corresponding to route is not joined
130: #define ROUTESTATE_JOINED 1 // The group corresponding to route is joined
131: #define ROUTESTATE_CHECK_LAST_MEMBER 2 // The router is checking for hosts
132:
133:
134:
135: // Linked list of networks...
136: struct SubnetList {
137: uint32_t subnet_addr;
138: uint32_t subnet_mask;
139: struct SubnetList* next;
140: };
141:
142: struct IfDesc {
143: char Name[IF_NAMESIZE];
144: struct in_addr InAdr; /* == 0 for non IP interfaces */
145: short Flags;
146: short state;
147: struct SubnetList* allowednets;
148: unsigned int robustness;
149: unsigned char threshold; /* ttl limit */
150: unsigned int ratelimit;
151: unsigned int index;
152: };
153:
154: // Keeps common configuration settings
155: struct Config {
156: unsigned int robustnessValue;
157: unsigned int queryInterval;
158: unsigned int queryResponseInterval;
159: // Used on startup..
160: unsigned int startupQueryInterval;
161: unsigned int startupQueryCount;
162: // Last member probe...
163: unsigned int lastMemberQueryInterval;
164: unsigned int lastMemberQueryCount;
165: // Set if upstream leave messages should be sent instantly..
166: unsigned short fastUpstreamLeave;
167: };
168:
169: // Defines the Index of the upstream VIF...
170: extern int upStreamVif;
171:
172: /* ifvc.c
173: */
174: void buildIfVc( void );
175: struct IfDesc *getIfByName( const char *IfName );
176: struct IfDesc *getIfByIx( unsigned Ix );
177: struct IfDesc *getIfByAddress( uint32_t Ix );
178: int isAdressValidForIf(struct IfDesc* intrface, uint32_t ipaddr);
179:
180: /* mroute-api.c
181: */
182: struct MRouteDesc {
183: struct in_addr OriginAdr, McAdr;
184: short InVif;
185: uint8_t TtlVc[ MAX_MC_VIFS ];
186: };
187:
188: // IGMP socket as interface for the mrouted API
189: // - receives the IGMP messages
190: extern int MRouterFD;
191:
192: int enableMRouter( void );
193: void disableMRouter( void );
194: void addVIF( struct IfDesc *Dp );
195: int addMRoute( struct MRouteDesc * Dp );
196: int delMRoute( struct MRouteDesc * Dp );
197: int getVifIx( struct IfDesc *IfDp );
198:
199: /* config.c
200: */
201: int loadConfig(char *configFile);
202: void configureVifs();
203: struct Config *getCommonConfig();
204:
205: /* igmp.c
206: */
207: extern uint32_t allhosts_group;
208: extern uint32_t allrouters_group;
209: void initIgmp(void);
210: void acceptIgmp(int);
211: void sendIgmp (uint32_t, uint32_t, int, int, uint32_t,int);
212:
213: /* lib.c
214: */
215: char *fmtInAdr( char *St, struct in_addr InAdr );
216: char *inetFmt(uint32_t addr, char *s);
217: char *inetFmts(uint32_t addr, uint32_t mask, char *s);
218: uint16_t inetChksum(uint16_t *addr, int len);
219:
220: /* kern.c
221: */
222: void k_set_rcvbuf(int bufsize, int minsize);
223: void k_hdr_include(int hdrincl);
224: void k_set_ttl(int t);
225: void k_set_loop(int l);
226: void k_set_if(uint32_t ifa);
227: /*
228: void k_join(uint32_t grp, uint32_t ifa);
229: void k_leave(uint32_t grp, uint32_t ifa);
230: */
231:
232: /* udpsock.c
233: */
234: int openUdpSocket( uint32_t PeerInAdr, uint16_t PeerPort );
235:
236: /* mcgroup.c
237: */
238: int joinMcGroup( int UdpSock, struct IfDesc *IfDp, uint32_t mcastaddr );
239: int leaveMcGroup( int UdpSock, struct IfDesc *IfDp, uint32_t mcastaddr );
240:
241:
242: /* rttable.c
243: */
244: void initRouteTable();
245: void clearAllRoutes();
246: int insertRoute(uint32_t group, int ifx);
247: int activateRoute(uint32_t group, uint32_t originAddr);
248: void ageActiveRoutes();
249: void setRouteLastMemberMode(uint32_t group);
250: int lastMemberGroupAge(uint32_t group);
251:
252: /* request.c
253: */
254: void acceptGroupReport(uint32_t src, uint32_t group, uint8_t type);
255: void acceptLeaveMessage(uint32_t src, uint32_t group);
256: void sendGeneralMembershipQuery();
257:
258: /* callout.c
259: */
260: typedef void (*timer_f)(void *);
261:
262: void callout_init();
263: void free_all_callouts();
264: void age_callout_queue(int);
265: int timer_nextTimer();
266: int timer_setTimer(int, timer_f, void *);
267: int timer_clearTimer(int);
268: int timer_leftTimer(int);
269:
270: /* confread.c
271: */
272: #define MAX_TOKEN_LENGTH 30
273:
274: int openConfigFile(char *filename);
275: void closeConfigFile();
276: char* nextConfigToken();
277: char* getCurrentConfigToken();
278:
279:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>