]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #1051 from donaldsharp/plists
authorDavid Lamparter <equinox@diac24.net>
Tue, 5 Sep 2017 02:41:17 +0000 (04:41 +0200)
committerGitHub <noreply@github.com>
Tue, 5 Sep 2017 02:41:17 +0000 (04:41 +0200)
Refactor Access and Prefix Lists application

1  2 
eigrpd/eigrp_dump.c
eigrpd/eigrp_interface.c
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c
eigrpd/eigrp_vty.c

diff --combined eigrpd/eigrp_dump.c
index 98c72668fc6aab2fd4708859508847dee06b038d,57aeb2a4d1d159f52f810fcaf0bf2604eec3c2d5..091b271129d989d3d05eaec3311d634b66a57a3c
@@@ -295,17 -295,15 +295,17 @@@ void show_ip_eigrp_prefix_entry(struct 
  
        vty_out(vty, "%s, ",
                prefix2str(tn->destination, buffer, PREFIX_STRLEN));
 -      vty_out(vty, "%u successors, ", successors->count);
 +      vty_out(vty, "%u successors, ",
 +              (successors) ? successors->count : 0);
        vty_out(vty, "FD is %u, serno: %" PRIu64 " \n", tn->fdistance,
                tn->serno);
  
 -      list_delete(successors);
 +      if (successors)
 +              list_delete(successors);
  }
  
