]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrp_filter.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / eigrpd / eigrp_filter.c
index 236c53acfcd6f666bd8c5b28cb6583ed98e7c6a5..c1bf1647d81fc08125f69a7e771d809b7a5262a4 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 /*
  * Distribute-list update functions.
  */
-void
-eigrp_distribute_update (struct distribute *dist)
+void eigrp_distribute_update(struct distribute *dist)
 {
-  struct interface *ifp;
-  struct eigrp_interface *ei = NULL;
-  struct access_list *alist;
-  struct prefix_list *plist;
-  //struct route_map *routemap;
-  struct eigrp *e;
-
-  /* if no interface address is present, set list to eigrp process struct */
-  e = eigrp_lookup();
-
-  /* Check if distribute-list was set for process or interface */
-  if (! dist->ifname)
-    {
-      /* access list IN for whole process */
-      if (dist->list[DISTRIBUTE_V4_IN])
-        {
-          alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_IN]);
-          zlog_info("<DEBUG DISTRIBUTE ACL IN FOUND: %s",alist->name);
-          if (alist)
-            e->list[EIGRP_FILTER_IN] = alist;
-          else
-            e->list[EIGRP_FILTER_IN] = NULL;
-        }
-      else
-        {
-          e->list[EIGRP_FILTER_IN] = NULL;
-        }
-
-      /* access list OUT for whole process */
-      if (dist->list[DISTRIBUTE_V4_OUT])
-        {
-          zlog_info("<DEBUG DISTRIBUTE ACL OUT FOUND: %s",dist->list[DISTRIBUTE_V4_OUT]);
-          alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_OUT]);
-          if (alist)
-            e->list[EIGRP_FILTER_OUT] = alist;
-          else
-            e->list[EIGRP_FILTER_OUT] = NULL;
-        }
-      else
-        {
-          e->list[EIGRP_FILTER_OUT] = NULL;
-        }
-      /* PREFIX_LIST IN for process */
-      if (dist->prefix[DISTRIBUTE_V4_IN])
-        {
-          zlog_info("<DEBUG DISTRIBUTE PREFIX IN FOUND: %s",dist->prefix[DISTRIBUTE_V4_IN]);
-          plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_IN]);
-          if (plist)
-            {
-              e->prefix[EIGRP_FILTER_IN] = plist;
-            }
-          else
-            e->prefix[EIGRP_FILTER_IN] = NULL;
-        } else
-        e->prefix[EIGRP_FILTER_IN] = NULL;
-
-      /* PREFIX_LIST OUT for process */
-      if (dist->prefix[DISTRIBUTE_V4_OUT])
-        {
-          zlog_info("<DEBUG DISTRIBUTE PREFIX OUT FOUND: %s",dist->prefix[DISTRIBUTE_V4_OUT]);
-          plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_OUT]);
-          if (plist)
-            {
-              e->prefix[EIGRP_FILTER_OUT] = plist;
-
-            }
-          else
-            e->prefix[EIGRP_FILTER_OUT] = NULL;
-        }
-      else
-        e->prefix[EIGRP_FILTER_OUT] = NULL;
-
-      //This is commented out, because the distribute.[ch] code
-      //changes looked poorly written from first glance
-      //commit was 133bdf2d
-      //TODO: DBS
+       struct interface *ifp;
+       struct eigrp_interface *ei = NULL;
+       struct access_list *alist;
+       struct prefix_list *plist;
+       // struct route_map *routemap;
+       struct eigrp *e;
+
+       /* if no interface address is present, set list to eigrp process struct
+        */
+       e = eigrp_lookup();
+       assert(e != NULL);
+
+       /* Check if distribute-list was set for process or interface */
+       if (!dist->ifname) {
+               /* access list IN for whole process */
+               if (dist->list[DISTRIBUTE_V4_IN]) {
+                       alist = access_list_lookup(
+                               AFI_IP, dist->list[DISTRIBUTE_V4_IN]);
+                       if (alist)
+                               e->list[EIGRP_FILTER_IN] = alist;
+                       else
+                               e->list[EIGRP_FILTER_IN] = NULL;
+               } else {
+                       e->list[EIGRP_FILTER_IN] = NULL;
+               }
+
+               /* access list OUT for whole process */
+               if (dist->list[DISTRIBUTE_V4_OUT]) {
+                       alist = access_list_lookup(
+                               AFI_IP, dist->list[DISTRIBUTE_V4_OUT]);
+                       if (alist)
+                               e->list[EIGRP_FILTER_OUT] = alist;
+                       else
+                               e->list[EIGRP_FILTER_OUT] = NULL;
+               } else {
+                       e->list[EIGRP_FILTER_OUT] = NULL;
+               }
+
+               /* PREFIX_LIST IN for process */
+               if (dist->prefix[DISTRIBUTE_V4_IN]) {
+                       plist = prefix_list_lookup(
+                               AFI_IP, dist->prefix[DISTRIBUTE_V4_IN]);
+                       if (plist) {
+                               e->prefix[EIGRP_FILTER_IN] = plist;
+                       } else
+                               e->prefix[EIGRP_FILTER_IN] = NULL;
+               } else
+                       e->prefix[EIGRP_FILTER_IN] = NULL;
+
+               /* PREFIX_LIST OUT for process */
+               if (dist->prefix[DISTRIBUTE_V4_OUT]) {
+                       plist = prefix_list_lookup(
+                               AFI_IP, dist->prefix[DISTRIBUTE_V4_OUT]);
+                       if (plist) {
+                               e->prefix[EIGRP_FILTER_OUT] = plist;
+
+                       } else
+                               e->prefix[EIGRP_FILTER_OUT] = NULL;
+               } else
+                       e->prefix[EIGRP_FILTER_OUT] = NULL;
+
+// This is commented out, because the distribute.[ch] code
+// changes looked poorly written from first glance
+// commit was 133bdf2d
+// TODO: DBS
 #if 0
       /* route-map IN for whole process */
       if (dist->route[DISTRIBUTE_V4_IN])
@@ -172,99 +158,83 @@ eigrp_distribute_update (struct distribute *dist)
           e->routemap[EIGRP_FILTER_OUT] = NULL;
         }
 #endif
