static void nhrp_zebra_connected(struct zclient *zclient) { zclient_send_reg_requests(zclient, VRF_DEFAULT); zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); }
void ospf6_asbr_external_lsa_refresh(void) { int type; if (ospf6 == NULL) return; for (type = 0; type < ZEBRA_ROUTE_MAX; type++) { if( (zclient->redist[type][0])&&(zclient->sock > 0) ) { zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, 0); zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type, 0); } } }
/* Send requests to zebra daemon for the information in a VRF. */ void zclient_send_requests (struct zclient *zclient, vrf_id_t vrf_id) { int i; /* zclient is disabled. */ if (! zclient->enable) return; /* If not connected to the zebra yet. */ if (zclient->sock < 0) return; if (zclient_debug) zlog_debug ("%s: send messages for VRF %u", __func__, vrf_id); /* We need router-id information. */ zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD, vrf_id); /* We need interface information. */ zebra_message_send (zclient, ZEBRA_INTERFACE_ADD, vrf_id); /* Set unwanted redistribute route. */ vrf_bitmap_set (zclient->redist[zclient->redist_default], vrf_id); /* Flush all redistribute request. */ for (i = 0; i < ZEBRA_ROUTE_MAX; i++) if (i != zclient->redist_default && vrf_bitmap_check (zclient->redist[i], vrf_id)) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, i, vrf_id); /* If default information is needed. */ if (vrf_bitmap_check (zclient->default_information, VRF_DEFAULT)) zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD, vrf_id); }
/* Make connection to zebra daemon. */ int zclient_start (struct zclient *zclient) { int i; if (zclient_debug) zlog_debug ("zclient_start is called"); /* zclient is disabled. */ if (! zclient->enable) return 0; /* If already connected to the zebra. */ if (zclient->sock >= 0) return 0; /* Check connect thread. */ if (zclient->t_connect) return 0; if (zclient_socket_connect(zclient) < 0) { if (zclient_debug) zlog_debug ("zclient connection fail"); zclient->fail++; zclient_event (ZCLIENT_CONNECT, zclient); return -1; } if (set_nonblocking(zclient->sock) < 0) zlog_warn("%s: set_nonblocking(%d) failed", __func__, zclient->sock); /* Clear fail count. */ zclient->fail = 0; if (zclient_debug) zlog_debug ("zclient connect success with socket [%d]", zclient->sock); /* Create read thread. */ zclient_event (ZCLIENT_READ, zclient); zebra_hello_send (zclient); /* We need router-id information. */ zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD); /* We need interface information. */ zebra_message_send (zclient, ZEBRA_INTERFACE_ADD); /* Flush all redistribute request. */ for (i = 0; i < ZEBRA_ROUTE_MAX; i++) if (i != zclient->redist_default && zclient->redist[i]) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, i); /* If default information is needed. */ if (zclient->default_information) zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD); return 0; }
void ospf6_zebra_no_redistribute (int type) { if (! zclient->redist[type]) return; zclient->redist[type] = 0; if (zclient->sock > 0) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type); }
void rip_redistribute_conf_delete(struct rip *rip, int type) { if (zclient->sock > 0) zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, type, 0, rip->vrf->vrf_id); /* Remove the routes from RIP table. */ rip_redistribute_withdraw(rip, type); }
void rip_redistribute_disable(struct rip *rip) { for (int i = 0; i < ZEBRA_ROUTE_MAX; i++) { if (!rip_redistribute_check(rip, i)) continue; zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, AFI_IP, i, 0, rip->vrf->vrf_id); } }
static int ripng_redistribute_unset (int type) { if (! zclient->redist[type]) return CMD_SUCCESS; zclient->redist[type] = 0; if (zclient->sock > 0) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type); ripng_redistribute_withdraw (type); return CMD_SUCCESS; }
void ospf6_zebra_no_redistribute (int type) { int top_change = 0; if (!zclient->redist[type]) return; if (ospf6_is_asbr (ospf6)) top_change = 1; zclient->redist[type] = 0; if (zclient->sock > 0) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient->sock, type); if (top_change) CALL_CHANGE_HOOK (&top_hook, ospf6); }
void zclient_redistribute (int command, struct zclient *zclient, int type) { if (command == ZEBRA_REDISTRIBUTE_ADD) { if (zclient->redist[type]) return; zclient->redist[type] = 1; } else { if (!zclient->redist[type]) return; zclient->redist[type] = 0; } if (zclient->sock > 0) zebra_redistribute_send (command, zclient, type); }
void ripng_redistribute_clean () { int i; for (i = 0; redist_type[i].str; i++) { if (zclient->redist[redist_type[i].type]) { if (zclient->sock > 0) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, redist_type[i].type); zclient->redist[redist_type[i].type] = 0; /* Remove the routes from RIPng table. */ ripng_redistribute_withdraw (redist_type[i].type); } } }
void zclient_redistribute (int command, struct zclient *zclient, int type, vrf_id_t vrf_id) { if (command == ZEBRA_REDISTRIBUTE_ADD) { if (vrf_bitmap_check (zclient->redist[type], vrf_id)) return; vrf_bitmap_set (zclient->redist[type], vrf_id); } else { if (!vrf_bitmap_check (zclient->redist[type], vrf_id)) return; vrf_bitmap_unset (zclient->redist[type], vrf_id); } if (zclient->sock > 0) zebra_redistribute_send (command, zclient, type, vrf_id); }
/* Unset redistribution. */ int bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type) { /* Unset flag from BGP instance. */ bgp->redist[afi][type] = 0; /* Unset route-map. */ if (bgp->rmap[afi][type].name) free (bgp->rmap[afi][type].name); bgp->rmap[afi][type].name = NULL; bgp->rmap[afi][type].map = NULL; /* Unset metric. */ bgp->redist_metric_flag[afi][type] = 0; bgp->redist_metric[afi][type] = 0; /* Return if zebra connection is disabled. */ if (! vrf_bitmap_check (zclient->redist[type], VRF_DEFAULT)) return CMD_WARNING; vrf_bitmap_unset (zclient->redist[type], VRF_DEFAULT); if (bgp->redist[AFI_IP][type] == 0 && bgp->redist[AFI_IP6][type] == 0 && zclient->sock >= 0) { /* Send distribute delete message to zebra. */ if (BGP_DEBUG(zebra, ZEBRA)) zlog_debug("Zebra send: redistribute delete %s", zebra_route_string(type)); zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type, VRF_DEFAULT); } /* Withdraw redistributed routes from current BGP's routing table. */ bgp_redistribute_withdraw (bgp, afi, type); return CMD_SUCCESS; }
/* Other routes redistribution into BGP. */ int bgp_redistribute_set (struct bgp *bgp, afi_t afi, int type) { /* Set flag to BGP instance. */ bgp->redist[afi][type] = 1; /* Return if already redistribute flag is set. */ if (zclient->redist[type]) return CMD_WARNING; zclient->redist[type] = 1; /* Return if zebra connection is not established. */ if (zclient->sock < 0) return CMD_WARNING; if (BGP_DEBUG(zebra, ZEBRA)) zlog_debug("Zebra send: redistribute add %s", zebra_route_string(type)); /* Send distribute add message to zebra. */ zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type); return CMD_SUCCESS; }
/* Make connection to zebra daemon. */ int #undef zclient zclient_start (struct_zclient *zclient) { int i; if (zclient_debug) zlog_debug ("zclient_start is called"); /* zclient is disabled. */ if (! zclient->enable) return 0; /* If already connected to the zebra. */ if (zclient->sock >= 0) return 0; /* Check connect thread. */ if (zclient->t_connect) return 0; /* Make socket. */ #ifdef HAVE_TCP_ZEBRA zclient->sock = zclient_socket (); #else zclient->sock = zclient_socket_un (ZEBRA_SERV_PATH); #endif /* HAVE_TCP_ZEBRA */ if (zclient->sock < 0) { if (zclient_debug) zlog_debug ("zclient connection fail"); zclient->fail++; zclient_event (ZCLIENT_CONNECT, zclient); return -1; } /* Clear fail count. */ zclient->fail = 0; if (zclient_debug) zlog_debug ("zclient connect success with socket [%d]", zclient->sock); /* Create read thread. */ zclient_event (ZCLIENT_READ, zclient); /* We need interface information. */ zebra_message_send (zclient, ZEBRA_INTERFACE_ADD); /* We need router-id information. */ zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD); /* Flush all redistribute request. */ for (i = 0; i < ZEBRA_ROUTE_MAX; i++) if (i != zclient->redist_default && zclient->redist[i]) zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient->sock, i); /* If default information is needed. */ if (zclient->default_information) zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD); return 0; }