diff --git a/eigrpd/eigrp_dump.c b/eigrpd/eigrp_dump.c index 0cb1ee5876..74515c98cb 100644 --- a/eigrpd/eigrp_dump.c +++ b/eigrpd/eigrp_dump.c @@ -158,7 +158,7 @@ const char *eigrp_topology_ip_string(struct eigrp_prefix_entry *tn) static char buf[EIGRP_IF_STRING_MAXLEN] = ""; u_int32_t ifaddr; - ifaddr = ntohl(tn->destination_ipv4->prefix.s_addr); + ifaddr = ntohl(tn->destination->u.prefix4.s_addr); snprintf(buf, EIGRP_IF_STRING_MAXLEN, "%u.%u.%u.%u", (ifaddr >> 24) & 0xff, (ifaddr >> 16) & 0xff, (ifaddr >> 8) & 0xff, ifaddr & 0xff); @@ -289,11 +289,12 @@ void show_ip_eigrp_topology_header(struct vty *vty, struct eigrp *eigrp) void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn) { struct list *successors = eigrp_topology_get_successor(tn); + char buffer[PREFIX_STRLEN]; vty_out(vty, "%-3c", (tn->state > 0) ? 'A' : 'P'); - vty_out(vty, "%s/%u, ", inet_ntoa(tn->destination_ipv4->prefix), - tn->destination_ipv4->prefixlen); + vty_out(vty, "%s, ", + prefix2str(tn->destination, buffer, PREFIX_STRLEN)); vty_out(vty, "%u successors, ", successors->count); vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance, tn->serno); diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c index 207001778d..bc9172dee6 100644 --- a/eigrpd/eigrp_interface.c +++ b/eigrpd/eigrp_interface.c @@ -289,21 +289,20 @@ int eigrp_if_up(struct eigrp_interface *ei) ne->adv_router = eigrp->neighbor_self; ne->flags = EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG; - struct prefix_ipv4 dest_addr; + struct prefix dest_addr; dest_addr.family = AF_INET; - dest_addr.prefix = ei->connected->address->u.prefix4; + dest_addr.u.prefix4 = ei->connected->address->u.prefix4; dest_addr.prefixlen = ei->connected->address->prefixlen; - apply_mask_ipv4(&dest_addr); + apply_mask(&dest_addr); pe = eigrp_topology_table_lookup_ipv4(eigrp->topology_table, - &dest_addr); + (struct prefix_ipv4 *)&dest_addr); if (pe == NULL) { pe = eigrp_prefix_entry_new(); pe->serno = eigrp->serno; - pe->destination_ipv4 = prefix_ipv4_new(); - prefix_copy((struct prefix *)pe->destination_ipv4, - (struct prefix *)&dest_addr); + pe->destination = (struct prefix *)prefix_ipv4_new(); + prefix_copy(pe->destination, &dest_addr); pe->af = AF_INET; pe->nt = EIGRP_TOPOLOGY_TYPE_CONNECTED; diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c index d4e8264f20..68e7cdcbbe 100644 --- a/eigrpd/eigrp_packet.c +++ b/eigrpd/eigrp_packet.c @@ -1167,21 +1167,21 @@ u_int16_t eigrp_add_internalTLV_to_stream(struct stream *s, u_int16_t length; stream_putw(s, EIGRP_TLV_IPv4_INT); - if (pe->destination_ipv4->prefixlen <= 8) { + if (pe->destination->prefixlen <= 8) { stream_putw(s, 0x001A); length = 0x001A; } - if ((pe->destination_ipv4->prefixlen > 8) - && (pe->destination_ipv4->prefixlen <= 16)) { + if ((pe->destination->prefixlen > 8) + && (pe->destination->prefixlen <= 16)) { stream_putw(s, 0x001B); length = 0x001B; } - if ((pe->destination_ipv4->prefixlen > 16) - && (pe->destination_ipv4->prefixlen <= 24)) { + if ((pe->destination->prefixlen > 16) + && (pe->destination->prefixlen <= 24)) { stream_putw(s, 0x001C); length = 0x001C; } - if (pe->destination_ipv4->prefixlen > 24) { + if (pe->destination->prefixlen > 24) { stream_putw(s, 0x001D); length = 0x001D; } @@ -1200,34 +1200,18 @@ u_int16_t eigrp_add_internalTLV_to_stream(struct stream *s, stream_putc(s, pe->reported_metric.tag); stream_putc(s, pe->reported_metric.flags); - stream_putc(s, pe->destination_ipv4->prefixlen); + stream_putc(s, pe->destination->prefixlen); - if (pe->destination_ipv4->prefixlen <= 8) { - stream_putc(s, pe->destination_ipv4->prefix.s_addr & 0xFF); - } - if ((pe->destination_ipv4->prefixlen > 8) - && (pe->destination_ipv4->prefixlen <= 16)) { - stream_putc(s, pe->destination_ipv4->prefix.s_addr & 0xFF); + stream_putc(s, pe->destination->u.prefix4.s_addr & 0xFF); + if (pe->destination->prefixlen > 8) stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 8) & 0xFF); - } - if ((pe->destination_ipv4->prefixlen > 16) - && (pe->destination_ipv4->prefixlen <= 24)) { - stream_putc(s, pe->destination_ipv4->prefix.s_addr & 0xFF); + (pe->destination->u.prefix4.s_addr >> 8) & 0xFF); + if (pe->destination->prefixlen > 16) stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 8) & 0xFF); + (pe->destination->u.prefix4.s_addr >> 16) & 0xFF); + if (pe->destination->prefixlen > 24) stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 16) & 0xFF); - } - if (pe->destination_ipv4->prefixlen > 24) { - stream_putc(s, pe->destination_ipv4->prefix.s_addr & 0xFF); - stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 8) & 0xFF); - stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 16) & 0xFF); - stream_putc(s, - (pe->destination_ipv4->prefix.s_addr >> 24) & 0xFF); - } + (pe->destination->u.prefix4.s_addr >> 24) & 0xFF); return length; } diff --git a/eigrpd/eigrp_reply.c b/eigrpd/eigrp_reply.c index 304a1a5242..cc70d1cfee 100644 --- a/eigrpd/eigrp_reply.c +++ b/eigrpd/eigrp_reply.c @@ -87,19 +87,19 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe) /* Check if any list fits */ if ((alist - && access_list_apply(alist, (struct prefix *)pe2->destination_ipv4) + && access_list_apply(alist, pe2->destination) == FILTER_DENY) || (plist && prefix_list_apply(plist, - (struct prefix *)pe2->destination_ipv4) + pe2->destination) == PREFIX_DENY) || (alist_i && access_list_apply(alist_i, - (struct prefix *)pe2->destination_ipv4) + pe2->destination) == FILTER_DENY) || (plist_i && prefix_list_apply(plist_i, - (struct prefix *)pe2->destination_ipv4) + pe2->destination) == PREFIX_DENY)) { zlog_info("REPLY SEND: Setting Metric to max"); pe2->reported_metric.delay = EIGRP_MAX_METRIC; diff --git a/eigrpd/eigrp_structs.h b/eigrpd/eigrp_structs.h index 6bb0c5cc2b..b769774a03 100644 --- a/eigrpd/eigrp_structs.h +++ b/eigrpd/eigrp_structs.h @@ -469,10 +469,7 @@ struct eigrp_prefix_entry { u_char af; // address family u_char req_action; // required action - struct prefix_ipv4 - *destination_ipv4; // pointer to struct with ipv4 address - struct prefix_ipv6 - *destination_ipv6; // pointer to struct with ipv6 address + struct prefix *destination; // If network type is REMOTE_EXTERNAL, pointer will have reference to // its external TLV diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c index 3ba8c5b5fd..e2f47ced31 100644 --- a/eigrpd/eigrp_topology.c +++ b/eigrpd/eigrp_topology.c @@ -81,25 +81,18 @@ static int eigrp_prefix_entry_cmp(struct eigrp_prefix_entry *node1, { if (node1->af == AF_INET) { if (node2->af == AF_INET) { - if (node1->destination_ipv4->prefix.s_addr - < node2->destination_ipv4->prefix.s_addr) { - return -1; // if it belong above node2 - } else { - if (node1->destination_ipv4->prefix.s_addr - > node2->destination_ipv4->prefix.s_addr) { - return 1; // if it belongs under node2 - } else { - return 0; // same value... ERROR...in - // case of adding same prefix - // again - } - } - } else { + if (node1->destination->u.prefix4.s_addr + < node2->destination->u.prefix4.s_addr) + return -1; + if (node1->destination->u.prefix4.s_addr + > node2->destination->u.prefix4.s_addr) + return 1; + else + return 0; + } else return 1; - } - } else { // TODO check if the prefix dont exists - return 1; // add to end - } + } else + return 1; } /* @@ -125,8 +118,7 @@ struct eigrp_prefix_entry *eigrp_prefix_entry_new() new->rij = list_new(); new->entries->cmp = (int (*)(void *, void *))eigrp_neighbor_entry_cmp; new->distance = new->fdistance = new->rdistance = EIGRP_MAX_METRIC; - new->destination_ipv4 = NULL; - new->destination_ipv6 = NULL; + new->destination = NULL; return new; } @@ -137,9 +129,8 @@ struct eigrp_prefix_entry *eigrp_prefix_entry_new() static int eigrp_neighbor_entry_cmp(struct eigrp_neighbor_entry *entry1, struct eigrp_neighbor_entry *entry2) { - if (entry1->distance - < entry2->distance) // parameter used in list_add_sort () - return -1; // actually set to sort by distance + if (entry1->distance < entry2->distance) + return -1; if (entry1->distance > entry2->distance) return 1; @@ -205,7 +196,8 @@ void eigrp_neighbor_entry_add(struct eigrp_prefix_entry *node, listnode_add_sort(node->entries, entry); entry->prefix = node; - eigrp_zebra_route_add(node->destination_ipv4, l); + eigrp_zebra_route_add((struct prefix_ipv4 *) + node->destination, l); } list_delete(l); @@ -230,7 +222,8 @@ void eigrp_prefix_entry_delete(struct list *topology, list_free(node->entries); list_free(node->rij); listnode_delete(topology, node); - eigrp_zebra_route_delete(node->destination_ipv4); + eigrp_zebra_route_delete((struct prefix_ipv4 *) + node->destination); XFREE(MTYPE_EIGRP_PREFIX_ENTRY, node); } } @@ -243,7 +236,8 @@ void eigrp_neighbor_entry_delete(struct eigrp_prefix_entry *node, { if (listnode_lookup(node->entries, entry) != NULL) { listnode_delete(node->entries, entry); - eigrp_zebra_route_delete(node->destination_ipv4); + eigrp_zebra_route_delete((struct prefix_ipv4 *) + node->destination); XFREE(MTYPE_EIGRP_NEIGHBOR_ENTRY, entry); } } @@ -275,11 +269,8 @@ eigrp_topology_table_lookup_ipv4(struct list *topology_table, struct eigrp_prefix_entry *data; struct listnode *node; for (ALL_LIST_ELEMENTS_RO(topology_table, node, data)) { - if ((data->af == AF_INET) - && (data->destination_ipv4->prefix.s_addr - == address->prefix.s_addr) - && (data->destination_ipv4->prefixlen - == address->prefixlen)) + if (prefix_same(data->destination, + (struct prefix *)address)) return data; } @@ -476,13 +467,16 @@ void eigrp_update_routing_table(struct eigrp_prefix_entry *prefix) struct eigrp_neighbor_entry *entry; if (successors) { - eigrp_zebra_route_add(prefix->destination_ipv4, successors); + eigrp_zebra_route_add((struct prefix_ipv4 *) + prefix->destination, + successors); for (ALL_LIST_ELEMENTS_RO(successors, node, entry)) entry->flags |= EIGRP_NEIGHBOR_ENTRY_INTABLE_FLAG; list_delete(successors); } else { - eigrp_zebra_route_delete(prefix->destination_ipv4); + eigrp_zebra_route_delete((struct prefix_ipv4 *) + prefix->destination); for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry)) entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_INTABLE_FLAG; } diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c index e4b7883741..c59a010087 100644 --- a/eigrpd/eigrp_update.c +++ b/eigrpd/eigrp_update.c @@ -116,9 +116,10 @@ static void eigrp_update_receive_GR_ask(struct eigrp *eigrp, /* iterate over all prefixes which weren't advertised by neighbor */ for (ALL_LIST_ELEMENTS_RO(nbr_prefixes, node1, prefix)) { - zlog_debug("GR receive: Neighbor not advertised %s/%d", - inet_ntoa(prefix->destination_ipv4->prefix), - prefix->destination_ipv4->prefixlen); + char buffer[PREFIX_STRLEN]; + zlog_debug("GR receive: Neighbor not advertised %s", + prefix2str(prefix->destination, + buffer, PREFIX_STRLEN)); fsm_msg.metrics = prefix->reported_metric; /* set delay to MAX */ @@ -311,9 +312,8 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph, /*Here comes topology information save*/ pe = eigrp_prefix_entry_new(); pe->serno = eigrp->serno; - pe->destination_ipv4 = prefix_ipv4_new(); - prefix_copy( - (struct prefix *)pe->destination_ipv4, + pe->destination = (struct prefix *)prefix_ipv4_new(); + prefix_copy(pe->destination, (struct prefix *)&dest_addr); pe->af = AF_INET; pe->state = EIGRP_FSM_STATE_PASSIVE; @@ -571,7 +571,7 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr) struct access_list *alist_i; struct prefix_list *plist_i; struct eigrp *e; - struct prefix_ipv4 *dest_addr; + struct prefix *dest_addr; u_int32_t seq_no = nbr->ei->eigrp->sequence_number; ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr); @@ -609,7 +609,7 @@ void eigrp_update_send_EOT(struct eigrp_neighbor *nbr) } } /* Get destination address from prefix */ - dest_addr = pe->destination_ipv4; + dest_addr = pe->destination; /* * Filtering @@ -656,7 +656,7 @@ void eigrp_update_send(struct eigrp_interface *ei) struct access_list *alist_i; struct prefix_list *plist_i; struct eigrp *e; - struct prefix_ipv4 *dest_addr; + struct prefix *dest_addr; u_int32_t seq_no = ei->eigrp->sequence_number; if (ei->nbrs->count == 0) @@ -714,7 +714,7 @@ void eigrp_update_send(struct eigrp_interface *ei) has_tlv = 0; } /* Get destination address from prefix */ - dest_addr = pe->destination_ipv4; + dest_addr = pe->destination; /* * Filtering @@ -824,7 +824,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) u_int16_t length = EIGRP_HEADER_LEN; struct listnode *node, *nnode; struct eigrp_prefix_entry *pe; - struct prefix_ipv4 *dest_addr; + struct prefix *dest_addr; struct eigrp *e; struct access_list *alist, *alist_i; struct prefix_list *plist, *plist_i; @@ -887,7 +887,7 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) /* * Filtering */ - dest_addr = pe->destination_ipv4; + dest_addr = pe->destination; /* get list from eigrp process */ e = eigrp_lookup(); /* Get access-lists and prefix-lists from process and interface @@ -899,22 +899,20 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) /* Check if any list fits */ if ((alist - && access_list_apply(alist, (struct prefix *)dest_addr) + && access_list_apply(alist, dest_addr) == FILTER_DENY) || (plist - && prefix_list_apply(plist, (struct prefix *)dest_addr) + && prefix_list_apply(plist, dest_addr) == PREFIX_DENY) || (alist_i - && access_list_apply(alist_i, - (struct prefix *)dest_addr) + && access_list_apply(alist_i, dest_addr) == FILTER_DENY) || (plist_i - && prefix_list_apply(plist_i, - (struct prefix *)dest_addr) + && prefix_list_apply(plist_i, dest_addr) == PREFIX_DENY)) { /* do not send filtered route */ zlog_info("Filtered prefix %s won't be sent out.", - inet_ntoa(dest_addr->prefix)); + inet_ntoa(dest_addr->u.prefix4)); } else { /* sending route which wasn't filtered */ length += eigrp_add_internalTLV_to_stream(ep->s, pe); @@ -928,22 +926,20 @@ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) /* Check if any list fits */ if ((alist - && access_list_apply(alist, (struct prefix *)dest_addr) + && access_list_apply(alist, dest_addr) == FILTER_DENY) || (plist - && prefix_list_apply(plist, (struct prefix *)dest_addr) + && prefix_list_apply(plist, dest_addr) == PREFIX_DENY) || (alist_i - && access_list_apply(alist_i, - (struct prefix *)dest_addr) + && access_list_apply(alist_i, dest_addr) == FILTER_DENY) || (plist_i - && prefix_list_apply(plist_i, - (struct prefix *)dest_addr) + && prefix_list_apply(plist_i, dest_addr) == PREFIX_DENY)) { /* do not send filtered route */ zlog_info("Filtered prefix %s will be removed.", - inet_ntoa(dest_addr->prefix)); + inet_ntoa(dest_addr->u.prefix4)); /* prepare message for FSM */ struct eigrp_fsm_action_message fsm_msg;