summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/ospfd/packet.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/usr.sbin/ospfd/packet.c b/usr.sbin/ospfd/packet.c
index 2f0ba92a85f..714ad0e45ef 100644
--- a/usr.sbin/ospfd/packet.c
+++ b/usr.sbin/ospfd/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.9 2005/05/26 19:54:49 norby Exp $ */
+/* $OpenBSD: packet.c,v 1.10 2005/05/27 07:24:51 norby Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -50,7 +50,8 @@ gen_ospf_hdr(struct buf *buf, struct iface *iface, u_int8_t type)
ospf_hdr.version = OSPF_VERSION;
ospf_hdr.type = type;
ospf_hdr.rtr_id = iface->rtr_id.s_addr;
- ospf_hdr.area_id = iface->area->id.s_addr;
+ if (iface->type != IF_TYPE_VIRTUALLINK)
+ ospf_hdr.area_id = iface->area->id.s_addr;
ospf_hdr.auth_type = htons(iface->auth_type);
return (buf_add(buf, &ospf_hdr, sizeof(ospf_hdr)));
@@ -240,12 +241,19 @@ ospf_hdr_sanity_check(const struct ip *ip_hdr, struct ospf_hdr *ospf_hdr,
return (-1);
}
- if (ospf_hdr->area_id != iface->area->id.s_addr) {
- /* TODO backbone area is allowed for virtual links */
- addr.s_addr = ospf_hdr->area_id;
- log_debug("recv_packet: invalid area ID %s, interface %s",
- inet_ntoa(addr), iface->name);
- return (-1);
+ if (iface->type != IF_TYPE_VIRTUALLINK) {
+ if (ospf_hdr->area_id != iface->area->id.s_addr) {
+ addr.s_addr = ospf_hdr->area_id;
+ log_debug("recv_packet: invalid area ID %s, "
+ "interface %s", inet_ntoa(addr), iface->name);
+ return (-1);
+ }
+ } else {
+ if (ospf_hdr->area_id != 0) {
+ log_debug("recv_packet: invalid area ID %s, "
+ "interface %s",iface->name);
+ return (-1);
+ }
}
if (iface->type == IF_TYPE_BROADCAST || iface->type == IF_TYPE_NBMA) {
@@ -280,10 +288,20 @@ find_iface(struct ospfd_conf *xconf, struct in_addr src)
if (iface->fd > 0 && (iface->addr.s_addr &
iface->mask.s_addr) == (src.s_addr &
- iface->mask.s_addr) && !iface->passive)
+ iface->mask.s_addr) && !iface->passive &&
+ iface->type != IF_TYPE_VIRTUALLINK) {
return (iface);
+ }
}
}
+ LIST_FOREACH(area, &xconf->area_list, entry)
+ LIST_FOREACH(iface, &area->iface_list, entry)
+ if ((iface->type == IF_TYPE_VIRTUALLINK) &&
+ (src.s_addr == iface->dst.s_addr)) {
+ return (iface);
+ }
+
+
return (NULL);
}