- void show_ip_eigrp_neighbor_entry(struct vty *vty, struct eigrp *eigrp,
-                                 struct eigrp_neighbor_entry *te, int *first)
+ void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
+                                 struct eigrp_nexthop_entry *te, int *first)
  {
        if (te->reported_distance == EIGRP_MAX_METRIC)
                return;
diff --combined eigrpd/eigrp_interface.c
index ee3e2217b38beb7bc6316274b3e6c6b2082f5ac5,f72e23ecd7af10aacdcaeaa34d982c84491d5c52..f2512eadade61c18c7656dd32c8aebb7c7848c6a
@@@ -245,18 -245,19 +245,18 @@@ struct eigrp_if_params *eigrp_lookup_if
  int eigrp_if_up(struct eigrp_interface *ei)
  {
        struct eigrp_prefix_entry *pe;
-       struct eigrp_neighbor_entry *ne;
+       struct eigrp_nexthop_entry *ne;
        struct eigrp_metrics metric;
        struct eigrp_interface *ei2;
        struct listnode *node, *nnode;
 -      struct eigrp *eigrp = eigrp_lookup();
 +      struct eigrp *eigrp;
  
        if (ei == NULL)
                return 0;
  
 -      if (eigrp != NULL)
 -              eigrp_adjust_sndbuflen(eigrp, ei->ifp->mtu);
 -      else
 -              zlog_warn("%s: eigrp_lookup () returned NULL", __func__);
 +      eigrp = ei->eigrp;
 +      eigrp_adjust_sndbuflen(eigrp, ei->ifp->mtu);
 +
        eigrp_if_stream_set(ei);
  
        /* Set multicast memberships appropriately for new state. */
  
        /*Add connected entry to topology table*/
  
-       ne = eigrp_neighbor_entry_new();
+       ne = eigrp_nexthop_entry_new();
        ne->ei = ei;
        ne->reported_metric = metric;
        ne->total_metric = metric;
        ne->distance = eigrp_calculate_metrics(eigrp, metric);
        ne->reported_distance = 0;
        ne->adv_router = eigrp->neighbor_self;
-       ne->flags = EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG;
+       ne->flags = EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
  
        struct prefix dest_addr;
  
                pe->nt = EIGRP_TOPOLOGY_TYPE_CONNECTED;
  
                ne->prefix = pe;
 +              pe->reported_metric = metric;
                pe->state = EIGRP_FSM_STATE_PASSIVE;
                pe->fdistance = eigrp_calculate_metrics(eigrp, metric);
                pe->req_action |= EIGRP_FSM_NEED_UPDATE;
                eigrp_prefix_entry_add(eigrp->topology_table, pe);
                listnode_add(eigrp->topology_changes_internalIPV4, pe);
  
-               eigrp_neighbor_entry_add(pe, ne);
+               eigrp_nexthop_entry_add(pe, ne);
  
                for (ALL_LIST_ELEMENTS(eigrp->eiflist, node, nnode, ei2)) {
                        eigrp_update_send(ei2);
                struct eigrp_fsm_action_message msg;
  
                ne->prefix = pe;
-               eigrp_neighbor_entry_add(pe, ne);
+               eigrp_nexthop_entry_add(pe, ne);
  
                msg.packet_type = EIGRP_OPC_UPDATE;
                msg.eigrp = eigrp;
diff --combined eigrpd/eigrp_topology.c
index 8390bfc66ee606e4b7f11083f46dc958f923bcb2,2545f4d63f165b1cb3da7d1576e5da3cf75a8a60..f1bc83af63bc16aeb31cca92b91390feb8c33e1c
@@@ -54,8 -54,8 +54,8 @@@
  static int eigrp_prefix_entry_cmp(struct eigrp_prefix_entry *,
                                  struct eigrp_prefix_entry *);
  static void eigrp_prefix_entry_del(struct eigrp_prefix_entry *);
- static int eigrp_neighbor_entry_cmp(struct eigrp_neighbor_entry *,
-                                   struct eigrp_neighbor_entry *);
+ static int eigrp_nexthop_entry_cmp(struct eigrp_nexthop_entry *,
+                                   struct eigrp_nexthop_entry *);
  
  /*
   * Returns linkedlist used as topology table
@@@ -116,7 -116,7 +116,7 @@@ struct eigrp_prefix_entry *eigrp_prefix
                      sizeof(struct eigrp_prefix_entry));
        new->entries = list_new();
        new->rij = list_new();
-       new->entries->cmp = (int (*)(void *, void *))eigrp_neighbor_entry_cmp;
+       new->entries->cmp = (int (*)(void *, void *))eigrp_nexthop_entry_cmp;
        new->distance = new->fdistance = new->rdistance = EIGRP_MAX_METRIC;
        new->destination = NULL;
  
  /*
   * Topology entry comparison
   */
- static int eigrp_neighbor_entry_cmp(struct eigrp_neighbor_entry *entry1,
-                                   struct eigrp_neighbor_entry *entry2)
+ static int eigrp_nexthop_entry_cmp(struct eigrp_nexthop_entry *entry1,
+                                   struct eigrp_nexthop_entry *entry2)
  {
        if (entry1->distance < entry2->distance)
                return -1;
   * Returns new topology entry
   */
  
- struct eigrp_neighbor_entry *eigrp_neighbor_entry_new()
+ struct eigrp_nexthop_entry *eigrp_nexthop_entry_new()
  {
-       struct eigrp_neighbor_entry *new;
+       struct eigrp_nexthop_entry *new;
  
-       new = XCALLOC(MTYPE_EIGRP_NEIGHBOR_ENTRY,
-                     sizeof(struct eigrp_neighbor_entry));
+       new = XCALLOC(MTYPE_EIGRP_NEXTHOP_ENTRY,
+                     sizeof(struct eigrp_nexthop_entry));
        new->reported_distance = EIGRP_MAX_METRIC;
        new->distance = EIGRP_MAX_METRIC;
  
@@@ -185,8 -185,8 +185,8 @@@ void eigrp_prefix_entry_add(struct lis
  /*
   * Adding topology entry to topology node
   */
- void eigrp_neighbor_entry_add(struct eigrp_prefix_entry *node,
-                             struct eigrp_neighbor_entry *entry)
+ void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *node,
+                             struct eigrp_nexthop_entry *entry)
  {
        struct list *l = list_new();
  
@@@ -229,13 -229,13 +229,13 @@@ void eigrp_prefix_entry_delete(struct l
  /*
   * Deleting topology entry from topology node
   */
- void eigrp_neighbor_entry_delete(struct eigrp_prefix_entry *node,
-                                struct eigrp_neighbor_entry *entry)
+ void eigrp_nexthop_entry_delete(struct eigrp_prefix_entry *node,
+                                struct eigrp_nexthop_entry *entry)
  {
        if (listnode_lookup(node->entries, entry) != NULL) {
                listnode_delete(node->entries, entry);
                eigrp_zebra_route_delete(node->destination);
-               XFREE(MTYPE_EIGRP_NEIGHBOR_ENTRY, entry);
+               XFREE(MTYPE_EIGRP_NEXTHOP_ENTRY, entry);
        }
  }
  
@@@ -283,11 -283,11 +283,11 @@@ eigrp_topology_table_lookup_ipv4(struc
  struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
  {
        struct list *successors = list_new();
-       struct eigrp_neighbor_entry *data;
+       struct eigrp_nexthop_entry *data;
        struct listnode *node1, *node2;
  
        for (ALL_LIST_ELEMENTS(table_node->entries, node1, node2, data)) {
-               if (data->flags & EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG) {
+               if (data->flags & EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG) {
                        listnode_add(successors, data);
                }
        }
@@@ -321,10 -321,10 +321,10 @@@ eigrp_topology_get_successor_max(struc
        return successors;
  }
  
- struct eigrp_neighbor_entry *
+ struct eigrp_nexthop_entry *
  eigrp_prefix_entry_lookup(struct list *entries, struct eigrp_neighbor *nbr)
  {
-       struct eigrp_neighbor_entry *data;
+       struct eigrp_nexthop_entry *data;
        struct listnode *node, *nnode;
        for (ALL_LIST_ELEMENTS(entries, node, nnode, data)) {
                if (data->adv_router == nbr) {
@@@ -341,7 -341,7 +341,7 @@@ struct list *eigrp_neighbor_prefixes_lo
  {
        struct listnode *node1, *node11, *node2, *node22;
        struct eigrp_prefix_entry *prefix;
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
  
        /* create new empty list for prefixes storage */
        struct list *prefixes = list_new();
@@@ -365,7 -365,7 +365,7 @@@ enum metric_change eigrp_topology_updat
  {
        struct eigrp *eigrp = msg->eigrp;
        struct eigrp_prefix_entry *prefix = msg->prefix;
-       struct eigrp_neighbor_entry *entry = msg->entry;
+       struct eigrp_nexthop_entry *entry = msg->entry;
        enum metric_change change = METRIC_SAME;
        u_int32_t new_reported_distance;
  
@@@ -439,24 -439,24 +439,24 @@@ void eigrp_topology_update_all_node_fla
  void eigrp_topology_update_node_flags(struct eigrp_prefix_entry *dest)
  {
        struct listnode *node;
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
        struct eigrp *eigrp = eigrp_lookup();
  
        for (ALL_LIST_ELEMENTS_RO(dest->entries, node, entry)) {
                if (((uint64_t)entry->distance
 -                   <= (uint64_t)(dest->distance * eigrp->variance))
 +                   <= (uint64_t)dest->distance * (uint64_t)eigrp->variance)
                    && entry->distance != EIGRP_MAX_METRIC) // is successor
                {
-                       entry->flags |= EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_FSUCCESSOR_FLAG;
+                       entry->flags |= EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
                } else if (entry->reported_distance
                           < dest->fdistance) // is feasible successor
                {
-                       entry->flags |= EIGRP_NEIGHBOR_ENTRY_FSUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG;
+                       entry->flags |= EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
                } else {
-                       entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_FSUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
                }
        }
  }
@@@ -467,19 -467,19 +467,19 @@@ void eigrp_update_routing_table(struct 
        struct list *successors =
                eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
        struct listnode *node;
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
  
        if (successors) {
                eigrp_zebra_route_add(prefix->destination,
                                      successors);
                for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
-                       entry->flags |= EIGRP_NEIGHBOR_ENTRY_INTABLE_FLAG;
+                       entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
  
                list_delete(successors);
        } else {
                eigrp_zebra_route_delete(prefix->destination);
                for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))
-                       entry->flags &= ~EIGRP_NEIGHBOR_ENTRY_INTABLE_FLAG;
+                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
        }
  }
  
@@@ -488,7 -488,7 +488,7 @@@ void eigrp_topology_neighbor_down(struc
  {
        struct listnode *node1, *node11, *node2, *node22;
        struct eigrp_prefix_entry *prefix;
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
  
        for (ALL_LIST_ELEMENTS(eigrp->topology_table, node1, node11, prefix)) {
                for (ALL_LIST_ELEMENTS(prefix->entries, node2, node22, entry)) {
@@@ -517,10 -517,10 +517,10 @@@ void eigrp_update_topology_table_prefix
  {
        struct listnode *node1, *node2;
  
-       struct eigrp_neighbor_entry *entry;
+       struct eigrp_nexthop_entry *entry;
        for (ALL_LIST_ELEMENTS(prefix->entries, node1, node2, entry)) {
                if (entry->distance == EIGRP_MAX_METRIC) {
-                       eigrp_neighbor_entry_delete(prefix, entry);
+                       eigrp_nexthop_entry_delete(prefix, entry);
                }
        }
        if (prefix->distance == EIGRP_MAX_METRIC
diff --combined eigrpd/eigrp_update.c
index 430068496b1f2bcc93e7ba3fbf443c0bd0fd9136,fad4093ef442c8df3082cfd5f64c79ccac1c4735..baa1ac5533bf559574f680733443cbbbb5410581
  #include "eigrpd/eigrp_network.h"
  #include "eigrpd/eigrp_memory.h"
  
+ bool eigrp_update_prefix_apply(struct eigrp *eigrp,
+                              struct eigrp_interface *ei,
+                              int in, struct prefix *prefix)
+ {
+       struct access_list *alist;
+       struct prefix_list *plist;
+       alist = eigrp->list[in];
+       if (alist && access_list_apply(alist, prefix) == FILTER_DENY)
+               return true;
+       plist = eigrp->prefix[in];
+       if (plist && prefix_list_apply(plist, prefix) == PREFIX_DENY)
+               return true;
+       alist = ei->list[in];
+       if (alist && access_list_apply(alist, prefix) == FILTER_DENY)
+               return true;
+       plist = ei->prefix[in];
+       if (plist && prefix_list_apply(plist, prefix) == PREFIX_DENY)
+               return true;
+       return false;
+ }
  /**
   * @fn remove_received_prefix_gr
   *
@@@ -125,7 -151,7 +151,7 @@@ static void eigrp_update_receive_GR_ask
                /* set delay to MAX */
                fsm_msg.metrics.delay = EIGRP_MAX_METRIC;
  
-               struct eigrp_neighbor_entry *entry =
+               struct eigrp_nexthop_entry *entry =
                        eigrp_prefix_entry_lookup(prefix->entries, nbr);
  
                fsm_msg.packet_type = EIGRP_OPC_UPDATE;
@@@ -150,15 -176,12 +176,12 @@@ void eigrp_update_receive(struct eigrp 
        struct eigrp_neighbor *nbr;
        struct TLV_IPv4_Internal_type *tlv;
        struct eigrp_prefix_entry *pe;
-       struct eigrp_neighbor_entry *ne;
+       struct eigrp_nexthop_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 dest_addr;
-       struct eigrp *e;
        u_char graceful_restart;
        u_char graceful_restart_final;
        struct list *nbr_prefixes = NULL;
                                                                  dest);
  
                                struct eigrp_fsm_action_message msg;
-                               struct eigrp_neighbor_entry *entry =
+                               struct eigrp_nexthop_entry *entry =
                                        eigrp_prefix_entry_lookup(dest->entries,
                                                                  nbr);
  
                                pe->state = EIGRP_FSM_STATE_PASSIVE;
                                pe->nt = EIGRP_TOPOLOGY_TYPE_REMOTE;
  
-                               ne = eigrp_neighbor_entry_new();
+                               ne = eigrp_nexthop_entry_new();
                                ne->ei = ei;
                                ne->adv_router = nbr;
                                ne->reported_metric = tlv->metric;
                                /*
                                 * Filtering
                                 */
-                               e = eigrp_lookup();
-                               /*
-                                * Check if there is any access-list on
-                                * interface (IN direction)
-                                *  and set distance to max
-                                */
-                               alist = ei->list[EIGRP_FILTER_IN];
-                               /* Check if access-list fits */
-                               if (alist
-                                   && access_list_apply(alist,
-                                                        &dest_addr)
-                                              == FILTER_DENY) {
-                                       /* If yes, set reported metric to Max */
-                                       ne->reported_metric.delay =
-                                               EIGRP_MAX_METRIC;
-                               } else {
-                                       ne->distance =
-                                               eigrp_calculate_total_metrics(
-                                                       eigrp, ne);
-                               }
-                               plist = e->prefix[EIGRP_FILTER_IN];
-                               /* Check if prefix-list fits */
-                               if (plist
-                                   && prefix_list_apply(plist,
-                                                        &dest_addr)
-                                              == PREFIX_DENY) {
-                                       /* If yes, set reported metric to Max */
-                                       ne->reported_metric.delay =
-                                               EIGRP_MAX_METRIC;
-                               }
-                               /*Get access-list from current interface */
-                               alist = ei->list[EIGRP_FILTER_IN];
-                               /* Check if access-list fits */
-                               if (alist
-                                   && access_list_apply(alist,
-                                                        &dest_addr)
-                                              == FILTER_DENY) {
-                                       /* If yes, set reported metric to Max */
-                                       ne->reported_metric.delay =
-                                               EIGRP_MAX_METRIC;
-                               }
-                               plist = ei->prefix[EIGRP_FILTER_IN];
-                               /* Check if prefix-list fits */
-                               if (plist
-                                   && prefix_list_apply(plist,
-                                                        &dest_addr)
-                                              == PREFIX_DENY) {
-                                       /* If yes, set reported metric to Max */
-                                       ne->reported_metric.delay =
-                                               EIGRP_MAX_METRIC;
-                               }
-                               /*
-                                * End of filtering
-                                */
+                               if (eigrp_update_prefix_apply(eigrp, ei,
+                                                             EIGRP_FILTER_IN,
+                                                             &dest_addr))
+                                       ne->reported_metric.delay = EIGRP_MAX_METRIC;
  
                                ne->distance = eigrp_calculate_total_metrics(
                                        eigrp, ne);
                                pe->fdistance = pe->distance = pe->rdistance =
                                        ne->distance;
                                ne->prefix = pe;
-                               ne->flags = EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG;
+                               ne->flags = EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
  
                                eigrp_prefix_entry_add(eigrp->topology_table,
                                                       pe);
-                               eigrp_neighbor_entry_add(pe, ne);
+                               eigrp_nexthop_entry_add(pe, ne);
                                pe->distance = pe->fdistance = pe->rdistance =
                                        ne->distance;
                                pe->reported_metric = ne->total_metric;
  
        eigrp_query_send_all(eigrp);
        eigrp_update_send_all(eigrp, ei);
 +
 +      if (nbr_prefixes)
 +              list_delete(nbr_prefixes);
  }
  
  /*send EIGRP Update packet*/
@@@ -562,86 -525,64 +528,64 @@@ void eigrp_update_send_EOT(struct eigrp
  {
        struct eigrp_packet *ep;
        u_int16_t length = EIGRP_HEADER_LEN;
-       struct eigrp_neighbor_entry *te;
+       struct eigrp_nexthop_entry *te;
        struct eigrp_prefix_entry *pe;
        struct listnode *node, *node2, *nnode, *nnode2;
-       struct access_list *alist;
-       struct prefix_list *plist;
-       struct access_list *alist_i;
-       struct prefix_list *plist_i;
-       struct eigrp *e;
+       struct eigrp_interface *ei = nbr->ei;
+       struct eigrp *eigrp = ei->eigrp;
        struct prefix *dest_addr;
-       u_int32_t seq_no = nbr->ei->eigrp->sequence_number;
+       u_int32_t seq_no = eigrp->sequence_number;
  
-       ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
+       ep = eigrp_packet_new(ei->ifp->mtu, nbr);
  
        /* Prepare EIGRP EOT UPDATE header */
-       eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei->eigrp,
+       eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp,
                                 ep->s, EIGRP_EOT_FLAG,
                                 seq_no, nbr->recv_sequence_number);
  
        // encode Authentication TLV, if needed
-       if((IF_DEF_PARAMS (nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) &&
-          (IF_DEF_PARAMS (nbr->ei->ifp)->auth_keychain != NULL)) {
-               length += eigrp_add_authTLV_MD5_to_stream(ep->s,nbr->ei);
+       if((IF_DEF_PARAMS (ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) &&
+          (IF_DEF_PARAMS (ei->ifp)->auth_keychain != NULL)) {
+               length += eigrp_add_authTLV_MD5_to_stream(ep->s,ei);
        }
  
-       for (ALL_LIST_ELEMENTS(nbr->ei->eigrp->topology_table, node, nnode, pe)) {
+       for (ALL_LIST_ELEMENTS(eigrp->topology_table, node, nnode, pe)) {
                for (ALL_LIST_ELEMENTS(pe->entries, node2, nnode2, te)) {
-                       if (eigrp_nbr_split_horizon_check(te, nbr->ei))
+                       if (eigrp_nbr_split_horizon_check(te, ei))
                                continue;
  
-                       if ((length + 0x001D) > (u_int16_t)nbr->ei->ifp->mtu) {
+                       if ((length + 0x001D) > (u_int16_t)ei->ifp->mtu) {
                                eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length);
                                seq_no++;
  
                                length = EIGRP_HEADER_LEN;
-                               ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
-                               eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei->eigrp,
+                               ep = eigrp_packet_new(ei->ifp->mtu, nbr);
+                               eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp,
                                                         ep->s, EIGRP_EOT_FLAG,
                                                         seq_no, nbr->recv_sequence_number);
  
-                               if((IF_DEF_PARAMS (nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) &&
-                                  (IF_DEF_PARAMS (nbr->ei->ifp)->auth_keychain != NULL))
+                               if((IF_DEF_PARAMS (ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5) &&
+                                  (IF_DEF_PARAMS (ei->ifp)->auth_keychain != NULL))
                                {
-                                       length += eigrp_add_authTLV_MD5_to_stream(ep->s,nbr->ei);
+                                       length += eigrp_add_authTLV_MD5_to_stream(ep->s,ei);
                                }
                        }
                        /* Get destination address from prefix */
                        dest_addr = pe->destination;
  
-                       /*
-                        * Filtering
-                        */
-                       //TODO: Work in progress
-                       /* get list from eigrp process */
-                       e = eigrp_lookup();
-                       /* Get access-lists and prefix-lists from process and interface */
-                       alist = e->list[EIGRP_FILTER_OUT];
-                       plist = e->prefix[EIGRP_FILTER_OUT];
-                       alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
-                       plist_i = nbr->ei->prefix[EIGRP_FILTER_OUT];
                        /* Check if any list fits */
-                       if ((alist
-                            && access_list_apply (alist,
-                                                  dest_addr) == FILTER_DENY)||
-                           (plist && prefix_list_apply (plist,
-                                                        dest_addr) == PREFIX_DENY)||
-                           (alist_i && access_list_apply (alist_i,
-                                                          dest_addr) == FILTER_DENY)||
-                           (plist_i && prefix_list_apply (plist_i,
-                                                          dest_addr) == PREFIX_DENY)) {
-                               //pe->reported_metric.delay = EIGRP_MAX_METRIC;
+                       if (eigrp_update_prefix_apply(eigrp, ei,
+                                                     EIGRP_FILTER_OUT,
+                                                     dest_addr))
                                continue;
-                       else {
+                       else {
                                length += eigrp_add_internalTLV_to_stream(ep->s, pe);
                        }
                }
        }
  
        eigrp_update_place_on_nbr_queue (nbr, ep, seq_no, length);
-       nbr->ei->eigrp->sequence_number = seq_no++;
+       eigrp->sequence_number = seq_no++;
  }
  
  void eigrp_update_send(struct eigrp_interface *ei)
        struct listnode *node, *nnode;
        struct eigrp_prefix_entry *pe;
        u_char has_tlv;
-       struct access_list *alist;
-       struct prefix_list *plist;
-       struct access_list *alist_i;
-       struct prefix_list *plist_i;
-       struct eigrp *e;
+       struct eigrp *eigrp = ei->eigrp;
        struct prefix *dest_addr;
-       u_int32_t seq_no = ei->eigrp->sequence_number;
+       u_int32_t seq_no = eigrp->sequence_number;
  
        if (ei->nbrs->count == 0)
                return;
        ep = eigrp_packet_new(ei->ifp->mtu, NULL);
  
        /* Prepare EIGRP INIT UPDATE header */
-       eigrp_packet_header_init(EIGRP_OPC_UPDATE, ei->eigrp,
+       eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp,
                                 ep->s, 0, seq_no, 0);
  
        // encode Authentication TLV, if needed
        has_tlv = 0;
        for (ALL_LIST_ELEMENTS(ei->eigrp->topology_changes_internalIPV4, node,
                               nnode, pe)) {
-               struct eigrp_neighbor_entry *ne;
+               struct eigrp_nexthop_entry *ne;
  
                if (!(pe->req_action & EIGRP_FSM_NEED_UPDATE))
                        continue;
  
                        length = EIGRP_HEADER_LEN;
                        ep = eigrp_packet_new(ei->ifp->mtu, NULL);
-                       eigrp_packet_header_init(EIGRP_OPC_UPDATE, ei->eigrp,
+                       eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp,
                                                 ep->s, 0, seq_no, 0);
                        if ((IF_DEF_PARAMS(ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
                            && (IF_DEF_PARAMS(ei->ifp)->auth_keychain != NULL)) {
                /* Get destination address from prefix */
                dest_addr = pe->destination;
  
-               /*
-                * Filtering
-                */
-               e = eigrp_lookup();
-               /* Get access-lists and prefix-lists from process and
-                * interface */
-               alist = e->list[EIGRP_FILTER_OUT];
-               plist = e->prefix[EIGRP_FILTER_OUT];
-               alist_i = ei->list[EIGRP_FILTER_OUT];
-               plist_i = ei->prefix[EIGRP_FILTER_OUT];
-               /* Check if any list fits */
-               if ((alist
-                    && access_list_apply(alist,
-                                         dest_addr)
-                    == FILTER_DENY)
-                   || (plist
-                       && prefix_list_apply(plist,
-                                            dest_addr)
-                       == PREFIX_DENY)
-                   || (alist_i
-                       && access_list_apply(alist_i,
-                                            dest_addr)
-                       == FILTER_DENY)
-                   || (plist_i
-                       && prefix_list_apply(plist_i,
-                                            dest_addr)
-                       == PREFIX_DENY)) {
+               if (eigrp_update_prefix_apply(eigrp, ei,
+                                             EIGRP_FILTER_OUT,
+                                             dest_addr)) {
                        // pe->reported_metric.delay = EIGRP_MAX_METRIC;
                        continue;
                } else {
        ep->dst.s_addr = htonl(EIGRP_MULTICAST_ADDRESS);
  
        /*This ack number we await from neighbor*/
-       ep->sequence_number = ei->eigrp->sequence_number;
+       ep->sequence_number = eigrp->sequence_number;
  
        if (IS_DEBUG_EIGRP_PACKET(0, RECV))
                zlog_debug("Enqueuing Update length[%u] Seq [%u]", length,
@@@ -824,9 -736,8 +739,8 @@@ static void eigrp_update_send_GR_part(s
        struct listnode *node, *nnode;
        struct eigrp_prefix_entry *pe;
        struct prefix *dest_addr;
-       struct eigrp *e;
-       struct access_list *alist, *alist_i;
-       struct prefix_list *plist, *plist_i;
+       struct eigrp_interface *ei = nbr->ei;
+       struct eigrp *eigrp = ei->eigrp;
        struct list *prefixes;
        u_int32_t flags;
        unsigned int send_prefixes;
                }
        }
  
-       ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
+       ep = eigrp_packet_new(ei->ifp->mtu, nbr);
  
        /* Prepare EIGRP Graceful restart UPDATE header */
-       eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei->eigrp, ep->s, flags,
-                                nbr->ei->eigrp->sequence_number,
+       eigrp_packet_header_init(EIGRP_OPC_UPDATE, eigrp, ep->s, flags,
+                                eigrp->sequence_number,
                                 nbr->recv_sequence_number);
  
        // encode Authentication TLV, if needed
-       if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
-           && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) {
-               length += eigrp_add_authTLV_MD5_to_stream(ep->s, nbr->ei);
+       if ((IF_DEF_PARAMS(ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
+           && (IF_DEF_PARAMS(ei->ifp)->auth_keychain != NULL)) {
+               length += eigrp_add_authTLV_MD5_to_stream(ep->s, ei);
        }
  
-       for (ALL_LIST_ELEMENTS(nbr->ei->eigrp->topology_table, node, nnode,
-                              pe)) {
+       for (ALL_LIST_ELEMENTS(eigrp->topology_table, node, nnode, pe)) {
                /*
                 * Filtering
                 */
                dest_addr = pe->destination;
-               /* get list from eigrp process */
-               e = eigrp_lookup();
-               /* Get access-lists and prefix-lists from process and interface
-                */
-               alist = e->list[EIGRP_FILTER_OUT];
-               plist = e->prefix[EIGRP_FILTER_OUT];
-               alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
-               plist_i = nbr->ei->prefix[EIGRP_FILTER_OUT];
-               /* Check if any list fits */
-               if ((alist
-                    && access_list_apply(alist, dest_addr)
-                               == FILTER_DENY)
-                   || (plist
-                       && prefix_list_apply(plist, dest_addr)
-                                  == PREFIX_DENY)
-                   || (alist_i
-                       && access_list_apply(alist_i, dest_addr)
-                                  == FILTER_DENY)
-                   || (plist_i
-                       && prefix_list_apply(plist_i, dest_addr)
-                                  == PREFIX_DENY)) {
+               if (eigrp_update_prefix_apply(eigrp, ei,
+                                             EIGRP_FILTER_OUT,
+                                             dest_addr)) {
                        /* do not send filtered route */
                        zlog_info("Filtered prefix %s won't be sent out.",
                                  inet_ntoa(dest_addr->u.prefix4));
                        send_prefixes++;
                }
  
-               alist = e->list[EIGRP_FILTER_IN];
-               plist = e->prefix[EIGRP_FILTER_IN];
-               alist_i = nbr->ei->list[EIGRP_FILTER_IN];
-               plist_i = nbr->ei->prefix[EIGRP_FILTER_IN];
-               /* Check if any list fits */
-               if ((alist
-                    && access_list_apply(alist, dest_addr)
-                               == FILTER_DENY)
-                   || (plist
-                       && prefix_list_apply(plist, dest_addr)
-                                  == PREFIX_DENY)
-                   || (alist_i
-                       && access_list_apply(alist_i, dest_addr)
-                                  == FILTER_DENY)
-                   || (plist_i
-                       && prefix_list_apply(plist_i, dest_addr)
-                                  == PREFIX_DENY)) {
+               /*
+                * This makes no sense, Filter out then filter in???
+                * Look into this more - DBS
+                */
+               if (eigrp_update_prefix_apply(eigrp, ei,
+                                             EIGRP_FILTER_IN,
+                                             dest_addr)) {
                        /* do not send filtered route */
                        zlog_info("Filtered prefix %s will be removed.",
                                  inet_ntoa(dest_addr->u.prefix4));
                        /* prepare message for FSM */
                        struct eigrp_fsm_action_message fsm_msg;
  
-                       struct eigrp_neighbor_entry *entry =
+                       struct eigrp_nexthop_entry *entry =
                                eigrp_prefix_entry_lookup(pe->entries, nbr);
  
                        fsm_msg.packet_type = EIGRP_OPC_UPDATE;
-                       fsm_msg.eigrp = e;
+                       fsm_msg.eigrp = eigrp;
                        fsm_msg.data_type = EIGRP_INT;
                        fsm_msg.adv_router = nbr;
                        fsm_msg.metrics = pe->reported_metric;
                        /* send message to FSM */
                        eigrp_fsm_event(&fsm_msg);
                }
-               /*
-                * End of filtering
-                */
  
                /* NULL the pointer */
                dest_addr = NULL;
        }
  
        /* compute Auth digest */
-       if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
-           && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) {
-               eigrp_make_md5_digest(nbr->ei, ep->s, EIGRP_AUTH_UPDATE_FLAG);
+       if ((IF_DEF_PARAMS(ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
+           && (IF_DEF_PARAMS(ei->ifp)->auth_keychain != NULL)) {
+               eigrp_make_md5_digest(ei, ep->s, EIGRP_AUTH_UPDATE_FLAG);
        }
  
        /* EIGRP Checksum */
-       eigrp_packet_checksum(nbr->ei, ep->s, length);
+       eigrp_packet_checksum(ei, ep->s, length);
  
        ep->length = length;
        ep->dst.s_addr = nbr->src.s_addr;
  
        /*This ack number we await from neighbor*/
-       ep->sequence_number = nbr->ei->eigrp->sequence_number;
+       ep->sequence_number = eigrp->sequence_number;
  
        if (IS_DEBUG_EIGRP_PACKET(0, RECV))
                zlog_debug("Enqueuing Update Init Len [%u] Seq [%u] Dest [%s]",
diff --combined eigrpd/eigrp_vty.c
index d4d3bb36926cee0267bc8b5437e9bc1551a4a9cc,f9119b56eed90574603417d1041efa9154fbb3cb..01407a746fcfa73ad8dd39f9116210277e4f3fb7
@@@ -93,7 -93,7 +93,7 @@@ static int config_write_interfaces(stru
        struct listnode *node;
  
        for (ALL_LIST_ELEMENTS_RO(eigrp->eiflist, node, ei)) {
 -              vty_out(vty, "interface %s\n", ei->ifp->name);
 +              vty_frame(vty, "interface %s\n", ei->ifp->name);
  
                if ((IF_DEF_PARAMS(ei->ifp)->auth_type)
                    == EIGRP_AUTH_TYPE_MD5) {
                }
  
                /*Separate this EIGRP interface configuration from the others*/
 -              vty_out(vty, "!\n");
 +              vty_endframe(vty, "!\n");
        }
  
        return 0;
@@@ -140,7 -140,7 +140,7 @@@ static int eigrp_write_interface(struc
        struct interface *ifp;
  
        for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) {
 -              vty_out(vty, "interface %s\n", ifp->name);
 +              vty_frame(vty, "interface %s\n", ifp->name);
  
                if (ifp->desc)
                        vty_out(vty, " description %s\n", ifp->desc);
                        vty_out(vty, " ip hold-time eigrp %u\n",
                                IF_DEF_PARAMS(ifp)->v_wait);
  
 -              vty_out(vty, "!\n");
 +              vty_endframe(vty, "!\n");
        }
  
        return 0;
@@@ -400,7 -400,7 +400,7 @@@ DEFUN (eigrp_network
  
        if (ret == 0) {
                vty_out(vty, "There is already same network statement.\n");
 -              return CMD_WARNING_CONFIG_FAILED;
 +              return CMD_WARNING;
        }
  
        return CMD_SUCCESS;
@@@ -464,7 -464,7 +464,7 @@@ DEFUN (show_ip_eigrp_topology
        struct eigrp *eigrp;
        struct listnode *node, *node2;
        struct eigrp_prefix_entry *tn;
-       struct eigrp_neighbor_entry *te;
+       struct eigrp_nexthop_entry *te;
        int first;
  
        eigrp = eigrp_lookup();
                for (ALL_LIST_ELEMENTS_RO(tn->entries, node2, te)) {
                        if (argc == 5
                            || (((te->flags
-                                 & EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG)
-                                == EIGRP_NEIGHBOR_ENTRY_SUCCESSOR_FLAG)
+                                 & EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
+                                == EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG)
                                || ((te->flags
-                                    & EIGRP_NEIGHBOR_ENTRY_FSUCCESSOR_FLAG)
-                                   == EIGRP_NEIGHBOR_ENTRY_FSUCCESSOR_FLAG))) {
-                               show_ip_eigrp_neighbor_entry(vty, eigrp, te,
+                                    & EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG)
+                                   == EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG))) {
+                               show_ip_eigrp_nexthop_entry(vty, eigrp, te,
                                                             &first);
                                first = 0;
                        }
@@@ -1267,11 -1267,7 +1267,11 @@@ DEFUN (clear_ip_eigrp_neighbors_IP
        struct eigrp_neighbor *nbr;
        struct in_addr nbr_addr;
  
 -      inet_aton(argv[4]->arg, &nbr_addr);
 +      if (!inet_aton(argv[4]->arg, &nbr_addr)) {
 +              vty_out(vty, "Unable to parse %s",
 +                      argv[4]->arg);
 +              return CMD_WARNING;
 +      }
  
        /* Check if eigrp process is enabled */
        eigrp = eigrp_lookup();
@@@ -1374,11 -1370,7 +1374,11 @@@ DEFUN (clear_ip_eigrp_neighbors_IP_soft
        struct eigrp_neighbor *nbr;
        struct in_addr nbr_addr;
  
 -      inet_aton(argv[4]->arg, &nbr_addr);
 +      if (!inet_aton(argv[4]->arg, &nbr_addr)) {
 +              vty_out(vty, "Unable to parse: %s",
 +                      argv[4]->arg);
 +              return CMD_WARNING;
 +      }
  
        /* Check if eigrp process is enabled */
        eigrp = eigrp_lookup();