Index | Thread | Search

From:
Theo Buehler <tb@theobuehler.org>
Subject:
Re: bgpd: fix session_notification
To:
tech@openbsd.org
Date:
Tue, 9 Apr 2024 17:47:37 +0200

Download raw body.

Thread
On Tue, Apr 09, 2024 at 05:41:12PM +0200, Claudio Jeker wrote:
> The early exit in session_notification no longer works since I moved the
> clearing of last_sent_errcode when the session goes into ESTABLISHED
> state. So if there is an error in the early phase of session establishment
> (e.g. capability negotiation) then this only works the first time.
> 
> Instead of checking the last_sent_errcode look at the session state to
> know if it makes sense to issue a notification or not.
> 
> I added a log_notification() in the early exit case just to know it
> happened. Maybe that should be removed (depending how often this early
> exit path is taken).

Let's see.

ok tb

> 
> -- 
> :wq Claudio
> 
> Index: session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
> diff -u -p -r1.468 session.c
> --- session.c	9 Apr 2024 09:03:18 -0000	1.468
> +++ session.c	9 Apr 2024 15:32:45 -0000
> @@ -1720,8 +1720,16 @@ session_notification(struct peer *p, uin
>  	int			 errs = 0;
>  	size_t			 datalen = 0;
>  
> -	if (p->stats.last_sent_errcode)	/* some notification already sent */
> +	switch (p->state) {
> +	case STATE_OPENSENT:
> +	case STATE_OPENCONFIRM:
> +	case STATE_ESTABLISHED:
> +		break;
> +	default:
> +		/* session not open, no need to send notification */
> +		log_notification(p, errcode, subcode, ibuf, "dropping");
>  		return;
> +	}
>  
>  	log_notification(p, errcode, subcode, ibuf, "sending");
>  
>