⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ifvc.c

📁 igmp proxy 实现源码
💻 C
字号:
/***  igmpproxy - IGMP proxy based multicast router **  Copyright (C) 2005 Johnny Egeland <johnny@rlo.org>****  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; if not, write to the Free Software**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA****----------------------------------------------------------------------------****  This software is derived work from the following software. The original**  source code has been modified from it's original state by the author**  of igmpproxy.****  smcroute 0.92 - Copyright (C) 2001 Carsten Schill <carsten@cschill.de>**  - Licensed under the GNU General Public License, version 2**  **  mrouted 3.9-beta3 - COPYRIGHT 1989 by The Board of Trustees of **  Leland Stanford Junior University.**  - Original license can be found in the "doc/mrouted-LINCESE" file.***/#include "defs.h"#include <linux/sockios.h>struct IfDesc IfDescVc[ MAX_IF ], *IfDescEp = IfDescVc;/*** Builds up a vector with the interface of the machine. Calls to the other functions of ** the module will fail if they are called before the vector is build.**          */void buildIfVc() {    struct ifreq IfVc[ sizeof( IfDescVc ) / sizeof( IfDescVc[ 0 ] )  ];    struct ifreq *IfEp;    int Sock;    if ( (Sock = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 )        log( LOG_ERR, errno, "RAW socket open" );    /* get If vector     */    {        struct ifconf IoCtlReq;        IoCtlReq.ifc_buf = (void *)IfVc;        IoCtlReq.ifc_len = sizeof( IfVc );        if ( ioctl( Sock, SIOCGIFCONF, &IoCtlReq ) < 0 )            log( LOG_ERR, errno, "ioctl SIOCGIFCONF" );        IfEp = (void *)((char *)IfVc + IoCtlReq.ifc_len);    }    /* loop over interfaces and copy interface info to IfDescVc     */    {        struct ifreq  *IfPt;        struct IfDesc *IfDp;        // Temp keepers of interface params...        uint32 addr, subnet, mask;        for ( IfPt = IfVc; IfPt < IfEp; IfPt++ ) {            struct ifreq IfReq;            char FmtBu[ 32 ];            strncpy( IfDescEp->Name, IfPt->ifr_name, sizeof( IfDescEp->Name ) );            // Currently don't set any allowed nets...            //IfDescEp->allowednets = NULL;            // Set the index to -1 by default.            IfDescEp->index = -1;            /* don't retrieve more info for non-IP interfaces             */            if ( IfPt->ifr_addr.sa_family != AF_INET ) {                IfDescEp->InAdr.s_addr = 0;  /* mark as non-IP interface */                IfDescEp++;                continue;            }            // Get the interface adress...            IfDescEp->InAdr = ((struct sockaddr_in *)&IfPt->ifr_addr)->sin_addr;            addr = IfDescEp->InAdr.s_addr;            memcpy( IfReq.ifr_name, IfDescEp->Name, sizeof( IfReq.ifr_name ) );            // Get the subnet mask...            if (ioctl(Sock, SIOCGIFNETMASK, &IfReq ) < 0)                log(LOG_ERR, errno, "ioctl SIOCGIFNETMASK for %s", IfReq.ifr_name);            mask = ((struct sockaddr_in *)&IfReq.ifr_addr)->sin_addr.s_addr;            subnet = addr & mask;            // Get the physical index of the Interface            if (ioctl(Sock, SIOCGIFINDEX, &IfReq ) < 0)                log(LOG_ERR, errno, "ioctl SIOCGIFINDEX for %s", IfReq.ifr_name);                        log(LOG_DEBUG, 0, "Physical Index value of IF '%s' is %d",                IfDescEp->Name, IfReq.ifr_ifindex);            /* get if flags            **            ** typical flags:            ** lo    0x0049 -> Running, Loopback, Up            ** ethx  0x1043 -> Multicast, Running, Broadcast, Up            ** ipppx 0x0091 -> NoArp, PointToPoint, Up             ** grex  0x00C1 -> NoArp, Running, Up            ** ipipx 0x00C1 -> NoArp, Running, Up            */            if ( ioctl( Sock, SIOCGIFFLAGS, &IfReq ) < 0 )                log( LOG_ERR, errno, "ioctl SIOCGIFFLAGS" );            IfDescEp->Flags = IfReq.ifr_flags;            // Insert the verified subnet as an allowed net...            IfDescEp->allowednets = (struct SubnetList *)malloc(sizeof(struct SubnetList));            if(IfDescEp->allowednets == NULL) log(LOG_ERR, 0, "Out of memory !");                        // Create the network address for the IF..            IfDescEp->allowednets->next = NULL;            IfDescEp->allowednets->subnet_mask = mask;            IfDescEp->allowednets->subnet_addr = subnet;            // Set the default params for the IF...            IfDescEp->state         = IF_STATE_DOWNSTREAM;            IfDescEp->robustness    = DEFAULT_ROBUSTNESS;            IfDescEp->threshold     = DEFAULT_THRESHOLD;   /* ttl limit */            IfDescEp->ratelimit     = DEFAULT_RATELIMIT;                         // Debug log the result...            IF_DEBUG log( LOG_DEBUG, 0, "buildIfVc: Interface %s Addr: %s, Flags: 0x%04x, Network: %s",                 IfDescEp->Name,                 fmtInAdr( FmtBu, IfDescEp->InAdr ),                 IfDescEp->Flags,                 inetFmts(subnet,mask, s1));            IfDescEp++;        }     }    close( Sock );}/*** Returns a pointer to the IfDesc of the interface 'IfName'**** returns: - pointer to the IfDesc of the requested interface**          - NULL if no interface 'IfName' exists**          */struct IfDesc *getIfByName( const char *IfName ) {    struct IfDesc *Dp;    for ( Dp = IfDescVc; Dp < IfDescEp; Dp++ )        if ( ! strcmp( IfName, Dp->Name ) )            return Dp;    return NULL;}/*** Returns a pointer to the IfDesc of the interface 'Ix'**** returns: - pointer to the IfDesc of the requested interface**          - NULL if no interface 'Ix' exists**          */struct IfDesc *getIfByIx( unsigned Ix ) {    struct IfDesc *Dp = &IfDescVc[ Ix ];    return Dp < IfDescEp ? Dp : NULL;}/***   Returns a pointer to the IfDesc whose subnet matches*   the supplied IP adress. The IP must match a interfaces*   subnet, or any configured allowed subnet on a interface.*/struct IfDesc *getIfByAddress( uint32 ipaddr ) {    struct IfDesc       *Dp;    struct SubnetList   *currsubnet;    for ( Dp = IfDescVc; Dp < IfDescEp; Dp++ ) {        // Loop through all registered allowed nets of the VIF...        for(currsubnet = Dp->allowednets; currsubnet != NULL; currsubnet = currsubnet->next) {            // Check if the ip falls in under the subnet....            if((ipaddr & currsubnet->subnet_mask) == currsubnet->subnet_addr) {                return Dp;            }        }    }    return NULL;}/***   Returns a pointer to the IfDesc whose subnet matches*   the supplied IP adress. The IP must match a interfaces*   subnet, or any configured allowed subnet on a interface.*/struct IfDesc *getIfByVifIndex( unsigned vifindex ) {    struct IfDesc       *Dp;    if(vifindex>0) {        for ( Dp = IfDescVc; Dp < IfDescEp; Dp++ ) {            if(Dp->index == vifindex) {                return Dp;            }        }    }    return NULL;}/***   Function that checks if a given ipaddress is a valid*   address for the supplied VIF.*/int isAdressValidForIf( struct IfDesc* intrface, uint32 ipaddr ) {    struct SubnetList   *currsubnet;        if(intrface == NULL) {        return 0;    }    // Loop through all registered allowed nets of the VIF...    for(currsubnet = intrface->allowednets; currsubnet != NULL; currsubnet = currsubnet->next) {        /*        IF_DEBUG log(LOG_DEBUG, 0, "Testing %s for subnet %s, mask %s: Result net: %s",            inetFmt(ipaddr, s1),            inetFmt(currsubnet->subnet_addr, s2),            inetFmt(currsubnet->subnet_mask, s3),            inetFmt((ipaddr & currsubnet->subnet_mask), s4)            );            */        // Check if the ip falls in under the subnet....        if((ipaddr & currsubnet->subnet_mask) == currsubnet->subnet_addr) {            return 1;        }    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -