]> git.proxmox.com Git - mirror_frr.git/blobdiff - ripngd/ripngd.h
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / ripngd / ripngd.h
index 62b7b073f87c04a677ecc265816d3ccc675ceabf..5b32374ace87238f08127ea0a80c941ba628ce02 100644 (file)
 #define RIPNG_METRIC_NEXTHOP          0xff
 #define RIPNG_GROUP              "ff02::9"
 
-/* RIPng timers. */
-#define RIPNG_UPDATE_TIMER_DEFAULT      30
-#define RIPNG_TIMEOUT_TIMER_DEFAULT    180
-#define RIPNG_GARBAGE_TIMER_DEFAULT    120
-
 /* RIPng peer timeout value. */
 #define RIPNG_PEER_TIMER_DEFAULT       180
 
@@ -77,9 +72,6 @@
 #define RIPNG_DEFAULT_ACCEPT_NONE        1
 #define RIPNG_DEFAULT_ACCEPT             2
 
-/* Default value for "default-metric" command. */
-#define RIPNG_DEFAULT_METRIC_DEFAULT     1
-
 /* For max RTE calculation. */
 #ifndef IPV6_HDRLEN
 #define IPV6_HDRLEN 40
 #define IFMINMTU    576
 #endif /* IFMINMTU */
 
+/* YANG paths */
+#define RIPNG_INSTANCE "/frr-ripngd:ripngd/instance"
+#define RIPNG_IFACE    "/frr-interface:lib/interface/frr-ripngd:ripng"
+
 /* RIPng structure. */
