openbsd-ports/net/igmpproxy/patches/patch-ifvc_c
sthen 99d5e52b90 igmpproxy is a simple multicast routing daemon which uses IGMP
forwarding to dynamically route multicast traffic.  Routing is done
by defining an "upstream" interface on which the daemon acts as a
normal Multicast client, and one or more "downstream" interfaces
that serves clients on the destination networks. This is useful in
situations where other dynamic multicast routers cannot be used.

from markus with small adjustments.
ok markus
2008-02-08 19:30:51 +00:00

188 lines
6.5 KiB
Plaintext

$OpenBSD: patch-ifvc_c,v 1.1.1.1 2008/02/08 19:30:51 sthen Exp $
--- ifvc.c.orig Tue May 24 16:49:18 2005
+++ ifvc.c Mon Nov 19 12:56:50 2007
@@ -32,7 +32,8 @@
*/
#include "defs.h"
-#include <linux/sockios.h>
+//#include <linux/sockios.h>
+#include <ifaddrs.h>
struct IfDesc IfDescVc[ MAX_IF ], *IfDescEp = IfDescVc;
@@ -42,119 +43,91 @@ struct IfDesc IfDescVc[ MAX_IF ], *IfDescEp = IfDescVc
**
*/
void buildIfVc() {
- struct ifreq IfVc[ sizeof( IfDescVc ) / sizeof( IfDescVc[ 0 ] ) ];
- struct ifreq *IfEp;
+ struct ifaddrs *ifap, *ifa;
+ struct IfDesc *ifp;
+ struct SubnetList *net;
- int Sock;
+ if (getifaddrs(&ifap) < 0)
+ log( LOG_ERR, errno, "getifaddrs" );
- 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;
+ for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
char FmtBu[ 32 ];
- strncpy( IfDescEp->Name, IfPt->ifr_name, sizeof( IfDescEp->Name ) );
+ if (IfDescEp >= &IfDescVc[ MAX_IF ]) {
+ log(LOG_WARNING, 0, "Too many interfaces, skipping %d", ifa->ifa_name);
+ continue;
+ }
- // 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
+ /* ignore non-IP interfaces
*/
- if ( IfPt->ifr_addr.sa_family != AF_INET ) {
- IfDescEp->InAdr.s_addr = 0; /* mark as non-IP interface */
- IfDescEp++;
+ if ( ifa->ifa_addr->sa_family != AF_INET )
continue;
- }
- // Get the interface adress...
- IfDescEp->InAdr = ((struct sockaddr_in *)&IfPt->ifr_addr)->sin_addr;
- addr = IfDescEp->InAdr.s_addr;
+ if ((ifp = getIfByName(ifa->ifa_name)) == NULL) {
- memcpy( IfReq.ifr_name, IfDescEp->Name, sizeof( IfReq.ifr_name ) );
+ strlcpy( IfDescEp->Name, ifa->ifa_name, sizeof( IfDescEp->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;
+ log(LOG_DEBUG, 0, "Adding Physical Index value of IF '%s' is %d",
+ IfDescEp->Name, if_nametoindex(IfDescEp->Name));
- // 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);
+ // Set the index to -1 by default.
+ IfDescEp->index = -1;
+ // Get the interface adress...
+ IfDescEp->InAdr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
- /* 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" );
+ /* 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
+ */
- IfDescEp->Flags = IfReq.ifr_flags;
+ IfDescEp->Flags = ifa->ifa_flags;
+ // 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;
+ IfDescEp->allowednets = NULL;
+ ifp = IfDescEp++;
+ }
+
// 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 !");
+ addr = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
+ mask = ((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr.s_addr;
+ subnet = addr & mask;
+
+ net = (struct SubnetList *)malloc(sizeof(struct SubnetList));
+ if(net == 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;
+ net->next = ifp->allowednets;
+ net->subnet_mask = mask;
+ net->subnet_addr = subnet;
+ ifp->allowednets = net;
-
// 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,
+ ifp->Name,
+ fmtInAdr( FmtBu, ifp->InAdr ),
+ ifp->Flags,
inetFmts(subnet,mask, s1));
- IfDescEp++;
}
- }
- close( Sock );
+ }
+ freeifaddrs(ifap);
}
/*