Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: rtr set TOS and TCP_NODELAY before connect
To:
tech@openbsd.org
Date:
Mon, 30 Sep 2024 11:09:03 +0200

Download raw body.

Thread
Move the setsockopts() for the rtr sockets up before calling connect().
Right now those functions are probably never called because connect()
returns EWOULDBLOCK and exits early.

Also it makes sense to use the right TOS already for the inital SYN
packet.

-- 
:wq Claudio

Index: bgpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
diff -u -p -r1.267 bgpd.c
--- bgpd.c	4 Sep 2024 15:06:36 -0000	1.267
+++ bgpd.c	30 Sep 2024 09:04:53 -0000
@@ -1381,6 +1381,29 @@ bgpd_rtr_connect(struct rtr_config *r)
 		return;
 	}
 
+	switch (r->remote_addr.aid) {
+	case AID_INET:
+		if (setsockopt(ce->fd, IPPROTO_IP, IP_TOS, &pre, sizeof(pre)) ==
+		    -1) {
+			log_warn("rtr %s: setsockopt IP_TOS", r->descr);
+			return;
+		}
+		break;
+	case AID_INET6:
+		if (setsockopt(ce->fd, IPPROTO_IPV6, IPV6_TCLASS, &pre,
+		    sizeof(pre)) == -1) {
+			log_warn("rtr %s: setsockopt IP_TOS", r->descr);
+			return;
+		}
+		break;
+	}
+
+	if (setsockopt(ce->fd, IPPROTO_TCP, TCP_NODELAY, &nodelay,
+	    sizeof(nodelay)) == -1) {
+		log_warn("rtr %s: setsockopt TCP_NODELAY", r->descr);
+		return;
+	}
+
 	if ((sa = addr2sa(&r->local_addr, 0, &len)) != NULL) {
 		if (bind(ce->fd, sa, len) == -1) {
 			log_warn("rtr %s: bind to %s", r->descr,
@@ -1402,29 +1425,6 @@ bgpd_rtr_connect(struct rtr_config *r)
 		}
 		TAILQ_INSERT_TAIL(&connect_queue, ce, entry);
 		connect_cnt++;
-		return;
-	}
-
-	switch (r->remote_addr.aid) {
-	case AID_INET:
-		if (setsockopt(ce->fd, IPPROTO_IP, IP_TOS, &pre, sizeof(pre)) ==
-		    -1) {
-			log_warn("rtr %s: setsockopt IP_TOS", r->descr);
-			return;
-		}
-		break;
-	case AID_INET6:
-		if (setsockopt(ce->fd, IPPROTO_IPV6, IPV6_TCLASS, &pre,
-		    sizeof(pre)) == -1) {
-			log_warn("rtr %s: setsockopt IP_TOS", r->descr);
-			return;
-		}
-		break;
-	}
-
-	if (setsockopt(ce->fd, IPPROTO_TCP, TCP_NODELAY, &nodelay,
-	    sizeof(nodelay)) == -1) {
-		log_warn("rtr %s: setsockopt TCP_NODELAY", r->descr);
 		return;
 	}