]> git.puffer.fish Git - mirror/frr.git/commitdiff
eigrpd: Some Basic Corrections
authorRenato Westphal <renatowestphal@gmail.com>
Fri, 12 May 2017 19:38:18 +0000 (15:38 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Sat, 13 May 2017 17:08:00 +0000 (13:08 -0400)
* Advertise routes to zebra
* Connected routes should not have a nexthop address
* Fix segfaut on exit

Signed-off-by: Renato Westphal <renatowestphal@gmail.com>
eigrpd/eigrp_neighbor.c
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c
eigrpd/eigrp_zebra.c
eigrpd/eigrpd.c

index f200351c108da1c7fec68cdb377aceb83d6d1c4e..003d3a7a7cda69f841baddbe5eb89f0f7e79997e 100644 (file)
@@ -195,7 +195,8 @@ eigrp_nbr_delete (struct eigrp_neighbor *nbr)
   eigrp_fifo_free (nbr->retrans_queue);
   THREAD_OFF (nbr->t_holddown);
 
-  listnode_delete (nbr->ei->nbrs,nbr);
+  if (nbr->ei)
+    listnode_delete (nbr->ei->nbrs,nbr);
   XFREE (MTYPE_EIGRP_NEIGHBOR, nbr);
 }
 
index 25beb63e80da6c9b98ae7ee07aff0a91b128a5cb..4fcbef7f147d6fe38895d1c6fa49e6b8a2672850 100644 (file)
@@ -216,11 +216,17 @@ void
 eigrp_neighbor_entry_add(struct eigrp_prefix_entry *node,
                          struct eigrp_neighbor_entry *entry)
 {
-  if (listnode_lookup(node->entries, entry) == NULL)
+  struct list *l = list_new ();
+
+  if (listnode_lookup (node->entries, entry) == NULL)
     {
-      listnode_add_sort(node->entries, entry);
+      listnode_add_sort (node->entries, entry);
       entry->prefix = node;
     }
+
+  listnode_add (l, entry);
+  eigrp_zebra_route_add (node->destination_ipv4, l);
+  list_delete (l);
 }
 
 /*
@@ -236,16 +242,18 @@ eigrp_prefix_entry_delete(struct list *topology,
    * Emergency removal of the node from this list.
    * Whatever it is.
    */
-  listnode_delete(eigrp->topology_changes_internalIPV4, node);
+  listnode_delete (eigrp->topology_changes_internalIPV4, node);
 
-  if (listnode_lookup(topology, node) != NULL)
+  if (listnode_lookup (topology, node) != NULL)
     {
-      list_delete_all_node(node->entries);
-      list_free(node->entries);
-      list_free(node->rij);
-      listnode_delete(topology, node);
-      XFREE(MTYPE_EIGRP_PREFIX_ENTRY,node);
+      list_delete_all_node (node->entries);
+      list_free (node->entries);
+      list_free (node->rij);
+      listnode_delete (topology, node);
+      XFREE (MTYPE_EIGRP_PREFIX_ENTRY,node);
     }
+
+  eigrp_zebra_route_delete (node->destination_ipv4);
 }
 
 /*
index 5c942bd4d576dffd92d326e76ed7104d7bbba1bc..463f3800fa2d239f257616959f3b3e70389be8bd 100644 (file)
@@ -454,26 +454,6 @@ eigrp_update_receive (struct eigrp *eigrp, struct ip *iph, struct eigrp_header *
 
               pe->req_action |= EIGRP_FSM_NEED_UPDATE;
               listnode_add(eigrp->topology_changes_internalIPV4, pe);
-
-              /*
-               * This code is a guess.  I am not actually
-               * sure that we should be doing this here.
-               * But for the moment it installs routes
-               * into the rib.  Which is good?
-               */
-              struct eigrp_fsm_action_message *msg;
-              msg = XCALLOC(MTYPE_EIGRP_FSM_MSG,
-                            sizeof(struct eigrp_fsm_action_message));
-
-              msg->packet_type = EIGRP_OPC_UPDATE;
-              msg->eigrp = eigrp;
-              msg->data_type =EIGRP_TLV_IPv4_INT;
-              msg->adv_router = nbr;
-              msg->data.ipv4_int_type = tlv;
-              msg->entry = ne;
-              msg->prefix = pe;
-              int event = eigrp_get_fsm_event(msg);
-              eigrp_fsm_event(msg, event);
             }
           eigrp_IPv4_InternalTLV_free (tlv);
         }
index 627d564a78e87ee02f7aac911d724776d3997d72..befb39dba124d069c260d89f2df915f0cc4ceef0 100644 (file)
@@ -444,8 +444,13 @@ eigrp_zebra_route_add (struct prefix_ipv4 *p, struct list *successors)
       /* Nexthop, ifindex, distance and metric information. */
       for (ALL_LIST_ELEMENTS_RO (successors, node, te))
         {
-          stream_putc (s, NEXTHOP_TYPE_IPV4_IFINDEX);
-          stream_put_in_addr (s, &te->adv_router->src);
+          if (te->adv_router->src.s_addr)
+            {
+              stream_putc (s, NEXTHOP_TYPE_IPV4_IFINDEX);
+              stream_put_in_addr (s, &te->adv_router->src);
+            }
+          else
+            stream_putc (s, NEXTHOP_TYPE_IFINDEX);
           stream_putl (s, te->ei->ifp->ifindex);
         }
 
index 40885c8a46e5d3a15a5064e90b073fed742a3804..c6af8986b7b6295e69232a7944e5ad96fa8a19bf 100644 (file)
@@ -188,7 +188,7 @@ eigrp_new (const char *AS)
   eigrp->topology_table = eigrp_topology_new();
 
   eigrp->neighbor_self = eigrp_nbr_new(NULL);
-  inet_aton("127.0.0.1", &eigrp->neighbor_self->src);
+  inet_aton("0.0.0.0", &eigrp->neighbor_self->src);
 
   eigrp->variance = EIGRP_VARIANCE_DEFAULT;
   eigrp->max_paths = EIGRP_MAX_PATHS_DEFAULT;