diff --git a/eigrpd/eigrp_query.c b/eigrpd/eigrp_query.c index 3bca444ab7..00f9ee1267 100644 --- a/eigrpd/eigrp_query.c +++ b/eigrpd/eigrp_query.c @@ -91,8 +91,10 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, { struct eigrp_neighbor *nbr; struct TLV_IPv4_Internal_type *tlv; + struct prefix_ipv4 dest_addr; u_int16_t type; + u_int16_t length; /* increment statistics. */ ei->query_in++; @@ -107,9 +109,8 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, while (s->endp > s->getp) { type = stream_getw(s); - if (type == EIGRP_TLV_IPv4_INT) { - struct prefix_ipv4 dest_addr; - + switch (type) { + case EIGRP_TLV_IPv4_INT: stream_set_getp(s, s->getp - sizeof(u_int16_t)); tlv = eigrp_read_ipv4_tlv(s); @@ -142,6 +143,18 @@ void eigrp_query_receive(struct eigrp *eigrp, struct ip *iph, eigrp_fsm_event(msg, event); } eigrp_IPv4_InternalTLV_free(tlv); + break; + + case EIGRP_TLV_IPv4_EXT: + /* DVS: processing of external routes needs packet and fsm work. + * for now, lets just not creash the box + */ + default: + length = stream_getw(s); + // -2 for type, -2 for len + for (length-=4; length ; length--) { + (void)stream_getc(s); + } } } eigrp_hello_send_ack(nbr); diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index 7a7b1dd5d6..d0c6520c4e 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -169,9 +169,11 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, struct eigrp_neighbor_entry *ne; u_int32_t flags; u_int16_t type; + u_int16_t length; u_char same; struct access_list *alist; struct prefix_list *plist; + struct prefix_ipv4 dest_addr; struct eigrp *e; u_char graceful_restart; u_char graceful_restart_final; @@ -287,9 +289,8 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, /*If there is topology information*/ while (s->endp > s->getp) { type = stream_getw(s); - if (type == EIGRP_TLV_IPv4_INT) { - struct prefix_ipv4 dest_addr; - + switch (type) { + case EIGRP_TLV_IPv4_INT: stream_set_getp(s, s->getp - sizeof(u_int16_t)); tlv = eigrp_read_ipv4_tlv(s); @@ -436,6 +437,18 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, pe); } eigrp_IPv4_InternalTLV_free(tlv); + break; + + case EIGRP_TLV_IPv4_EXT: + /* DVS: processing of external routes needs packet and fsm work. + * for now, lets just not creash the box + */ + default: + length = stream_getw(s); + // -2 for type, -2 for len + for (length-=4; length ; length--) { + (void)stream_getc(s); + } } }