allow setting transport addresses for interfaces into config file

also move passive-interface functionality under interface block
report the correct line for config parsing errors
This commit is contained in:
kefren 2013-10-17 18:10:23 +00:00
parent 4a806b5236
commit f86d4fa943
3 changed files with 99 additions and 24 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: conffile.c,v 1.6 2013/07/11 10:46:19 kefren Exp $ */
/* $NetBSD: conffile.c,v 1.7 2013/10/17 18:10:23 kefren Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@ -63,13 +63,21 @@ static int Fneighbour(char*);
static int Gneighbour(struct conf_neighbour *, char *);
static int Fnodefault(char*);
static int Floopdetection(char*);
static int Fpassiveif(char*);
static int Finterface(char*);
static int Ginterface(struct conf_interface *, char *);
static int Ipassive(struct conf_interface *, char *);
static int Itaddr(struct conf_interface *, char *);
struct conf_func {
char com[64];
int (* func)(char *);
};
struct intf_func {
char com[64];
int (* func)(struct conf_interface *, char *);
};
struct conf_func main_commands[] = {
{ "hello-time", Fhellotime },
{ "keepalive-time", Fkeepalive },
@ -77,26 +85,33 @@ struct conf_func main_commands[] = {
{ "command-port", Fport },
{ "min-label", Fminlabel },
{ "max-label", Fmaxlabel },
{ "LDP-ID", Fldpid },
{ "ldp-id", Fldpid },
{ "neighbor", Fneighbour },
{ "neighbour", Fneighbour },
{ "no-default-route", Fnodefault },
{ "loop-detection", Floopdetection },
{ "passive-if", Fpassiveif },
{ "interface", Finterface },
{ "", NULL },
};
struct intf_func intf_commands[] = {
{ "passive", Ipassive },
{ "transport-address", Itaddr },
{ "", NULL },
};
static int parseline;
/*
* Parses config file
*/
int
conf_parsefile(const char *fname)
{
int i;
char buf[LINEMAXSIZE + 1];
SLIST_INIT(&conei_head);
SLIST_INIT(&passifs_head);
SLIST_INIT(&coifs_head);
conf_ldp_id.s_addr = 0;
confh = open(fname, O_RDONLY, 0);
@ -104,10 +119,10 @@ conf_parsefile(const char *fname)
if (confh == -1)
return E_CONF_IO;
for (i = 1; conf_readline(buf, sizeof(buf)) >= 0; i++)
for (parseline = 1; conf_readline(buf, sizeof(buf)) >= 0; parseline++)
if (conf_dispatch(buf) != 0) {
close(confh);
return i;
return parseline;
}
close(confh);
@ -155,7 +170,7 @@ conf_dispatch(char *line)
command = NextCommand(nline);
for (i = 0; main_commands[i].func != NULL; i++)
if (strncasecmp(main_commands[i].com, command,
strlen(command)) == 0) {
strlen(main_commands[i].com)) == 0) {
matched++;
last_match = i;
}
@ -287,6 +302,7 @@ Fneighbour(char *line)
SLIST_INSERT_HEAD(&conei_head, nei, neilist);
while (conf_readline(buf, sizeof(buf)) >= 0) {
parseline++;
if (buf[0] == '}')
return 0;
if (Gneighbour(nei, buf) == -1)
@ -328,15 +344,59 @@ Floopdetection(char *line)
return 0;
}
/*
* Interface sub-commands
*/
int
Fpassiveif(char *line)
Finterface(char *line)
{
struct passive_if *pif;
char *ifname;
struct conf_interface *conf_if = calloc(1, sizeof(*conf_if));
char buf[1024];
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);
ifname = NextCommand(line);
if (conf_if == NULL || ifname == NULL)
return -1;
strlcpy(conf_if->if_name, ifname, IF_NAMESIZE);
SLIST_INSERT_HEAD(&coifs_head, conf_if, iflist);
while (conf_readline(buf, sizeof(buf)) >= 0) {
parseline++;
if (buf[0] == '}')
return 0;
if (Ginterface(conf_if, buf) == -1)
return -1;
}
return -1;
}
int
Ginterface(struct conf_interface *conf_if, char *buf)
{
int i;
for (i = 0; intf_commands[i].func != NULL; i++)
if (strncasecmp(buf, intf_commands[i].com,
strlen(intf_commands[i].com)) == 0)
return intf_commands[i].func(conf_if, buf +
strlen(intf_commands[i].com) + 1);
/* command not found */
return -1;
}
/* sets transport address */
int
Itaddr(struct conf_interface *conf_if, char *buf)
{
if (inet_pton(AF_INET, buf, &conf_if->tr_addr) != 1)
return -1;
return 0;
}
/* sets passive-interface on */
int
Ipassive(struct conf_interface *conf_if, char *buf)
{
conf_if->passive = 1;
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: conffile.h,v 1.3 2013/07/11 10:46:19 kefren Exp $ */
/* $NetBSD: conffile.h,v 1.4 2013/10/17 18:10:23 kefren Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@ -51,11 +51,13 @@ struct conf_neighbour {
};
SLIST_HEAD(,conf_neighbour) conei_head;
struct passive_if {
struct conf_interface {
char if_name[IF_NAMESIZE];
SLIST_ENTRY(passive_if) listentry;
struct in_addr tr_addr;
int passive;
SLIST_ENTRY(conf_interface) iflist;
};
SLIST_HEAD(,passive_if) passifs_head;
SLIST_HEAD(,conf_interface) coifs_head;
int conf_parsefile(const char *fname);

View File

@ -1,4 +1,4 @@
/* $NetBSD: socketops.c,v 1.31 2013/07/27 14:35:41 kefren Exp $ */
/* $NetBSD: socketops.c,v 1.32 2013/10/17 18:10:23 kefren Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@ -287,10 +287,11 @@ is_hello_socket(int s)
static int
is_passive_if(const char *if_name)
{
struct passive_if *pif;
struct conf_interface *coif;
SLIST_FOREACH(pif, &passifs_head, listentry)
if (strncasecmp(if_name, pif->if_name, IF_NAMESIZE) == 0)
SLIST_FOREACH(coif, &coifs_head, iflist)
if (strncasecmp(if_name, coif->if_name, IF_NAMESIZE) == 0 &&
coif->passive != 0)
return 1;
return 0;
}
@ -408,6 +409,8 @@ send_hello(void)
int ip4socket = -1;
uint lastifindex;
struct hello_socket *hs;
struct conf_interface *coif;
bool bad_tr_addr;
#ifdef INET6
struct sockaddr_in6 sadest6;
int ip6socket = -1;
@ -502,6 +505,16 @@ send_hello(void)
/* Send only once per interface, using primary address */
if (lastifindex == if_nametoindex(ifb->ifa_name))
continue;
/* Check if there is transport address set for this interface */
bad_tr_addr = false;
SLIST_FOREACH(coif, &coifs_head, iflist)
if (strncasecmp(coif->if_name, ifb->ifa_name,
IF_NAMESIZE) == 0 &&
coif->tr_addr.s_addr != 0 &&
coif->tr_addr.s_addr != if_sa->sin_addr.s_addr)
bad_tr_addr = true;
if (bad_tr_addr == true)
continue;
lastifindex = if_nametoindex(ifb->ifa_name);
if (setsockopt(ip4socket, IPPROTO_IP, IP_MULTICAST_IF,