Module Name: src Committed By: kefren Date: Sat Jan 26 21:07:49 UTC 2013
Modified Files: src/usr.sbin/ldpd: conffile.c conffile.h socketops.c Log Message: * add a new keyword for config file - passive-if and check if it's allowed to use the interface before join/send mcast * check if interface supports multicast before join/send mcast To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/usr.sbin/ldpd/conffile.c cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/ldpd/conffile.h cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/ldpd/socketops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/ldpd/conffile.c diff -u src/usr.sbin/ldpd/conffile.c:1.4 src/usr.sbin/ldpd/conffile.c:1.5 --- src/usr.sbin/ldpd/conffile.c:1.4 Mon Nov 12 18:39:00 2012 +++ src/usr.sbin/ldpd/conffile.c Sat Jan 26 21:07:49 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: conffile.c,v 1.4 2012/11/12 18:39:00 kefren Exp $ */ +/* $NetBSD: conffile.c,v 1.5 2013/01/26 21:07:49 kefren Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -63,6 +63,7 @@ static int Fneighbour(char*); static int Gneighbour(struct conf_neighbour *, char *); static int Fnodefault(char*); static int Floopdetection(char*); +static int Fpassiveif(char*); struct conf_func { char com[64]; @@ -81,6 +82,7 @@ struct conf_func main_commands[] = { { "neighbour", Fneighbour }, { "no-default-route", Fnodefault }, { "loop-detection", Floopdetection }, + { "passive-if", Fpassiveif }, { "", NULL }, }; @@ -94,6 +96,7 @@ conf_parsefile(char *fname) char buf[LINEMAXSIZE + 1]; SLIST_INIT(&conei_head); + SLIST_INIT(&passifs_head); conf_ldp_id.s_addr = 0; confh = open(fname, O_RDONLY, 0); @@ -324,3 +327,16 @@ Floopdetection(char *line) loop_detection = loopd; return 0; } + +int +Fpassiveif(char *line) +{ + struct passive_if *pif; + + if (strlen(line) > IF_NAMESIZE - 1) + return E_CONF_PARAM; + pif = calloc(1, sizeof(*pif)); + strlcpy(pif->if_name, line, IF_NAMESIZE); + SLIST_INSERT_HEAD(&passifs_head, pif, listentry); + return 0; +} Index: src/usr.sbin/ldpd/conffile.h diff -u src/usr.sbin/ldpd/conffile.h:1.1 src/usr.sbin/ldpd/conffile.h:1.2 --- src/usr.sbin/ldpd/conffile.h:1.1 Thu Dec 30 11:29:21 2010 +++ src/usr.sbin/ldpd/conffile.h Sat Jan 26 21:07:49 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: conffile.h,v 1.1 2010/12/30 11:29:21 kefren Exp $ */ +/* $NetBSD: conffile.h,v 1.2 2013/01/26 21:07:49 kefren Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -32,6 +32,7 @@ #ifndef __CONFFILE_H #define __CONFFILE_H +#include <net/if.h> #include <netinet/in.h> #include <sys/queue.h> @@ -50,6 +51,11 @@ struct conf_neighbour { }; SLIST_HEAD(,conf_neighbour) conei_head; +struct passive_if { + char if_name[IF_NAMESIZE]; + SLIST_ENTRY(passive_if) listentry; +}; +SLIST_HEAD(,passive_if) passifs_head; int conf_parsefile(char *fname); Index: src/usr.sbin/ldpd/socketops.c diff -u src/usr.sbin/ldpd/socketops.c:1.19 src/usr.sbin/ldpd/socketops.c:1.20 --- src/usr.sbin/ldpd/socketops.c:1.19 Sat Jan 26 19:44:52 2013 +++ src/usr.sbin/ldpd/socketops.c Sat Jan 26 21:07:49 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: socketops.c,v 1.19 2013/01/26 19:44:52 kefren Exp $ */ +/* $NetBSD: socketops.c,v 1.20 2013/01/26 21:07:49 kefren Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -47,6 +47,7 @@ #include <strings.h> #include <unistd.h> +#include "conffile.h" #include "fsm.h" #include "ldp.h" #include "ldp_command.h" @@ -83,6 +84,7 @@ static int set_tos(int); static int socket_reuse_port(int); static int get_local_addr(struct sockaddr_dl *, struct in_addr *); static int is_hello_socket(int); +static int is_passive_if(char *if_name); int create_hello_sockets() @@ -134,7 +136,9 @@ create_hello_sockets() struct sockaddr_in *if_sa = (struct sockaddr_in *) ifb->ifa_addr; if (if_sa->sin_family != AF_INET || (!(ifb->ifa_flags & IFF_UP)) || (ifb->ifa_flags & IFF_LOOPBACK) || + (!(ifb->ifa_flags & IFF_MULTICAST)) || (ntohl(if_sa->sin_addr.s_addr) >> 24 == IN_LOOPBACKNET) || + is_passive_if(ifb->ifa_name) || lastifindex == if_nametoindex(ifb->ifa_name)) continue; lastifindex = if_nametoindex(ifb->ifa_name); @@ -211,7 +215,9 @@ create_hello_sockets() if_sa6 = (struct sockaddr_in6 *) ifb->ifa_addr; if (if_sa6->sin6_family != AF_INET6 || (!(ifb->ifa_flags & IFF_UP)) || + (!(ifb->ifa_flags & IFF_MULTICAST)) || (ifb->ifa_flags & IFF_LOOPBACK) || + is_passive_if(ifb->ifa_name) || IN6_IS_ADDR_LOOPBACK(&if_sa6->sin6_addr)) continue; /* @@ -275,6 +281,18 @@ is_hello_socket(int s) return 0; } +/* Check if interface is passive */ +static int +is_passive_if(char *if_name) +{ + struct passive_if *pif; + + SLIST_FOREACH(pif, &passifs_head, listentry) + if (strncasecmp(if_name, pif->if_name, IF_NAMESIZE) == 0) + return 1; + return 0; +} + /* Sets the TTL to 1 as we don't want to transmit outside this subnet */ int set_ttl(int s) @@ -471,10 +489,13 @@ send_hello(void) /* Loop all interfaces in order to send IPv4 hellos */ for (ifb = ifa; ifb; ifb = ifb->ifa_next) { if_sa = (struct sockaddr_in *) ifb->ifa_addr; - if (if_sa->sin_family != AF_INET) - continue; - if (ntohl(if_sa->sin_addr.s_addr) >> 24 == IN_LOOPBACKNET || - ntohl(if_sa->sin_addr.s_addr) >> 24 == 0) + if (if_sa->sin_family != AF_INET || + (!(ifb->ifa_flags & IFF_UP)) || + (ifb->ifa_flags & IFF_LOOPBACK) || + (!(ifb->ifa_flags & IFF_MULTICAST)) || + is_passive_if(ifb->ifa_name) || + (ntohl(if_sa->sin_addr.s_addr) >> 24 == IN_LOOPBACKNET) || + lastifindex == if_nametoindex(ifb->ifa_name)) continue; /* Send only once per interface, using primary address */ @@ -529,7 +550,9 @@ send_hello(void) (struct sockaddr_in6 *) ifb->ifa_addr; if (if_sa6->sin6_family != AF_INET6 || (!(ifb->ifa_flags & IFF_UP)) || + (!(ifb->ifa_flags & IFF_MULTICAST)) || (ifb->ifa_flags & IFF_LOOPBACK) || + is_passive_if(ifb->ifa_name) || IN6_IS_ADDR_LOOPBACK(&if_sa6->sin6_addr)) continue; /*