summaryrefslogtreecommitdiff
path: root/proto
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2020-08-12 19:42:44 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2020-08-12 19:42:44 +0200
commitdc8d9dec4a3484f358d2117328fe860e8e7b16bb (patch)
tree1f10cfd0ddbae41e21d6027d4337cdf7ffc9bf6e /proto
parentc0e1f534c95f5f395fda62b01ea1c245323e3aed (diff)
OSPF: Skip out-of-state packets earlier
Sometimes multicast OSPF packet is received when neighbor adjacency is not established. Such packet should be ignored earlier in packet processing as otherwise it causes strange error messages when OSPFv3 authentication is enabled.
Diffstat (limited to 'proto')
-rw-r--r--proto/ospf/packet.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c
index cbc8f2ec..85cbbdf0 100644
--- a/proto/ospf/packet.c
+++ b/proto/ospf/packet.c
@@ -14,6 +14,14 @@
#include "lib/mac.h"
#include "lib/socket.h"
+const char * const ospf_pkt_names[] = {
+ [HELLO_P] = "HELLO",
+ [DBDES_P] = "DBDES",
+ [LSREQ_P] = "LSREQ",
+ [LSUPD_P] = "LSUPD",
+ [LSACK_P] = "LSACK",
+};
+
void
ospf_pkt_fill_hdr(struct ospf_iface *ifa, void *buf, u8 h_type)
{
@@ -550,6 +558,10 @@ found:
if (rid == 0)
DROP1("zero router ID");
+ /* Check packet type here, ospf_pkt_checkauth3() expects valid values */
+ if (pkt->type < HELLO_P || pkt->type > LSACK_P)
+ DROP("invalid packet type", pkt->type);
+
/* In OSPFv2, neighbors are identified by either IP or Router ID, based on network type */
uint t = ifa->type;
struct ospf_neighbor *n;
@@ -565,11 +577,15 @@ found:
return 1;
}
- /* Check packet type here, ospf_pkt_checkauth3() expects valid values */
- if (pkt->type < HELLO_P || pkt->type > LSACK_P)
- DROP("invalid packet type", pkt->type);
+ /* We need to ignore out-of-state packets before ospf_pkt_checkauth3() */
+ if ((pkt->type > DBDES_P) && (n->state < NEIGHBOR_EXCHANGE))
+ {
+ OSPF_TRACE(D_PACKETS, "%s packet ignored - lesser state than Exchange",
+ ospf_pkt_names[pkt->type]);
+ return 1;
+ }
- /* ospf_pkt_checkauth() has its own error logging */
+ /* ospf_pkt_checkauthX() has its own error logging */
if ((ospf_is_v2(p) ?
!ospf_pkt_checkauth2(n, ifa, pkt, len) :
!ospf_pkt_checkauth3(n, ifa, pkt, len, sk->faddr)))