Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lib, zebra: Allow for interface deletion when kernel event happens #5009

Merged
merged 8 commits into from
Sep 30, 2019
32 changes: 19 additions & 13 deletions babeld/babel_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,23 +104,14 @@ babel_interface_down (ZAPI_CALLBACK_ARGS)
return 0;
}

int
babel_interface_add (ZAPI_CALLBACK_ARGS)
int babel_ifp_create (struct interface *ifp)
{
struct interface *ifp = NULL;

debugf(BABEL_DEBUG_IF, "receive a 'interface add'");

/* read and add the interface in the iflist. */
ifp = zebra_interface_add_read (zclient->ibuf, vrf_id);

if (ifp == NULL) {
return 0;
}

interface_recalculate(ifp);
return 0;
}

return 0;
donaldsharp marked this conversation as resolved.
Show resolved Hide resolved
}

int
babel_interface_delete (ZAPI_CALLBACK_ARGS)
Expand Down Expand Up @@ -1260,6 +1251,21 @@ DEFUN (show_babel_parameters,
return CMD_SUCCESS;
}

int babel_ifp_up(struct interface *ifp)
{
return 0;
}

int babel_ifp_down(struct interface *ifp)
{
return 0;
}

int babel_ifp_destroy(struct interface *ifp)
{
return 0;
}

void
babel_if_init(void)
{
Expand Down
5 changes: 5 additions & 0 deletions babeld/babel_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ int babel_interface_delete (int, struct zclient *, zebra_size_t, vrf_id_t);
int babel_interface_address_add (int, struct zclient *, zebra_size_t, vrf_id_t);
int babel_interface_address_delete (int, struct zclient *, zebra_size_t, vrf_id_t);

int babel_ifp_create(struct interface *ifp);
int babel_ifp_up(struct interface *ifp);
int babel_ifp_down(struct interface *ifp);
int babel_ifp_destroy(struct interface *ifp);

unsigned jitter(babel_interface_nfo *, int);
unsigned update_jitter(babel_interface_nfo *babel_ifp, int urgent);
/* return "true" if "address" is one of our ipv6 addresses */
Expand Down
2 changes: 2 additions & 0 deletions babeld/babel_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ main(int argc, char **argv)
babel_replace_by_null(STDIN_FILENO);

/* init some quagga's dependencies, and babeld's commands */
if_zapi_callbacks(babel_ifp_create, babel_ifp_up,
babel_ifp_down, babel_ifp_destroy);
babeld_quagga_init();
/* init zebra client's structure and it's commands */
/* this replace kernel_setup && kernel_setup_socket */
Expand Down
1 change: 0 additions & 1 deletion babeld/babel_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,6 @@ void babelz_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_BABEL, 0, &babeld_privs);

zclient->zebra_connected = babel_zebra_connected;
zclient->interface_add = babel_interface_add;
zclient->interface_delete = babel_interface_delete;
zclient->interface_up = babel_interface_up;
zclient->interface_down = babel_interface_down;
Expand Down
28 changes: 13 additions & 15 deletions bfdd/ptm_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,20 +677,6 @@ static int bfdd_interface_update(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;

/*
* `zebra_interface_add_read` will handle the interface creation
* on `lib/if.c`. We'll use that data structure instead of
* rolling our own.
*/
if (cmd == ZEBRA_INTERFACE_ADD) {
ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);
if (ifp == NULL)
return 0;

bfdd_sessions_enable_interface(ifp);
return 0;
}

/* Update interface information. */
ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
if (ifp == NULL)
Expand Down Expand Up @@ -756,8 +742,21 @@ static int bfdd_interface_address_update(ZAPI_CALLBACK_ARGS)
return 0;
}

static int bfd_ifp_create(struct interface *ifp)
{
bfdd_sessions_enable_interface(ifp);

return 0;
}

static int bfd_ifp_destroy(struct interface *ifp)
{
return 0;
}