-struct ripng 
-{
-  /* RIPng socket. */
-  int sock;
-
-  /* RIPng Parameters.*/
-  u_char command;
-  u_char version;
-  unsigned long update_time;
-  unsigned long timeout_time;
-  unsigned long garbage_time;
-  int max_mtu;
-  int default_metric;
-  int default_information;
-
-  /* Input/output buffer of RIPng. */
-  struct stream *ibuf;
-  struct stream *obuf;
-
-  /* RIPng routing information base. */
-  struct route_table *table;
-
-  /* RIPng only static route information. */
-  struct route_table *route;
-
-  /* RIPng aggregate route information. */
-  struct route_table *aggregate;
-
-  /* RIPng threads. */
-  struct thread *t_read;
-  struct thread *t_write;
-  struct thread *t_update;
-  struct thread *t_garbage;
-  struct thread *t_zebra;
-
-  /* Triggered update hack. */
-  int trigger;
-  struct thread *t_triggered_update;
-  struct thread *t_triggered_interval;
-
-  /* RIPng ECMP flag */
-  unsigned int ecmp;
-
-  /* For redistribute route map. */
-  struct
-  {
-    char *name;
-    struct route_map *map;
-    int metric_config;
-    u_int32_t metric;
-  } route_map[ZEBRA_ROUTE_MAX];
+struct ripng {
+       /* RIPng socket. */
+       int sock;
+
+       /* RIPng Parameters.*/
+       uint8_t command;
+       uint8_t version;
+       uint16_t update_time;
+       uint16_t timeout_time;
+       uint16_t garbage_time;
+       int max_mtu;
+       uint8_t default_metric;
+
+       /* Input/output buffer of RIPng. */
+       struct stream *ibuf;
+       struct stream *obuf;
+
+       /* RIPng routing information base. */
+       struct agg_table *table;
+
+       /* RIPng threads. */
+       struct thread *t_read;
+       struct thread *t_write;
+       struct thread *t_update;
+       struct thread *t_garbage;
+       struct thread *t_zebra;
+
+       /* Triggered update hack. */
+       int trigger;
+       struct thread *t_triggered_update;
+       struct thread *t_triggered_interval;
+
+       /* RIPng ECMP flag */
+       bool ecmp;
+
+       /* For redistribute route map. */
+       struct {
+               char *name;
+               struct route_map *map;
+               bool metric_config;
+               uint8_t metric;
+       } route_map[ZEBRA_ROUTE_MAX];
 };
 
 /* Routing table entry. */
-struct rte
-{
-  struct in6_addr addr;        /* RIPng destination prefix */
-  u_int16_t tag;               /* RIPng tag */
-  u_char prefixlen;    /* Length of the RIPng prefix */
-  u_char metric;       /* Metric of the RIPng route */
-                       /* The nexthop is stored by the structure
-                        * ripng_nexthop within ripngd.c */
+struct rte {
+       struct in6_addr addr; /* RIPng destination prefix */
+       uint16_t tag;    /* RIPng tag */
+       uint8_t prefixlen;    /* Length of the RIPng prefix */
+       uint8_t metric;       /* Metric of the RIPng route */
+                             /* The nexthop is stored by the structure
+                              * ripng_nexthop within ripngd.c */
 };
 
 /* RIPNG send packet. */
-struct ripng_packet
-{
-  u_char command;
-  u_char version;
-  u_int16_t zero; 
-  struct rte rte[1];
+struct ripng_packet {
+       uint8_t command;
+       uint8_t version;
+       uint16_t zero;
+       struct rte rte[1];
 };
 
 /* Each route's information. */
-struct ripng_info
-{
-  /* This route's type.  Static, ripng or aggregate. */
-  u_char type;
+struct ripng_info {
+       /* This route's type.  Static, ripng or aggregate. */
+       uint8_t type;
 
-  /* Sub type for static route. */
-  u_char sub_type;
+       /* Sub type for static route. */
+       uint8_t sub_type;
 
-  /* RIPng specific information */
-  struct in6_addr nexthop;     
-  struct in6_addr from;
+       /* RIPng specific information */
+       struct in6_addr nexthop;
+       struct in6_addr from;
 
-  /* Which interface does this route come from. */
-  ifindex_t ifindex;
+       /* Which interface does this route come from. */
+       ifindex_t ifindex;
 
-  /* Metric of this route.  */
-  u_char metric;               
+       /* Metric of this route.  */
+       uint8_t metric;
 
-  /* Tag field of RIPng packet.*/
-  u_int16_t tag;               
+       /* Tag field of RIPng packet.*/
+       uint16_t tag;
 
-  /* For aggregation. */
-  unsigned int suppress;
+       /* For aggregation. */
+       unsigned int suppress;
 
-  /* Flags of RIPng route. */
+/* Flags of RIPng route. */
 #define RIPNG_RTF_FIB      1
 #define RIPNG_RTF_CHANGED  2
-  u_char flags;
+       uint8_t flags;
 
-  /* Garbage collect timer. */
-  struct thread *t_timeout;
-  struct thread *t_garbage_collect;
+       /* Garbage collect timer. */
+       struct thread *t_timeout;
+       struct thread *t_garbage_collect;
 
-  /* Route-map features - this variables can be changed. */
-  struct in6_addr nexthop_out;
-  u_char metric_set;
-  u_char metric_out;
-  u_int16_t tag_out;
+       /* Route-map features - this variables can be changed. */
+       struct in6_addr nexthop_out;
+       uint8_t metric_set;
+       uint8_t metric_out;
+       uint16_t tag_out;
 
-  struct route_node *rp;
+       struct agg_node *rp;
 };
 
 #ifdef notyet
@@ -212,10 +196,10 @@ struct ripng_info
 struct ripng_tag
 {
   /* Tag value. */
-  u_int16_t tag;
+  uint16_t tag;
 
   /* Port. */
-  u_int16_t port;
+  uint16_t port;
 
   /* Multicast group. */
   struct in6_addr maddr;
@@ -227,47 +211,45 @@ struct ripng_tag
   int distance;
 
   /* Split horizon. */
-  u_char split_horizon;
+  uint8_t split_horizon;
 
   /* Poison reverse. */
-  u_char poison_reverse;
+  uint8_t poison_reverse;
 };
 #endif /* 0 */
 #endif /* not yet */
 
 typedef enum {
-  RIPNG_NO_SPLIT_HORIZON = 0,
-  RIPNG_SPLIT_HORIZON,
-  RIPNG_SPLIT_HORIZON_POISONED_REVERSE
+       RIPNG_NO_SPLIT_HORIZON = 0,
+       RIPNG_SPLIT_HORIZON,
+       RIPNG_SPLIT_HORIZON_POISONED_REVERSE
 } split_horizon_policy_t;
 
 /* RIPng specific interface configuration. */
-struct ripng_interface
-{
-  /* RIPng is enabled on this interface. */
-  int enable_network;
-  int enable_interface;
-
-  /* RIPng is running on this interface. */
-  int running;
-
-  /* Split horizon flag. */
-  split_horizon_policy_t split_horizon;
-  split_horizon_policy_t split_horizon_default;
-  
-  /* For filter type slot. */
+struct ripng_interface {
+       /* RIPng is enabled on this interface. */
+       int enable_network;
+       int enable_interface;
+
+       /* RIPng is running on this interface. */
+       int running;
+
+       /* Split horizon flag. */
+       split_horizon_policy_t split_horizon;
+
+/* For filter type slot. */
 #define RIPNG_FILTER_IN  0
 #define RIPNG_FILTER_OUT 1
 #define RIPNG_FILTER_MAX 2
 
-  /* Access-list. */
-  struct access_list *list[RIPNG_FILTER_MAX];
+       /* Access-list. */
+       struct access_list *list[RIPNG_FILTER_MAX];
 
-  /* Prefix-list. */
-  struct prefix_list *prefix[RIPNG_FILTER_MAX];
+       /* Prefix-list. */
+       struct prefix_list *prefix[RIPNG_FILTER_MAX];
 
-  /* Route-map. */
-  struct route_map *routemap[RIPNG_FILTER_MAX];
+       /* Route-map. */
+       struct route_map *routemap[RIPNG_FILTER_MAX];
 
 #ifdef notyet
 #if 0
@@ -276,148 +258,175 @@ struct ripng_interface
 #endif /* 0 */
 #endif /* notyet */
 
-  /* Default information originate. */
-  u_char default_originate;
+       /* Default information originate. */
+       uint8_t default_originate;
 
-  /* Default information only. */
-  u_char default_only;
+       /* Default information only. */
+       uint8_t default_only;
 
-  /* Wake up thread. */
-  struct thread *t_wakeup;
+       /* Wake up thread. */
+       struct thread *t_wakeup;
 
-  /* Passive interface. */
-  int passive;
+       /* Passive interface. */
+       int passive;
 };
 
 /* RIPng peer information. */
-struct ripng_peer
-{
-  /* Peer address. */
-  struct in6_addr addr;
+struct ripng_peer {
+       /* Peer address. */
+       struct in6_addr addr;
 
-  /* Peer RIPng tag value. */
-  int domain;
+       /* Peer RIPng tag value. */
+       int domain;
 
-  /* Last update time. */
-  time_t uptime;
+       /* Last update time. */
+       time_t uptime;
 
-  /* Peer RIP version. */
-  u_char version;
+       /* Peer RIP version. */
+       uint8_t version;
 
-  /* Statistics. */
-  int recv_badpackets;
-  int recv_badroutes;
+       /* Statistics. */
+       int recv_badpackets;
+       int recv_badroutes;
 
-  /* Timeout thread. */
-  struct thread *t_timeout;
+       /* Timeout thread. */
+       struct thread *t_timeout;
 };
 
 /* All RIPng events. */
-enum ripng_event
-{
-  RIPNG_READ,
-  RIPNG_ZEBRA,
-  RIPNG_REQUEST_EVENT,
-  RIPNG_UPDATE_EVENT,
-  RIPNG_TRIGGERED_UPDATE,
+enum ripng_event {
+       RIPNG_READ,
+       RIPNG_ZEBRA,
+       RIPNG_REQUEST_EVENT,
+       RIPNG_UPDATE_EVENT,
+       RIPNG_TRIGGERED_UPDATE,
 };
 
 /* RIPng timer on/off macro. */
 #define RIPNG_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T))
 
-#define RIPNG_TIMER_OFF(T) \
-do { \
-   if (T) \
-     { \
-       thread_cancel(T); \
-       (T) = NULL; \
-     } \
-} while (0)
+#define RIPNG_TIMER_OFF(T)                                                     \
+       do {                                                                   \
+               if (T) {                                                       \
+                       thread_cancel(T);                                      \
+                       (T) = NULL;                                            \
+               }                                                              \
+       } while (0)
+
+#define RIPNG_OFFSET_LIST_IN  0
+#define RIPNG_OFFSET_LIST_OUT 1
+#define RIPNG_OFFSET_LIST_MAX 2
+
+struct ripng_offset_list {
+       char *ifname;
+
+       struct {
+               char *alist_name;
+               /* struct access_list *alist; */
+               uint8_t metric;
+       } direct[RIPNG_OFFSET_LIST_MAX];
+};
 
 /* Extern variables. */
 extern struct ripng *ripng;
-
+extern struct list *peer_list;
+extern struct zebra_privs_t ripngd_privs;
 extern struct thread_master *master;
 
 /* Prototypes. */
-extern void ripng_init (void);
-extern void ripng_reset (void);
-extern void ripng_clean (void);
-extern void ripng_clean_network (void);
-extern void ripng_interface_clean (void);
-extern void ripng_interface_reset (void);
-extern void ripng_passive_interface_clean (void);
-extern void ripng_if_init (void);
-extern void ripng_route_map_init (void);
-extern void ripng_route_map_reset (void);
-extern void ripng_terminate (void);
- /* zclient_init() is done by ripng_zebra.c:zebra_init() */
+extern void ripng_init(void);
+extern void ripng_clean(void);
+extern void ripng_clean_network(void);
+extern void ripng_interface_clean(void);
+extern int ripng_enable_network_add(struct prefix *p);
+extern int ripng_enable_network_delete(struct prefix *p);
+extern int ripng_enable_if_add(const char *ifname);
+extern int ripng_enable_if_delete(const char *ifname);
+extern int ripng_passive_interface_set(const char *ifname);
+extern int ripng_passive_interface_unset(const char *ifname);
+extern void ripng_passive_interface_clean(void);
+extern void ripng_if_init(void);
+extern void ripng_route_map_init(void);
+extern void ripng_terminate(void);
+/* zclient_init() is done by ripng_zebra.c:zebra_init() */
 extern void zebra_init(struct thread_master *);
-extern void ripng_zclient_reset (void);
-extern void ripng_offset_init (void);
-
-extern int config_write_ripng_offset_list (struct vty *);
-
-extern void ripng_peer_init (void);
-extern void ripng_peer_update (struct sockaddr_in6 *, u_char);
-extern void ripng_peer_bad_route (struct sockaddr_in6 *);
-extern void ripng_peer_bad_packet (struct sockaddr_in6 *);
-extern void ripng_peer_display (struct vty *);
-extern struct ripng_peer *ripng_peer_lookup (struct in6_addr *);
-extern struct ripng_peer *ripng_peer_lookup_next (struct in6_addr *);
-
-extern int ripng_offset_list_apply_in (struct prefix_ipv6 *,
-                                       struct interface *, u_char *);
-extern int ripng_offset_list_apply_out (struct prefix_ipv6 *,
-                                        struct interface *, u_char *);
-extern void ripng_offset_clean (void);
-
-extern struct ripng_info * ripng_info_new (void);
-extern void ripng_info_free (struct ripng_info *rinfo);
-extern void ripng_event (enum ripng_event, int);
-extern int ripng_request (struct interface *ifp);
-extern void ripng_redistribute_add (int, int, struct prefix_ipv6 *,
-                                    ifindex_t, struct in6_addr *, route_tag_t);
-extern void ripng_redistribute_delete (int, int, struct prefix_ipv6 *,
-                                       ifindex_t);
-extern void ripng_redistribute_withdraw (int type);
-
-extern void ripng_distribute_update_interface (struct interface *);
-extern void ripng_if_rmap_update_interface (struct interface *);
-
-extern void ripng_zebra_ipv6_add (struct route_node *);
-extern void ripng_zebra_ipv6_delete (struct route_node *);
-
-extern void ripng_redistribute_clean (void);
-extern int ripng_redistribute_check (int);
-extern void ripng_redistribute_write (struct vty *, int);
-
-extern int ripng_write_rte (int num, struct stream *s, struct prefix_ipv6 *p,
-                            struct in6_addr *nexthop,
-                            u_int16_t tag, u_char metric);
-extern int ripng_send_packet (caddr_t buf, int bufsize,
-                              struct sockaddr_in6 *to, struct interface *ifp);
-
-extern void ripng_packet_dump (struct ripng_packet *packet, int size,
-                               const char *sndrcv);
-
-extern int ripng_interface_up (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-extern int ripng_interface_down (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-extern int ripng_interface_add (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-extern int ripng_interface_delete (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-extern int ripng_interface_address_add (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-extern int ripng_interface_address_delete (int command, struct zclient *, zebra_size_t,
-    vrf_id_t);
-
-extern int ripng_network_write (struct vty *, int);
-
-extern struct ripng_info *ripng_ecmp_add (struct ripng_info *);
-extern struct ripng_info *ripng_ecmp_replace (struct ripng_info *);
-extern struct ripng_info *ripng_ecmp_delete (struct ripng_info *);
+extern void ripng_zebra_stop(void);
+extern void ripng_redistribute_conf_update(int type);
+extern void ripng_redistribute_conf_delete(int type);
+
+extern void ripng_peer_init(void);
+extern void ripng_peer_update(struct sockaddr_in6 *, uint8_t);
+extern void ripng_peer_bad_route(struct sockaddr_in6 *);
+extern void ripng_peer_bad_packet(struct sockaddr_in6 *);
+extern void ripng_peer_display(struct vty *);
+extern struct ripng_peer *ripng_peer_lookup(struct in6_addr *);
+extern struct ripng_peer *ripng_peer_lookup_next(struct in6_addr *);
+
+extern struct ripng_offset_list *ripng_offset_list_new(const char *ifname);
+extern void ripng_offset_list_del(struct ripng_offset_list *offset);
+extern struct ripng_offset_list *ripng_offset_list_lookup(const char *ifname);
+extern struct ripng_offset_list *ripng_offset_list_lookup(const char *ifname);
+extern int ripng_offset_list_apply_in(struct prefix_ipv6 *, struct interface *,
+                                     uint8_t *);
+extern int ripng_offset_list_apply_out(struct prefix_ipv6 *, struct interface *,
+                                      uint8_t *);
+extern void ripng_offset_init(void);
+extern void ripng_offset_clean(void);
+
+extern int ripng_route_rte(struct ripng_info *rinfo);
+extern struct ripng_info *ripng_info_new(void);
+extern void ripng_info_free(struct ripng_info *rinfo);
+extern void ripng_event(enum ripng_event, int);
+extern int ripng_request(struct interface *ifp);
+extern void ripng_redistribute_add(int, int, struct prefix_ipv6 *, ifindex_t,
+                                  struct in6_addr *, route_tag_t);
+extern void ripng_redistribute_delete(int, int, struct prefix_ipv6 *,
+                                     ifindex_t);
+extern void ripng_redistribute_withdraw(int type);
+
+extern void ripng_ecmp_disable(void);
+extern void ripng_distribute_update_interface(struct interface *);
+extern void ripng_if_rmap_update_interface(struct interface *);
+
+extern void ripng_zebra_ipv6_add(struct agg_node *node);
+extern void ripng_zebra_ipv6_delete(struct agg_node *node);
+
+extern void ripng_redistribute_clean(void);
+extern int ripng_redistribute_check(int);
+extern void ripng_redistribute_write(struct vty *);
+
+extern int ripng_write_rte(int num, struct stream *s, struct prefix_ipv6 *p,
+                          struct in6_addr *nexthop, uint16_t tag,
+                          uint8_t metric);
+extern int ripng_send_packet(caddr_t buf, int bufsize, struct sockaddr_in6 *to,
+                            struct interface *ifp);
+
+extern void ripng_packet_dump(struct ripng_packet *packet, int size,
+                             const char *sndrcv);
+
+extern int ripng_interface_up(int command, struct zclient *, zebra_size_t,
+                             vrf_id_t);
+extern int ripng_interface_down(int command, struct zclient *, zebra_size_t,
+                               vrf_id_t);
+extern int ripng_interface_add(int command, struct zclient *, zebra_size_t,
+                              vrf_id_t);
+extern int ripng_interface_delete(int command, struct zclient *, zebra_size_t,
+                                 vrf_id_t);
+extern int ripng_interface_address_add(int command, struct zclient *,
+                                      zebra_size_t, vrf_id_t);
+extern int ripng_interface_address_delete(int command, struct zclient *,
+                                         zebra_size_t, vrf_id_t);
+
+extern int ripng_create(int socket);
+extern int ripng_make_socket(void);
+extern int ripng_network_write(struct vty *);
+
+extern struct ripng_info *ripng_ecmp_add(struct ripng_info *);
+extern struct ripng_info *ripng_ecmp_replace(struct ripng_info *);
+extern struct ripng_info *ripng_ecmp_delete(struct ripng_info *);
+
+/* Northbound. */
+extern void ripng_cli_init(void);
+extern const struct frr_yang_module_info frr_ripngd_info;
 
 #endif /* _ZEBRA_RIPNG_RIPNGD_H */