diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2021-03-10 17:31:57 +0300 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2021-03-16 22:14:57 +0300 | 
| commit | 4df3e31c3d09f83340e7c1a0d7645d0bdddcb68f (patch) | |
| tree | 01b36a351e9a10d91d25d5dd802bb7f09a69108c /bfdd/bfdd_nb_config.c | |
| parent | 81ef5048dd229570f27c524d6d6268caecf3b663 (diff) | |
bfdd: separate echo rx/tx timers
Currently there is a single interval for both RX and TX echo functions.
This commit introduces separate RX and TX timers for echo packets.
The main advantage is to be able to set the receive interval to zero
when we don't want to receive echo packets from the remote system.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to 'bfdd/bfdd_nb_config.c')
| -rw-r--r-- | bfdd/bfdd_nb_config.c | 83 | 
1 files changed, 81 insertions, 2 deletions
diff --git a/bfdd/bfdd_nb_config.c b/bfdd/bfdd_nb_config.c index c8dd5cc3f6..26bce4f357 100644 --- a/bfdd/bfdd_nb_config.c +++ b/bfdd/bfdd_nb_config.c @@ -483,17 +483,57 @@ int bfdd_bfd_profile_echo_mode_modify(struct nb_cb_modify_args *args)  }  /* - * XPath: /frr-bfdd:bfdd/bfd/profile/desired-echo-echo-transmission-interval + * XPath: /frr-bfdd:bfdd/bfd/profile/desired-echo-transmission-interval   */  int bfdd_bfd_profile_desired_echo_transmission_interval_modify(  	struct nb_cb_modify_args *args)  {  	struct bfd_profile *bp; +	uint32_t min_tx; + +	switch (args->event) { +	case NB_EV_VALIDATE: +		min_tx = yang_dnode_get_uint32(args->dnode, NULL); +		if (min_tx < 10000 || min_tx > 60000000) +			return NB_ERR_VALIDATION; +		break; + +	case NB_EV_PREPARE: +		/* NOTHING */ +		break; + +	case NB_EV_APPLY: +		min_tx = yang_dnode_get_uint32(args->dnode, NULL); +		bp = nb_running_get_entry(args->dnode, NULL, true); +		if (bp->min_echo_tx == min_tx) +			return NB_OK; + +		bp->min_echo_tx = min_tx; +		bfd_profile_update(bp); +		break; + +	case NB_EV_ABORT: +		/* NOTHING */ +		break; +	} + +	return NB_OK; +} + +/* + * XPath: /frr-bfdd:bfdd/bfd/profile/required-echo-receive-interval + */ +int bfdd_bfd_profile_required_echo_receive_interval_modify( +	struct nb_cb_modify_args *args) +{ +	struct bfd_profile *bp;  	uint32_t min_rx;  	switch (args->event) {  	case NB_EV_VALIDATE:  		min_rx = yang_dnode_get_uint32(args->dnode, NULL); +		if (min_rx == 0) +			return NB_OK;  		if (min_rx < 10000 || min_rx > 60000000)  			return NB_ERR_VALIDATION;  		break; @@ -789,7 +829,46 @@ int bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify(  	case NB_EV_APPLY:  		bs = nb_running_get_entry(args->dnode, NULL, true); -		if (echo_interval == bs->timers.required_min_echo) +		if (echo_interval == bs->timers.desired_min_echo_tx) +			return NB_OK; + +		bs->peer_profile.min_echo_tx = echo_interval; +		bfd_session_apply(bs); +		break; + +	case NB_EV_ABORT: +		/* NOTHING */ +		break; +	} + +	return NB_OK; +} + +/* + * XPath: + * /frr-bfdd:bfdd/bfd/sessions/single-hop/required-echo-receive-interval + */ +int bfdd_bfd_sessions_single_hop_required_echo_receive_interval_modify( +	struct nb_cb_modify_args *args) +{ +	uint32_t echo_interval = yang_dnode_get_uint32(args->dnode, NULL); +	struct bfd_session *bs; + +	switch (args->event) { +	case NB_EV_VALIDATE: +		if (echo_interval == 0) +                        return NB_OK; +		if (echo_interval < 10000 || echo_interval > 60000000) +			return NB_ERR_VALIDATION; +		break; + +	case NB_EV_PREPARE: +		/* NOTHING */ +		break; + +	case NB_EV_APPLY: +		bs = nb_running_get_entry(args->dnode, NULL, true); +		if (echo_interval == bs->timers.required_min_echo_rx)  			return NB_OK;  		bs->peer_profile.min_echo_rx = echo_interval;  | 
