mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-02 18:56:53 +00:00

The problem is that zclient->redist[ZEBRA_ROUTE_MAX] used for storing a client’s redist state, has no address-family qualification. This means a client can only store its interest in a protocol (connected, static etc.), but cant choose IPv4 or ipv6 with that. This hindered implementation on client sides to manage redistribution of ipv4 and ipv6 both. BGP's redistribution of protocols like connected/static is one such place. One fix could be to overload this and flap the redist connection each time any new afi is added for redist, but that may have side-effects on the existing afi redist. The cleaner way is to modify redist data-structure to also take AFI, and adjust routines that deal with it, so that a client can register for a protocol redistribution based on the AFI. BGP already maintains redistribution state based on afi and protocol (bgp->redist[AFI_MAX][ZEBRA_ROUTE_MAX]). This patch takes care of filling up the gap in zclient/zserv redistribution state to also use AFI qualification. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
169 lines
4.8 KiB
C
169 lines
4.8 KiB
C
/* Zebra daemon server header.
|
|
* Copyright (C) 1997, 98 Kunihiro Ishiguro
|
|
*
|
|
* This file is part of GNU Zebra.
|
|
*
|
|
* GNU Zebra is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
* later version.
|
|
*
|
|
* GNU Zebra is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef _ZEBRA_ZSERV_H
|
|
#define _ZEBRA_ZSERV_H
|
|
|
|
#include "rib.h"
|
|
#include "if.h"
|
|
#include "workqueue.h"
|
|
#include "routemap.h"
|
|
#include "zclient.h"
|
|
|
|
/* Default port information. */
|
|
#define ZEBRA_VTY_PORT 2601
|
|
|
|
/* Default configuration filename. */
|
|
#define DEFAULT_CONFIG_FILE "zebra.conf"
|
|
|
|
#define ZEBRA_RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
|
|
|
|
/* Client structure. */
|
|
struct zserv
|
|
{
|
|
/* Client file descriptor. */
|
|
int sock;
|
|
|
|
/* Input/output buffer to the client. */
|
|
struct stream *ibuf;
|
|
struct stream *obuf;
|
|
|
|
/* Buffer of data waiting to be written to client. */
|
|
struct buffer *wb;
|
|
|
|
/* Threads for read/write. */
|
|
struct thread *t_read;
|
|
struct thread *t_write;
|
|
|
|
/* Thread for delayed close. */
|
|
struct thread *t_suicide;
|
|
|
|
/* default routing table this client munges */
|
|
int rtm_table;
|
|
|
|
/* This client's redistribute flag. */
|
|
struct redist_proto redist[AFI_MAX][ZEBRA_ROUTE_MAX];
|
|
|
|
/* Redistribute default route flag. */
|
|
u_char redist_default;
|
|
|
|
/* Interface information. */
|
|
u_char ifinfo;
|
|
|
|
/* Router-id information. */
|
|
u_char ridinfo;
|
|
|
|
/* client's protocol */
|
|
u_char proto;
|
|
u_short instance;
|
|
|
|
/* Statistics */
|
|
u_int32_t redist_v4_add_cnt;
|
|
u_int32_t redist_v4_del_cnt;
|
|
u_int32_t redist_v6_add_cnt;
|
|
u_int32_t redist_v6_del_cnt;
|
|
u_int32_t v4_route_add_cnt;
|
|
u_int32_t v4_route_upd8_cnt;
|
|
u_int32_t v4_route_del_cnt;
|
|
u_int32_t v6_route_add_cnt;
|
|
u_int32_t v6_route_del_cnt;
|
|
u_int32_t v6_route_upd8_cnt;
|
|
u_int32_t connected_rt_add_cnt;
|
|
u_int32_t connected_rt_del_cnt;
|
|
u_int32_t ifup_cnt;
|
|
u_int32_t ifdown_cnt;
|
|
u_int32_t ifadd_cnt;
|
|
u_int32_t ifdel_cnt;
|
|
u_int32_t if_bfd_cnt;
|
|
|
|
time_t connect_time;
|
|
time_t last_read_time;
|
|
time_t last_write_time;
|
|
time_t nh_reg_time;
|
|
time_t nh_dereg_time;
|
|
time_t nh_last_upd_time;
|
|
|
|
int last_read_cmd;
|
|
int last_write_cmd;
|
|
};
|
|
|
|
/* Zebra instance */
|
|
struct zebra_t
|
|
{
|
|
/* Thread master */
|
|
struct thread_master *master;
|
|
struct list *client_list;
|
|
|
|
/* default table */
|
|
int rtm_table_default;
|
|
|
|
/* rib work queue */
|
|
struct work_queue *ribq;
|
|
struct meta_queue *mq;
|
|
};
|
|
|
|
/* Count prefix size from mask length */
|
|
#define PSIZE(a) (((a) + 7) / (8))
|
|
|
|
/* Prototypes. */
|
|
extern void zebra_init (void);
|
|
extern void zebra_if_init (void);
|
|
extern void zebra_zserv_socket_init (char *path);
|
|
extern void hostinfo_get (void);
|
|
extern void rib_init (void);
|
|
extern void interface_list (void);
|
|
extern void kernel_init (void);
|
|
extern void route_read (void);
|
|
extern void zebra_route_map_init (void);
|
|
extern void zebra_snmp_init (void);
|
|
extern void zebra_vty_init (void);
|
|
|
|
extern int zsend_interface_add (struct zserv *, struct interface *);
|
|
extern int zsend_interface_delete (struct zserv *, struct interface *);
|
|
extern int zsend_interface_address (int, struct zserv *, struct interface *,
|
|
struct connected *);
|
|
extern void nbr_connected_replacement_add_ipv6 (struct interface *,
|
|
struct in6_addr *, u_char);
|
|
extern void nbr_connected_delete_ipv6 (struct interface *, struct in6_addr *, u_char);
|
|
extern int zsend_interface_update (int, struct zserv *, struct interface *);
|
|
extern int zsend_route_multipath (int, struct zserv *, struct prefix *,
|
|
struct rib *);
|
|
extern int zsend_router_id_update(struct zserv *, struct prefix *);
|
|
extern int zsend_interface_bfd_update(int, struct zserv *, struct interface *,
|
|
struct prefix *);
|
|
extern pid_t pid;
|
|
|
|
extern void zserv_create_header(struct stream *s, uint16_t cmd);
|
|
extern int zebra_server_send_message(struct zserv *client);
|
|
|
|
extern void zebra_route_map_write_delay_timer(struct vty *);
|
|
extern route_map_result_t zebra_route_map_check (int family, int rib_type,
|
|
struct prefix *p,
|
|
struct nexthop *nexthop,
|
|
u_short tag);
|
|
extern route_map_result_t zebra_nht_route_map_check (int family,
|
|
int client_proto,
|
|
struct prefix *p,
|
|
struct rib *,
|
|
struct nexthop *nexthop);
|
|
|
|
#endif /* _ZEBRA_ZEBRA_H */
|