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>