Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Jun 2021 19:28:49 GMT
From:      Lutz Donnerhacke <donner@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 1178dda53d10 - main - libalias: Restructure - Table for PPTP
Message-ID:  <202106191928.15JJSnYv000134@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by donner:

URL: https://cgit.FreeBSD.org/src/commit/?id=1178dda53d10b096e0b99e356d15b7c24390e099

commit 1178dda53d10b096e0b99e356d15b7c24390e099
Author:     Lutz Donnerhacke <donner@FreeBSD.org>
AuthorDate: 2021-05-27 18:27:25 +0000
Commit:     Lutz Donnerhacke <donner@FreeBSD.org>
CommitDate: 2021-06-19 19:26:31 +0000

    libalias: Restructure - Table for PPTP
    
    Let PPTP use its own data structure.
    Regroup and rename other lists, which are not PPTP.
    
    MFC after:      1 week
    Differential Revision: https://reviews.freebsd.org/D30580
---
 sys/netinet/libalias/alias_db.c    | 353 +++++++++++++++++++------------------
 sys/netinet/libalias/alias_local.h |   1 +
 2 files changed, 187 insertions(+), 167 deletions(-)

diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c
index 3dae7ac72645..5f199394eb99 100644
--- a/sys/netinet/libalias/alias_db.c
+++ b/sys/netinet/libalias/alias_db.c
@@ -322,8 +322,15 @@ struct alias_link {
 	int		sockfd;		/* socket descriptor */
 #endif
 	/* Linked list of pointers for input and output lookup tables  */
-	LIST_ENTRY    (alias_link) list_out;
-	LIST_ENTRY    (alias_link) list_in;
+	union {
+		struct {
+			LIST_ENTRY(alias_link) in;
+			LIST_ENTRY(alias_link) out;
+		} all;
+		struct {
+			LIST_ENTRY(alias_link) list;
+		} pptp;
+	};
 	struct {
 		TAILQ_ENTRY(alias_link) list;
 		int	time;	/* Expire time for link */
@@ -416,8 +423,7 @@ StartPointIn(struct libalias *la,
 	struct group_in *grp, *tmp;
 
 	n = alias_addr.s_addr;
-	if (link_type != LINK_PPTP)
-		n += alias_port;
+	n += alias_port;
 	n += link_type;
 	n %= LINK_TABLE_IN_SIZE;
 
@@ -451,10 +457,8 @@ StartPointOut(struct in_addr src_addr, struct in_addr dst_addr,
 
 	n = src_addr.s_addr;
 	n += dst_addr.s_addr;
-	if (link_type != LINK_PPTP) {
-		n += src_port;
-		n += dst_port;
-	}
+	n += src_port;
+	n += dst_port;
 	n += link_type;
 
 	return (n % LINK_TABLE_OUT_SIZE);
@@ -835,7 +839,6 @@ static void
 CleanupAliasData(struct libalias *la)
 {
 	struct alias_link *lnk, *lnk_tmp;
-	struct group_in *grp, *grp_tmp;
 	u_int i;
 
 	LIBALIAS_LOCK_ASSERT(la);
@@ -844,12 +847,15 @@ CleanupAliasData(struct libalias *la)
 	TAILQ_FOREACH_SAFE(lnk, &la->checkExpire, expire.list, lnk_tmp)
 		DeleteLink(&lnk);
 
-	for (i = 0; i < LINK_TABLE_IN_SIZE; i++)
+	for (i = 0; i < LINK_TABLE_IN_SIZE; i++) {
+		struct group_in *grp, *grp_tmp;
+
 		LIST_FOREACH_SAFE(grp, &la->groupTableIn[i], group_in, grp_tmp)
 			if (LIST_EMPTY(&grp->full) && LIST_EMPTY(&grp->partial)) {
 				LIST_REMOVE(grp, group_in);
 				free(grp);
 			}
+	}
 }
 
 static void
@@ -896,23 +902,30 @@ DeleteLink(struct alias_link **plnk)
 	ClearFWHole(lnk);
 #endif
 
-	/* Free memory allocated for LSNAT server pool */
-	if (lnk->server != NULL) {
-		struct server *head, *curr, *next;
+	switch (lnk->link_type) {
+	case LINK_PPTP:
+		LIST_REMOVE(lnk, pptp.list);
+		break;
+	default:
+		/* Free memory allocated for LSNAT server pool */
+		if (lnk->server != NULL) {
+			struct server *head, *curr, *next;
+
+			head = curr = lnk->server;
+			do {
+				next = curr->next;
+				free(curr);
+			} while ((curr = next) != head);
+		} else {
+			/* Adjust output table pointers */
+			LIST_REMOVE(lnk, all.out);
+		}
 
-		head = curr = lnk->server;
-		do {
-			next = curr->next;
-			free(curr);
-		} while ((curr = next) != head);
-	} else {
-		/* Adjust output table pointers */
-		LIST_REMOVE(lnk, list_out);
+		/* Adjust input table pointers */
+		LIST_REMOVE(lnk, all.in);
+		break;
 	}
 
-	/* Adjust input table pointers */
-	LIST_REMOVE(lnk, list_in);
-
 	/* remove from housekeeping */
 	TAILQ_REMOVE(&la->checkExpire, lnk, expire.list);
 
@@ -970,119 +983,128 @@ AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr,
 {
 	u_int start_point;
 	struct alias_link *lnk;
-	struct group_in *grp_in;
 
 	LIBALIAS_LOCK_ASSERT(la);
 
 	lnk = malloc(sizeof(struct alias_link));
-	if (lnk != NULL) {
-		/* Basic initialization */
-		lnk->la = la;
-		lnk->src_addr = src_addr;
-		lnk->dst_addr = dst_addr;
-		lnk->alias_addr = alias_addr;
-		lnk->proxy_addr.s_addr = INADDR_ANY;
-		lnk->src_port = src_port;
-		lnk->dst_port = dst_port;
-		lnk->proxy_port = 0;
-		lnk->server = NULL;
-		lnk->link_type = link_type;
+	if (lnk == NULL) {
+#ifdef LIBALIAS_DEBUG
+		fprintf(stderr, "PacketAlias/AddLink(): ");
+		fprintf(stderr, "malloc() call failed.\n");
+#endif
+		return (NULL);
+	}
+	/* Basic initialization */
+	lnk->la = la;
+	lnk->src_addr = src_addr;
+	lnk->dst_addr = dst_addr;
+	lnk->alias_addr = alias_addr;
+	lnk->proxy_addr.s_addr = INADDR_ANY;
+	lnk->src_port = src_port;
+	lnk->dst_port = dst_port;
+	lnk->proxy_port = 0;
+	lnk->server = NULL;
+	lnk->link_type = link_type;
 #ifndef NO_USE_SOCKETS
-		lnk->sockfd = -1;
+	lnk->sockfd = -1;
 #endif
-		lnk->flags = 0;
-		lnk->pflags = 0;
-		lnk->timestamp = LibAliasTime;
+	lnk->flags = 0;
+	lnk->pflags = 0;
+	lnk->timestamp = LibAliasTime;
 
-		/* Expiration time */
-		switch (link_type) {
-		case LINK_ICMP:
-			lnk->expire.time = ICMP_EXPIRE_TIME;
-			break;
-		case LINK_UDP:
-			lnk->expire.time = UDP_EXPIRE_TIME;
-			break;
-		case LINK_TCP:
-			lnk->expire.time = TCP_EXPIRE_INITIAL;
-			break;
-		case LINK_PPTP:
-			lnk->flags |= LINK_PERMANENT;	/* no timeout. */
-			break;
-		case LINK_FRAGMENT_ID:
-			lnk->expire.time = FRAGMENT_ID_EXPIRE_TIME;
-			break;
-		case LINK_FRAGMENT_PTR:
-			lnk->expire.time = FRAGMENT_PTR_EXPIRE_TIME;
-			break;
-		case LINK_ADDR:
-			break;
-		default:
-			lnk->expire.time = PROTO_EXPIRE_TIME;
-			break;
-		}
+	/* Expiration time */
+	switch (link_type) {
+	case LINK_ICMP:
+		lnk->expire.time = ICMP_EXPIRE_TIME;
+		break;
+	case LINK_UDP:
+		lnk->expire.time = UDP_EXPIRE_TIME;
+		break;
+	case LINK_TCP:
+		lnk->expire.time = TCP_EXPIRE_INITIAL;
+		break;
+	case LINK_FRAGMENT_ID:
+		lnk->expire.time = FRAGMENT_ID_EXPIRE_TIME;
+		break;
+	case LINK_FRAGMENT_PTR:
+		lnk->expire.time = FRAGMENT_PTR_EXPIRE_TIME;
+		break;
+	case LINK_ADDR:
+		break;
+	default:
+		lnk->expire.time = PROTO_EXPIRE_TIME;
+		break;
+	}
 
-		/* Determine alias flags */
-		if (dst_addr.s_addr == INADDR_ANY)
-			lnk->flags |= LINK_UNKNOWN_DEST_ADDR;
-		if (dst_port == 0)
-			lnk->flags |= LINK_UNKNOWN_DEST_PORT;
+	/* Determine alias flags */
+	if (dst_addr.s_addr == INADDR_ANY)
+		lnk->flags |= LINK_UNKNOWN_DEST_ADDR;
+	if (dst_port == 0)
+		lnk->flags |= LINK_UNKNOWN_DEST_PORT;
 
-		/* Determine alias port */
-		if (GetNewPort(la, lnk, alias_port_param) != 0) {
-			free(lnk);
-			return (NULL);
-		}
-		/* Link-type dependent initialization */
-		switch (link_type) {
-			struct tcp_dat *aux_tcp;
+	/* Determine alias port */
+	if (GetNewPort(la, lnk, alias_port_param) != 0) {
+		free(lnk);
+		return (NULL);
+	}
+	/* Link-type dependent initialization */
+	switch (link_type) {
+	case LINK_ICMP:
+		la->icmpLinkCount++;
+		break;
+	case LINK_UDP:
+		la->udpLinkCount++;
+		break;
+	case LINK_TCP: {
+		struct tcp_dat *aux_tcp;
+		int i;
 
-		case LINK_ICMP:
-			la->icmpLinkCount++;
-			break;
-		case LINK_UDP:
-			la->udpLinkCount++;
-			break;
-		case LINK_TCP:
-			aux_tcp = malloc(sizeof(struct tcp_dat));
-			if (aux_tcp != NULL) {
-				int i;
-
-				la->tcpLinkCount++;
-				aux_tcp->state.in = ALIAS_TCP_STATE_NOT_CONNECTED;
-				aux_tcp->state.out = ALIAS_TCP_STATE_NOT_CONNECTED;
-				aux_tcp->state.index = 0;
-				aux_tcp->state.ack_modified = 0;
-				for (i = 0; i < N_LINK_TCP_DATA; i++)
-					aux_tcp->ack[i].active = 0;
-				aux_tcp->fwhole = -1;
-				lnk->data.tcp = aux_tcp;
-			} else {
+		aux_tcp = malloc(sizeof(struct tcp_dat));
+		if (aux_tcp == NULL) {
 #ifdef LIBALIAS_DEBUG
-				fprintf(stderr, "PacketAlias/AddLink: ");
-				fprintf(stderr, " cannot allocate auxiliary TCP data\n");
+			fprintf(stderr, "PacketAlias/AddLink: ");
+			fprintf(stderr, " cannot allocate auxiliary TCP data\n");
 #endif
-				free(lnk);
-				return (NULL);
-			}
-			break;
-		case LINK_PPTP:
-			la->pptpLinkCount++;
-			break;
-		case LINK_FRAGMENT_ID:
-			la->fragmentIdLinkCount++;
-			break;
-		case LINK_FRAGMENT_PTR:
-			la->fragmentPtrLinkCount++;
-			break;
-		case LINK_ADDR:
-			break;
-		default:
-			la->protoLinkCount++;
-			break;
+			free(lnk);
+			return (NULL);
 		}
 
-		grp_in = StartPointIn(la, alias_addr, lnk->alias_port, link_type, 1);
-		if (grp_in == NULL) {
+		la->tcpLinkCount++;
+		aux_tcp->state.in = ALIAS_TCP_STATE_NOT_CONNECTED;
+		aux_tcp->state.out = ALIAS_TCP_STATE_NOT_CONNECTED;
+		aux_tcp->state.index = 0;
+		aux_tcp->state.ack_modified = 0;
+		for (i = 0; i < N_LINK_TCP_DATA; i++)
+			aux_tcp->ack[i].active = 0;
+		aux_tcp->fwhole = -1;
+		lnk->data.tcp = aux_tcp;
+	}
+		break;
+	case LINK_PPTP:
+		la->pptpLinkCount++;
+		break;
+	case LINK_FRAGMENT_ID:
+		la->fragmentIdLinkCount++;
+		break;
+	case LINK_FRAGMENT_PTR:
+		la->fragmentPtrLinkCount++;
+		break;
+	case LINK_ADDR:
+		break;
+	default:
+		la->protoLinkCount++;
+		break;
+	}
+
+	switch (link_type) {
+	case LINK_PPTP:
+		LIST_INSERT_HEAD(&la->pptpList, lnk, pptp.list);
+		break;
+	default: {
+		struct group_in *grp;
+
+		grp = StartPointIn(la, alias_addr, lnk->alias_port, link_type, 1);
+		if (grp == NULL) {
 			free(lnk);
 			return (NULL);
 		}
@@ -1090,26 +1112,23 @@ AddLink(struct libalias *la, struct in_addr src_addr, struct in_addr dst_addr,
 		/* Set up pointers for output lookup table */
 		start_point = StartPointOut(src_addr, dst_addr,
 		    src_port, dst_port, link_type);
-		LIST_INSERT_HEAD(&la->linkTableOut[start_point], lnk, list_out);
+		LIST_INSERT_HEAD(&la->linkTableOut[start_point], lnk, all.out);
 
 		/* Set up pointers for input lookup table */
-		if (lnk->flags & LINK_PARTIALLY_SPECIFIED) {
-			LIST_INSERT_HEAD(&grp_in->partial, lnk, list_in);
-		} else {
-			LIST_INSERT_HEAD(&grp_in->full, lnk, list_in);
-		}
-
-		/* Include the element into the housekeeping list */
-		TAILQ_INSERT_TAIL(&la->checkExpire, lnk, expire.list);
-	} else {
-#ifdef LIBALIAS_DEBUG
-		fprintf(stderr, "PacketAlias/AddLink(): ");
-		fprintf(stderr, "malloc() call failed.\n");
-#endif
+		if (lnk->flags & LINK_PARTIALLY_SPECIFIED)
+			LIST_INSERT_HEAD(&grp->partial, lnk, all.in);
+		else
+			LIST_INSERT_HEAD(&grp->full, lnk, all.in);
 	}
-	if (la->packetAliasMode & PKT_ALIAS_LOG) {
-		ShowAliasStats(la);
+		break;
 	}
+
+	/* Include the element into the housekeeping list */
+	TAILQ_INSERT_TAIL(&la->checkExpire, lnk, expire.list);
+
+	if (la->packetAliasMode & PKT_ALIAS_LOG)
+		ShowAliasStats(la);
+
 	return (lnk);
 }
 
@@ -1164,7 +1183,7 @@ _SearchLinkOut(struct libalias *la, struct in_addr src_addr,
 	struct alias_link *lnk;
 
 	i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type);
-	LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) {
+	LIST_FOREACH(lnk, &la->linkTableOut[i], all.out) {
 		OUTGUARD;
 		return (UseLink(la, lnk));
 	}
@@ -1279,14 +1298,14 @@ _FindLinkIn(struct libalias *la, struct in_addr dst_addr,
 
 	switch (flags_in) {
 	case 0:
-		LIST_FOREACH(lnk, &grp->full, list_in) {
+		LIST_FOREACH(lnk, &grp->full, all.in) {
 			if (lnk->dst_addr.s_addr == dst_addr.s_addr &&
 			    lnk->dst_port == dst_port)
 				return (UseLink(la, lnk));
 		}
 		break;
 	case LINK_UNKNOWN_DEST_PORT:
-		LIST_FOREACH(lnk, &grp->full, list_in) {
+		LIST_FOREACH(lnk, &grp->full, all.in) {
 			if(lnk->dst_addr.s_addr == dst_addr.s_addr) {
 				lnk_unknown_dst_port = lnk;
 				break;
@@ -1294,7 +1313,7 @@ _FindLinkIn(struct libalias *la, struct in_addr dst_addr,
 		}
 		break;
 	case LINK_UNKNOWN_DEST_ADDR:
-		LIST_FOREACH(lnk, &grp->full, list_in) {
+		LIST_FOREACH(lnk, &grp->full, all.in) {
 			if(lnk->dst_port == dst_port) {
 				lnk_unknown_dst_addr = lnk;
 				break;
@@ -1307,7 +1326,7 @@ _FindLinkIn(struct libalias *la, struct in_addr dst_addr,
 	}
 
 	if (lnk_unknown_dst_port == NULL) {
-		LIST_FOREACH(lnk, &grp->partial, list_in) {
+		LIST_FOREACH(lnk, &grp->partial, all.in) {
 			int flags = (flags_in | lnk->flags) & LINK_PARTIALLY_SPECIFIED;
 
 			if (flags == LINK_PARTIALLY_SPECIFIED &&
@@ -1639,14 +1658,11 @@ FindPptpOutByCallId(struct libalias *la, struct in_addr src_addr,
     struct in_addr dst_addr,
     u_int16_t src_call_id)
 {
-	u_int i;
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
-	i = StartPointOut(src_addr, dst_addr, 0, 0, LINK_PPTP);
-	LIST_FOREACH(lnk, &la->linkTableOut[i], list_out)
-		if (lnk->link_type == LINK_PPTP &&
-		    lnk->src_addr.s_addr == src_addr.s_addr &&
+	LIST_FOREACH(lnk, &la->pptpList, pptp.list)
+		if (lnk->src_addr.s_addr == src_addr.s_addr &&
 		    lnk->dst_addr.s_addr == dst_addr.s_addr &&
 		    lnk->src_port == src_call_id)
 			break;
@@ -1659,14 +1675,11 @@ FindPptpOutByPeerCallId(struct libalias *la, struct in_addr src_addr,
     struct in_addr dst_addr,
     u_int16_t dst_call_id)
 {
-	u_int i;
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
-	i = StartPointOut(src_addr, dst_addr, 0, 0, LINK_PPTP);
-	LIST_FOREACH(lnk, &la->linkTableOut[i], list_out)
-		if (lnk->link_type == LINK_PPTP &&
-		    lnk->src_addr.s_addr == src_addr.s_addr &&
+	LIST_FOREACH(lnk, &la->pptpList, pptp.list)
+		if (lnk->src_addr.s_addr == src_addr.s_addr &&
 		    lnk->dst_addr.s_addr == dst_addr.s_addr &&
 		    lnk->dst_port == dst_call_id)
 			break;
@@ -1679,18 +1692,14 @@ FindPptpInByCallId(struct libalias *la, struct in_addr dst_addr,
     struct in_addr alias_addr,
     u_int16_t dst_call_id)
 {
-	struct group_in *grp;
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
 
-	grp = StartPointIn(la, alias_addr, 0, LINK_PPTP, 0);
-	if (grp == NULL)
-		return (NULL);
-
-	LIST_FOREACH(lnk, &grp->full, list_in)
-		if (lnk->dst_addr.s_addr == dst_addr.s_addr &&
-		    lnk->dst_port == dst_call_id)
+	LIST_FOREACH(lnk, &la->pptpList, pptp.list)
+		if (lnk->dst_port == dst_call_id &&
+		    lnk->dst_addr.s_addr == dst_addr.s_addr &&
+		    lnk->alias_addr.s_addr == alias_addr.s_addr)
 			break;
 
 	return (UseLink(la, lnk));
@@ -1704,9 +1713,11 @@ FindPptpInByPeerCallId(struct libalias *la, struct in_addr dst_addr,
 	struct alias_link *lnk;
 
 	LIBALIAS_LOCK_ASSERT(la);
-	lnk = FindLinkIn(la, dst_addr, alias_addr,
-	    0 /* any */ , alias_call_id,
-	    LINK_PPTP, 0);
+	LIST_FOREACH(lnk, &la->pptpList, pptp.list)
+		if (lnk->alias_port == alias_call_id &&
+		    lnk->dst_addr.s_addr == dst_addr.s_addr &&
+		    lnk->alias_addr.s_addr == alias_addr.s_addr)
+			break;
 
 	return (lnk);
 }
@@ -2331,7 +2342,14 @@ LibAliasAddServer(struct libalias *la, struct alias_link *lnk, struct in_addr ad
 	LIBALIAS_LOCK(la);
 	(void)la;
 
-	server = malloc(sizeof(struct server));
+	switch (lnk->link_type) {
+	case LINK_PPTP:
+		server = NULL;
+		break;
+	default:
+		server = malloc(sizeof(struct server));
+		break;
+	}
 
 	if (server != NULL) {
 		struct server *head;
@@ -2343,7 +2361,7 @@ LibAliasAddServer(struct libalias *la, struct alias_link *lnk, struct in_addr ad
 		if (head == NULL) {
 			server->next = server;
 			/* not usable for outgoing connections */
-			LIST_REMOVE(lnk, list_out);
+			LIST_REMOVE(lnk, all.out);
 		} else {
 			struct server *s;
 
@@ -2517,6 +2535,7 @@ LibAliasInit(struct libalias *la)
 			LIST_INIT(&la->linkTableOut[i]);
 		for (i = 0; i < LINK_TABLE_IN_SIZE; i++)
 			LIST_INIT(&la->groupTableIn[i]);
+		LIST_INIT(&la->pptpList);
 		TAILQ_INIT(&la->checkExpire);
 #ifdef _KERNEL
 		AliasSctpInit(la);
diff --git a/sys/netinet/libalias/alias_local.h b/sys/netinet/libalias/alias_local.h
index 6e5d40ab0c9a..bfdd299a74ff 100644
--- a/sys/netinet/libalias/alias_local.h
+++ b/sys/netinet/libalias/alias_local.h
@@ -102,6 +102,7 @@ struct libalias {
 	 * output lookup tables. */
 	LIST_HEAD (, alias_link) linkTableOut[LINK_TABLE_OUT_SIZE];
 	LIST_HEAD (, group_in)   groupTableIn[LINK_TABLE_IN_SIZE];
+	LIST_HEAD (, alias_link) pptpList;
 	/* HouseKeeping */
 	TAILQ_HEAD    (, alias_link) checkExpire;
 	/* Link statistics */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202106191928.15JJSnYv000134>