-      //TODO: check Graceful restart after 10sec
-
-      /* check if there is already GR scheduled */
-      if(e->t_distribute != NULL)
-        {
-          /* if is, cancel schedule */
-          thread_cancel(e->t_distribute);
-        }
-      /* schedule Graceful restart for whole process in 10sec */
-      e->t_distribute = thread_add_timer(master, eigrp_distribute_timer_process, e,(10));
-
-      return;
-    }
-
-  ifp = if_lookup_by_name (dist->ifname, VRF_DEFAULT);
-  if (ifp == NULL)
-    return;
-
-  zlog_info("<DEBUG ACL 2");
-
-  /*struct eigrp_if_info * info = ifp->info;
-  ei = info->eigrp_interface;*/
-  struct listnode *node, *nnode;
-  struct eigrp_interface *ei2;
-  /* Find proper interface */
-  for (ALL_LIST_ELEMENTS (e->eiflist, node, nnode, ei2))
-  {
-    if(strcmp(ei2->ifp->name,ifp->name) == 0){
-      ei = ei2;
-      break;
-    }
-  }
-
-  if(ei == NULL)
-    {
-      zlog_info("Not Found eigrp interface %s",ifp->name);
-    }
-
-  /* Access-list for interface in */
-  if (dist->list[DISTRIBUTE_V4_IN])
-    {
-      zlog_info("<DEBUG ACL in");
-      alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_IN]);
-      if (alist){
-        ei->list[EIGRP_FILTER_IN] = alist;
-      }
-      else
-        ei->list[EIGRP_FILTER_IN] = NULL;
-    }
-  else
-  {
-    ei->list[EIGRP_FILTER_IN] = NULL;
-  }
-
-  /* Access-list for interface in */
-  if (dist->list[DISTRIBUTE_V4_OUT])
-    {
-      alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_OUT]);
-      if (alist)
-        ei->list[EIGRP_FILTER_OUT] = alist;
-      else
-        ei->list[EIGRP_FILTER_OUT] = NULL;
-
-    }
-  else
-    {
-      ei->list[EIGRP_FILTER_OUT] = NULL;
-      zlog_info("<DEBUG ACL out else");
-    }
-
-  /* Prefix-list for interface in */
-  if (dist->prefix[DISTRIBUTE_V4_IN])
-    {
-      plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_IN]);
-      if (plist)
-        ei->prefix[EIGRP_FILTER_IN] = plist;
-      else
-        ei->prefix[EIGRP_FILTER_IN] = NULL;
-    }
-  else
-    ei->prefix[EIGRP_FILTER_IN] = NULL;
-
-  /* Prefix-list for interface out */
-  if (dist->prefix[DISTRIBUTE_V4_OUT])
-    {
-      plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_OUT]);
-      if (plist)
-        ei->prefix[EIGRP_FILTER_OUT] = plist;
-      else
-        ei->prefix[EIGRP_FILTER_OUT] = NULL;
-    }
-  else
-    ei->prefix[EIGRP_FILTER_OUT] = NULL;
+               // TODO: check Graceful restart after 10sec
+
+               /* check if there is already GR scheduled */
+               if (e->t_distribute != NULL) {
+                       /* if is, cancel schedule */
+                       thread_cancel(e->t_distribute);
+               }
+               /* schedule Graceful restart for whole process in 10sec */
+               e->t_distribute = NULL;
+               thread_add_timer(master, eigrp_distribute_timer_process, e,
+                                (10), &e->t_distribute);
+
+               return;
+       }
+
+       ifp = if_lookup_by_name(dist->ifname, VRF_DEFAULT);
+       if (ifp == NULL)
+               return;
+
+       /*struct eigrp_if_info * info = ifp->info;
+       ei = info->eigrp_interface;*/
+       struct listnode *node, *nnode;
+       struct eigrp_interface *ei2;
+       /* Find proper interface */
+       for (ALL_LIST_ELEMENTS(e->eiflist, node, nnode, ei2)) {
+               if (strcmp(ei2->ifp->name, ifp->name) == 0) {
+                       ei = ei2;
+                       break;
+               }
+       }
+       assert(ei != NULL);
+
+       /* Access-list for interface in */
+       if (dist->list[DISTRIBUTE_V4_IN]) {
+               alist = access_list_lookup(AFI_IP,
+                                          dist->list[DISTRIBUTE_V4_IN]);
+               if (alist) {
+                       ei->list[EIGRP_FILTER_IN] = alist;
+               } else
+                       ei->list[EIGRP_FILTER_IN] = NULL;
+       } else {
+               ei->list[EIGRP_FILTER_IN] = NULL;
+       }
+
+       /* Access-list for interface in */
+       if (dist->list[DISTRIBUTE_V4_OUT]) {
+               alist = access_list_lookup(AFI_IP,
+                                          dist->list[DISTRIBUTE_V4_OUT]);
+               if (alist)
+                       ei->list[EIGRP_FILTER_OUT] = alist;
+               else
+                       ei->list[EIGRP_FILTER_OUT] = NULL;
+
+       } else
+               ei->list[EIGRP_FILTER_OUT] = NULL;
+
+       /* Prefix-list for interface in */
+       if (dist->prefix[DISTRIBUTE_V4_IN]) {
+               plist = prefix_list_lookup(AFI_IP,
+                                          dist->prefix[DISTRIBUTE_V4_IN]);
+               if (plist)
+                       ei->prefix[EIGRP_FILTER_IN] = plist;
+               else
+                       ei->prefix[EIGRP_FILTER_IN] = NULL;
+       } else
+               ei->prefix[EIGRP_FILTER_IN] = NULL;
+
+       /* Prefix-list for interface out */
+       if (dist->prefix[DISTRIBUTE_V4_OUT]) {
+               plist = prefix_list_lookup(AFI_IP,
+                                          dist->prefix[DISTRIBUTE_V4_OUT]);
+               if (plist)
+                       ei->prefix[EIGRP_FILTER_OUT] = plist;
+               else
+                       ei->prefix[EIGRP_FILTER_OUT] = NULL;
+       } else
+               ei->prefix[EIGRP_FILTER_OUT] = NULL;
 
 #if 0
   /* route-map IN for whole process */
