struct proto_ospf *po = ifa->oa->po;
// struct proto *p = &po->proto;
- int src_local = ipa_in_net(sk->faddr, ifa->addr->prefix, ifa->addr->pxlen);
- int dst_local = ipa_equal(sk->laddr, ifa->addr->ip);
- int dst_mcast = ipa_equal(sk->laddr, AllSPFRouters) || ipa_equal(sk->laddr, AllDRouters);
+ int src_local, dst_local UNUSED, dst_mcast;
+ src_local = ipa_in_net(sk->faddr, ifa->addr->prefix, ifa->addr->pxlen);
+ dst_local = ipa_equal(sk->laddr, ifa->addr->ip);
+ dst_mcast = ipa_equal(sk->laddr, AllSPFRouters) || ipa_equal(sk->laddr, AllDRouters);
#ifdef OSPFv2
/* First, we eliminate packets with strange address combinations.
.nhs = en->nhs
};
+ if (pxlen < 0 || pxlen > MAX_PREFIX_LENGTH)
+ {
+ log(L_WARN "%s: Invalid prefix in LSA (Type: %04x, Id: %R, Rt: %R)",
+ oa->po->proto.name, en->lsa.type, en->lsa.id, en->lsa.rt);
+ return;
+ }
+
if (en == oa->rt)
{
/*
{
// struct proto *p = &oa->po->proto;
struct proto_ospf *po = oa->po;
- int i;
+ ip_addr prefix UNUSED;
+ int pxlen UNUSED, i;
struct ospf_lsa_rt *rt = en->lsa_body;
struct ospf_lsa_rt_link *rr = (struct ospf_lsa_rt_link *) (rt + 1);
* the same result by handing them here because add_network()
* will keep the best (not the first) found route.
*/
- add_network(oa, ipa_from_u32(rtl->id),
- ipa_mklen(ipa_from_u32(rtl->data)),
- act->dist + rtl->metric, act, i);
+ prefix = ipa_from_u32(rtl->id & rtl->data);
+ pxlen = ipa_mklen(ipa_from_u32(rtl->data));
+ add_network(oa, prefix, pxlen, act->dist + rtl->metric, act, i);
break;
#endif
struct ospf_lsa_rt *rt;
struct ospf_lsa_net *ln;
struct top_hash_entry *act, *tmp;
+ ip_addr prefix UNUSED;
+ int pxlen UNUSED;
u32 i, *rts;
node *n;
ln = act->lsa_body;
#ifdef OSPFv2
- add_network(oa, ipa_and(ipa_from_u32(act->lsa.id), ln->netmask),
- ipa_mklen(ln->netmask), act->dist, act, -1);
+ prefix = ipa_and(ipa_from_u32(act->lsa.id), ln->netmask);
+ pxlen = ipa_mklen(ln->netmask);
+ add_network(oa, prefix, pxlen, act->dist, act, -1);
#endif
rts = (u32 *) (ln + 1);
{
#ifdef OSPFv2
struct ospf_lsa_sum *ls = en->lsa_body;
- pxlen = ipa_mklen(ls->netmask);
ip = ipa_and(ipa_from_u32(en->lsa.id), ls->netmask);
+ pxlen = ipa_mklen(ls->netmask);
#else /* OSPFv3 */
u8 pxopts;
u16 rest;
continue;
#endif
+ if (pxlen < 0 || pxlen > MAX_PREFIX_LENGTH)
+ {
+ log(L_WARN "%s: Invalid prefix in LSA (Type: %04x, Id: %R, Rt: %R)",
+ p->name, en->lsa.type, en->lsa.id, en->lsa.rt);
+ continue;
+ }
+
metric = ls->metric & METRIC_MASK;
options = 0;
type = ORT_NET;
static void
ospf_rt_sum_tr(struct ospf_area *oa)
{
- // struct proto *p = &oa->po->proto;
+ struct proto *p = &oa->po->proto;
struct proto_ospf *po = oa->po;
struct ospf_area *bb = po->backbone;
ip_addr abrip;
int pxlen;
#ifdef OSPFv2
struct ospf_lsa_sum *ls = en->lsa_body;
- pxlen = ipa_mklen(ls->netmask);
ip = ipa_and(ipa_from_u32(en->lsa.id), ls->netmask);
+ pxlen = ipa_mklen(ls->netmask);
#else /* OSPFv3 */
u8 pxopts;
u16 rest;
continue;
#endif
+ if (pxlen < 0 || pxlen > MAX_PREFIX_LENGTH)
+ {
+ log(L_WARN "%s: Invalid prefix in LSA (Type: %04x, Id: %R, Rt: %R)",
+ p->name, en->lsa.type, en->lsa.id, en->lsa.rt);
+ continue;
+ }
+
metric = ls->metric & METRIC_MASK;
re = fib_find(&po->rtf, &ip, pxlen);
}
rt_tag = 0;
#endif
- if (pxlen < 0)
+ if (pxlen < 0 || pxlen > MAX_PREFIX_LENGTH)
{
- log(L_WARN "%s: Invalid mask in LSA (Type: %04x, Id: %R, Rt: %R)",
+ log(L_WARN "%s: Invalid prefix in LSA (Type: %04x, Id: %R, Rt: %R)",
p->name, en->lsa.type, en->lsa.id, en->lsa.rt);
continue;
}
e->net = ne;
e->pref = p->preference;
-
-
DBG("Mod rte type %d - %I/%d via %I on iface %s, met %d\n",
a0.source, nf->fn.prefix, nf->fn.pxlen, a0.gw, a0.iface ? a0.iface->name : "(none)", nf->n.metric1);
rte_update(p->table, ne, p, p, e);