#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
#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
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;
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
#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 */