@@ -296,51 +266,49 @@ eigrp_distribute_update (struct distribute *dist)
       ei->routemap[EIGRP_FILTER_OUT] = NULL;
     }
 #endif
-  //TODO: check Graceful restart after 10sec
-
-  /* check if there is already GR scheduled */
-  if(ei->t_distribute != NULL)
-    {
-      /* if is, cancel schedule */
-      thread_cancel(ei->t_distribute);
-    }
-  /* schedule Graceful restart for interface in 10sec */
-  e->t_distribute = thread_add_timer(master, eigrp_distribute_timer_interface, ei, 10);
+       // TODO: check Graceful restart after 10sec
+
+       /* check if there is already GR scheduled */
+       if (ei->t_distribute != NULL) {
+               /* if is, cancel schedule */
+               thread_cancel(ei->t_distribute);
+       }
+       /* schedule Graceful restart for interface in 10sec */
+       e->t_distribute = NULL;
+       thread_add_timer(master, eigrp_distribute_timer_interface, ei, 10,
+                        &e->t_distribute);
 }
 
 /*
  * Function called by prefix-list and access-list update
  */
-void
-eigrp_distribute_update_interface (struct interface *ifp)
+void eigrp_distribute_update_interface(struct interface *ifp)
 {
-  struct distribute *dist;
+       struct distribute *dist;
 
-  dist = distribute_lookup (ifp->name);
-  if (dist)
-    eigrp_distribute_update (dist);
+       dist = distribute_lookup(ifp->name);
+       if (dist)
+               eigrp_distribute_update(dist);
 }
 
 /* Update all interface's distribute list.
  * Function used in hook for prefix-list
  */