void bfdd_zclient_init(struct zebra_privs_t *bfdd_priv)
{
if_zapi_callbacks(bfd_ifp_create, NULL, NULL, bfd_ifp_destroy);
zclient = zclient_new(master, &zclient_options_default);
assert(zclient != NULL);
zclient_init(zclient, ZEBRA_ROUTE_BFD, 0, bfdd_priv);
Expand All @@ -773,7 +772,6 @@ void bfdd_zclient_init(struct zebra_privs_t *bfdd_priv)
zclient->zebra_connected = bfdd_zebra_connected;

/* Learn interfaces from zebra instead of the OS. */
zclient->interface_add = bfdd_interface_update;
zclient->interface_delete = bfdd_interface_update;

/* Learn about interface VRF. */
Expand Down
59 changes: 35 additions & 24 deletions bgpd/bgp_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,29 +202,6 @@ static void bgp_nbr_connected_delete(struct bgp *bgp, struct nbr_connected *ifc,
}
}

/* Inteface addition message from zebra. */
static int bgp_interface_add(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
struct bgp *bgp;

ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);
if (!ifp) // unexpected
return 0;

if (BGP_DEBUG(zebra, ZEBRA) && ifp)
zlog_debug("Rx Intf add VRF %u IF %s", vrf_id, ifp->name);

bgp = bgp_lookup_by_vrf_id(vrf_id);
if (!bgp)
return 0;

bgp_mac_add_mac_entry(ifp);

bgp_update_interface_nbrs(bgp, ifp, ifp);
return 0;
}

static int bgp_interface_delete(ZAPI_CALLBACK_ARGS)
{
struct stream *s;
Expand Down Expand Up @@ -2721,16 +2698,50 @@ static void bgp_zebra_process_label_chunk(ZAPI_CALLBACK_ARGS)

extern struct zebra_privs_t bgpd_privs;

static int bgp_ifp_create(struct interface *ifp)
{
struct bgp *bgp;

if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("Rx Intf add VRF %u IF %s", ifp->vrf_id, ifp->name);

bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
if (!bgp)
return 0;

bgp_mac_add_mac_entry(ifp);

bgp_update_interface_nbrs(bgp, ifp, ifp);
return 0;
}

static int bgp_ifp_up(struct interface *ifp)
{
return 0;
}

static int bgp_ifp_down(struct interface *ifp)
{
return 0;
}

static int bgp_ifp_destroy(struct interface *ifp)
{
return 0;
}

void bgp_zebra_init(struct thread_master *master, unsigned short instance)
{
zclient_num_connects = 0;

if_zapi_callbacks(bgp_ifp_create, bgp_ifp_up,
bgp_ifp_down, bgp_ifp_destroy);

/* Set default values. */
zclient = zclient_new(master, &zclient_options_default);
zclient_init(zclient, ZEBRA_ROUTE_BGP, 0, &bgpd_privs);
zclient->zebra_connected = bgp_zebra_connected;
zclient->router_id_update = bgp_router_id_update;
zclient->interface_add = bgp_interface_add;
zclient->interface_delete = bgp_interface_delete;
zclient->interface_address_add = bgp_interface_address_add;
zclient->interface_address_delete = bgp_interface_address_delete;
Expand Down
31 changes: 31 additions & 0 deletions eigrpd/eigrp_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,41 @@ int eigrp_if_delete_hook(struct interface *ifp)
return 0;
}

static int eigrp_ifp_create(struct interface *ifp)
{
struct eigrp_interface *ei = ifp->info;

if (!ei)
return 0;

ei->params.type = eigrp_default_iftype(ifp);

eigrp_if_update(ifp);

return 0;
}

static int eigrp_ifp_up(struct interface *ifp)
{
return 0;
}

static int eigrp_ifp_down(struct interface *ifp)
{
return 0;
}

static int eigrp_ifp_destroy(struct interface *ifp)
{
return 0;
}

struct list *eigrp_iflist;

void eigrp_if_init(void)
{
if_zapi_callbacks(eigrp_ifp_create, eigrp_ifp_up,
eigrp_ifp_down, eigrp_ifp_destroy);
/* Initialize Zebra interface data structure. */
// hook_register_prio(if_add, 0, eigrp_if_new);
hook_register_prio(if_del, 0, eigrp_if_delete_hook);
Expand Down
1 change: 0 additions & 1 deletion eigrpd/eigrp_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,4 @@ extern uint32_t eigrp_scaled_to_bandwidth(uint32_t);
extern uint32_t eigrp_delay_to_scaled(uint32_t);
extern uint32_t eigrp_scaled_to_delay(uint32_t);


#endif /* ZEBRA_EIGRP_INTERFACE_H_ */
22 changes: 0 additions & 22 deletions eigrpd/eigrp_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@
#include "eigrpd/eigrp_topology.h"
#include "eigrpd/eigrp_fsm.h"

static int eigrp_interface_add(ZAPI_CALLBACK_ARGS);
static int eigrp_interface_delete(ZAPI_CALLBACK_ARGS);
static int eigrp_interface_address_add(ZAPI_CALLBACK_ARGS);
static int eigrp_interface_address_delete(ZAPI_CALLBACK_ARGS);
Expand Down Expand Up @@ -114,7 +113,6 @@ void eigrp_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);
zclient->zebra_connected = eigrp_zebra_connected;
zclient->router_id_update = eigrp_router_id_update_zebra;
zclient->interface_add = eigrp_interface_add;
zclient->interface_delete = eigrp_interface_delete;
zclient->interface_up = eigrp_interface_state_up;
zclient->interface_down = eigrp_interface_state_down;
Expand Down Expand Up @@ -151,26 +149,6 @@ static int eigrp_zebra_read_route(ZAPI_CALLBACK_ARGS)
return 0;
}

