diff options
| author | Karen Schoener <karen@voltanet.io> | 2020-07-22 12:10:59 -0400 | 
|---|---|---|
| committer | lynne <lynne@voltanet.io> | 2020-09-09 10:45:41 -0400 | 
| commit | e1894ff70f77f39ae993f875a96d6cb1282ffd1a (patch) | |
| tree | 2b626ddfa147660799e092679808e6e5fd6c055e /ldpd/ldp_zebra.c | |
| parent | f088c4e77db8d31d9d1c5f8f027acc84cde0b28d (diff) | |
ldpd: Adding support for LDP IGP Synchronization
Signed-off-by: Lynne Morrison <lynne@voltanet.io>
Signed-off-by: Karen Schoener <karen@voltanet.io>
Diffstat (limited to 'ldpd/ldp_zebra.c')
| -rw-r--r-- | ldpd/ldp_zebra.c | 110 | 
1 files changed, 107 insertions, 3 deletions
diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index d828fbe977..16e9adc9d9 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -31,6 +31,7 @@  #include "ldpd.h"  #include "ldpe.h"  #include "lde.h" +#include "ldp_sync.h"  #include "log.h"  #include "ldp_debug.h" @@ -46,6 +47,14 @@ static int	 ldp_zebra_read_pw_status_update(ZAPI_CALLBACK_ARGS);  static void	 ldp_zebra_connected(struct zclient *);  static void	 ldp_zebra_filter_update(struct access_list *access); +static void 	ldp_zebra_opaque_register(void); +static void 	ldp_zebra_opaque_unregister(void); +static int 	ldp_sync_zebra_send_announce(void); +static int 	ldp_zebra_opaque_msg_handler(ZAPI_CALLBACK_ARGS); +static void 	ldp_sync_zebra_start_hello_timer(void); +static int 	ldp_sync_zebra_hello(struct thread *thread); +static void 	ldp_sync_zebra_init(void); +  static struct zclient	*zclient;  static void @@ -103,6 +112,95 @@ pw2zpw(struct l2vpn_pw *pw, struct zapi_pw *zpw)  	    sizeof(zpw->data.ldp.vpn_name));  } +static void +ldp_zebra_opaque_register(void) +{ +	zclient_register_opaque(zclient, LDP_IGP_SYNC_IF_STATE_REQUEST); +} + +static void +ldp_zebra_opaque_unregister(void) +{ +	zclient_unregister_opaque(zclient, LDP_IGP_SYNC_IF_STATE_REQUEST); +} + +int +ldp_sync_zebra_send_state_update(struct ldp_igp_sync_if_state *state) +{ +        return zclient_send_opaque(zclient, LDP_IGP_SYNC_IF_STATE_UPDATE, +		(const uint8_t *) state, sizeof(*state)); +} + +static int +ldp_sync_zebra_send_announce(void) +{ +	struct ldp_igp_sync_announce announce; +	announce.proto = ZEBRA_ROUTE_LDP; + +        return zclient_send_opaque(zclient, LDP_IGP_SYNC_ANNOUNCE_UPDATE, +		(const uint8_t *) &announce, sizeof(announce)); +} + +static int +ldp_zebra_opaque_msg_handler(ZAPI_CALLBACK_ARGS) +{ +	struct stream *s; +	struct zapi_opaque_msg info; +	struct ldp_igp_sync_if_state_req state_req; + +        s = zclient->ibuf; + +        if (zclient_opaque_decode(s, &info) != 0) +                return -1; + +	switch (info.type) { +	case LDP_IGP_SYNC_IF_STATE_REQUEST: +		STREAM_GET(&state_req, s, sizeof(state_req)); +		main_imsg_compose_ldpe(IMSG_LDP_SYNC_IF_STATE_REQUEST, 0, &state_req, +			    sizeof(state_req)); +		break; +	default: +		break; +	} + +stream_failure: +        return 0; +} + +static void +ldp_sync_zebra_start_hello_timer(void) +{ +	thread_add_timer_msec(master, ldp_sync_zebra_hello, NULL, 250, NULL); +} + +static int +ldp_sync_zebra_hello(struct thread *thread) +{ +	static unsigned int sequence = 0; +	struct ldp_igp_sync_hello hello; + +	sequence++; + +	hello.proto = ZEBRA_ROUTE_LDP; +	hello.sequence = sequence; + +	zclient_send_opaque(zclient, LDP_IGP_SYNC_HELLO_UPDATE, +		(const uint8_t *) &hello, sizeof(hello)); + +	ldp_sync_zebra_start_hello_timer(); + +	return (0); +} + +static void +ldp_sync_zebra_init(void) +{ +	ldp_sync_zebra_send_announce(); + +	ldp_sync_zebra_start_hello_timer(); +} + +  static int  ldp_zebra_send_mpls_labels(int cmd, struct kroute *kr)  { @@ -299,7 +397,7 @@ ldp_ifp_destroy(struct interface *ifp)  }  static int -ldp_interface_status_change_helper(struct interface *ifp) +ldp_interface_status_change(struct interface *ifp)  {  	struct listnode		*node;  	struct connected	*ifc; @@ -330,12 +428,12 @@ ldp_interface_status_change_helper(struct interface *ifp)  static int ldp_ifp_up(struct interface *ifp)  { -	return ldp_interface_status_change_helper(ifp); +	return ldp_interface_status_change(ifp);  }  static int ldp_ifp_down(struct interface *ifp)  { -	return ldp_interface_status_change_helper(ifp); +	return ldp_interface_status_change(ifp);  }  static int @@ -525,6 +623,10 @@ ldp_zebra_connected(struct zclient *zclient)  	    ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT);  	zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6,  	    ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); + +	ldp_zebra_opaque_register(); + +	ldp_sync_zebra_init();  }  static void @@ -563,6 +665,7 @@ ldp_zebra_init(struct thread_master *master)  	zclient->redistribute_route_add = ldp_zebra_read_route;  	zclient->redistribute_route_del = ldp_zebra_read_route;  	zclient->pw_status_update = ldp_zebra_read_pw_status_update; +	zclient->opaque_msg_handler = ldp_zebra_opaque_msg_handler;  	/* Access list initialize. */  	access_list_add_hook(ldp_zebra_filter_update); @@ -572,6 +675,7 @@ ldp_zebra_init(struct thread_master *master)  void  ldp_zebra_destroy(void)  { +	ldp_zebra_opaque_unregister();  	zclient_stop(zclient);  	zclient_free(zclient);  	zclient = NULL;  | 