-void
-eigrp_distribute_update_all (struct prefix_list *notused)
+void eigrp_distribute_update_all(struct prefix_list *notused)
 {
-  struct interface *ifp;
-  struct listnode *node, *nnode;
+       struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
+       struct interface *ifp;
 
-  for (ALL_LIST_ELEMENTS (vrf_iflist(VRF_DEFAULT), node, nnode, ifp))
-    eigrp_distribute_update_interface (ifp);
+       FOR_ALL_INTERFACES (vrf, ifp)
+               eigrp_distribute_update_interface(ifp);
 }
 
 /*
  * Function used in hook for acces-list
  */
-void
-eigrp_distribute_update_all_wrapper(struct access_list *notused)
+void eigrp_distribute_update_all_wrapper(struct access_list *notused)
 {
-  eigrp_distribute_update_all(NULL);
+       eigrp_distribute_update_all(NULL);
 }
 
 /*
@@ -354,18 +322,17 @@ eigrp_distribute_update_all_wrapper(struct access_list *notused)
  * Called when 10sec waiting time expire and
  * executes Graceful restart for whole process
  */
-int
-eigrp_distribute_timer_process (struct thread *thread)
+int eigrp_distribute_timer_process(struct thread *thread)
 {
-  struct eigrp *eigrp;
+       struct eigrp *eigrp;
 
-  eigrp = THREAD_ARG(thread);
-  eigrp->t_distribute = NULL;
+       eigrp = THREAD_ARG(thread);
+       eigrp->t_distribute = NULL;
 
-  /* execute GR for whole process */
-  eigrp_update_send_process_GR(eigrp, EIGRP_GR_FILTER, NULL);
+       /* execute GR for whole process */
+       eigrp_update_send_process_GR(eigrp, EIGRP_GR_FILTER, NULL);
 
-  return 0;
+       return 0;
 }
 
 /*
@@ -379,16 +346,15 @@ eigrp_distribute_timer_process (struct thread *thread)
  * Called when 10sec waiting time expire and
  * executes Graceful restart for interface
  */
-int
-eigrp_distribute_timer_interface (struct thread *thread)
+int eigrp_distribute_timer_interface(struct thread *thread)
 {
-  struct eigrp_interface *ei;
+       struct eigrp_interface *ei;
 
-  ei = THREAD_ARG(thread);
-  ei->t_distribute = NULL;
+       ei = THREAD_ARG(thread);
+       ei->t_distribute = NULL;
 
-  /* execute GR for interface */
-  eigrp_update_send_interface_GR(ei, EIGRP_GR_FILTER, NULL);
+       /* execute GR for interface */
+       eigrp_update_send_interface_GR(ei, EIGRP_GR_FILTER, NULL);
 
-  return 0;
+       return 0;
 }