/* Inteface addition message from zebra. */
static int eigrp_interface_add(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
struct eigrp_interface *ei;

ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);

if (!ifp->info)
return 0;

ei = ifp->info;

ei->params.type = eigrp_default_iftype(ifp);

eigrp_if_update(ifp);

return 0;
}

static int eigrp_interface_delete(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
Expand Down
30 changes: 30 additions & 0 deletions isisd/isis_circuit.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@

DEFINE_QOBJ_TYPE(isis_circuit)

DEFINE_HOOK(isis_if_new_hook, (struct interface *ifp), (ifp))

/*
* Prototypes.
*/
Expand Down Expand Up @@ -1389,6 +1391,32 @@ int isis_if_delete_hook(struct interface *ifp)
return 0;
}

static int isis_ifp_create(struct interface *ifp)
{
if (if_is_operative(ifp))
isis_csm_state_change(IF_UP_FROM_Z, circuit_scan_by_ifp(ifp),
ifp);

hook_call(isis_if_new_hook, ifp);

return 0;
}

static int isis_ifp_up(struct interface *ifp)
{
return 0;
}

static int isis_ifp_down(struct interface *ifp)
{
return 0;
}

static int isis_ifp_destroy(struct interface *ifp)
{
return 0;
}

void isis_circuit_init(void)
{
/* Initialize Zebra interface data structure */
Expand All @@ -1398,4 +1426,6 @@ void isis_circuit_init(void)
/* Install interface node */
install_node(&interface_node, isis_interface_config_write);
if_cmd_init();
if_zapi_callbacks(isis_ifp_create, isis_ifp_up,
isis_ifp_down, isis_ifp_destroy);
}
2 changes: 2 additions & 0 deletions isisd/isis_circuit.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
#include "isis_constants.h"
#include "isis_common.h"

DECLARE_HOOK(isis_if_new_hook, (struct interface *ifp), (ifp));

struct isis_lsp;

struct password {
Expand Down
18 changes: 0 additions & 18 deletions isisd/isis_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@

struct zclient *zclient = NULL;

DEFINE_HOOK(isis_if_new_hook, (struct interface *ifp), (ifp))

/* Router-id update message from zebra. */
static int isis_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
{
Expand All @@ -74,21 +72,6 @@ static int isis_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
return 0;
}

static int isis_zebra_if_add(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;

ifp = zebra_interface_add_read(zclient->ibuf, vrf_id);

if (if_is_operative(ifp))
isis_csm_state_change(IF_UP_FROM_Z, circuit_scan_by_ifp(ifp),
ifp);

hook_call(isis_if_new_hook, ifp);

return 0;
}

static int isis_zebra_if_del(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
Expand Down Expand Up @@ -388,7 +371,6 @@ void isis_zebra_init(struct thread_master *master)
zclient_init(zclient, PROTO_TYPE, 0, &isisd_privs);
zclient->zebra_connected = isis_zebra_connected;
zclient->router_id_update = isis_router_id_update_zebra;
zclient->interface_add = isis_zebra_if_add;
zclient->interface_delete = isis_zebra_if_del;
zclient->interface_up = isis_zebra_if_state_up;
zclient->interface_down = isis_zebra_if_state_down;
Expand Down
Loading