summaryrefslogtreecommitdiffstats
path: root/proto/ospf/ospf.h
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-10-29 23:57:42 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2009-10-29 23:57:42 +0100
commita6bc04d59130c49a1dbfadffa4285b11e2ff4939 (patch)
treeb5f453dc5fbe20204883149e1bc153905f356709 /proto/ospf/ospf.h
parent9d4d38d1a5d67f5485d2b2fa439c879583dfdcb0 (diff)
downloadbird-a6bc04d59130c49a1dbfadffa4285b11e2ff4939.tar
bird-a6bc04d59130c49a1dbfadffa4285b11e2ff4939.zip
Implements better checks on incoming packets and LSAs in OSPF.
Diffstat (limited to 'proto/ospf/ospf.h')
-rw-r--r--proto/ospf/ospf.h28
1 files changed, 28 insertions, 0 deletions
diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h
index d826c73..3e33e45 100644
--- a/proto/ospf/ospf.h
+++ b/proto/ospf/ospf.h
@@ -438,6 +438,8 @@ struct ospf_lsa_ext
u32 tag;
};
+#define LSA_SUM_TOS 0xFF000000
+#define LSA_EXT_TOS 0x7F000000
#define LSA_EXT_EBIT 0x80000000
/* Endianity swap for lsa->type */
@@ -545,6 +547,9 @@ lsa_net_count(struct ospf_lsa_header *lsa)
#ifdef OSPFv3
+#define IPV6_PREFIX_SPACE(x) ((((x) + 63) / 32) * 4)
+#define IPV6_PREFIX_WORDS(x) (((x) + 63) / 32)
+
static inline u32 *
lsa_get_ipv6_prefix(u32 *buf, ip_addr *addr, int *pxlen, u8 *pxopts, u16 *rest)
{
@@ -575,6 +580,29 @@ lsa_get_ipv6_addr(u32 *buf, ip_addr *addr)
return buf + 4;
}
+static inline u32 *
+put_ipv6_prefix(u32 *buf, ip_addr addr, u8 pxlen, u8 pxopts, u16 lh)
+{
+ *buf++ = ((pxlen << 24) | (pxopts << 16) | lh);
+
+ if (pxlen > 0)
+ *buf++ = _I0(addr);
+ if (pxlen > 32)
+ *buf++ = _I1(addr);
+ if (pxlen > 64)
+ *buf++ = _I2(addr);
+ if (pxlen > 96)
+ *buf++ = _I3(addr);
+ return buf;
+}
+
+static inline u32 *
+put_ipv6_addr(u32 *buf, ip_addr addr)
+{
+ *(ip_addr *) buf = addr;
+ return buf + 4;
+}
+
#endif